1 ' Tween - Client of Twitter
2 ' Copyright (c) 2007-2010 kiri_feather (@kiri_feather) <kiri_feather@gmail.com>
3 ' (c) 2008-2010 Moz (@syo68k) <http://iddy.jp/profile/moz/>
4 ' (c) 2008-2010 takeshik (@takeshik) <http://www.takeshik.org/>
7 ' This file is part of Tween.
9 ' This program is free software; you can redistribute it and/or modify it
10 ' under the terms of the GNU General Public License as published by the Free
11 ' Software Foundation; either version 3 of the License, or (at your option)
14 ' This program is distributed in the hope that it will be useful, but
15 ' WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 ' or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 ' You should have received a copy of the GNU General Public License along
20 ' with this program. If not, see <http://www.gnu.org/licenses/>, or write to
21 ' the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
22 ' Boston, MA 02110-1301, USA.
25 '"c:\Program Files\Microsoft.NET\SDK\v2.0\Bin\sgen.exe" /f /a:"$(TargetPath)"
26 '"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe" /f /a:"$(TargetPath)"
31 Imports System.Text.RegularExpressions
32 Imports Tween.TweenCustomControl
35 Imports System.Reflection
36 Imports System.ComponentModel
37 Imports System.Diagnostics
38 Imports Microsoft.Win32
41 Imports System.Threading
43 Public Class TweenMain
46 Private _mySize As Size '画面サイズ
47 Private _myLoc As Point '画面位置
48 Private _mySpDis As Integer '区切り位置
49 Private _mySpDis2 As Integer '発言欄区切り位置
50 Private _mySpDis3 As Integer 'プレビュー区切り位置
51 Private _iconSz As Integer 'アイコンサイズ(現在は16、24、48の3種類。将来直接数字指定可能とする 注:24x24の場合に26と指定しているのはMSゴシック系フォントのための仕様)
52 Private _iconCol As Boolean '1列表示の時True(48サイズのとき)
55 Private _initial As Boolean 'True:起動時処理中
56 Private _initialLayout As Boolean = True
57 Private _ignoreConfigSave As Boolean 'True:起動時処理中
58 Private _tabDrag As Boolean 'タブドラッグ中フラグ(DoDragDropを実行するかの判定用)
59 Private _rclickTabName As String '右クリックしたタブの名前(Tabコントロール機能不足対応)
60 Private ReadOnly _syncObject As New Object() 'ロック用
61 Private Const detailHtmlFormatMono1 As String = "<html><head><style type=""text/css""><!-- pre {font-family: """
62 Private Const detailHtmlFormat2 As String = """, sans-serif; font-size: "
63 Private Const detailHtmlFormat3 As String = "pt; word-wrap: break-word; color:rgb("
64 Private Const detailHtmlFormat4 As String = ");} a:link, a:visited, a:active, a:hover {color:rgb("
65 Private Const detailHtmlFormat5 As String = "); } --></style></head><body style=""margin:0px; background-color:rgb("
66 Private Const detailHtmlFormatMono6 As String = ");""><pre>"
67 Private Const detailHtmlFormatMono7 As String = "</pre></body></html>"
68 Private Const detailHtmlFormat1 As String = "<html><head><style type=""text/css""><!-- p {font-family: """
69 Private Const detailHtmlFormat6 As String = ");""><p>"
70 Private Const detailHtmlFormat7 As String = "</p></body></html>"
71 Private detailHtmlFormatHeader As String
72 Private detailHtmlFormatFooter As String
73 Private _myStatusError As Boolean = False
74 Private _myStatusOnline As Boolean = False
75 Private soundfileListup As Boolean = False
76 Private _spaceKeyCanceler As SpaceKeyCanceler
79 'Private _cfg As SettingToConfig '旧
80 Private _cfgLocal As SettingLocal
81 Private _cfgCommon As SettingCommon
82 Private _modifySettingLocal As Boolean = False
83 Private _modifySettingCommon As Boolean = False
84 Private _modifySettingAtId As Boolean = False
87 Private tw As New Twitter
90 Private SettingDialog As Setting = Setting.Instance '設定画面インスタンス
91 Private TabDialog As New TabsDialog 'タブ選択ダイアログインスタンス
92 Private SearchDialog As New SearchWord '検索画面インスタンス
93 Private fDialog As New FilterDialog 'フィルター編集画面
94 Private UrlDialog As New OpenURL
95 Private dialogAsShieldicon As DialogAsShieldIcon ' シールドアイコン付きダイアログ
96 Public AtIdSupl As AtIdSupplement '@id補助
97 Public HashSupl As AtIdSupplement 'Hashtag補助
98 Public HashMgr As HashtagManage
101 Private _fntUnread As Font '未読用フォント
102 Private _clUnread As Color '未読用文字色
103 Private _fntReaded As Font '既読用フォント
104 Private _clReaded As Color '既読用文字色
105 Private _clFav As Color 'Fav用文字色
106 Private _clOWL As Color '片思い用文字色
107 Private _clRetweet As Color 'Retweet用文字色
108 Private _fntDetail As Font '発言詳細部用フォント
109 Private _clDetail As Color '発言詳細部用色
110 Private _clDetailLink As Color '発言詳細部用リンク文字色
111 Private _clDetailBackcolor As Color '発言詳細部用背景色
112 Private _clSelf As Color '自分の発言用背景色
113 Private _clAtSelf As Color '自分宛返信用背景色
114 Private _clTarget As Color '選択発言者の他の発言用背景色
115 Private _clAtTarget As Color '選択発言中の返信先用背景色
116 Private _clAtFromTarget As Color '選択発言者への返信発言用背景色
117 Private _clAtTo As Color '選択発言の唯一@先
118 Private _clListBackcolor As Color 'リスト部通常発言背景色
119 Private _clInputBackcolor As Color '入力欄背景色
120 Private _clInputFont As Color '入力欄文字色
121 Private _fntInputFont As Font '入力欄フォント
122 Private TIconDic As IDictionary(Of String, Image) 'アイコン画像リスト
123 Private NIconAt As Icon 'At.ico タスクトレイアイコン:通常時
124 Private NIconAtRed As Icon 'AtRed.ico タスクトレイアイコン:通信エラー時
125 Private NIconAtSmoke As Icon 'AtSmoke.ico タスクトレイアイコン:オフライン時
126 Private NIconRefresh(3) As Icon 'Refresh.ico タスクトレイアイコン:更新中(アニメーション用に4種類を保持するリスト)
127 Private TabIcon As Icon 'Tab.ico 未読のあるタブ用アイコン
128 Private MainIcon As Icon 'Main.ico 画面左上のアイコン
129 Private ReplyIcon As Icon '5g
130 Private ReplyIconBlink As Icon '6g
132 Private _anchorPost As PostClass
133 Private _anchorFlag As Boolean 'True:関連発言移動中(関連移動以外のオペレーションをするとFalseへ。Trueだとリスト背景色をアンカー発言選択中として描画)
135 Private _history As New List(Of PostingStatus) '発言履歴
136 Private _hisIdx As Integer '発言履歴カレントインデックス
138 '発言投稿時のAPI引数(発言編集時に設定。手書きreplyでは設定されない)
139 Private _reply_to_id As Long ' リプライ先のステータスID 0の場合はリプライではない 注:複数あてのものはリプライではない
140 Private _reply_to_name As String ' リプライ先ステータスの書き込み者の名前
143 Private _postTimestamps As New List(Of Date)
144 Private _favTimestamps As New List(Of Date)
145 Private _tlTimestamps As New Dictionary(Of Date, Integer)
146 Private _tlCount As Integer
149 Private _brsHighLight As New SolidBrush(Color.FromKnownColor(KnownColor.Highlight))
150 Private _brsHighLightText As New SolidBrush(Color.FromKnownColor(KnownColor.HighlightText))
151 Private _brsForeColorUnread As SolidBrush
152 Private _brsForeColorReaded As SolidBrush
153 Private _brsForeColorFav As SolidBrush
154 Private _brsForeColorOWL As SolidBrush
155 Private _brsForeColorRetweet As SolidBrush
156 Private _brsBackColorMine As SolidBrush
157 Private _brsBackColorAt As SolidBrush
158 Private _brsBackColorYou As SolidBrush
159 Private _brsBackColorAtYou As SolidBrush
160 Private _brsBackColorAtFromTarget As SolidBrush
161 Private _brsBackColorAtTo As SolidBrush
162 Private _brsBackColorNone As SolidBrush
163 Private _brsDeactiveSelection As New SolidBrush(Color.FromKnownColor(KnownColor.ButtonFace)) 'Listにフォーカスないときの選択行の背景色
164 'Private sf As New StringFormat()
165 Private sfTab As New StringFormat()
167 '''''''''''''''''''''''''''''''''''''''''''''''''''''
168 Private _apiGauge As New ToolStripAPIGauge()
169 Private _statuses As TabInformations
170 Private _itemCache() As ListViewItem
171 Private _itemCacheIndex As Integer
172 Private _postCache() As PostClass
173 Private _curTab As TabPage
174 Private _curItemIndex As Integer
175 Private _curList As DetailsListView
176 Private _curPost As PostClass
177 Private _isColumnChanged As Boolean = False
178 'Private _waitFollower As Boolean = False
179 Private _waitTimeline As Boolean = False
180 Private _waitReply As Boolean = False
181 Private _waitDm As Boolean = False
182 Private _waitFav As Boolean = False
183 Private _waitPubSearch As Boolean = False
184 Private _waitLists As Boolean = False
185 Private _bw(18) As BackgroundWorker
186 Private _bwFollower As BackgroundWorker
187 Private cMode As Integer
188 Private shield As New ShieldIcon
189 Private SecurityManager As InternetSecurityManager
190 Private Thumbnail As Thumbnail
192 'Private _homeCounter As Integer = 0
193 'Private _homeCounterAdjuster As Integer = 0
194 'Private _mentionCounter As Integer = 0
195 'Private _dmCounter As Integer = 0
196 'Private _pubSearchCounter As Integer = 0
197 'Private _listsCounter As Integer = 0
199 Private UnreadCounter As Integer = -1
200 Private UnreadAtCounter As Integer = -1
202 Private ColumnOrgText(8) As String
203 Private ColumnText(8) As String
205 'Private _UseAdditionalFlags As Boolean = False
206 'Private _FirstRefreshFlags As Boolean = False
207 'Private _FirstListsRefreshFlags As Boolean = False
209 Private _DoFavRetweetFlags As Boolean = False
211 '''''''''''''''''''''''''''''''''''''''''''''''''''''
212 Private _postBrowserStatusText As String = ""
214 Private _colorize As Boolean = False
216 Private WithEvents TimerTimeline As New System.Timers.Timer
219 Private Structure urlUndo
220 Public Before As String
221 Public After As String
224 Private urlUndoBuffer As Generic.List(Of urlUndo) = Nothing
226 Private Structure ReplyChain
227 Public OriginalId As Long
228 Public InReplyToId As Long
229 Public OriginalTab As TabPage
231 Sub New(ByVal originalId As Long, ByVal inReplyToId As Long, ByVal originalTab As TabPage)
232 Me.OriginalId = originalId
233 Me.InReplyToId = inReplyToId
234 Me.OriginalTab = originalTab
238 Private replyChains As Stack(Of ReplyChain)
240 'Backgroundworkerの処理結果通知用引数構造体
241 Private Class GetWorkerResult
242 Public retMsg As String = "" '処理結果詳細メッセージ。エラー時に値がセットされる
243 Public page As Integer '取得対象ページ番号
244 Public endPage As Integer '取得終了ページ番号(継続可能ならインクリメントされて返る。pageと比較して継続判定)
245 Public type As WORKERTYPE '処理種別
246 Public imgs As Dictionary(Of String, Image) '新規取得したアイコンイメージ
247 Public tName As String = "" 'Fav追加・削除時のタブ名
248 Public ids As List(Of Long) 'Fav追加・削除時のID
249 Public sIds As List(Of Long) 'Fav追加・削除成功分のID
250 Public newDM As Boolean
251 Public addCount As Integer
252 Public status As PostingStatus
255 'Backgroundworkerへ処理内容を通知するための引数用構造体
256 Private Class GetWorkerArg
257 Public page As Integer '処理対象ページ番号
258 Public endPage As Integer '処理終了ページ番号(起動時の読み込みページ数。通常時はpageと同じ値をセット)
259 Public type As WORKERTYPE '処理種別
260 Public url As String = "" 'URLをブラウザで開くときのアドレス
261 Public status As New PostingStatus '発言POST時の発言内容
262 Public ids As List(Of Long) 'Fav追加・削除時のItemIndex
263 Public sIds As List(Of Long) 'Fav追加・削除成功分のItemIndex
264 Public tName As String = "" 'Fav追加・削除時のタブ名
268 Private Enum SEARCHTYPE
274 Private Class PostingStatus
275 Public status As String = ""
276 Public inReplyToId As Long = 0
277 Public inReplyToName As String = ""
278 Public imageService As String = "" '画像投稿サービス名
279 Public imagePath As String = ""
283 Public Sub New(ByVal status As String, ByVal replyToId As Long, ByVal replyToName As String)
285 Me.inReplyToId = replyToId
286 Me.inReplyToName = replyToName
290 Private Class SpaceKeyCanceler
291 Inherits NativeWindow
292 Implements IDisposable
294 Dim WM_KEYDOWN As Integer = &H100
295 Dim VK_SPACE As Integer = &H20
297 Public Sub New(ByVal control As Control)
298 Me.AssignHandle(control.Handle)
301 Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
302 If (m.Msg = WM_KEYDOWN) AndAlso (CInt(m.WParam) = VK_SPACE) Then
303 RaiseEvent SpaceCancel(Me, EventArgs.Empty)
310 Public Event SpaceCancel As EventHandler
312 Public Sub Dispose() Implements IDisposable.Dispose
317 Private Sub TweenMain_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
318 '画面がアクティブになったら、発言欄の背景色戻す
319 If StatusText.Focused Then
320 Me.StatusText_Enter(Me.StatusText, System.EventArgs.Empty)
324 Private Sub TweenMain_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
326 SettingDialog.Dispose()
328 SearchDialog.Dispose()
331 _spaceKeyCanceler.Dispose()
332 If NIconAt IsNot Nothing Then NIconAt.Dispose()
333 If NIconAtRed IsNot Nothing Then NIconAtRed.Dispose()
334 If NIconAtSmoke IsNot Nothing Then NIconAtSmoke.Dispose()
335 If NIconRefresh(0) IsNot Nothing Then NIconRefresh(0).Dispose()
336 If NIconRefresh(1) IsNot Nothing Then NIconRefresh(1).Dispose()
337 If NIconRefresh(2) IsNot Nothing Then NIconRefresh(2).Dispose()
338 If NIconRefresh(3) IsNot Nothing Then NIconRefresh(3).Dispose()
339 If TabIcon IsNot Nothing Then TabIcon.Dispose()
340 If MainIcon IsNot Nothing Then MainIcon.Dispose()
341 If ReplyIcon IsNot Nothing Then ReplyIcon.Dispose()
342 If ReplyIconBlink IsNot Nothing Then ReplyIconBlink.Dispose()
343 _brsHighLight.Dispose()
344 _brsHighLightText.Dispose()
345 If _brsForeColorUnread IsNot Nothing Then _brsForeColorUnread.Dispose()
346 If _brsForeColorReaded IsNot Nothing Then _brsForeColorReaded.Dispose()
347 If _brsForeColorFav IsNot Nothing Then _brsForeColorFav.Dispose()
348 If _brsForeColorOWL IsNot Nothing Then _brsForeColorOWL.Dispose()
349 If _brsForeColorRetweet IsNot Nothing Then _brsForeColorRetweet.Dispose()
350 If _brsBackColorMine IsNot Nothing Then _brsBackColorMine.Dispose()
351 If _brsBackColorAt IsNot Nothing Then _brsBackColorAt.Dispose()
352 If _brsBackColorYou IsNot Nothing Then _brsBackColorYou.Dispose()
353 If _brsBackColorAtYou IsNot Nothing Then _brsBackColorAtYou.Dispose()
354 If _brsBackColorAtFromTarget IsNot Nothing Then _brsBackColorAtFromTarget.Dispose()
355 If _brsBackColorAtTo IsNot Nothing Then _brsBackColorAtTo.Dispose()
356 If _brsBackColorNone IsNot Nothing Then _brsBackColorNone.Dispose()
357 If _brsDeactiveSelection IsNot Nothing Then _brsDeactiveSelection.Dispose()
361 For Each bw As BackgroundWorker In _bw
362 If bw IsNot Nothing Then
366 If _bwFollower IsNot Nothing Then
367 _bwFollower.Dispose()
369 Me._apiGauge.Dispose()
370 If TIconDic IsNot Nothing Then DirectCast(TIconDic, IDisposable).Dispose()
373 Private Sub LoadIcon(ByRef IconInstance As Icon, ByVal FileName As String)
374 Dim dir As String = Application.StartupPath
375 If File.Exists(Path.Combine(dir, FileName)) Then
377 IconInstance = New Icon(Path.Combine(dir, FileName))
378 Catch ex As Exception
383 Private Sub LoadIcons()
386 Dim dir As String = Application.StartupPath
388 NIconAt = My.Resources.At
389 NIconAtRed = My.Resources.AtRed
390 NIconAtSmoke = My.Resources.AtSmoke
391 NIconRefresh(0) = My.Resources.Refresh
392 NIconRefresh(1) = My.Resources.Refresh2
393 NIconRefresh(2) = My.Resources.Refresh3
394 NIconRefresh(3) = My.Resources.Refresh4
395 TabIcon = My.Resources.TabIcon
396 MainIcon = My.Resources.MIcon
397 ReplyIcon = My.Resources.Reply
398 ReplyIconBlink = My.Resources.ReplyBlink
400 If Not Directory.Exists(Path.Combine(dir, "Icons")) Then
404 LoadIcon(NIconAt, "Icons\At.ico")
407 LoadIcon(NIconAtRed, "Icons\AtRed.ico")
410 LoadIcon(NIconAtSmoke, "Icons\AtSmoke.ico")
414 LoadIcon(NIconRefresh(0), "Icons\Refresh.ico")
415 LoadIcon(NIconRefresh(1), "Icons\Refresh2.ico")
416 LoadIcon(NIconRefresh(2), "Icons\Refresh3.ico")
417 LoadIcon(NIconRefresh(3), "Icons\Refresh4.ico")
420 LoadIcon(TabIcon, "Icons\Tab.ico")
423 LoadIcon(MainIcon, "Icons\MIcon.ico")
426 LoadIcon(ReplyIcon, "Icons\Reply.ico")
429 LoadIcon(ReplyIconBlink, "Icons\ReplyBlink.ico")
432 Private Sub InitColumnText()
435 ColumnText(1) = My.Resources.AddNewTabText2
436 ColumnText(2) = My.Resources.AddNewTabText3
437 ColumnText(3) = My.Resources.AddNewTabText4_2
438 ColumnText(4) = My.Resources.AddNewTabText5
441 ColumnText(7) = "Source"
443 ColumnOrgText(0) = ""
444 ColumnOrgText(1) = My.Resources.AddNewTabText2
445 ColumnOrgText(2) = My.Resources.AddNewTabText3
446 ColumnOrgText(3) = My.Resources.AddNewTabText4_2
447 ColumnOrgText(4) = My.Resources.AddNewTabText5
448 ColumnOrgText(5) = ""
449 ColumnOrgText(6) = ""
450 ColumnOrgText(7) = "Source"
453 Select Case _statuses.SortMode
454 Case IdComparerClass.ComparerMode.Nickname 'ニックネーム
456 Case IdComparerClass.ComparerMode.Data '本文
458 Case IdComparerClass.ComparerMode.Id '時刻=発言Id
460 Case IdComparerClass.ComparerMode.Name '名前
462 Case IdComparerClass.ComparerMode.Source 'Source
467 If _statuses.SortOrder() = SortOrder.Descending Then
468 ' U+25BE BLACK DOWN-POINTING SMALL TRIANGLE
469 ColumnText(2) = ColumnOrgText(2) + "▾"
471 ' U+25B4 BLACK UP-POINTING SMALL TRIANGLE
472 ColumnText(2) = ColumnOrgText(2) + "▴"
475 If _statuses.SortOrder() = SortOrder.Descending Then
476 ' U+25BE BLACK DOWN-POINTING SMALL TRIANGLE
477 ColumnText(c) = ColumnOrgText(c) + "▾"
479 ' U+25B4 BLACK UP-POINTING SMALL TRIANGLE
480 ColumnText(c) = ColumnOrgText(c) + "▴"
485 Private Sub InitializeTraceFrag()
487 TraceOutToolStripMenuItem.Checked = True
490 If Not fileVersion.EndsWith("0") Then
491 TraceOutToolStripMenuItem.Checked = True
496 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
497 _ignoreConfigSave = True
499 SecurityManager = New InternetSecurityManager(PostBrowser)
500 Thumbnail = New Thumbnail(Me)
502 AddHandler TwitterApiInfo.Changed, AddressOf SetStatusLabelApiHandler
504 VerUpMenuItem.Image = shield.Icon
505 If Not My.Application.CommandLineArgs.Count = 0 AndAlso My.Application.CommandLineArgs.Contains("/d") Then TraceFlag = True
507 Me._spaceKeyCanceler = New SpaceKeyCanceler(Me.PostButton)
508 AddHandler Me._spaceKeyCanceler.SpaceCancel, AddressOf spaceKeyCanceler_SpaceCancel
510 Regex.CacheSize = 100
512 fileVersion = DirectCast(Assembly.GetExecutingAssembly().GetCustomAttributes(GetType(AssemblyFileVersionAttribute), False)(0), AssemblyFileVersionAttribute).Version
513 InitializeTraceFrag()
514 LoadIcons() ' アイコン読み込み
517 _statuses = TabInformations.GetInstance()
520 Me.Icon = MainIcon 'メインフォーム(TweenMain)
521 NotifyIcon1.Icon = NIconAt 'タスクトレイ
522 TabImage.Images.Add(TabIcon) 'タブ見出し
524 SettingDialog.Owner = Me
525 SearchDialog.Owner = Me
530 _history.Add(New PostingStatus)
535 '<<<<<<<<<設定関連>>>>>>>>>
543 NewPostPopMenuItem.Checked = _cfgCommon.NewAllPop
544 Me.NotifyFileMenuItem.Checked = NewPostPopMenuItem.Checked
547 _fntUnread = _cfgLocal.FontUnread
548 _clUnread = _cfgLocal.ColorUnread
549 _fntReaded = _cfgLocal.FontRead
550 _clReaded = _cfgLocal.ColorRead
551 _clFav = _cfgLocal.ColorFav
552 _clOWL = _cfgLocal.ColorOWL
553 _clRetweet = _cfgLocal.ColorRetweet
554 _fntDetail = _cfgLocal.FontDetail
555 _clDetail = _cfgLocal.ColorDetail
556 _clDetailLink = _cfgLocal.ColorDetailLink
557 _clDetailBackcolor = _cfgLocal.ColorDetailBackcolor
558 _clSelf = _cfgLocal.ColorSelf
559 _clAtSelf = _cfgLocal.ColorAtSelf
560 _clTarget = _cfgLocal.ColorTarget
561 _clAtTarget = _cfgLocal.ColorAtTarget
562 _clAtFromTarget = _cfgLocal.ColorAtFromTarget
563 _clAtTo = _cfgLocal.ColorAtTo
564 _clListBackcolor = _cfgLocal.ColorListBackcolor
565 _clInputBackcolor = _cfgLocal.ColorInputBackcolor
566 _clInputFont = _cfgLocal.ColorInputFont
567 _fntInputFont = _cfgLocal.FontInputFont
569 _brsForeColorUnread = New SolidBrush(_clUnread)
570 _brsForeColorReaded = New SolidBrush(_clReaded)
571 _brsForeColorFav = New SolidBrush(_clFav)
572 _brsForeColorOWL = New SolidBrush(_clOWL)
573 _brsForeColorRetweet = New SolidBrush(_clRetweet)
574 _brsBackColorMine = New SolidBrush(_clSelf)
575 _brsBackColorAt = New SolidBrush(_clAtSelf)
576 _brsBackColorYou = New SolidBrush(_clTarget)
577 _brsBackColorAtYou = New SolidBrush(_clAtTarget)
578 _brsBackColorAtFromTarget = New SolidBrush(_clAtFromTarget)
579 _brsBackColorAtTo = New SolidBrush(_clAtTo)
580 '_brsBackColorNone = New SolidBrush(Color.FromKnownColor(KnownColor.Window))
581 _brsBackColorNone = New SolidBrush(_clListBackcolor)
583 ' StringFormatオブジェクトへの事前設定
584 'sf.Alignment = StringAlignment.Near ' Textを近くへ配置(左から右の場合は左寄せ)
585 'sf.LineAlignment = StringAlignment.Near ' Textを近くへ配置(上寄せ)
586 'sf.FormatFlags = StringFormatFlags.LineLimit '
587 sfTab.Alignment = StringAlignment.Center
588 sfTab.LineAlignment = StringAlignment.Center
591 SettingDialog.IsOAuth = _cfgCommon.IsOAuth
592 HttpTwitter.TwitterUrl = _cfgCommon.TwitterUrl
593 HttpTwitter.TwitterSearchUrl = _cfgCommon.TwitterSearchUrl
594 SettingDialog.TwitterApiUrl = _cfgCommon.TwitterUrl
595 SettingDialog.TwitterSearchApiUrl = _cfgCommon.TwitterSearchUrl
597 If _cfgCommon.IsOAuth Then
598 If _cfgCommon.Token = "" Then _cfgCommon.UserName = ""
599 tw.Initialize(_cfgCommon.Token, _cfgCommon.TokenSecret, _cfgCommon.UserName)
601 tw.Initialize(_cfgCommon.UserName, _cfgCommon.Password)
604 SettingDialog.TimelinePeriodInt = _cfgCommon.TimelinePeriod
605 SettingDialog.ReplyPeriodInt = _cfgCommon.ReplyPeriod
606 SettingDialog.DMPeriodInt = _cfgCommon.DMPeriod
607 SettingDialog.PubSearchPeriodInt = _cfgCommon.PubSearchPeriod
608 SettingDialog.ListsPeriodInt = _cfgCommon.ListsPeriod
610 If Not My.Application.CommandLineArgs.Contains("nolimit") Then
611 If SettingDialog.TimelinePeriodInt < 15 AndAlso SettingDialog.TimelinePeriodInt > 0 Then SettingDialog.TimelinePeriodInt = 15
612 If SettingDialog.ReplyPeriodInt < 15 AndAlso SettingDialog.ReplyPeriodInt > 0 Then SettingDialog.ReplyPeriodInt = 15
613 If SettingDialog.DMPeriodInt < 15 AndAlso SettingDialog.DMPeriodInt > 0 Then SettingDialog.DMPeriodInt = 15
614 If SettingDialog.PubSearchPeriodInt < 30 AndAlso SettingDialog.PubSearchPeriodInt > 0 Then SettingDialog.PubSearchPeriodInt = 30
615 If SettingDialog.ListsPeriodInt < 15 AndAlso SettingDialog.ListsPeriodInt > 0 Then SettingDialog.ListsPeriodInt = 15
618 '起動時読み込み分を既読にするか。Trueなら既読として処理
619 SettingDialog.Readed = _cfgCommon.Read
620 '新着取得時のリストスクロールをするか。Trueならスクロールしない
621 ListLockMenuItem.Checked = _cfgCommon.ListLock
622 Me.LockListFileMenuItem.Checked = _cfgCommon.ListLock
623 SettingDialog.IconSz = _cfgCommon.IconSize
625 SettingDialog.Status = _cfgLocal.StatusText
627 SettingDialog.UnreadManage = _cfgCommon.UnreadManage
629 SettingDialog.PlaySound = _cfgCommon.PlaySound
630 PlaySoundMenuItem.Checked = SettingDialog.PlaySound
631 Me.PlaySoundFileMenuItem.Checked = SettingDialog.PlaySound
633 SettingDialog.OneWayLove = _cfgCommon.OneWayLove
635 SettingDialog.FontUnread = _fntUnread
636 SettingDialog.ColorUnread = _clUnread
637 SettingDialog.FontReaded = _fntReaded
638 SettingDialog.ColorReaded = _clReaded
639 SettingDialog.ColorFav = _clFav
640 SettingDialog.ColorOWL = _clOWL
641 SettingDialog.ColorRetweet = _clRetweet
642 SettingDialog.FontDetail = _fntDetail
643 SettingDialog.ColorDetail = _clDetail
644 SettingDialog.ColorDetailLink = _clDetailLink
645 SettingDialog.ColorDetailBackcolor = _clDetailBackcolor
646 SettingDialog.ColorSelf = _clSelf
647 SettingDialog.ColorAtSelf = _clAtSelf
648 SettingDialog.ColorTarget = _clTarget
649 SettingDialog.ColorAtTarget = _clAtTarget
650 SettingDialog.ColorAtFromTarget = _clAtFromTarget
651 SettingDialog.ColorAtTo = _clAtTo
652 SettingDialog.ColorListBackcolor = _clListBackcolor
653 SettingDialog.ColorInputBackcolor = _clInputBackcolor
654 SettingDialog.ColorInputFont = _clInputFont
655 SettingDialog.FontInputFont = _fntInputFont
657 SettingDialog.NameBalloon = _cfgCommon.NameBalloon
658 SettingDialog.PostCtrlEnter = _cfgCommon.PostCtrlEnter
659 SettingDialog.PostShiftEnter = _cfgCommon.PostShiftEnter
661 SettingDialog.CountApi = _cfgCommon.CountApi
662 SettingDialog.CountApiReply = _cfgCommon.CountApiReply
663 If SettingDialog.CountApi < 20 OrElse SettingDialog.CountApi > 200 Then SettingDialog.CountApi = 60
664 If SettingDialog.CountApiReply < 20 OrElse SettingDialog.CountApiReply > 200 Then SettingDialog.CountApiReply = 40
666 SettingDialog.BrowserPath = _cfgLocal.BrowserPath
667 SettingDialog.PostAndGet = _cfgCommon.PostAndGet
668 SettingDialog.UseRecommendStatus = _cfgLocal.UseRecommendStatus
669 SettingDialog.DispUsername = _cfgCommon.DispUsername
670 SettingDialog.CloseToExit = _cfgCommon.CloseToExit
671 SettingDialog.MinimizeToTray = _cfgCommon.MinimizeToTray
672 SettingDialog.DispLatestPost = _cfgCommon.DispLatestPost
673 SettingDialog.SortOrderLock = _cfgCommon.SortOrderLock
674 SettingDialog.TinyUrlResolve = _cfgCommon.TinyUrlResolve
676 SettingDialog.SelectedProxyType = _cfgLocal.ProxyType
677 SettingDialog.ProxyAddress = _cfgLocal.ProxyAddress
678 SettingDialog.ProxyPort = _cfgLocal.ProxyPort
679 SettingDialog.ProxyUser = _cfgLocal.ProxyUser
680 SettingDialog.ProxyPassword = _cfgLocal.ProxyPassword
682 SettingDialog.PeriodAdjust = _cfgCommon.PeriodAdjust
683 SettingDialog.StartupVersion = _cfgCommon.StartupVersion
684 SettingDialog.StartupFollowers = _cfgCommon.StartupFollowers
685 SettingDialog.RestrictFavCheck = _cfgCommon.RestrictFavCheck
686 SettingDialog.AlwaysTop = _cfgCommon.AlwaysTop
687 SettingDialog.UrlConvertAuto = _cfgCommon.UrlConvertAuto
689 SettingDialog.OutputzEnabled = _cfgCommon.Outputz
690 SettingDialog.OutputzKey = _cfgCommon.OutputzKey
691 SettingDialog.OutputzUrlmode = _cfgCommon.OutputzUrlMode
693 SettingDialog.UseUnreadStyle = _cfgCommon.UseUnreadStyle
694 SettingDialog.DefaultTimeOut = _cfgCommon.DefaultTimeOut
695 'SettingDialog.ProtectNotInclude = _cfgCommon.ProtectNotInclude
696 SettingDialog.RetweetNoConfirm = _cfgCommon.RetweetNoConfirm
697 SettingDialog.PlaySound = _cfgCommon.PlaySound
698 SettingDialog.DateTimeFormat = _cfgCommon.DateTimeFormat
699 SettingDialog.LimitBalloon = _cfgCommon.LimitBalloon
701 '廃止サービスが選択されていた場合bit.lyへ読み替え
702 If _cfgCommon.AutoShortUrlFirst < 0 Then
703 _cfgCommon.AutoShortUrlFirst = Tween.UrlConverter.Bitly
706 SettingDialog.AutoShortUrlFirst = _cfgCommon.AutoShortUrlFirst
707 SettingDialog.TabIconDisp = _cfgCommon.TabIconDisp
708 SettingDialog.ReplyIconState = _cfgCommon.ReplyIconState
709 SettingDialog.ReadOwnPost = _cfgCommon.ReadOwnPost
710 SettingDialog.GetFav = _cfgCommon.GetFav
711 SettingDialog.ReadOldPosts = _cfgCommon.ReadOldPosts
712 SettingDialog.UseSsl = _cfgCommon.UseSsl
713 SettingDialog.BitlyUser = _cfgCommon.BilyUser
714 SettingDialog.BitlyPwd = _cfgCommon.BitlyPwd
715 SettingDialog.ShowGrid = _cfgCommon.ShowGrid
716 SettingDialog.Language = _cfgCommon.Language
717 SettingDialog.UseAtIdSupplement = _cfgCommon.UseAtIdSupplement
718 SettingDialog.UseHashSupplement = _cfgCommon.UseHashSupplement
719 SettingDialog.PreviewEnable = _cfgCommon.PreviewEnable
720 AtIdSupl = New AtIdSupplement(SettingAtIdList.Load().AtIdList, "@")
722 SettingDialog.IsMonospace = _cfgCommon.IsMonospace
723 If SettingDialog.IsMonospace Then
724 detailHtmlFormatHeader = detailHtmlFormatMono1
725 detailHtmlFormatFooter = detailHtmlFormatMono7
727 detailHtmlFormatHeader = detailHtmlFormat1
728 detailHtmlFormatFooter = detailHtmlFormat7
730 detailHtmlFormatHeader += _fntDetail.Name + detailHtmlFormat2 + _fntDetail.Size.ToString() + detailHtmlFormat3 + _clDetail.R.ToString + "," + _clDetail.G.ToString + "," + _clDetail.B.ToString + detailHtmlFormat4 + _clDetailLink.R.ToString + "," + _clDetailLink.G.ToString + "," + _clDetailLink.B.ToString + detailHtmlFormat5 + _clDetailBackcolor.R.ToString + "," + _clDetailBackcolor.G.ToString + "," + _clDetailBackcolor.B.ToString
731 If SettingDialog.IsMonospace Then
732 detailHtmlFormatHeader += detailHtmlFormatMono6
734 detailHtmlFormatHeader += detailHtmlFormat6
736 Me.IdeographicSpaceToSpaceToolStripMenuItem.Checked = _cfgCommon.WideSpaceConvert
737 Me.ToolStripFocusLockMenuItem.Checked = _cfgCommon.FocusLockToStatusText
739 'Dim statregex As New Regex("^0*")
740 SettingDialog.RecommendStatusText = " [TWNv" + Regex.Replace(fileVersion.Replace(".", ""), "^0*", "") + "]"
744 If DateTime.Now.ToString(SettingDialog.DateTimeFormat).Length = 0 Then
746 ' 変換が成功した場合にLengthが0にならない
747 SettingDialog.DateTimeFormat = "yyyy/MM/dd H:mm:ss"
749 Catch ex As FormatException
750 ' FormatExceptionが発生したら初期値を設定 (=yyyy/MM/dd H:mm:ssとみなされる)
751 SettingDialog.DateTimeFormat = "yyyy/MM/dd H:mm:ss"
754 SettingDialog.Nicoms = _cfgCommon.Nicoms
755 SettingDialog.HotkeyEnabled = _cfgCommon.HotkeyEnabled
756 SettingDialog.HotkeyMod = _cfgCommon.HotkeyModifier
757 SettingDialog.HotkeyKey = _cfgCommon.HotkeyKey
758 SettingDialog.HotkeyValue = _cfgCommon.HotkeyValue
760 SettingDialog.BlinkNewMentions = _cfgCommon.BlinkNewMentions
762 SettingDialog.UseAdditionalCount = _cfgCommon.UseAdditionalCount
763 SettingDialog.MoreCountApi = _cfgCommon.MoreCountApi
764 SettingDialog.FirstCountApi = _cfgCommon.FirstCountApi
765 SettingDialog.SearchCountApi = _cfgCommon.SearchCountApi
766 SettingDialog.FavoritesCountApi = _cfgCommon.FavoritesCountApi
767 'If _cfgCommon.UseAdditionalCount Then
768 ' _FirstRefreshFlags = True
769 ' _FirstListsRefreshFlags = True
771 SettingDialog.UserstreamStartup = _cfgCommon.UserstreamStartup
772 SettingDialog.UserstreamPeriodInt = _cfgCommon.UserstreamPeriod
775 HashSupl = New AtIdSupplement(_cfgCommon.HashTags, "#")
776 HashMgr = New HashtagManage(HashSupl, _
777 _cfgCommon.HashTags.ToArray, _
778 _cfgCommon.HashSelected, _
779 _cfgCommon.HashIsPermanent, _
780 _cfgCommon.HashIsHead)
781 If HashMgr.UseHash <> "" AndAlso HashMgr.IsPermanent Then HashStripSplitButton.Text = HashMgr.UseHash
785 Dim saveRequired As Boolean = False
786 'ユーザー名、パスワードが未設定なら設定画面を表示(初回起動時など)
787 If tw.Username = "" Then
789 '設定せずにキャンセルされた場合はプログラム終了
790 If SettingDialog.ShowDialog() = Windows.Forms.DialogResult.Cancel Then
791 Application.Exit() '強制終了
794 '設定されたが、依然ユーザー名とパスワードが未設定ならプログラム終了
795 If tw.Username = "" Then
796 Application.Exit() '強制終了
801 _fntUnread = SettingDialog.FontUnread
802 _clUnread = SettingDialog.ColorUnread
803 _fntReaded = SettingDialog.FontReaded
804 _clReaded = SettingDialog.ColorReaded
805 _clFav = SettingDialog.ColorFav
806 _clOWL = SettingDialog.ColorOWL
807 _clRetweet = SettingDialog.ColorRetweet
808 _fntDetail = SettingDialog.FontDetail
809 _clDetail = SettingDialog.ColorDetail
810 _clDetailLink = SettingDialog.ColorDetailLink
811 _clDetailBackcolor = SettingDialog.ColorDetailBackcolor
812 _clSelf = SettingDialog.ColorSelf
813 _clAtSelf = SettingDialog.ColorAtSelf
814 _clTarget = SettingDialog.ColorTarget
815 _clAtTarget = SettingDialog.ColorAtTarget
816 _clAtFromTarget = SettingDialog.ColorAtFromTarget
817 _clAtTo = SettingDialog.ColorAtTo
818 _clListBackcolor = SettingDialog.ColorListBackcolor
819 _clInputBackcolor = SettingDialog.ColorInputBackcolor
820 _clInputFont = SettingDialog.ColorInputFont
821 _fntInputFont = SettingDialog.FontInputFont
822 _brsForeColorUnread.Dispose()
823 _brsForeColorReaded.Dispose()
824 _brsForeColorFav.Dispose()
825 _brsForeColorOWL.Dispose()
826 _brsForeColorRetweet.Dispose()
827 _brsForeColorUnread = New SolidBrush(_clUnread)
828 _brsForeColorReaded = New SolidBrush(_clReaded)
829 _brsForeColorFav = New SolidBrush(_clFav)
830 _brsForeColorOWL = New SolidBrush(_clOWL)
831 _brsForeColorRetweet = New SolidBrush(_clRetweet)
832 _brsBackColorMine.Dispose()
833 _brsBackColorAt.Dispose()
834 _brsBackColorYou.Dispose()
835 _brsBackColorAtYou.Dispose()
836 _brsBackColorAtFromTarget.Dispose()
837 _brsBackColorAtTo.Dispose()
838 _brsBackColorNone.Dispose()
839 _brsBackColorMine = New SolidBrush(_clSelf)
840 _brsBackColorAt = New SolidBrush(_clAtSelf)
841 _brsBackColorYou = New SolidBrush(_clTarget)
842 _brsBackColorAtYou = New SolidBrush(_clAtTarget)
843 _brsBackColorAtFromTarget = New SolidBrush(_clAtFromTarget)
844 _brsBackColorAtTo = New SolidBrush(_clAtTo)
845 _brsBackColorNone = New SolidBrush(_clListBackcolor)
847 If SettingDialog.IsMonospace Then
848 detailHtmlFormatHeader = detailHtmlFormatMono1
849 detailHtmlFormatFooter = detailHtmlFormatMono7
851 detailHtmlFormatHeader = detailHtmlFormat1
852 detailHtmlFormatFooter = detailHtmlFormat7
854 detailHtmlFormatHeader += _fntDetail.Name + detailHtmlFormat2 + _fntDetail.Size.ToString() + detailHtmlFormat3 + _clDetail.R.ToString + "," + _clDetail.G.ToString + "," + _clDetail.B.ToString + detailHtmlFormat4 + _clDetailLink.R.ToString + "," + _clDetailLink.G.ToString + "," + _clDetailLink.B.ToString + detailHtmlFormat5 + _clDetailBackcolor.R.ToString + "," + _clDetailBackcolor.G.ToString + "," + _clDetailBackcolor.B.ToString
855 If SettingDialog.IsMonospace Then
856 detailHtmlFormatHeader += detailHtmlFormatMono6
858 detailHtmlFormatHeader += detailHtmlFormat6
860 '他の設定項目は、随時設定画面で保持している値を読み出して使用
863 If SettingDialog.HotkeyEnabled Then
865 Dim modKey As HookGlobalHotkey.ModKeys = HookGlobalHotkey.ModKeys.None
866 If (SettingDialog.HotkeyMod And Keys.Alt) = Keys.Alt Then modKey = modKey Or HookGlobalHotkey.ModKeys.Alt
867 If (SettingDialog.HotkeyMod And Keys.Control) = Keys.Control Then modKey = modKey Or HookGlobalHotkey.ModKeys.Ctrl
868 If (SettingDialog.HotkeyMod And Keys.Shift) = Keys.Shift Then modKey = modKey Or HookGlobalHotkey.ModKeys.Shift
869 If (SettingDialog.HotkeyMod And Keys.LWin) = Keys.LWin Then modKey = modKey Or HookGlobalHotkey.ModKeys.Win
871 _hookGlobalHotkey.RegisterOriginalHotkey(SettingDialog.HotkeyKey, SettingDialog.HotkeyValue, modKey)
875 HttpConnection.InitializeConnection(SettingDialog.DefaultTimeOut, _
876 SettingDialog.SelectedProxyType, _
877 SettingDialog.ProxyAddress, _
878 SettingDialog.ProxyPort, _
879 SettingDialog.ProxyUser, _
880 SettingDialog.ProxyPassword)
881 'tw.CountApi = SettingDialog.CountApi
882 'tw.CountApiReply = SettingDialog.CountApiReply
883 tw.RestrictFavCheck = SettingDialog.RestrictFavCheck
884 tw.ReadOwnPost = SettingDialog.ReadOwnPost
885 tw.UseSsl = SettingDialog.UseSsl
886 ShortUrl.IsResolve = SettingDialog.TinyUrlResolve
887 ShortUrl.BitlyId = SettingDialog.BitlyUser
888 ShortUrl.BitlyKey = SettingDialog.BitlyPwd
889 HttpTwitter.TwitterUrl = _cfgCommon.TwitterUrl
890 HttpTwitter.TwitterSearchUrl = _cfgCommon.TwitterSearchUrl
891 tw.TrackWord = _cfgCommon.TrackWord
892 TrackToolStripMenuItem.Checked = Not String.IsNullOrEmpty(tw.TrackWord)
893 tw.AllAtReply = _cfgCommon.AllAtReply
894 AllrepliesToolStripMenuItem.Checked = tw.AllAtReply
896 Outputz.Key = SettingDialog.OutputzKey
897 Outputz.Enabled = SettingDialog.OutputzEnabled
898 Select Case SettingDialog.OutputzUrlmode
899 Case OutputzUrlmode.twittercom
900 Outputz.OutUrl = "http://twitter.com/"
901 Case OutputzUrlmode.twittercomWithUsername
902 Outputz.OutUrl = "http://twitter.com/" + tw.Username
906 SetImageServiceCombo()
907 ImageSelectionPanel.Enabled = False
910 Me.ClientSize = _cfgLocal.FormSize
911 _mySize = _cfgLocal.FormSize 'サイズ保持(最小化・最大化されたまま終了した場合の対応用)
912 _myLoc = _cfgLocal.FormLocation
914 If Me.WindowState <> FormWindowState.Minimized Then
915 Me.DesktopLocation = _cfgLocal.FormLocation
916 Dim tbarRect As New Rectangle(Me.Location, New Size(_mySize.Width, SystemInformation.CaptionHeight))
917 Dim outOfScreen As Boolean = True
918 If Screen.AllScreens.Length = 1 Then 'ハングするとの報告
919 For Each scr As Screen In Screen.AllScreens
920 If Not Rectangle.Intersect(tbarRect, scr.Bounds).IsEmpty Then
926 Me.DesktopLocation = New Point(0, 0)
927 _myLoc = Me.DesktopLocation
931 Me.TopMost = SettingDialog.AlwaysTop
932 _mySpDis = _cfgLocal.SplitterDistance
933 _mySpDis2 = _cfgLocal.StatusTextHeight
934 _mySpDis3 = _cfgLocal.PreviewDistance
935 If _mySpDis3 = -1 Then
936 _mySpDis3 = _mySize.Width - 150
937 If _mySpDis3 < 1 Then _mySpDis3 = 50
938 _cfgLocal.PreviewDistance = _mySpDis3
940 MultiLineMenuItem.Checked = _cfgLocal.StatusMultiline
941 'Me.Tween_ClientSizeChanged(Me, Nothing)
942 PlaySoundMenuItem.Checked = SettingDialog.PlaySound
943 Me.PlaySoundFileMenuItem.Checked = SettingDialog.PlaySound
945 StatusText.Font = _fntInputFont
946 StatusText.ForeColor = _clInputFont
948 '全新着通知のチェック状態により、Reply&DMの新着通知有効無効切り替え(タブ別設定にするため削除予定)
949 If SettingDialog.UnreadManage = False Then
950 ReadedStripMenuItem.Enabled = False
951 UnreadStripMenuItem.Enabled = False
955 TimerTimeline.AutoReset = True
956 TimerTimeline.SynchronizingObject = Me
958 TimerTimeline.Interval = 1000
959 TimerTimeline.Enabled = True
962 TimerRefreshIcon.Interval = 200
963 TimerRefreshIcon.Enabled = True
966 StatusLabel.Text = ""
967 StatusLabel.AutoToolTip = False
968 StatusLabel.ToolTipText = ""
970 lblLen.Text = GetRestStatusCount(True, False).ToString()
972 ''''''''''''''''''''''''''''''''''''''''
973 _statuses.SortOrder = DirectCast(_cfgCommon.SortOrder, System.Windows.Forms.SortOrder)
974 Dim mode As IdComparerClass.ComparerMode
975 Select Case _cfgCommon.SortColumn
976 Case 0, 5, 6 '0:アイコン,5:未読マーク,6:プロテクト・フィルターマーク
978 mode = IdComparerClass.ComparerMode.Id 'Idソートに読み替え
980 mode = IdComparerClass.ComparerMode.Nickname
982 mode = IdComparerClass.ComparerMode.Data
984 mode = IdComparerClass.ComparerMode.Id
986 mode = IdComparerClass.ComparerMode.Name
988 mode = IdComparerClass.ComparerMode.Source
990 _statuses.SortMode = mode
991 ''''''''''''''''''''''''''''''''''''''''
993 Select Case SettingDialog.IconSz
994 Case IconSizes.IconNone
996 Case IconSizes.Icon16
998 Case IconSizes.Icon24
1000 Case IconSizes.Icon48
1002 Case IconSizes.Icon48_2
1010 tw.IconSize = _iconSz
1012 tw.TinyUrlResolve = SettingDialog.TinyUrlResolve
1014 '発言詳細部アイコンをリストアイコンにサイズ変更
1015 Dim sz As Integer = _iconSz
1021 TIconDic = New ImageDictionary(5000)
1023 tw.DetailIcon = TIconDic
1025 StatusLabel.Text = My.Resources.Form1_LoadText1 '画面右下の状態表示を変更
1026 StatusLabelUrl.Text = "" '画面左下のリンク先URL表示部を初期化
1027 NameLabel.Text = "" '発言詳細部名前ラベル初期化
1028 DateTimeLabel.Text = "" '発言詳細部日時ラベル初期化
1029 SourceLinkLabel.Text = "" 'Source部分初期化
1031 '<<<<<<<<タブ関連>>>>>>>
1032 'デフォルトタブの存在チェック、ない場合には追加
1033 If _statuses.GetTabByType(TabUsageType.Home) Is Nothing Then
1034 If Not _statuses.Tabs.ContainsKey(DEFAULTTAB.RECENT) Then
1035 _statuses.AddTab(DEFAULTTAB.RECENT, TabUsageType.Home, Nothing)
1037 _statuses.Tabs(DEFAULTTAB.RECENT).TabType = TabUsageType.Home
1040 If _statuses.GetTabByType(TabUsageType.Mentions) Is Nothing Then
1041 If Not _statuses.Tabs.ContainsKey(DEFAULTTAB.REPLY) Then
1042 _statuses.AddTab(DEFAULTTAB.REPLY, TabUsageType.Mentions, Nothing)
1044 _statuses.Tabs(DEFAULTTAB.REPLY).TabType = TabUsageType.Mentions
1047 If _statuses.GetTabByType(TabUsageType.DirectMessage) Is Nothing Then
1048 If Not _statuses.Tabs.ContainsKey(DEFAULTTAB.DM) Then
1049 _statuses.AddTab(DEFAULTTAB.DM, TabUsageType.DirectMessage, Nothing)
1051 _statuses.Tabs(DEFAULTTAB.DM).TabType = TabUsageType.DirectMessage
1054 If _statuses.GetTabByType(TabUsageType.Favorites) Is Nothing Then
1055 If Not _statuses.Tabs.ContainsKey(DEFAULTTAB.FAV) Then
1056 _statuses.AddTab(DEFAULTTAB.FAV, TabUsageType.Favorites, Nothing)
1058 _statuses.Tabs(DEFAULTTAB.FAV).TabType = TabUsageType.Favorites
1061 For Each tn As String In _statuses.Tabs.Keys
1062 If _statuses.Tabs(tn).TabType = TabUsageType.Undefined Then
1063 _statuses.Tabs(tn).TabType = TabUsageType.UserDefined
1065 If Not AddNewTab(tn, True, _statuses.Tabs(tn).TabType) Then Throw New Exception("タブ作成エラー")
1068 Me.JumpReadOpMenuItem.ShortcutKeyDisplayString = "Space"
1069 CopySTOTMenuItem.ShortcutKeyDisplayString = "Ctrl+C"
1070 CopyURLMenuItem.ShortcutKeyDisplayString = "Ctrl+Shift+C"
1071 CopyUserIdStripMenuItem.ShortcutKeyDisplayString = "Shift+Alt+C"
1073 If SettingDialog.MinimizeToTray = False OrElse Me.WindowState <> FormWindowState.Minimized Then
1076 _curTab = ListTab.SelectedTab
1078 _curList = DirectCast(_curTab.Tag, DetailsListView)
1079 SetMainWindowTitle()
1082 If SettingDialog.TabIconDisp Then
1083 ListTab.DrawMode = TabDrawMode.Normal
1085 ListTab.DrawMode = TabDrawMode.OwnerDrawFixed
1086 AddHandler ListTab.DrawItem, AddressOf ListTab_DrawItem
1087 ListTab.ImageList = Nothing
1090 _ignoreConfigSave = False
1091 Me.TweenMain_Resize(Nothing, Nothing)
1092 If saveRequired Then SaveConfigsAll(False)
1095 Private Sub spaceKeyCanceler_SpaceCancel(ByVal sender As Object, ByVal e As EventArgs)
1096 JumpUnreadMenuItem_Click(Nothing, Nothing)
1099 Private Sub ListTab_DrawItem( _
1100 ByVal sender As Object, ByVal e As DrawItemEventArgs)
1103 txt = ListTab.TabPages(e.Index).Text
1104 Catch ex As Exception
1108 e.Graphics.FillRectangle(System.Drawing.SystemBrushes.Control, e.Bounds)
1109 If e.State = DrawItemState.Selected Then
1110 e.DrawFocusRectangle()
1114 If _statuses.Tabs(txt).UnreadCount > 0 Then
1117 fore = System.Drawing.SystemBrushes.ControlText
1119 Catch ex As Exception
1120 fore = System.Drawing.SystemBrushes.ControlText
1122 e.Graphics.DrawString(txt, e.Font, fore, e.Bounds, sfTab)
1125 'Private Function LoadOldConfig() As Boolean
1126 ' Dim needToSave As Boolean = False
1127 ' _cfgCommon = SettingCommon.Load()
1128 ' _cfgLocal = SettingLocal.Load()
1129 ' If _cfgCommon.TabList.Count > 0 Then
1130 ' For Each tabName As String In _cfgCommon.TabList
1131 ' _statuses.Tabs.Add(tabName, SettingTab.Load(tabName).Tab)
1132 ' If tabName <> ReplaceInvalidFilename(tabName) Then
1133 ' Dim tb As TabClass = _statuses.Tabs(tabName)
1134 ' _statuses.RemoveTab(tabName)
1135 ' tb.TabName = ReplaceInvalidFilename(tabName)
1136 ' _statuses.Tabs.Add(ReplaceInvalidFilename(tabName), tb)
1137 ' Dim tabSetting As New SettingTab
1138 ' tabSetting.Tab = tb
1144 ' _statuses.AddTab(DEFAULTTAB.RECENT, TabUsageType.Home, Nothing)
1145 ' _statuses.AddTab(DEFAULTTAB.REPLY, TabUsageType.Mentions, Nothing)
1146 ' _statuses.AddTab(DEFAULTTAB.DM, TabUsageType.DirectMessage, Nothing)
1147 ' _statuses.AddTab(DEFAULTTAB.FAV, TabUsageType.Favorites, Nothing)
1149 ' If needToSave Then
1150 ' _cfgCommon.TabList.Clear()
1151 ' For Each tabName As String In _statuses.Tabs.Keys
1152 ' _cfgCommon.TabList.Add(tabName)
1157 ' If System.IO.File.Exists(SettingCommon.GetSettingFilePath("")) Then
1164 Private Sub LoadConfig()
1165 Dim needToSave As Boolean = False
1166 _cfgCommon = SettingCommon.Load()
1167 _cfgLocal = SettingLocal.Load()
1168 Dim tabs As List(Of TabClass) = SettingTabs.Load().Tabs
1169 For Each tb As TabClass In tabs
1170 _statuses.Tabs.Add(tb.TabName, tb)
1172 If _statuses.Tabs.Count = 0 Then
1173 _statuses.AddTab(DEFAULTTAB.RECENT, TabUsageType.Home, Nothing)
1174 _statuses.AddTab(DEFAULTTAB.REPLY, TabUsageType.Mentions, Nothing)
1175 _statuses.AddTab(DEFAULTTAB.DM, TabUsageType.DirectMessage, Nothing)
1176 _statuses.AddTab(DEFAULTTAB.FAV, TabUsageType.Favorites, Nothing)
1180 'Private Sub ConvertConfig()
1182 ' If System.IO.File.Exists(SettingTabs.GetSettingFilePath("")) Then
1189 Private Sub TimerTimeline_Elapsed(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerTimeline.Elapsed
1190 Static homeCounter As Integer = 0
1191 Static mentionCounter As Integer = 0
1192 Static dmCounter As Integer = 0
1193 Static pubSearchCounter As Integer = 0
1194 Static listsCounter As Integer = 0
1195 Static usCounter As Integer = 0
1197 If homeCounter > 0 Then Interlocked.Decrement(homeCounter)
1198 If mentionCounter > 0 Then Interlocked.Decrement(mentionCounter)
1199 If dmCounter > 0 Then Interlocked.Decrement(dmCounter)
1200 If pubSearchCounter > 0 Then Interlocked.Decrement(pubSearchCounter)
1201 If listsCounter > 0 Then Interlocked.Decrement(listsCounter)
1202 If usCounter > 0 Then Interlocked.Decrement(usCounter)
1205 If homeCounter <= 0 AndAlso SettingDialog.TimelinePeriodInt > 0 Then
1206 'Dim period As Integer
1207 'Interlocked.Exchange(period, 0)
1208 'Interlocked.Add(period, SettingDialog.TimelinePeriodInt)
1209 'Interlocked.Add(period, -_homeCounterAdjuster)
1210 'Interlocked.Exchange(_homeCounter, period)
1211 Interlocked.Exchange(homeCounter, SettingDialog.TimelinePeriodInt)
1212 If Not Me._isActiveUserstream Then GetTimeline(WORKERTYPE.Timeline, 1, 0, "")
1214 If mentionCounter <= 0 AndAlso SettingDialog.ReplyPeriodInt > 0 Then
1215 Interlocked.Exchange(mentionCounter, SettingDialog.ReplyPeriodInt)
1216 If Not Me._isActiveUserstream Then GetTimeline(WORKERTYPE.Reply, 1, 0, "")
1218 If dmCounter <= 0 AndAlso SettingDialog.DMPeriodInt > 0 Then
1219 Interlocked.Exchange(dmCounter, SettingDialog.DMPeriodInt)
1220 If Not Me._isActiveUserstream Then GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
1222 If pubSearchCounter <= 0 AndAlso SettingDialog.PubSearchPeriodInt > 0 Then
1223 Interlocked.Exchange(pubSearchCounter, SettingDialog.PubSearchPeriodInt)
1224 GetTimeline(WORKERTYPE.PublicSearch, 1, 0, "")
1226 If listsCounter <= 0 AndAlso SettingDialog.ListsPeriodInt > 0 Then
1227 Interlocked.Exchange(listsCounter, SettingDialog.ListsPeriodInt)
1228 GetTimeline(WORKERTYPE.List, 1, 0, "")
1230 If usCounter <= 0 AndAlso SettingDialog.UserstreamPeriodInt > 0 Then
1231 Interlocked.Exchange(usCounter, SettingDialog.UserstreamPeriodInt)
1232 If Me._isActiveUserstream Then RefreshTimeline(True)
1237 Private Sub RefreshTimeline(ByVal isUserStream As Boolean)
1239 Dim smode As Integer = -1 '-1:制御しない,-2:最新へ,その他:topitem使用
1240 Dim topId As Long = GetScrollPos(smode)
1241 Dim befCnt As Integer = _curList.VirtualListSize
1244 Dim selId As New Dictionary(Of String, Long())
1245 Dim focusedId As New Dictionary(Of String, Long)
1246 SaveSelectedStatus(selId, focusedId)
1249 Dim dmCount As Integer = _statuses.GetTabByType(TabUsageType.DirectMessage).AllCount
1252 Dim notifyPosts() As PostClass = Nothing
1253 Dim soundFile As String = ""
1254 Dim addCount As Integer = 0
1255 Dim isMention As Boolean = False
1256 addCount = _statuses.SubmitUpdate(soundFile, notifyPosts, isMention, isUserStream)
1258 If _endingFlag Then Exit Sub
1262 For Each tab As TabPage In ListTab.TabPages
1263 Dim lst As DetailsListView = DirectCast(tab.Tag, DetailsListView)
1264 Dim tabInfo As TabClass = _statuses.Tabs(tab.Text)
1266 If lst.VirtualListSize <> tabInfo.AllCount Then
1267 If lst.Equals(_curList) Then
1268 _itemCache = Nothing
1269 _postCache = Nothing
1272 lst.VirtualListSize = tabInfo.AllCount 'リスト件数更新
1273 Catch ex As Exception
1276 Me.SelectListItem(lst, _
1277 _statuses.IndexOf(tab.Text, selId(tab.Text)), _
1278 _statuses.IndexOf(tab.Text, focusedId(tab.Text)))
1281 If tabInfo.UnreadCount > 0 Then
1282 If SettingDialog.TabIconDisp Then
1283 If tab.ImageIndex = -1 Then tab.ImageIndex = 0 'タブアイコン
1287 If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
1288 Catch ex As Exception
1289 'ex.Data("Msg") = "Ref1, UseAPI=" + SettingDialog.UseAPI.ToString
1295 If befCnt <> _curList.VirtualListSize Then
1299 _curList.EnsureVisible(0)
1302 If _curList.VirtualListSize > 0 Then _curList.EnsureVisible(_curList.VirtualListSize - 1)
1307 If _curList.VirtualListSize > 0 AndAlso _statuses.IndexOf(_curTab.Text, topId) > -1 Then
1308 _curList.EnsureVisible(_curList.VirtualListSize - 1)
1309 _curList.EnsureVisible(_statuses.IndexOf(_curTab.Text, topId))
1313 Catch ex As Exception
1314 ex.Data("Msg") = "Ref2"
1319 NotifyNewPosts(notifyPosts,
1322 isMention OrElse dmCount <> _statuses.GetTabByType(TabUsageType.DirectMessage).AllCount)
1324 SetMainWindowTitle()
1325 If Not StatusLabelUrl.Text.StartsWith("http") Then SetStatusLabelUrl()
1327 HashSupl.AddRangeItem(tw.GetHashList)
1331 Private Function GetScrollPos(ByRef smode As Integer) As Long
1332 Dim topId As Long = -1
1333 If _curList IsNot Nothing AndAlso _curTab IsNot Nothing AndAlso _curList.VirtualListSize > 0 Then
1334 If _statuses.SortMode = IdComparerClass.ComparerMode.Id Then
1335 If _statuses.SortOrder = SortOrder.Ascending Then
1337 If ListLockMenuItem.Checked Then
1341 If _curList.TopItem IsNot Nothing Then topId = _statuses.GetId(_curTab.Text, _curList.TopItem.Index)
1344 '最下行が表示されていたら、最下行へ強制スクロール。最下行が表示されていなかったら制御しない
1345 Dim _item As ListViewItem
1346 _item = _curList.GetItemAt(0, _curList.ClientSize.Height - 1) '一番下
1347 If _item Is Nothing Then _item = _curList.Items(_curList.Items.Count - 1)
1348 If _item.Index = _curList.Items.Count - 1 Then
1352 If _curList.TopItem IsNot Nothing Then topId = _statuses.GetId(_curTab.Text, _curList.TopItem.Index)
1358 If ListLockMenuItem.Checked Then
1360 If _curList.TopItem IsNot Nothing Then topId = _statuses.GetId(_curTab.Text, _curList.TopItem.Index)
1363 '最上行が表示されていたら、制御しない。最上行が表示されていなかったら、現在表示位置へ強制スクロール
1364 Dim _item As ListViewItem
1366 _item = _curList.GetItemAt(0, 10) '一番上
1367 If _item Is Nothing Then _item = _curList.Items(0)
1368 If _item.Index = 0 Then
1371 If _curList.TopItem IsNot Nothing Then topId = _statuses.GetId(_curTab.Text, _curList.TopItem.Index)
1378 If _curList.TopItem IsNot Nothing Then topId = _statuses.GetId(_curTab.Text, _curList.TopItem.Index)
1387 Private Sub SaveSelectedStatus(ByVal selId As Dictionary(Of String, Long()), ByVal focusedId As Dictionary(Of String, Long))
1388 If _endingFlag Then Exit Sub
1389 For Each tab As TabPage In ListTab.TabPages
1390 Dim lst As DetailsListView = DirectCast(tab.Tag, DetailsListView)
1391 If lst.SelectedIndices.Count > 0 AndAlso lst.SelectedIndices.Count < 31 Then
1392 selId.Add(tab.Text, _statuses.GetId(tab.Text, lst.SelectedIndices))
1394 selId.Add(tab.Text, New Long(0) {-1})
1396 If lst.FocusedItem IsNot Nothing Then
1397 focusedId.Add(tab.Text, _statuses.GetId(tab.Text, lst.FocusedItem.Index))
1399 focusedId.Add(tab.Text, -1)
1405 Private Sub NotifyNewPosts(ByVal notifyPosts() As PostClass, ByVal soundFile As String, ByVal addCount As Integer, ByVal newMentions As Boolean)
1408 NewPostPopMenuItem.Checked AndAlso _
1409 notifyPosts IsNot Nothing AndAlso _
1410 notifyPosts.Length > 0 AndAlso _
1411 Not _initial AndAlso _
1414 SettingDialog.LimitBalloon AndAlso _
1416 Me.WindowState = FormWindowState.Minimized OrElse _
1417 Not Me.Visible OrElse _
1418 Form.ActiveForm Is Nothing _
1421 Not SettingDialog.LimitBalloon _
1424 Not IsScreenSaverRunning() Then
1425 Dim sb As New StringBuilder
1426 Dim reply As Boolean = False
1427 Dim dm As Boolean = False
1428 For Each post As PostClass In notifyPosts
1429 If post.IsReply AndAlso Not post.IsExcludeReply Then reply = True
1430 If post.IsDm Then dm = True
1431 If sb.Length > 0 Then sb.Append(System.Environment.NewLine)
1432 Select Case SettingDialog.NameBalloon
1433 Case NameBalloonEnum.UserID
1434 sb.Append(post.Name).Append(" : ")
1435 Case NameBalloonEnum.NickName
1436 sb.Append(post.Nickname).Append(" : ")
1438 sb.Append(post.Data)
1440 If SettingDialog.DispUsername Then NotifyIcon1.BalloonTipTitle = tw.Username + " - " Else NotifyIcon1.BalloonTipTitle = ""
1442 NotifyIcon1.BalloonTipIcon = ToolTipIcon.Warning
1443 NotifyIcon1.BalloonTipTitle += "Tween [DM] " + My.Resources.RefreshDirectMessageText1 + " " + addCount.ToString() + My.Resources.RefreshDirectMessageText2
1445 NotifyIcon1.BalloonTipIcon = ToolTipIcon.Warning
1446 NotifyIcon1.BalloonTipTitle += "Tween [Reply!] " + My.Resources.RefreshTimelineText1 + " " + addCount.ToString() + My.Resources.RefreshTimelineText2
1448 NotifyIcon1.BalloonTipIcon = ToolTipIcon.Info
1449 NotifyIcon1.BalloonTipTitle += "Tween " + My.Resources.RefreshTimelineText1 + " " + addCount.ToString() + My.Resources.RefreshTimelineText2
1451 Dim bText As String = sb.ToString
1452 If String.IsNullOrEmpty(bText) Then Exit Sub
1453 NotifyIcon1.BalloonTipText = sb.ToString()
1454 NotifyIcon1.ShowBalloonTip(500)
1458 If Not _initial AndAlso SettingDialog.PlaySound AndAlso soundFile <> "" Then
1460 Dim dir As String = My.Application.Info.DirectoryPath
1461 If Directory.Exists(Path.Combine(dir, "Sounds")) Then
1462 dir = Path.Combine(dir, "Sounds")
1464 My.Computer.Audio.Play(Path.Combine(dir, soundFile), AudioPlayMode.Background)
1465 Catch ex As Exception
1471 If Not _initial AndAlso SettingDialog.BlinkNewMentions AndAlso newMentions AndAlso Form.ActiveForm Is Nothing Then
1472 FlashMyWindow(Me.Handle, FlashSpecification.FlashTray, 3)
1477 Private Sub MyList_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
1478 If _curList.SelectedIndices.Count <> 1 Then Exit Sub
1479 'If _curList.SelectedIndices.Count = 0 Then Exit Sub
1481 _curItemIndex = _curList.SelectedIndices(0)
1482 'If _curPost Is GetCurTabPost(_curItemIndex) Then Exit Sub 'refreshで既読化されるのを防ぐため追加
1483 _curPost = GetCurTabPost(_curItemIndex)
1484 If SettingDialog.UnreadManage Then _statuses.SetRead(True, _curTab.Text, _curItemIndex)
1485 'MyList.RedrawItems(MyList.SelectedIndices(0), MyList.SelectedIndices(0), False) 'RetrieveVirtualItemが発生することを期待
1487 ChangeCacheStyleRead(True, _curItemIndex, _curTab) '既読へ(フォント、文字色)
1489 'ColorizeList(-1) '全キャッシュ更新(背景色)
1495 Private Sub ChangeCacheStyleRead(ByVal Read As Boolean, ByVal Index As Integer, ByVal Tab As TabPage)
1496 'Read:True=既読 False=未読
1497 '未読管理していなかったら既読として扱う
1498 If Not _statuses.Tabs(_curTab.Text).UnreadManage OrElse _
1499 Not SettingDialog.UnreadManage Then Read = True
1502 Dim itm As ListViewItem
1503 Dim post As PostClass
1504 If Tab.Equals(_curTab) AndAlso _itemCache IsNot Nothing AndAlso Index >= _itemCacheIndex AndAlso Index < _itemCacheIndex + _itemCache.Length Then
1505 itm = _itemCache(Index - _itemCacheIndex)
1506 post = _postCache(Index - _itemCacheIndex)
1508 itm = DirectCast(Tab.Tag, DetailsListView).Items(Index)
1509 post = _statuses.Item(Tab.Text, Index)
1512 ChangeItemStyleRead(Read, itm, post, DirectCast(Tab.Tag, DetailsListView))
1515 Private Sub ChangeItemStyleRead(ByVal Read As Boolean, ByVal Item As ListViewItem, ByVal Post As PostClass, ByVal DList As DetailsListView)
1520 Item.SubItems(5).Text = ""
1523 Item.SubItems(5).Text = "★"
1529 ElseIf Post.RetweetedId > 0 Then
1531 ElseIf Post.IsOwl AndAlso (Post.IsDm OrElse SettingDialog.OneWayLove) Then
1533 ElseIf Read OrElse Not SettingDialog.UseUnreadStyle Then
1538 If DList Is Nothing OrElse Item.Index = -1 Then
1540 If SettingDialog.UseUnreadStyle Then
1545 If SettingDialog.UseUnreadStyle Then
1546 DList.ChangeItemFontAndColor(Item.Index, cl, fnt)
1548 DList.ChangeItemForeColor(Item.Index, cl)
1550 'If _itemCache IsNot Nothing Then DList.RedrawItems(_itemCacheIndex, _itemCacheIndex + _itemCache.Length - 1, False)
1554 Private Sub ColorizeList()
1555 'Index:更新対象のListviewItem.Index。Colorを返す。
1556 '-1は全キャッシュ。Colorは返さない(ダミーを戻す)
1557 Dim _post As PostClass
1564 If _itemCache Is Nothing Then Exit Sub
1566 If _post Is Nothing Then Exit Sub
1569 For cnt As Integer = 0 To _itemCache.Length - 1
1570 _curList.ChangeItemBackColor(_itemCacheIndex + cnt, JudgeColor(_post, _postCache(cnt)))
1572 Catch ex As Exception
1576 Private Sub ColorizeList(ByVal Item As ListViewItem, ByVal Index As Integer)
1577 'Index:更新対象のListviewItem.Index。Colorを返す。
1578 '-1は全キャッシュ。Colorは返さない(ダミーを戻す)
1579 Dim _post As PostClass
1586 Dim tPost As PostClass = GetCurTabPost(Index)
1588 If _post Is Nothing Then Exit Sub
1590 If Item.Index = -1 Then
1591 Item.BackColor = JudgeColor(_post, tPost)
1593 _curList.ChangeItemBackColor(Item.Index, JudgeColor(_post, tPost))
1597 Private Function JudgeColor(ByVal BasePost As PostClass, ByVal TargetPost As PostClass) As Color
1599 If TargetPost.Id = BasePost.InReplyToId Then
1602 ElseIf TargetPost.IsMe Then
1605 ElseIf TargetPost.IsReply Then
1608 ElseIf BasePost.ReplyToList.Contains(TargetPost.Name.ToLower()) Then
1610 cl = _clAtFromTarget
1611 ElseIf TargetPost.ReplyToList.Contains(BasePost.Name.ToLower()) Then
1614 ElseIf TargetPost.Name.Equals(BasePost.Name, StringComparison.OrdinalIgnoreCase) Then
1619 cl = _clListBackcolor
1624 Private Sub PostButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PostButton.Click
1625 If StatusText.Text.Trim.Length = 0 Then
1626 If Not ImageSelectionPanel.Enabled Then
1632 If _curPost IsNot Nothing AndAlso StatusText.Text.Trim() = String.Format("RT @{0}: {1}", _curPost.Name, _curPost.Data) Then
1633 Dim rtResult As DialogResult = MessageBox.Show(String.Format(My.Resources.PostButton_Click1, Environment.NewLine),
1635 MessageBoxButtons.YesNoCancel,
1636 MessageBoxIcon.Question)
1637 Select Case rtResult
1638 Case Windows.Forms.DialogResult.Yes
1639 doReTweetOfficial(False)
1640 StatusText.Text = ""
1642 Case Windows.Forms.DialogResult.Cancel
1647 _history(_history.Count - 1) = New PostingStatus(StatusText.Text.Trim, _reply_to_id, _reply_to_name)
1649 If SettingDialog.UrlConvertAuto Then
1650 StatusText.SelectionStart = StatusText.Text.Length
1651 UrlConvertAutoToolStripMenuItem_Click(Nothing, Nothing)
1652 ElseIf SettingDialog.Nicoms Then
1653 StatusText.SelectionStart = StatusText.Text.Length
1654 UrlConvert(UrlConverter.Nicoms)
1656 StatusText.SelectionStart = StatusText.Text.Length
1657 Dim args As New GetWorkerArg()
1660 args.type = WORKERTYPE.PostMessage
1661 CheckReplyTo(StatusText.Text)
1664 Dim adjustCount As Integer = 0
1665 Dim tmpStatus As String = StatusText.Text.Trim
1666 If ToolStripMenuItemApiCommandEvasion.Checked Then
1668 If Regex.IsMatch(tmpStatus, _
1669 "^[+\-\[\]\s\\.,*/(){}^~|='&%$#""<>?]*(get|g|fav|follow|f|on|off|stop|quit|leave|l|whois|w|nudge|n|stats|invite|track|untrack|tracks|tracking|\*)([+\-\[\]\s\\.,*/(){}^~|='&%$#""<>?]+|$)", _
1670 RegexOptions.IgnoreCase) _
1671 AndAlso tmpStatus.EndsWith(" .") = False Then adjustCount += 2
1674 If ToolStripMenuItemUrlMultibyteSplit.Checked Then
1676 adjustCount += Regex.Matches(tmpStatus, "https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#^]+").Count
1679 Dim isCutOff As Boolean = False
1680 Dim isRemoveFooter As Boolean = My.Computer.Keyboard.ShiftKeyDown
1681 If StatusText.Multiline AndAlso Not SettingDialog.PostCtrlEnter Then
1682 '複数行でEnter投稿の場合、Ctrlも押されていたらフッタ付加しない
1683 isRemoveFooter = My.Computer.Keyboard.CtrlKeyDown
1685 If SettingDialog.PostShiftEnter Then
1686 isRemoveFooter = My.Computer.Keyboard.CtrlKeyDown
1688 If Not isRemoveFooter AndAlso (StatusText.Text.Contains("RT @") OrElse StatusText.Text.Contains("QT @")) Then
1689 isRemoveFooter = True
1691 If GetRestStatusCount(False, Not isRemoveFooter) - adjustCount < 0 Then
1692 If MessageBox.Show(My.Resources.PostLengthOverMessage1, My.Resources.PostLengthOverMessage2, MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.OK Then
1694 If Not SettingDialog.UrlConvertAuto Then UrlConvertAutoToolStripMenuItem_Click(Nothing, Nothing)
1695 If GetRestStatusCount(False, Not isRemoveFooter) - adjustCount < 0 Then
1696 isRemoveFooter = True
1703 Dim footer As String = ""
1704 Dim header As String = ""
1705 If StatusText.Text.StartsWith("D ") OrElse StatusText.Text.StartsWith("d ") Then
1710 If HashMgr.UseHash <> "" Then
1711 If HashMgr.IsHead Then
1712 header = HashMgr.UseHash + " "
1714 footer = " " + HashMgr.UseHash
1717 If Not isRemoveFooter Then
1718 If SettingDialog.UseRecommendStatus Then
1720 footer += SettingDialog.RecommendStatusText
1722 ' テキストボックスに入力されている文字列を使用する
1723 footer += " " + SettingDialog.Status.Trim
1727 args.status.status = header + StatusText.Text.Trim + footer
1729 If ToolStripMenuItemApiCommandEvasion.Checked Then
1731 If Regex.IsMatch(args.status.status, _
1732 "^[+\-\[\]\s\\.,*/(){}^~|='&%$#""<>?]*(get|g|fav|follow|f|on|off|stop|quit|leave|l|whois|w|nudge|n|stats|invite|track|untrack|tracks|tracking|\*)([+\-\[\]\s\\.,*/(){}^~|='&%$#""<>?]+|$)", _
1733 RegexOptions.IgnoreCase) _
1734 AndAlso args.status.status.EndsWith(" .") = False Then args.status.status += " ."
1737 If ToolStripMenuItemUrlMultibyteSplit.Checked Then
1739 Dim mc2 As Match = Regex.Match(args.status.status, "https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#^]+")
1740 If mc2.Success Then args.status.status = Regex.Replace(args.status.status, "https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#^]+", "$& ")
1743 If IdeographicSpaceToSpaceToolStripMenuItem.Checked Then
1744 ' 文中の全角スペースを半角スペース1個にする
1745 args.status.status = args.status.status.Replace(" ", " ")
1748 If isCutOff AndAlso args.status.status.Length > 140 Then
1749 args.status.status = args.status.status.Substring(0, 140)
1750 Dim AtId As String = "(@|@)[a-z0-9_/]+$"
1751 Dim HashTag As String = "(^|[^0-9A-Z&\/\?]+)(#|#)([0-9A-Z_]*[A-Z_]+)$"
1752 Dim Url As String = "https?:\/\/[a-z0-9!\*'\(\);:&=\+\$\/%#\[\]\-_\.,~?]+$" '簡易判定
1753 Dim pattern As String = String.Format("({0})|({1})|({2})", AtId, HashTag, Url)
1754 Dim mc As Match = Regex.Match(args.status.status, pattern, RegexOptions.IgnoreCase)
1756 'さらに@ID、ハッシュタグ、URLと推測される文字列をカットする
1757 args.status.status = args.status.status.Substring(0, 140 - mc.Value.Length)
1759 If MessageBox.Show(args.status.status, "Post or Cancel?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then Exit Sub
1762 args.status.inReplyToId = _reply_to_id
1763 args.status.inReplyToName = _reply_to_name
1764 If ImageSelectionPanel.Visible Then
1766 If ImageSelectedPicture.Image IsNot ImageSelectedPicture.InitialImage AndAlso _
1767 ImageServiceCombo.SelectedIndex > -1 AndAlso _
1768 ImagefilePathText.Text <> "" Then
1769 If MessageBox.Show(My.Resources.PostPictureConfirm1, _
1770 My.Resources.PostPictureConfirm2, _
1771 MessageBoxButtons.OKCancel, _
1772 MessageBoxIcon.Question, _
1773 MessageBoxDefaultButton.Button1) _
1774 = Windows.Forms.DialogResult.Cancel Then
1775 TimelinePanel.Visible = True
1776 TimelinePanel.Enabled = True
1777 ImageSelectionPanel.Visible = False
1778 ImageSelectionPanel.Enabled = False
1779 If _curList IsNot Nothing Then
1784 args.status.imageService = ImageServiceCombo.Text
1785 args.status.imagePath = ImagefilePathText.Text
1786 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
1787 ImagefilePathText.Text = ""
1788 TimelinePanel.Visible = True
1789 TimelinePanel.Enabled = True
1790 ImageSelectionPanel.Visible = False
1791 ImageSelectionPanel.Enabled = False
1792 If _curList IsNot Nothing Then
1796 MessageBox.Show(My.Resources.PostPictureWarn1, My.Resources.PostPictureWarn2)
1804 If StatusText.Text.StartsWith("Google:", StringComparison.OrdinalIgnoreCase) AndAlso StatusText.Text.Trim.Length > 7 Then
1805 Dim tmp As String = String.Format(My.Resources.SearchItem2Url, HttpUtility.UrlEncode(StatusText.Text.Substring(7)))
1811 StatusText.Text = ""
1812 _history.Add(New PostingStatus)
1813 _hisIdx = _history.Count - 1
1814 If Not ToolStripFocusLockMenuItem.Checked Then
1815 DirectCast(ListTab.SelectedTab.Tag, Control).Focus()
1817 urlUndoBuffer = Nothing
1818 UrlUndoToolStripMenuItem.Enabled = False 'Undoをできないように設定
1821 Private Sub EndToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EndToolStripMenuItem.Click, EndFileMenuItem.Click
1826 Private Sub Tween_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
1827 If Not SettingDialog.CloseToExit AndAlso e.CloseReason = CloseReason.UserClosing AndAlso _endingFlag = False Then
1828 '_endingFlag=False:フォームの×ボタン
1832 _hookGlobalHotkey.UnregisterAllOriginalHotkey()
1833 _ignoreConfigSave = True
1835 TimerTimeline.Enabled = False
1836 TimerRefreshIcon.Enabled = False
1840 Private Sub NotifyIcon1_BalloonTipClicked(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NotifyIcon1.BalloonTipClicked
1842 If Me.WindowState = FormWindowState.Minimized Then
1843 Me.WindowState = FormWindowState.Normal
1848 Private Shared Function CheckAccountValid() As Boolean
1849 Static errorCount As Integer = 0
1850 If Twitter.AccountState <> ACCOUNT_STATE.Valid Then
1852 If errorCount > 5 Then
1854 Twitter.AccountState = ACCOUNT_STATE.Valid
1863 Private Sub GetTimelineWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
1864 Dim bw As BackgroundWorker = DirectCast(sender, BackgroundWorker)
1865 If bw.CancellationPending OrElse _endingFlag Then
1870 Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.BelowNormal
1872 My.Application.InitCulture()
1874 Dim ret As String = ""
1875 Dim rslt As New GetWorkerResult()
1877 Dim read As Boolean = Not SettingDialog.UnreadManage
1878 If _initial AndAlso SettingDialog.UnreadManage Then read = SettingDialog.Readed
1880 Dim args As GetWorkerArg = DirectCast(e.Argument, GetWorkerArg)
1882 If Not CheckAccountValid() Then
1883 rslt.retMsg = "Auth error. Check your account"
1884 rslt.type = WORKERTYPE.ErrorState 'エラー表示のみ行ない、後処理キャンセル
1885 rslt.tName = args.tName
1890 If args.type <> WORKERTYPE.OpenUri Then bw.ReportProgress(0, "") 'Notifyアイコンアニメーション開始
1891 Select Case args.type
1892 Case WORKERTYPE.Timeline, WORKERTYPE.Reply
1893 bw.ReportProgress(50, MakeStatusMessage(args, False))
1894 ret = tw.GetTimelineApi(read, args.type, args.page = -1, _initial)
1896 If ret = "" AndAlso args.type = WORKERTYPE.Timeline AndAlso SettingDialog.ReadOldPosts Then
1900 rslt.addCount = _statuses.DistributePosts()
1901 Case WORKERTYPE.DirectMessegeRcv '送信分もまとめて取得
1902 bw.ReportProgress(50, MakeStatusMessage(args, False))
1903 ret = tw.GetDirectMessageApi(read, WORKERTYPE.DirectMessegeRcv, args.page = -1)
1904 If ret = "" Then ret = tw.GetDirectMessageApi(read, WORKERTYPE.DirectMessegeSnt, args.page = -1)
1905 rslt.addCount = _statuses.DistributePosts()
1906 Case WORKERTYPE.FavAdd
1908 If _statuses.Tabs.ContainsKey(args.tName) Then
1909 Dim tbc As TabClass = _statuses.Tabs(args.tName)
1910 For i As Integer = 0 To args.ids.Count - 1
1911 Dim post As PostClass = Nothing
1912 If tbc.TabType = TabUsageType.Lists OrElse tbc.TabType = TabUsageType.PublicSearch Then
1913 post = tbc.Posts(args.ids(i))
1915 post = _statuses.Item(args.ids(i))
1918 bw.ReportProgress(50, MakeStatusMessage(args, False))
1919 If Not post.IsFav Then
1920 If post.RetweetedId = 0 Then
1921 ret = tw.PostFavAdd(post.Id)
1923 ret = tw.PostFavAdd(post.RetweetedId)
1925 If ret.Length = 0 Then
1926 args.sIds.Add(post.Id)
1927 post.IsFav = True 'リスト再描画必要
1928 _favTimestamps.Add(Now)
1929 If post.RelTabName = "" Then
1930 '検索,リストタブからのfavは、favタブへ追加せず。それ以外は追加
1931 _statuses.GetTabByType(TabUsageType.Favorites).Add(post.Id, post.IsRead, False)
1933 '検索・リストタブからのfavで、TLでも取得済みならfav反映
1934 If _statuses.ContainsKey(post.Id) Then
1935 Dim postTl As PostClass = _statuses.Item(post.Id)
1937 _statuses.GetTabByType(TabUsageType.Favorites).Add(postTl.Id, postTl.IsRead, False)
1941 For Each tb As TabClass In _statuses.GetTabsByType(TabUsageType.PublicSearch Or TabUsageType.Lists)
1942 If tb.Contains(post.Id) Then tb.Posts(post.Id).IsFav = True
1948 rslt.sIds = args.sIds
1949 Case WORKERTYPE.FavRemove
1951 If _statuses.Tabs.ContainsKey(args.tName) Then
1952 Dim tbc As TabClass = _statuses.Tabs(args.tName)
1953 For i As Integer = 0 To args.ids.Count - 1
1954 Dim post As PostClass = Nothing
1955 If tbc.TabType = TabUsageType.Lists OrElse tbc.TabType = TabUsageType.PublicSearch Then
1956 post = tbc.Posts(args.ids(i))
1958 post = _statuses.Item(args.ids(i))
1961 bw.ReportProgress(50, MakeStatusMessage(args, False))
1963 If post.RetweetedId = 0 Then
1964 ret = tw.PostFavRemove(post.Id)
1966 ret = tw.PostFavRemove(post.RetweetedId)
1968 If ret.Length = 0 Then
1969 args.sIds.Add(post.Id)
1970 post.IsFav = False 'リスト再描画必要
1971 If _statuses.ContainsKey(post.Id) Then _statuses.Item(post.Id).IsFav = False
1973 For Each tb As TabClass In _statuses.GetTabsByType(TabUsageType.PublicSearch Or TabUsageType.Lists)
1974 If tb.Contains(post.Id) Then tb.Posts(post.Id).IsFav = False
1980 rslt.sIds = args.sIds
1981 Case WORKERTYPE.PostMessage
1982 bw.ReportProgress(200)
1983 If String.IsNullOrEmpty(args.status.imagePath) Then
1984 For i As Integer = 0 To 1
1985 ret = tw.PostStatus(args.status.status, args.status.inReplyToId)
1986 If ret = "" OrElse _
1987 ret.StartsWith("OK:") OrElse _
1988 ret.StartsWith("Outputz:") OrElse _
1989 ret.StartsWith("Warn:") OrElse _
1990 ret = "Err:Status is a duplicate." OrElse _
1991 args.status.status.StartsWith("D", StringComparison.OrdinalIgnoreCase) OrElse _
1992 args.status.status.StartsWith("DM", StringComparison.OrdinalIgnoreCase) OrElse _
1993 Twitter.AccountState <> ACCOUNT_STATE.Valid Then
1998 Dim picSvc As New PictureService(tw)
1999 If String.IsNullOrEmpty(args.status.status) Then args.status.status = ""
2000 ret = picSvc.Upload(args.status.imagePath, args.status.status, args.status.imageService)
2002 bw.ReportProgress(300)
2003 rslt.status = args.status
2004 Case WORKERTYPE.Retweet
2005 bw.ReportProgress(200)
2006 For i As Integer = 0 To args.ids.Count - 1
2007 ret = tw.PostRetweet(args.ids(i), read)
2009 bw.ReportProgress(300)
2010 Case WORKERTYPE.Follower
2011 bw.ReportProgress(50, My.Resources.UpdateFollowersMenuItem1_ClickText1)
2012 ret = tw.GetFollowersApi()
2013 Case WORKERTYPE.OpenUri
2014 Dim myPath As String = Convert.ToString(args.url)
2017 If SettingDialog.BrowserPath <> "" Then
2018 If SettingDialog.BrowserPath.StartsWith("""") AndAlso SettingDialog.BrowserPath.Length > 2 AndAlso SettingDialog.BrowserPath.IndexOf("""", 2) > -1 Then
2019 Dim sep As Integer = SettingDialog.BrowserPath.IndexOf("""", 2)
2020 Dim browserPath As String = SettingDialog.BrowserPath.Substring(1, sep - 1)
2021 Dim arg As String = ""
2022 If sep < SettingDialog.BrowserPath.Length - 1 Then
2023 arg = SettingDialog.BrowserPath.Substring(sep + 1)
2025 myPath = arg + " " + myPath
2026 System.Diagnostics.Process.Start(browserPath, myPath)
2028 System.Diagnostics.Process.Start(SettingDialog.BrowserPath, myPath)
2031 System.Diagnostics.Process.Start(myPath)
2033 Catch ex As Exception
2034 ' MessageBox.Show("ブラウザの起動に失敗、またはタイムアウトしました。" + ex.ToString())
2036 Case WORKERTYPE.Favorites
2037 bw.ReportProgress(50, MakeStatusMessage(args, False))
2038 ret = tw.GetFavoritesApi(read, args.type)
2039 rslt.addCount = _statuses.DistributePosts()
2040 Case WORKERTYPE.PublicSearch
2041 bw.ReportProgress(50, MakeStatusMessage(args, False))
2042 If args.tName = "" Then
2043 For Each tb As TabClass In _statuses.GetTabsByType(TabUsageType.PublicSearch)
2044 If tb.SearchWords <> "" Then ret = tw.GetSearch(read, tb, False)
2047 Dim tb As TabClass = _statuses.GetTabByName(args.tName)
2048 If tb IsNot Nothing Then
2049 ret = tw.GetSearch(read, tb, False)
2050 If ret = "" AndAlso args.page = -1 Then
2051 ret = tw.GetSearch(read, tb, True)
2056 rslt.addCount = _statuses.DistributePosts()
2057 Case WORKERTYPE.List
2058 bw.ReportProgress(50, MakeStatusMessage(args, False))
2059 If args.tName = "" Then
2061 For Each tb As TabClass In _statuses.GetTabsByType(TabUsageType.Lists)
2062 If tb.ListInfo IsNot Nothing AndAlso tb.ListInfo.Id <> 0 Then ret = tw.GetListStatus(read, tb, False, _initial)
2066 Dim tb As TabClass = _statuses.GetTabByName(args.tName)
2067 If tb IsNot Nothing Then
2068 ret = tw.GetListStatus(read, tb, args.page = -1, _initial)
2072 rslt.addCount = _statuses.DistributePosts()
2073 Case WORKERTYPE.Related
2074 bw.ReportProgress(50, MakeStatusMessage(args, False))
2075 Dim tb As TabClass = _statuses.GetTabByName(args.tName)
2076 ret = tw.GetRelatedResultsApi(read, tb)
2077 rslt.addCount = _statuses.DistributePosts()
2080 If bw.CancellationPending Then
2086 If args.type = WORKERTYPE.FavAdd Then
2087 Dim oneHour As Date = Now.Subtract(New TimeSpan(1, 0, 0))
2088 For i As Integer = _favTimestamps.Count - 1 To 0 Step -1
2089 If _favTimestamps(i).CompareTo(oneHour) < 0 Then
2090 _favTimestamps.RemoveAt(i)
2094 If args.type = WORKERTYPE.Timeline AndAlso Not _initial Then
2095 SyncLock _syncObject
2096 Dim tm As Date = Now
2097 If _tlTimestamps.ContainsKey(tm) Then
2098 _tlTimestamps(tm) += rslt.addCount
2100 _tlTimestamps.Add(Now, rslt.addCount)
2102 Dim oneHour As Date = Now.Subtract(New TimeSpan(1, 0, 0))
2103 Dim keys As New List(Of Date)
2105 For Each key As Date In _tlTimestamps.Keys
2106 If key.CompareTo(oneHour) < 0 Then
2109 _tlCount += _tlTimestamps(key)
2112 For Each key As Date In keys
2113 _tlTimestamps.Remove(key)
2120 If args.type <> WORKERTYPE.OpenUri Then bw.ReportProgress(100, MakeStatusMessage(args, True)) 'ステータス書き換え、Notifyアイコンアニメーション開始
2123 rslt.type = args.type
2124 rslt.tName = args.tName
2125 If args.type = WORKERTYPE.DirectMessegeRcv OrElse _
2126 args.type = WORKERTYPE.DirectMessegeSnt OrElse _
2127 args.type = WORKERTYPE.Reply OrElse _
2128 args.type = WORKERTYPE.Timeline OrElse _
2129 args.type = WORKERTYPE.Favorites Then
2130 rslt.page = args.page - 1 '値が正しいか後でチェック。10ページ毎の継続確認
2136 Private Function MakeStatusMessage(ByVal AsyncArg As GetWorkerArg, ByVal Finish As Boolean) As String
2137 Dim smsg As String = ""
2140 Select Case AsyncArg.type
2141 Case WORKERTYPE.Timeline
2142 smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText5 + AsyncArg.page.ToString() + My.Resources.GetTimelineWorker_RunWorkerCompletedText6
2143 Case WORKERTYPE.Reply
2144 smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText4 + AsyncArg.page.ToString() + My.Resources.GetTimelineWorker_RunWorkerCompletedText6
2145 Case WORKERTYPE.DirectMessegeRcv
2146 smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText8 + AsyncArg.page.ToString() + My.Resources.GetTimelineWorker_RunWorkerCompletedText6
2147 Case WORKERTYPE.FavAdd
2148 smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText15 + AsyncArg.page.ToString() + "/" + AsyncArg.ids.Count.ToString() + _
2149 My.Resources.GetTimelineWorker_RunWorkerCompletedText16 + (AsyncArg.page - AsyncArg.sIds.Count - 1).ToString()
2150 Case WORKERTYPE.FavRemove
2151 smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText17 + AsyncArg.page.ToString() + "/" + AsyncArg.ids.Count.ToString() + _
2152 My.Resources.GetTimelineWorker_RunWorkerCompletedText18 + (AsyncArg.page - AsyncArg.sIds.Count - 1).ToString()
2153 Case WORKERTYPE.Favorites
2154 smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText19
2155 Case WORKERTYPE.PublicSearch
2156 smsg = "Search refreshing..."
2157 Case WORKERTYPE.List
2158 smsg = "List refreshing..."
2159 Case WORKERTYPE.Related
2160 smsg = "Related refreshing..."
2164 Select Case AsyncArg.type
2165 Case WORKERTYPE.Timeline
2166 smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText1
2167 Case WORKERTYPE.Reply
2168 smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText9
2169 Case WORKERTYPE.DirectMessegeRcv
2170 smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText11
2171 Case WORKERTYPE.DirectMessegeSnt
2172 smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText13
2173 Case WORKERTYPE.FavAdd
2175 Case WORKERTYPE.FavRemove
2177 Case WORKERTYPE.Favorites
2178 smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText20
2179 Case WORKERTYPE.Follower
2180 smsg = My.Resources.UpdateFollowersMenuItem1_ClickText3
2181 Case WORKERTYPE.PublicSearch
2182 smsg = "Search refreshed"
2183 Case WORKERTYPE.List
2184 smsg = "List refreshed"
2185 Case WORKERTYPE.Related
2186 smsg = "Related refreshed"
2192 Private Sub GetTimelineWorker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs)
2193 If _endingFlag Then Exit Sub
2194 If e.ProgressPercentage > 100 Then
2196 If e.ProgressPercentage = 200 Then '開始
2197 StatusLabel.Text = "Posting..."
2199 If e.ProgressPercentage = 300 Then '終了
2200 StatusLabel.Text = My.Resources.PostWorker_RunWorkerCompletedText4
2203 Dim smsg As String = DirectCast(e.UserState, String)
2204 If smsg.Length > 0 Then StatusLabel.Text = smsg
2208 Private Sub GetTimelineWorker_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
2210 If _endingFlag OrElse e.Cancelled Then Exit Sub 'キャンセル
2212 If e.Error IsNot Nothing Then
2213 _myStatusError = True
2214 _waitTimeline = False
2218 _waitPubSearch = False
2220 Throw New Exception("BackgroundWorker Exception", e.Error)
2224 Dim rslt As GetWorkerResult = DirectCast(e.Result, GetWorkerResult)
2226 If rslt.type = WORKERTYPE.OpenUri Then Exit Sub
2229 If rslt.retMsg.Length > 0 Then
2230 _myStatusError = True
2231 StatusLabel.Text = rslt.retMsg
2234 If rslt.type = WORKERTYPE.ErrorState Then Exit Sub
2236 If rslt.type = WORKERTYPE.FavRemove Then
2237 DispSelectedPost() ' 詳細画面書き直し
2238 Dim favTabName As String = _statuses.GetTabByType(TabUsageType.Favorites).TabName
2240 If _curTab.Text.Equals(favTabName) Then
2241 If _curList.FocusedItem IsNot Nothing Then
2242 fidx = _curList.FocusedItem.Index
2243 ElseIf _curList.TopItem IsNot Nothing Then
2244 fidx = _curList.TopItem.Index
2250 For Each i As Long In rslt.sIds
2251 _statuses.RemoveFavPost(i)
2253 If _curTab IsNot Nothing AndAlso _curTab.Text.Equals(favTabName) Then
2254 _itemCache = Nothing 'キャッシュ破棄
2255 _postCache = Nothing
2259 For Each tp As TabPage In ListTab.TabPages
2260 If tp.Text = favTabName Then
2261 DirectCast(tp.Tag, DetailsListView).VirtualListSize = _statuses.Tabs(favTabName).AllCount
2265 If _curTab.Text.Equals(favTabName) Then
2266 _curList.SelectedIndices.Clear()
2267 If _statuses.Tabs(favTabName).AllCount > 0 Then
2268 If _statuses.Tabs(favTabName).AllCount - 1 > fidx AndAlso fidx > -1 Then
2269 _curList.SelectedIndices.Add(fidx)
2271 _curList.SelectedIndices.Add(_statuses.Tabs(favTabName).AllCount - 1)
2273 If _curList.SelectedIndices.Count > 0 Then
2274 _curList.EnsureVisible(_curList.SelectedIndices(0))
2275 _curList.FocusedItem = _curList.Items(_curList.SelectedIndices(0))
2282 'Dim busy As Boolean = False
2283 'For Each bw As BackgroundWorker In _bw
2284 ' If bw IsNot Nothing AndAlso bw.IsBusy Then
2289 'If Not busy Then RefreshTimeline() 'background処理なければ、リスト反映
2290 If rslt.type = WORKERTYPE.Timeline OrElse _
2291 rslt.type = WORKERTYPE.Reply OrElse _
2292 rslt.type = WORKERTYPE.List OrElse _
2293 rslt.type = WORKERTYPE.PublicSearch OrElse _
2294 rslt.type = WORKERTYPE.DirectMessegeRcv OrElse _
2295 rslt.type = WORKERTYPE.DirectMessegeSnt OrElse _
2296 rslt.type = WORKERTYPE.Favorites OrElse _
2297 rslt.type = WORKERTYPE.Follower OrElse _
2298 rslt.type = WORKERTYPE.FavAdd OrElse _
2299 rslt.type = WORKERTYPE.FavRemove OrElse _
2300 rslt.type = WORKERTYPE.Related Then
2301 RefreshTimeline(False) 'リスト反映
2304 Select Case rslt.type
2305 Case WORKERTYPE.Timeline
2306 _waitTimeline = False
2307 If Not _initial Then
2308 ' 'API使用時の取得調整は別途考える(カウント調整?)
2310 Case WORKERTYPE.Reply
2312 If rslt.newDM AndAlso Not _initial Then
2313 GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
2315 Case WORKERTYPE.Favorites
2317 Case WORKERTYPE.DirectMessegeRcv
2319 Case WORKERTYPE.FavAdd, WORKERTYPE.FavRemove
2320 If _curList IsNot Nothing AndAlso _curTab IsNot Nothing Then
2321 _curList.BeginUpdate()
2322 If rslt.type = WORKERTYPE.FavRemove AndAlso _statuses.Tabs(_curTab.Text).TabType = TabUsageType.Favorites Then
2325 For i As Integer = 0 To rslt.sIds.Count - 1
2326 If _curTab.Text.Equals(rslt.tName) Then
2327 Dim idx As Integer = _statuses.Tabs(rslt.tName).IndexOf(rslt.sIds(i))
2329 Dim post As PostClass = Nothing
2330 Dim tb As TabClass = _statuses.Tabs(rslt.tName)
2331 If tb IsNot Nothing Then
2332 If tb.TabType = TabUsageType.Lists OrElse tb.TabType = TabUsageType.PublicSearch Then
2333 post = tb.Posts(rslt.sIds(i))
2335 post = _statuses.Item(rslt.sIds(i))
2337 ChangeCacheStyleRead(post.IsRead, idx, _curTab)
2339 If idx = _curItemIndex Then DispSelectedPost() '選択アイテム再表示
2344 _curList.EndUpdate()
2346 Case WORKERTYPE.PostMessage
2347 If rslt.retMsg = "" OrElse _
2348 rslt.retMsg.StartsWith("Outputz") OrElse _
2349 rslt.retMsg.StartsWith("OK:") OrElse _
2350 rslt.retMsg = "Warn:Status is a duplicate." Then
2351 _postTimestamps.Add(Now)
2352 Dim oneHour As Date = Now.Subtract(New TimeSpan(1, 0, 0))
2353 For i As Integer = _postTimestamps.Count - 1 To 0 Step -1
2354 If _postTimestamps(i).CompareTo(oneHour) < 0 Then
2355 _postTimestamps.RemoveAt(i)
2359 If Not HashMgr.IsPermanent AndAlso HashMgr.UseHash <> "" Then
2360 HashMgr.ClearHashtag()
2361 Me.HashStripSplitButton.Text = "#[-]"
2362 Me.HashToggleMenuItem.Checked = False
2363 Me.HashToggleToolStripMenuItem.Checked = False
2365 SetMainWindowTitle()
2368 If MessageBox.Show(String.Format("{0} ---> [ " & rslt.retMsg & " ]" & Environment.NewLine & """" & rslt.status.status & """" & Environment.NewLine & "{1}", My.Resources.StatusUpdateFailed1, My.Resources.StatusUpdateFailed2), "Failed to update status", MessageBoxButtons.RetryCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Retry Then
2369 Dim args As New GetWorkerArg()
2372 args.type = WORKERTYPE.PostMessage
2373 args.status = rslt.status
2376 If ToolStripFocusLockMenuItem.Checked Then
2377 '連投モードのときだけEnterイベントが起きないので強制的に背景色を戻す
2378 StatusText_Enter(StatusText, New EventArgs)
2382 If rslt.retMsg.Length = 0 AndAlso SettingDialog.PostAndGet Then GetTimeline(WORKERTYPE.Timeline, 1, 0, "")
2383 Case WORKERTYPE.Retweet
2384 If rslt.retMsg.Length = 0 Then
2385 _postTimestamps.Add(Now)
2386 Dim oneHour As Date = Now.Subtract(New TimeSpan(1, 0, 0))
2387 For i As Integer = _postTimestamps.Count - 1 To 0 Step -1
2388 If _postTimestamps(i).CompareTo(oneHour) < 0 Then
2389 _postTimestamps.RemoveAt(i)
2392 If SettingDialog.PostAndGet Then GetTimeline(WORKERTYPE.Timeline, 1, 0, "")
2394 Case WORKERTYPE.Follower
2395 '_waitFollower = False
2396 _itemCache = Nothing
2397 _postCache = Nothing
2398 If _curList IsNot Nothing Then _curList.Refresh()
2399 Case WORKERTYPE.PublicSearch
2400 _waitPubSearch = False
2401 Case WORKERTYPE.List
2407 Private Sub GetTimeline(ByVal WkType As WORKERTYPE, ByVal fromPage As Integer, ByVal toPage As Integer, ByVal tabName As String)
2409 If Not IsNetworkAvailable() Then Exit Sub
2412 Dim args As New GetWorkerArg
2413 args.page = fromPage
2414 args.endPage = toPage
2416 args.tName = tabName
2418 Static lastTime As New Dictionary(Of WORKERTYPE, DateTime)
2419 If Not lastTime.ContainsKey(WkType) Then lastTime.Add(WkType, New DateTime)
2420 Dim period As Double = Now.Subtract(lastTime(WkType)).TotalSeconds
2421 If period > 1 OrElse period < -1 Then
2422 lastTime(WkType) = Now
2426 'Timeline取得モードの場合はReplyも同時に取得
2427 'If Not SettingDialog.UseAPI AndAlso _
2428 ' Not _initial AndAlso _
2429 ' WkType = WORKERTYPE.Timeline AndAlso _
2430 ' SettingDialog.CheckReply Then
2431 ' 'TimerReply.Enabled = False
2432 ' _mentionCounter = SettingDialog.ReplyPeriodInt
2433 ' Dim _args As New GetWorkerArg
2434 ' _args.page = fromPage
2435 ' _args.endPage = toPage
2436 ' _args.type = WORKERTYPE.Reply
2441 Private Sub NotifyIcon1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseClick
2442 If e.Button = Windows.Forms.MouseButtons.Left Then
2444 If Me.WindowState = FormWindowState.Minimized Then
2445 Me.WindowState = FormWindowState.Normal
2451 Private Sub MyList_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
2452 MakeReplyOrDirectStatus()
2455 Private Sub FavAddToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FavAddToolStripMenuItem.Click, FavOpMenuItem.Click
2456 FavoriteChange(True)
2459 Private Sub FavRemoveToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FavRemoveToolStripMenuItem.Click, UnFavOpMenuItem.Click
2460 FavoriteChange(False)
2464 Private Sub FavoriteRetweetMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FavoriteRetweetMenuItem.Click, FavoriteRetweetContextMenu.Click
2465 FavoritesRetweetOriginal()
2468 Private Sub FavoriteRetweetUnofficialMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FavoriteRetweetUnofficialMenuItem.Click, FavoriteRetweetUnofficialContextMenu.Click
2469 FavoritesRetweetUnofficial()
2472 Private Sub FavoriteChange(ByVal FavAdd As Boolean, Optional ByVal multiFavoriteChangeDialogEnable As Boolean = True)
2473 'TrueでFavAdd,FalseでFavRemove
2474 If _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage OrElse _curList.SelectedIndices.Count = 0 Then Exit Sub
2477 If _curList.SelectedIndices.Count > 250 AndAlso FavAdd Then
2478 MessageBox.Show(My.Resources.FavoriteLimitCountText)
2479 _DoFavRetweetFlags = False
2481 ElseIf multiFavoriteChangeDialogEnable AndAlso _curList.SelectedIndices.Count > 1 Then
2483 Dim QuestionText As String = My.Resources.FavAddToolStripMenuItem_ClickText1
2484 If _DoFavRetweetFlags Then QuestionText = My.Resources.FavoriteRetweetQuestionText3
2485 If MessageBox.Show(QuestionText, My.Resources.FavAddToolStripMenuItem_ClickText2, _
2486 MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then
2487 _DoFavRetweetFlags = False
2491 If MessageBox.Show(My.Resources.FavRemoveToolStripMenuItem_ClickText1, My.Resources.FavRemoveToolStripMenuItem_ClickText2, _
2492 MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then
2498 Dim args As New GetWorkerArg
2499 args.ids = New List(Of Long)
2500 args.sIds = New List(Of Long)
2501 args.tName = _curTab.Text
2503 args.type = WORKERTYPE.FavAdd
2505 args.type = WORKERTYPE.FavRemove
2507 For Each idx As Integer In _curList.SelectedIndices
2508 Dim post As PostClass = GetCurTabPost(idx)
2510 If Not post.IsFav Then args.ids.Add(post.Id)
2512 If post.IsFav Then args.ids.Add(post.Id)
2515 If args.ids.Count = 0 Then
2517 StatusLabel.Text = My.Resources.FavAddToolStripMenuItem_ClickText4
2519 StatusLabel.Text = My.Resources.FavRemoveToolStripMenuItem_ClickText4
2527 Private Function GetCurTabPost(ByVal Index As Integer) As PostClass
2528 If _postCache IsNot Nothing AndAlso Index >= _itemCacheIndex AndAlso Index < _itemCacheIndex + _postCache.Length Then
2529 Return _postCache(Index - _itemCacheIndex)
2531 Return _statuses.Item(_curTab.Text, Index)
2536 Private Sub MoveToHomeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MoveToHomeToolStripMenuItem.Click, OpenHomeOpMenuItem.Click
2537 If _curList.SelectedIndices.Count > 0 Then
2538 OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name)
2539 ElseIf _curList.SelectedIndices.Count = 0 Then
2540 OpenUriAsync("http://twitter.com/")
2544 Private Sub MoveToFavToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MoveToFavToolStripMenuItem.Click, OpenFavOpMenuItem.Click
2545 If _curList.SelectedIndices.Count > 0 Then
2546 OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name + "/favorites")
2550 Private Sub Tween_ClientSizeChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.ClientSizeChanged
2551 If Me.WindowState <> FormWindowState.Minimized Then
2552 If Not _initialLayout AndAlso Me.Visible = True Then
2553 If Me.WindowState = FormWindowState.Normal Then
2554 _mySize = Me.ClientSize
2555 _mySpDis = Me.SplitContainer1.SplitterDistance
2556 _mySpDis3 = Me.SplitContainer3.SplitterDistance
2557 If StatusText.Multiline Then _mySpDis2 = Me.StatusText.Height
2558 _modifySettingLocal = True
2564 Private Sub MyList_ColumnClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs)
2565 If SettingDialog.SortOrderLock Then Exit Sub
2566 Dim mode As IdComparerClass.ComparerMode
2568 mode = IdComparerClass.ComparerMode.Id
2570 Select Case e.Column
2571 Case 0, 5, 6 '0:アイコン,5:未読マーク,6:プロテクト・フィルターマーク
2575 mode = IdComparerClass.ComparerMode.Nickname
2577 mode = IdComparerClass.ComparerMode.Data
2579 mode = IdComparerClass.ComparerMode.Id
2581 mode = IdComparerClass.ComparerMode.Name
2583 mode = IdComparerClass.ComparerMode.Source
2586 _statuses.ToggleSortOrder(mode)
2590 DirectCast(sender, DetailsListView).Columns.Item(0).Text = ColumnOrgText(0)
2591 DirectCast(sender, DetailsListView).Columns.Item(1).Text = ColumnText(2)
2593 For i As Integer = 0 To 7
2594 DirectCast(sender, DetailsListView).Columns.Item(i).Text = ColumnOrgText(i)
2596 DirectCast(sender, DetailsListView).Columns.Item(e.Column).Text = ColumnText(e.Column)
2599 _itemCache = Nothing
2600 _postCache = Nothing
2602 If _statuses.Tabs(_curTab.Text).AllCount > 0 AndAlso _curPost IsNot Nothing Then
2603 Dim idx As Integer = _statuses.Tabs(_curTab.Text).IndexOf(_curPost.Id)
2604 SelectListItem(_curList, idx)
2605 _curList.EnsureVisible(idx)
2608 _modifySettingCommon = True
2611 Private Sub Tween_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
2612 If Me.WindowState = FormWindowState.Normal AndAlso Not _initialLayout Then
2613 _myLoc = Me.DesktopLocation
2614 _modifySettingLocal = True
2618 Private Sub ContextMenuOperate_Opening(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ContextMenuOperate.Opening
2619 If ListTab.SelectedTab Is Nothing Then Exit Sub
2620 If _statuses Is Nothing OrElse _statuses.Tabs Is Nothing OrElse Not _statuses.Tabs.ContainsKey(ListTab.SelectedTab.Text) Then Exit Sub
2621 If _curPost Is Nothing Then
2622 ReplyStripMenuItem.Enabled = False
2623 ReplyAllStripMenuItem.Enabled = False
2624 DMStripMenuItem.Enabled = False
2625 ShowProfileMenuItem.Enabled = False
2626 ListManageUserContextToolStripMenuItem2.Enabled = False
2627 MoveToFavToolStripMenuItem.Enabled = False
2628 TabMenuItem.Enabled = False
2629 IDRuleMenuItem.Enabled = False
2630 ReadedStripMenuItem.Enabled = False
2631 UnreadStripMenuItem.Enabled = False
2633 ShowProfileMenuItem.Enabled = True
2634 ListManageUserContextToolStripMenuItem2.Enabled = True
2635 ReplyStripMenuItem.Enabled = True
2636 ReplyAllStripMenuItem.Enabled = True
2637 DMStripMenuItem.Enabled = True
2638 MoveToFavToolStripMenuItem.Enabled = True
2639 TabMenuItem.Enabled = True
2640 IDRuleMenuItem.Enabled = True
2641 ReadedStripMenuItem.Enabled = True
2642 UnreadStripMenuItem.Enabled = True
2644 If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.DirectMessage OrElse _curPost Is Nothing OrElse _curPost.IsDm Then
2645 FavAddToolStripMenuItem.Enabled = False
2646 FavRemoveToolStripMenuItem.Enabled = False
2647 StatusOpenMenuItem.Enabled = False
2648 FavorareMenuItem.Enabled = False
2649 ShowRelatedStatusesMenuItem.Enabled = False
2651 ReTweetStripMenuItem.Enabled = False
2652 ReTweetOriginalStripMenuItem.Enabled = False
2653 QuoteStripMenuItem.Enabled = False
2654 FavoriteRetweetContextMenu.Enabled = False
2655 FavoriteRetweetUnofficialContextMenu.Enabled = False
2656 If _curPost IsNot Nothing AndAlso _curPost.IsDm Then DeleteStripMenuItem.Enabled = True
2658 FavAddToolStripMenuItem.Enabled = True
2659 FavRemoveToolStripMenuItem.Enabled = True
2660 StatusOpenMenuItem.Enabled = True
2661 FavorareMenuItem.Enabled = True
2662 ShowRelatedStatusesMenuItem.Enabled = True 'PublicSearchの時問題出るかも
2664 If _curPost.IsMe Then
2665 ReTweetOriginalStripMenuItem.Enabled = False
2666 FavoriteRetweetContextMenu.Enabled = False
2667 DeleteStripMenuItem.Enabled = True
2669 DeleteStripMenuItem.Enabled = False
2670 If _curPost.IsProtect Then
2671 ReTweetOriginalStripMenuItem.Enabled = False
2672 ReTweetStripMenuItem.Enabled = False
2673 QuoteStripMenuItem.Enabled = False
2674 FavoriteRetweetContextMenu.Enabled = False
2675 FavoriteRetweetUnofficialContextMenu.Enabled = False
2677 ReTweetOriginalStripMenuItem.Enabled = True
2678 ReTweetStripMenuItem.Enabled = True
2679 QuoteStripMenuItem.Enabled = True
2680 FavoriteRetweetContextMenu.Enabled = True
2681 FavoriteRetweetUnofficialContextMenu.Enabled = True
2685 If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.Favorites Then
2686 RefreshMoreStripMenuItem.Enabled = True
2688 RefreshMoreStripMenuItem.Enabled = False
2690 If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.PublicSearch _
2691 OrElse _curPost Is Nothing _
2692 OrElse Not _curPost.InReplyToId > 0 Then
2693 RepliedStatusOpenMenuItem.Enabled = False
2695 RepliedStatusOpenMenuItem.Enabled = True
2697 If _curPost Is Nothing OrElse _curPost.RetweetedBy = "" Then
2698 MoveToRTHomeMenuItem.Enabled = False
2700 MoveToRTHomeMenuItem.Enabled = True
2704 Private Sub ReplyStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReplyStripMenuItem.Click, ReplyOpMenuItem.Click
2705 MakeReplyOrDirectStatus(False, True)
2708 Private Sub DMStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DMStripMenuItem.Click, DmOpMenuItem.Click
2709 MakeReplyOrDirectStatus(False, False)
2712 Private Sub doStatusDelete()
2713 If _curTab Is Nothing OrElse _curList Is Nothing Then Exit Sub
2714 If _statuses.Tabs(_curTab.Text).TabType <> TabUsageType.DirectMessage Then
2715 Dim myPost As Boolean = False
2716 For Each idx As Integer In _curList.SelectedIndices
2717 If GetCurTabPost(idx).IsMe OrElse _
2718 GetCurTabPost(idx).RetweetedBy.ToLower = tw.Username.ToLower Then
2723 If Not myPost Then Exit Sub
2725 If _curList.SelectedIndices.Count = 0 Then
2730 Dim tmp As String = String.Format(My.Resources.DeleteStripMenuItem_ClickText1, Environment.NewLine)
2732 If MessageBox.Show(tmp, My.Resources.DeleteStripMenuItem_ClickText2, _
2733 MessageBoxButtons.OKCancel, _
2734 MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then Exit Sub
2737 If _curList.FocusedItem IsNot Nothing Then
2738 fidx = _curList.FocusedItem.Index
2739 ElseIf _curList.TopItem IsNot Nothing Then
2740 fidx = _curList.TopItem.Index
2746 Me.Cursor = Cursors.WaitCursor
2748 Dim rslt As Boolean = True
2749 For Each Id As Long In _statuses.GetId(_curTab.Text, _curList.SelectedIndices)
2750 Dim rtn As String = ""
2751 If _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage Then
2752 rtn = tw.RemoveDirectMessage(Id, _statuses.Item(Id))
2754 If _statuses.Item(Id).IsMe OrElse _statuses.Item(Id).RetweetedBy.ToLower = tw.Username.ToLower Then
2755 rtn = tw.RemoveStatus(Id)
2760 If rtn.Length > 0 Then
2764 _statuses.RemovePost(Id)
2769 StatusLabel.Text = My.Resources.DeleteStripMenuItem_ClickText3 '失敗
2771 StatusLabel.Text = My.Resources.DeleteStripMenuItem_ClickText4 '成功
2774 _itemCache = Nothing 'キャッシュ破棄
2775 _postCache = Nothing
2778 For Each tb As TabPage In ListTab.TabPages
2779 DirectCast(tb.Tag, DetailsListView).VirtualListSize = _statuses.Tabs(tb.Text).AllCount
2780 If _curTab.Equals(tb) Then
2781 _curList.SelectedIndices.Clear()
2782 If _statuses.Tabs(tb.Text).AllCount > 0 Then
2783 If _statuses.Tabs(tb.Text).AllCount - 1 > fidx AndAlso fidx > -1 Then
2784 _curList.SelectedIndices.Add(fidx)
2786 _curList.SelectedIndices.Add(_statuses.Tabs(tb.Text).AllCount - 1)
2788 If _curList.SelectedIndices.Count > 0 Then
2789 _curList.EnsureVisible(_curList.SelectedIndices(0))
2790 _curList.FocusedItem = _curList.Items(_curList.SelectedIndices(0))
2794 If _statuses.Tabs(tb.Text).UnreadCount = 0 Then
2795 If SettingDialog.TabIconDisp Then
2796 If tb.ImageIndex = 0 Then tb.ImageIndex = -1 'タブアイコン
2800 If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
2802 Me.Cursor = Cursors.Default
2806 Private Sub DeleteStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DeleteStripMenuItem.Click, DelOpMenuItem.Click
2810 Private Sub ReadedStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReadedStripMenuItem.Click, ReadOpMenuItem.Click
2811 _curList.BeginUpdate()
2812 If SettingDialog.UnreadManage Then
2813 For Each idx As Integer In _curList.SelectedIndices
2814 _statuses.SetRead(True, _curTab.Text, idx)
2817 For Each idx As Integer In _curList.SelectedIndices
2818 ChangeCacheStyleRead(True, idx, _curTab)
2821 _curList.EndUpdate()
2822 For Each tb As TabPage In ListTab.TabPages
2823 If _statuses.Tabs(tb.Text).UnreadCount = 0 Then
2824 If SettingDialog.TabIconDisp Then
2825 If tb.ImageIndex = 0 Then tb.ImageIndex = -1 'タブアイコン
2829 If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
2832 Private Sub UnreadStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UnreadStripMenuItem.Click, UnreadOpMenuItem.Click
2833 _curList.BeginUpdate()
2834 If SettingDialog.UnreadManage Then
2835 For Each idx As Integer In _curList.SelectedIndices
2836 _statuses.SetRead(False, _curTab.Text, idx)
2839 For Each idx As Integer In _curList.SelectedIndices
2840 ChangeCacheStyleRead(False, idx, _curTab)
2843 _curList.EndUpdate()
2844 For Each tb As TabPage In ListTab.TabPages
2845 If _statuses.Tabs(tb.Text).UnreadCount > 0 Then
2846 If SettingDialog.TabIconDisp Then
2847 If tb.ImageIndex = -1 Then tb.ImageIndex = 0 'タブアイコン
2851 If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
2854 Private Sub RefreshStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RefreshStripMenuItem.Click, RefreshOpMenuItem.Click
2858 Private Sub DoRefresh()
2859 If _curTab IsNot Nothing Then
2860 Select Case _statuses.Tabs(_curTab.Text).TabType
2861 Case TabUsageType.Mentions
2862 GetTimeline(WORKERTYPE.Reply, 1, 0, "")
2863 Case TabUsageType.DirectMessage
2864 GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
2865 Case TabUsageType.Favorites
2866 GetTimeline(WORKERTYPE.Favorites, 1, 0, "")
2867 'Case TabUsageType.Profile
2869 Case TabUsageType.PublicSearch
2871 Dim tb As TabClass = _statuses.Tabs(_curTab.Text)
2872 If tb.SearchWords = "" Then Exit Sub
2873 GetTimeline(WORKERTYPE.PublicSearch, 1, 0, _curTab.Text)
2874 Case TabUsageType.Lists
2876 Dim tb As TabClass = _statuses.Tabs(_curTab.Text)
2877 If tb.ListInfo Is Nothing OrElse tb.ListInfo.Id = 0 Then Exit Sub
2878 GetTimeline(WORKERTYPE.List, 1, 0, _curTab.Text)
2880 GetTimeline(WORKERTYPE.Timeline, 1, 0, "")
2883 GetTimeline(WORKERTYPE.Timeline, 1, 0, "")
2887 Private Sub DoRefreshMore()
2889 If _curTab IsNot Nothing Then
2890 Select Case _statuses.Tabs(_curTab.Text).TabType
2891 Case TabUsageType.Mentions
2892 GetTimeline(WORKERTYPE.Reply, -1, 0, "")
2893 Case TabUsageType.DirectMessage
2894 GetTimeline(WORKERTYPE.DirectMessegeRcv, -1, 0, "")
2895 Case TabUsageType.Favorites
2896 ' GetTimeline(WORKERTYPE.Favorites, -1, 0, "")
2897 Case TabUsageType.Profile
2899 Case TabUsageType.PublicSearch
2901 Dim tb As TabClass = _statuses.Tabs(_curTab.Text)
2902 If tb.SearchWords = "" Then Exit Sub
2903 GetTimeline(WORKERTYPE.PublicSearch, -1, 0, _curTab.Text)
2904 Case TabUsageType.Lists
2906 Dim tb As TabClass = _statuses.Tabs(_curTab.Text)
2907 If tb.ListInfo Is Nothing OrElse tb.ListInfo.Id = 0 Then Exit Sub
2908 GetTimeline(WORKERTYPE.List, -1, 0, _curTab.Text)
2910 GetTimeline(WORKERTYPE.Timeline, -1, 0, "")
2913 GetTimeline(WORKERTYPE.Timeline, -1, 0, "")
2917 Private Sub SettingStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SettingStripMenuItem.Click, SettingFileMenuItem.Click
2918 Dim result As DialogResult
2919 Dim uid As String = tw.Username.ToLower
2922 result = SettingDialog.ShowDialog()
2923 Catch ex As Exception
2927 If result = Windows.Forms.DialogResult.OK Then
2928 SyncLock _syncObject
2930 ' If SettingDialog.TimelinePeriodInt > 0 Then
2931 ' _homeCounterAdjuster = 0
2933 'Catch ex As Exception
2934 ' ex.Data("Instance") = "Set Timers"
2935 ' ex.Data("IsTerminatePermission") = False
2938 'tw.CountApi = SettingDialog.CountApi
2939 'tw.CountApiReply = SettingDialog.CountApiReply
2940 tw.TinyUrlResolve = SettingDialog.TinyUrlResolve
2941 tw.RestrictFavCheck = SettingDialog.RestrictFavCheck
2942 tw.ReadOwnPost = SettingDialog.ReadOwnPost
2943 tw.UseSsl = SettingDialog.UseSsl
2944 ShortUrl.IsResolve = SettingDialog.TinyUrlResolve
2945 ShortUrl.BitlyId = SettingDialog.BitlyUser
2946 ShortUrl.BitlyKey = SettingDialog.BitlyPwd
2947 HttpTwitter.TwitterUrl = _cfgCommon.TwitterUrl
2948 HttpTwitter.TwitterSearchUrl = _cfgCommon.TwitterSearchUrl
2950 HttpConnection.InitializeConnection(SettingDialog.DefaultTimeOut, _
2951 SettingDialog.SelectedProxyType, _
2952 SettingDialog.ProxyAddress, _
2953 SettingDialog.ProxyPort, _
2954 SettingDialog.ProxyUser, _
2955 SettingDialog.ProxyPassword)
2957 If SettingDialog.TabIconDisp Then
2958 RemoveHandler ListTab.DrawItem, AddressOf ListTab_DrawItem
2959 ListTab.DrawMode = TabDrawMode.Normal
2960 ListTab.ImageList = Me.TabImage
2962 RemoveHandler ListTab.DrawItem, AddressOf ListTab_DrawItem
2963 AddHandler ListTab.DrawItem, AddressOf ListTab_DrawItem
2964 ListTab.DrawMode = TabDrawMode.OwnerDrawFixed
2965 ListTab.ImageList = Nothing
2967 Catch ex As Exception
2968 ex.Data("Instance") = "ListTab(TabIconDisp)"
2969 ex.Data("IsTerminatePermission") = False
2974 If Not SettingDialog.UnreadManage Then
2975 ReadedStripMenuItem.Enabled = False
2976 UnreadStripMenuItem.Enabled = False
2977 If SettingDialog.TabIconDisp Then
2978 For Each myTab As TabPage In ListTab.TabPages
2979 myTab.ImageIndex = -1
2983 ReadedStripMenuItem.Enabled = True
2984 UnreadStripMenuItem.Enabled = True
2986 Catch ex As Exception
2987 ex.Data("Instance") = "ListTab(UnreadManage)"
2988 ex.Data("IsTerminatePermission") = False
2993 For Each mytab As TabPage In ListTab.TabPages
2994 Dim lst As DetailsListView = DirectCast(mytab.Tag, DetailsListView)
2995 lst.GridLines = SettingDialog.ShowGrid
2997 Catch ex As Exception
2998 ex.Data("Instance") = "ListTab(ShowGrid)"
2999 ex.Data("IsTerminatePermission") = False
3003 PlaySoundMenuItem.Checked = SettingDialog.PlaySound
3004 Me.PlaySoundFileMenuItem.Checked = SettingDialog.PlaySound
3005 _fntUnread = SettingDialog.FontUnread
3006 _clUnread = SettingDialog.ColorUnread
3007 _fntReaded = SettingDialog.FontReaded
3008 _clReaded = SettingDialog.ColorReaded
3009 _clFav = SettingDialog.ColorFav
3010 _clOWL = SettingDialog.ColorOWL
3011 _clRetweet = SettingDialog.ColorRetweet
3012 _fntDetail = SettingDialog.FontDetail
3013 _clDetail = SettingDialog.ColorDetail
3014 _clDetailLink = SettingDialog.ColorDetailLink
3015 _clDetailBackcolor = SettingDialog.ColorDetailBackcolor
3016 _clSelf = SettingDialog.ColorSelf
3017 _clAtSelf = SettingDialog.ColorAtSelf
3018 _clTarget = SettingDialog.ColorTarget
3019 _clAtTarget = SettingDialog.ColorAtTarget
3020 _clAtFromTarget = SettingDialog.ColorAtFromTarget
3021 _clAtTo = SettingDialog.ColorAtTo
3022 _clListBackcolor = SettingDialog.ColorListBackcolor
3023 _clInputBackcolor = SettingDialog.ColorInputBackcolor
3024 _clInputFont = SettingDialog.ColorInputFont
3025 _fntInputFont = SettingDialog.FontInputFont
3027 If StatusText.Focused Then StatusText.BackColor = _clInputBackcolor
3028 StatusText.Font = _fntInputFont
3029 StatusText.ForeColor = _clInputFont
3030 Catch ex As Exception
3031 MessageBox.Show(ex.Message)
3034 _brsForeColorUnread.Dispose()
3035 _brsForeColorReaded.Dispose()
3036 _brsForeColorFav.Dispose()
3037 _brsForeColorOWL.Dispose()
3038 _brsForeColorRetweet.Dispose()
3039 _brsForeColorUnread = New SolidBrush(_clUnread)
3040 _brsForeColorReaded = New SolidBrush(_clReaded)
3041 _brsForeColorFav = New SolidBrush(_clFav)
3042 _brsForeColorOWL = New SolidBrush(_clOWL)
3043 _brsForeColorRetweet = New SolidBrush(_clRetweet)
3044 _brsBackColorMine.Dispose()
3045 _brsBackColorAt.Dispose()
3046 _brsBackColorYou.Dispose()
3047 _brsBackColorAtYou.Dispose()
3048 _brsBackColorAtFromTarget.Dispose()
3049 _brsBackColorAtTo.Dispose()
3050 _brsBackColorNone.Dispose()
3051 _brsBackColorMine = New SolidBrush(_clSelf)
3052 _brsBackColorAt = New SolidBrush(_clAtSelf)
3053 _brsBackColorYou = New SolidBrush(_clTarget)
3054 _brsBackColorAtYou = New SolidBrush(_clAtTarget)
3055 _brsBackColorAtFromTarget = New SolidBrush(_clAtFromTarget)
3056 _brsBackColorAtTo = New SolidBrush(_clAtTo)
3057 _brsBackColorNone = New SolidBrush(_clListBackcolor)
3059 If SettingDialog.IsMonospace Then
3060 detailHtmlFormatHeader = detailHtmlFormatMono1
3061 detailHtmlFormatFooter = detailHtmlFormatMono7
3063 detailHtmlFormatHeader = detailHtmlFormat1
3064 detailHtmlFormatFooter = detailHtmlFormat7
3066 detailHtmlFormatHeader += _fntDetail.Name + detailHtmlFormat2 + _fntDetail.Size.ToString() + detailHtmlFormat3 + _clDetail.R.ToString + "," + _clDetail.G.ToString + "," + _clDetail.B.ToString + detailHtmlFormat4 + _clDetailLink.R.ToString + "," + _clDetailLink.G.ToString + "," + _clDetailLink.B.ToString + detailHtmlFormat5 + _clDetailBackcolor.R.ToString + "," + _clDetailBackcolor.G.ToString + "," + _clDetailBackcolor.B.ToString
3067 If SettingDialog.IsMonospace Then
3068 detailHtmlFormatHeader += detailHtmlFormatMono6
3070 detailHtmlFormatHeader += detailHtmlFormat6
3072 Catch ex As Exception
3073 ex.Data("Instance") = "Font"
3074 ex.Data("IsTerminatePermission") = False
3078 _statuses.SetUnreadManage(SettingDialog.UnreadManage)
3079 Catch ex As Exception
3080 ex.Data("Instance") = "_statuses"
3081 ex.Data("IsTerminatePermission") = False
3086 For Each tb As TabPage In ListTab.TabPages
3087 If SettingDialog.TabIconDisp Then
3088 If _statuses.Tabs(tb.Text).UnreadCount = 0 Then
3094 If tb.Tag IsNot Nothing AndAlso tb.Controls.Count > 0 Then
3095 DirectCast(tb.Tag, DetailsListView).Font = _fntReaded
3096 DirectCast(tb.Tag, DetailsListView).BackColor = _clListBackcolor
3099 Catch ex As Exception
3100 ex.Data("Instance") = "ListTab(TabIconDisp no2)"
3101 ex.Data("IsTerminatePermission") = False
3104 SetMainWindowTitle()
3107 _itemCache = Nothing
3108 _postCache = Nothing
3109 If _curList IsNot Nothing Then _curList.Refresh()
3112 Outputz.Key = SettingDialog.OutputzKey
3113 Outputz.Enabled = SettingDialog.OutputzEnabled
3114 Select Case SettingDialog.OutputzUrlmode
3115 Case OutputzUrlmode.twittercom
3116 Outputz.OutUrl = "http://twitter.com/"
3117 Case OutputzUrlmode.twittercomWithUsername
3118 Outputz.OutUrl = "http://twitter.com/" + tw.Username
3121 _hookGlobalHotkey.UnregisterAllOriginalHotkey()
3122 If SettingDialog.HotkeyEnabled Then
3123 '''グローバルホットキーの登録。設定で変更可能にするかも
3124 Dim modKey As HookGlobalHotkey.ModKeys = HookGlobalHotkey.ModKeys.None
3125 If (SettingDialog.HotkeyMod And Keys.Alt) = Keys.Alt Then modKey = modKey Or HookGlobalHotkey.ModKeys.Alt
3126 If (SettingDialog.HotkeyMod And Keys.Control) = Keys.Control Then modKey = modKey Or HookGlobalHotkey.ModKeys.Ctrl
3127 If (SettingDialog.HotkeyMod And Keys.Shift) = Keys.Shift Then modKey = modKey Or HookGlobalHotkey.ModKeys.Shift
3128 If (SettingDialog.HotkeyMod And Keys.LWin) = Keys.LWin Then modKey = modKey Or HookGlobalHotkey.ModKeys.Win
3130 _hookGlobalHotkey.RegisterOriginalHotkey(SettingDialog.HotkeyKey, SettingDialog.HotkeyValue, modKey)
3133 If uid <> tw.Username Then Me.doGetFollowersMenu()
3135 SetImageServiceCombo()
3138 StatusText_TextChanged(Nothing, Nothing)
3139 Catch ex As Exception
3145 Twitter.AccountState = ACCOUNT_STATE.Valid
3147 Me.TopMost = SettingDialog.AlwaysTop
3148 SaveConfigsAll(False)
3151 Private Sub PostBrowser_Navigated(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserNavigatedEventArgs) Handles PostBrowser.Navigated
3152 If e.Url.AbsoluteUri <> "about:blank" Then
3154 OpenUriAsync(e.Url.OriginalString)
3158 Private Sub PostBrowser_Navigating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserNavigatingEventArgs) Handles PostBrowser.Navigating
3159 If e.Url.Scheme = "data" Then
3160 StatusLabelUrl.Text = PostBrowser.StatusText.Replace("&", "&&")
3161 ElseIf e.Url.AbsoluteUri <> "about:blank" Then
3164 If e.Url.AbsoluteUri.StartsWith("http://twitter.com/search?q=%23") OrElse _
3165 e.Url.AbsoluteUri.StartsWith("https://twitter.com/search?q=%23") Then
3167 Dim urlStr As String = HttpUtility.UrlDecode(e.Url.AbsoluteUri)
3168 Dim hash As String = urlStr.Substring(urlStr.IndexOf("#"))
3169 HashSupl.AddItem(hash)
3170 HashMgr.AddHashToHistory(hash.Trim, False)
3171 AddNewTabForSearch(hash)
3174 OpenUriAsync(e.Url.OriginalString)
3179 Public Sub AddNewTabForSearch(ByVal searchWord As String)
3180 '同一検索条件のタブが既に存在すれば、そのタブアクティブにして終了
3181 For Each tb As TabClass In _statuses.GetTabsByType(TabUsageType.PublicSearch)
3182 If tb.SearchWords = searchWord AndAlso tb.SearchLang = "" Then
3183 For Each tp As TabPage In ListTab.TabPages
3184 If tb.TabName = tp.Text Then
3185 ListTab.SelectedTab = tp
3192 Dim tabName As String = searchWord
3193 For i As Integer = 0 To 100
3194 If _statuses.ContainsTab(tabName) Then
3201 AddNewTab(tabName, False, TabUsageType.PublicSearch)
3202 _statuses.AddTab(tabName, TabUsageType.PublicSearch, Nothing)
3204 ListTab.SelectedIndex = ListTab.TabPages.Count - 1
3206 Dim cmb As ComboBox = DirectCast(ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch"), ComboBox)
3207 cmb.Items.Add(searchWord)
3208 cmb.Text = searchWord
3211 Me.SearchButton_Click(ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch"), Nothing)
3214 Public Function AddNewTab(ByVal tabName As String, ByVal startup As Boolean, ByVal tabType As TabUsageType) As Boolean
3216 For Each tb As TabPage In ListTab.TabPages
3217 If tb.Text = tabName Then Return False
3221 If tabName = My.Resources.AddNewTabText1 Then Return False
3225 If tabType = TabUsageType.DirectMessage OrElse _
3226 tabType = TabUsageType.Favorites OrElse _
3227 tabType = TabUsageType.Home OrElse _
3228 tabType = TabUsageType.Mentions OrElse _
3229 tabType = TabUsageType.Related Then
3230 If _statuses.GetTabByType(tabType) IsNot Nothing Then Return False
3234 Dim _tabPage As TabPage = New TabPage
3235 Dim _listCustom As DetailsListView = New DetailsListView
3236 Dim _colHd1 As ColumnHeader = New ColumnHeader() 'アイコン
3237 Dim _colHd2 As ColumnHeader = New ColumnHeader() 'ニックネーム
3238 Dim _colHd3 As ColumnHeader = New ColumnHeader() '本文
3239 Dim _colHd4 As ColumnHeader = New ColumnHeader() '日付
3240 Dim _colHd5 As ColumnHeader = New ColumnHeader() 'ユーザID
3241 Dim _colHd6 As ColumnHeader = New ColumnHeader() '未読
3242 Dim _colHd7 As ColumnHeader = New ColumnHeader() 'マーク&プロテクト
3243 Dim _colHd8 As ColumnHeader = New ColumnHeader() 'ソース
3245 Dim cnt As Integer = ListTab.TabPages.Count
3247 '''ToDo:Create and set controls follow tabtypes
3249 Me.SplitContainer1.Panel1.SuspendLayout()
3250 Me.SplitContainer1.Panel2.SuspendLayout()
3251 Me.SplitContainer1.SuspendLayout()
3252 Me.ListTab.SuspendLayout()
3255 _tabPage.SuspendLayout()
3260 Dim pnl As Panel = Nothing
3261 If tabType = TabUsageType.PublicSearch Then
3264 Dim lbl As New Label
3265 Dim cmb As New ComboBox
3266 Dim btn As New Button
3267 Dim cmbLang As New ComboBox
3271 pnl.Controls.Add(cmb)
3272 pnl.Controls.Add(cmbLang)
3273 pnl.Controls.Add(btn)
3274 pnl.Controls.Add(lbl)
3275 pnl.Name = "panelSearch"
3276 pnl.Dock = DockStyle.Top
3277 pnl.Height = cmb.Height
3278 AddHandler pnl.Enter, AddressOf SearchControls_Enter
3279 AddHandler pnl.Leave, AddressOf SearchControls_Leave
3282 cmb.Anchor = AnchorStyles.Left Or AnchorStyles.Right
3283 cmb.Dock = DockStyle.Fill
3284 cmb.Name = "comboSearch"
3285 cmb.DropDownStyle = ComboBoxStyle.DropDown
3286 cmb.ImeMode = Windows.Forms.ImeMode.NoControl
3288 cmb.AutoCompleteMode = AutoCompleteMode.None
3290 If _statuses.ContainsTab(tabName) Then
3291 cmb.Items.Add(_statuses.Tabs(tabName).SearchWords)
3292 cmb.Text = _statuses.Tabs(tabName).SearchWords
3296 cmbLang.Anchor = AnchorStyles.Left Or AnchorStyles.Right
3297 cmbLang.Dock = DockStyle.Right
3299 cmbLang.Name = "comboLang"
3300 cmbLang.DropDownStyle = ComboBoxStyle.DropDownList
3301 cmbLang.TabStop = False
3302 cmbLang.Items.Add("")
3303 cmbLang.Items.Add("ja")
3304 cmbLang.Items.Add("en")
3305 cmbLang.Items.Add("ar")
3306 cmbLang.Items.Add("da")
3307 cmbLang.Items.Add("nl")
3308 cmbLang.Items.Add("fa")
3309 cmbLang.Items.Add("fi")
3310 cmbLang.Items.Add("fr")
3311 cmbLang.Items.Add("de")
3312 cmbLang.Items.Add("hu")
3313 cmbLang.Items.Add("is")
3314 cmbLang.Items.Add("it")
3315 cmbLang.Items.Add("no")
3316 cmbLang.Items.Add("pl")
3317 cmbLang.Items.Add("pt")
3318 cmbLang.Items.Add("ru")
3319 cmbLang.Items.Add("es")
3320 cmbLang.Items.Add("sv")
3321 cmbLang.Items.Add("th")
3322 If _statuses.ContainsTab(tabName) Then cmbLang.Text = _statuses.Tabs(tabName).SearchLang
3324 lbl.Text = "Search(C-S-f)"
3326 lbl.Dock = DockStyle.Left
3328 lbl.Height = cmb.Height
3329 lbl.TextAlign = ContentAlignment.MiddleLeft
3332 btn.Name = "buttonSearch"
3333 btn.UseVisualStyleBackColor = True
3334 btn.Dock = DockStyle.Right
3336 AddHandler btn.Click, AddressOf SearchButton_Click
3340 Me.ListTab.Controls.Add(_tabPage)
3341 _tabPage.Controls.Add(_listCustom)
3343 If tabType = TabUsageType.PublicSearch Then _tabPage.Controls.Add(pnl)
3345 _tabPage.Location = New Point(4, 4)
3346 _tabPage.Name = "CTab" + cnt.ToString()
3347 _tabPage.Size = New Size(380, 260)
3348 _tabPage.TabIndex = 2 + cnt
3349 _tabPage.Text = tabName
3350 _tabPage.UseVisualStyleBackColor = True
3352 _listCustom.AllowColumnReorder = True
3353 If Not _iconCol Then
3354 _listCustom.Columns.AddRange(New ColumnHeader() {_colHd1, _colHd2, _colHd3, _colHd4, _colHd5, _colHd6, _colHd7, _colHd8})
3356 _listCustom.Columns.AddRange(New ColumnHeader() {_colHd1, _colHd3})
3358 _listCustom.ContextMenuStrip = Me.ContextMenuOperate
3359 _listCustom.Dock = DockStyle.Fill
3360 _listCustom.FullRowSelect = True
3361 _listCustom.HideSelection = False
3362 _listCustom.Location = New Point(0, 0)
3363 _listCustom.Margin = New Padding(0)
3364 _listCustom.Name = "CList" + Environment.TickCount.ToString()
3365 _listCustom.ShowItemToolTips = True
3366 _listCustom.Size = New Size(380, 260)
3367 _listCustom.UseCompatibleStateImageBehavior = False
3368 _listCustom.View = View.Details
3369 _listCustom.OwnerDraw = True
3370 _listCustom.VirtualMode = True
3371 _listCustom.Font = _fntReaded
3372 _listCustom.BackColor = _clListBackcolor
3374 _listCustom.GridLines = SettingDialog.ShowGrid
3375 _listCustom.AllowDrop = True
3377 AddHandler _listCustom.SelectedIndexChanged, AddressOf MyList_SelectedIndexChanged
3378 AddHandler _listCustom.MouseDoubleClick, AddressOf MyList_MouseDoubleClick
3379 AddHandler _listCustom.ColumnClick, AddressOf MyList_ColumnClick
3380 AddHandler _listCustom.DrawColumnHeader, AddressOf MyList_DrawColumnHeader
3381 AddHandler _listCustom.DragDrop, AddressOf TweenMain_DragDrop
3382 AddHandler _listCustom.DragOver, AddressOf TweenMain_DragOver
3383 AddHandler _listCustom.DrawItem, AddressOf MyList_DrawItem
3384 AddHandler _listCustom.MouseClick, AddressOf MyList_MouseClick
3385 AddHandler _listCustom.ColumnReordered, AddressOf MyList_ColumnReordered
3386 AddHandler _listCustom.ColumnWidthChanged, AddressOf MyList_ColumnWidthChanged
3387 AddHandler _listCustom.CacheVirtualItems, AddressOf MyList_CacheVirtualItems
3388 AddHandler _listCustom.RetrieveVirtualItem, AddressOf MyList_RetrieveVirtualItem
3389 AddHandler _listCustom.DrawSubItem, AddressOf MyList_DrawSubItem
3390 AddHandler _listCustom.HScrolled, AddressOf MyList_HScrolled
3393 _colHd1.Text = ColumnText(0)
3395 _colHd2.Text = ColumnText(1)
3397 _colHd3.Text = ColumnText(2)
3399 _colHd4.Text = ColumnText(3)
3401 _colHd5.Text = ColumnText(4)
3403 _colHd6.Text = ColumnText(5)
3405 _colHd7.Text = ColumnText(6)
3407 _colHd8.Text = ColumnText(7)
3410 If (_statuses.Tabs.ContainsKey(tabName) AndAlso _statuses.Tabs(tabName).TabType = TabUsageType.Mentions) _
3411 OrElse (Not _statuses.IsDefaultTab(tabName) AndAlso tabType <> TabUsageType.PublicSearch AndAlso tabType <> TabUsageType.Lists AndAlso tabType <> TabUsageType.Related) Then
3412 TabDialog.AddTab(tabName)
3415 _listCustom.SmallImageList = New ImageList()
3417 _listCustom.SmallImageList.ImageSize = New Size(_iconSz, _iconSz)
3420 Dim dispOrder(7) As Integer
3422 For i As Integer = 0 To _curList.Columns.Count - 1
3423 For j As Integer = 0 To _curList.Columns.Count - 1
3424 If _curList.Columns(j).DisplayIndex = i Then
3430 For i As Integer = 0 To _curList.Columns.Count - 1
3431 _listCustom.Columns(i).Width = _curList.Columns(i).Width
3432 _listCustom.Columns(dispOrder(i)).DisplayIndex = i
3436 _listCustom.Columns(0).Width = _cfgLocal.Width1
3437 _listCustom.Columns(1).Width = _cfgLocal.Width3
3438 _listCustom.Columns(0).DisplayIndex = 0
3439 _listCustom.Columns(1).DisplayIndex = 1
3441 For i As Integer = 0 To 7
3442 If _cfgLocal.DisplayIndex1 = i Then
3444 ElseIf _cfgLocal.DisplayIndex2 = i Then
3446 ElseIf _cfgLocal.DisplayIndex3 = i Then
3448 ElseIf _cfgLocal.DisplayIndex4 = i Then
3450 ElseIf _cfgLocal.DisplayIndex5 = i Then
3452 ElseIf _cfgLocal.DisplayIndex6 = i Then
3454 ElseIf _cfgLocal.DisplayIndex7 = i Then
3456 ElseIf _cfgLocal.DisplayIndex8 = i Then
3460 _listCustom.Columns(0).Width = _cfgLocal.Width1
3461 _listCustom.Columns(1).Width = _cfgLocal.Width2
3462 _listCustom.Columns(2).Width = _cfgLocal.Width3
3463 _listCustom.Columns(3).Width = _cfgLocal.Width4
3464 _listCustom.Columns(4).Width = _cfgLocal.Width5
3465 _listCustom.Columns(5).Width = _cfgLocal.Width6
3466 _listCustom.Columns(6).Width = _cfgLocal.Width7
3467 _listCustom.Columns(7).Width = _cfgLocal.Width8
3468 For i As Integer = 0 To 7
3469 _listCustom.Columns(dispOrder(i)).DisplayIndex = i
3474 If tabType = TabUsageType.PublicSearch Then pnl.ResumeLayout(False)
3476 _tabPage.ResumeLayout(False)
3478 Me.SplitContainer1.Panel1.ResumeLayout(False)
3479 Me.SplitContainer1.Panel2.ResumeLayout(False)
3480 Me.SplitContainer1.ResumeLayout(False)
3481 Me.ListTab.ResumeLayout(False)
3482 Me.ResumeLayout(False)
3484 _tabPage.Tag = _listCustom
3488 Public Function RemoveSpecifiedTab(ByVal TabName As String) As Boolean
3489 Dim idx As Integer = 0
3490 For idx = 0 To ListTab.TabPages.Count - 1
3491 If ListTab.TabPages(idx).Text = TabName Then Exit For
3494 If _statuses.IsDefaultTab(TabName) Then Return False
3496 Dim tmp As String = String.Format(My.Resources.RemoveSpecifiedTabText1, Environment.NewLine)
3497 If MessageBox.Show(tmp, TabName + " " + My.Resources.RemoveSpecifiedTabText2, _
3498 MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Cancel Then
3502 SetListProperty() '他のタブに列幅等を反映
3504 Dim tabType As TabUsageType = _statuses.Tabs(TabName).TabType
3507 Me.SplitContainer1.Panel1.SuspendLayout()
3508 Me.SplitContainer1.Panel2.SuspendLayout()
3509 Me.SplitContainer1.SuspendLayout()
3510 Me.ListTab.SuspendLayout()
3513 Dim _tabPage As TabPage = ListTab.TabPages(idx)
3514 Dim _listCustom As DetailsListView = DirectCast(_tabPage.Tag, DetailsListView)
3515 _tabPage.Tag = Nothing
3517 _tabPage.SuspendLayout()
3519 Me.ListTab.Controls.Remove(_tabPage)
3521 Dim pnl As Control = Nothing
3522 If tabType = TabUsageType.PublicSearch Then
3523 pnl = _tabPage.Controls("panelSearch")
3524 For Each ctrl As Control In pnl.Controls
3525 If ctrl.Name = "buttonSearch" Then
3526 RemoveHandler ctrl.Click, AddressOf SearchButton_Click
3528 RemoveHandler ctrl.Enter, AddressOf SearchControls_Enter
3529 RemoveHandler ctrl.Leave, AddressOf SearchControls_Leave
3530 pnl.Controls.Remove(ctrl)
3533 _tabPage.Controls.Remove(pnl)
3536 _tabPage.Controls.Remove(_listCustom)
3537 _listCustom.Columns.Clear()
3538 _listCustom.ContextMenuStrip = Nothing
3540 RemoveHandler _listCustom.SelectedIndexChanged, AddressOf MyList_SelectedIndexChanged
3541 RemoveHandler _listCustom.MouseDoubleClick, AddressOf MyList_MouseDoubleClick
3542 RemoveHandler _listCustom.ColumnClick, AddressOf MyList_ColumnClick
3543 RemoveHandler _listCustom.DrawColumnHeader, AddressOf MyList_DrawColumnHeader
3544 RemoveHandler _listCustom.DragDrop, AddressOf TweenMain_DragDrop
3545 RemoveHandler _listCustom.DragOver, AddressOf TweenMain_DragOver
3546 RemoveHandler _listCustom.DrawItem, AddressOf MyList_DrawItem
3547 RemoveHandler _listCustom.MouseClick, AddressOf MyList_MouseClick
3548 RemoveHandler _listCustom.ColumnReordered, AddressOf MyList_ColumnReordered
3549 RemoveHandler _listCustom.ColumnWidthChanged, AddressOf MyList_ColumnWidthChanged
3550 RemoveHandler _listCustom.CacheVirtualItems, AddressOf MyList_CacheVirtualItems
3551 RemoveHandler _listCustom.RetrieveVirtualItem, AddressOf MyList_RetrieveVirtualItem
3552 RemoveHandler _listCustom.DrawSubItem, AddressOf MyList_DrawSubItem
3553 RemoveHandler _listCustom.HScrolled, AddressOf MyList_HScrolled
3555 TabDialog.RemoveTab(TabName)
3557 _listCustom.SmallImageList = Nothing
3558 _listCustom.ListViewItemSorter = Nothing
3561 If _curTab.Equals(_tabPage) Then
3567 _itemCache = Nothing
3568 _itemCacheIndex = -1
3569 _postCache = Nothing
3571 _tabPage.ResumeLayout(False)
3573 Me.SplitContainer1.Panel1.ResumeLayout(False)
3574 Me.SplitContainer1.Panel2.ResumeLayout(False)
3575 Me.SplitContainer1.ResumeLayout(False)
3576 Me.ListTab.ResumeLayout(False)
3577 Me.ResumeLayout(False)
3581 _listCustom.Dispose()
3582 _statuses.RemoveTab(TabName)
3584 For Each tp As TabPage In ListTab.TabPages
3585 Dim lst As DetailsListView = DirectCast(tp.Tag, DetailsListView)
3586 If lst.VirtualListSize <> _statuses.Tabs(tp.Text).AllCount Then
3587 lst.VirtualListSize = _statuses.Tabs(tp.Text).AllCount
3593 Private Sub ListTab_Deselected(ByVal sender As Object, ByVal e As System.Windows.Forms.TabControlEventArgs) Handles ListTab.Deselected
3594 _itemCache = Nothing
3595 _itemCacheIndex = -1
3596 _postCache = Nothing
3599 Private Sub ListTab_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListTab.MouseMove
3601 Dim cpos As New Point(e.X, e.Y)
3603 If e.Button = Windows.Forms.MouseButtons.Left AndAlso _tabDrag Then
3604 Dim tn As String = ""
3605 For i As Integer = 0 To ListTab.TabPages.Count - 1
3606 Dim rect As Rectangle = ListTab.GetTabRect(i)
3607 If rect.Left <= cpos.X AndAlso cpos.X <= rect.Right AndAlso _
3608 rect.Top <= cpos.Y AndAlso cpos.Y <= rect.Bottom Then
3609 tn = ListTab.TabPages(i).Text
3614 If tn = "" Then Exit Sub
3616 For Each tb As TabPage In ListTab.TabPages
3617 If tb.Text = tn Then
3618 ListTab.DoDragDrop(tb, DragDropEffects.All)
3626 For i As Integer = 0 To ListTab.TabPages.Count - 1
3627 Dim rect As Rectangle = ListTab.GetTabRect(i)
3628 If rect.Left <= cpos.X And cpos.X <= rect.Right And _
3629 rect.Top <= cpos.Y And cpos.Y <= rect.Bottom Then
3630 _rclickTabName = ListTab.TabPages(i).Text
3636 Private Sub ListTab_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListTab.SelectedIndexChanged
3639 SetMainWindowTitle()
3641 If ListTab.Focused OrElse DirectCast(ListTab.SelectedTab.Tag, Control).Focused Then Me.Tag = ListTab.Tag
3642 TabMenuControl(ListTab.SelectedTab.Text)
3645 Private Sub SetListProperty()
3647 If _curList Is Nothing Then Exit Sub
3648 If Not _isColumnChanged Then Exit Sub
3650 Dim dispOrder(_curList.Columns.Count - 1) As Integer
3651 For i As Integer = 0 To _curList.Columns.Count - 1
3652 For j As Integer = 0 To _curList.Columns.Count - 1
3653 If _curList.Columns(j).DisplayIndex = i Then
3661 For Each tb As TabPage In ListTab.TabPages
3662 If Not tb.Equals(_curTab) Then
3663 If tb.Tag IsNot Nothing AndAlso tb.Controls.Count > 0 Then
3664 Dim lst As DetailsListView = DirectCast(tb.Tag, DetailsListView)
3665 For i As Integer = 0 To lst.Columns.Count - 1
3666 lst.Columns(dispOrder(i)).DisplayIndex = i
3667 lst.Columns(i).Width = _curList.Columns(i).Width
3673 _isColumnChanged = False
3676 Private Sub PostBrowser_StatusTextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles PostBrowser.StatusTextChanged
3677 If PostBrowser.StatusText.StartsWith("http") OrElse PostBrowser.StatusText.StartsWith("ftp") _
3678 OrElse PostBrowser.StatusText.StartsWith("data") Then
3679 StatusLabelUrl.Text = PostBrowser.StatusText.Replace("&", "&&")
3681 If PostBrowser.StatusText = "" Then
3686 Private Sub StatusText_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles StatusText.KeyPress
3687 If e.KeyChar = "@" Then
3688 If Not SettingDialog.UseAtIdSupplement Then Exit Sub
3690 ShowSuplDialog(StatusText, AtIdSupl)
3692 ElseIf e.KeyChar = "#" Then
3693 If Not SettingDialog.UseHashSupplement Then Exit Sub
3694 ShowSuplDialog(StatusText, HashSupl)
3699 Public Overloads Sub ShowSuplDialog(ByVal owner As TextBox, ByVal dialog As AtIdSupplement)
3700 ShowSuplDialog(owner, dialog, 0, "")
3703 Public Overloads Sub ShowSuplDialog(ByVal owner As TextBox, ByVal dialog As AtIdSupplement, ByVal offset As Integer)
3704 ShowSuplDialog(owner, dialog, offset, "")
3707 Public Overloads Sub ShowSuplDialog(ByVal owner As TextBox, ByVal dialog As AtIdSupplement, ByVal offset As Integer, ByVal startswith As String)
3708 dialog.StartsWith = startswith
3709 If dialog.Visible Then
3714 Me.TopMost = SettingDialog.AlwaysTop
3715 Dim selStart As Integer = owner.SelectionStart
3716 Dim fHalf As String = ""
3717 Dim eHalf As String = ""
3718 If dialog.DialogResult = Windows.Forms.DialogResult.OK Then
3719 If dialog.inputText <> "" Then
3720 If selStart > 0 Then
3721 fHalf = owner.Text.Substring(0, selStart - offset)
3723 If selStart < owner.Text.Length Then
3724 eHalf = owner.Text.Substring(selStart)
3726 owner.Text = fHalf + dialog.inputText + eHalf
3727 owner.SelectionStart = selStart + dialog.inputText.Length
3730 If selStart > 0 Then
3731 fHalf = owner.Text.Substring(0, selStart)
3733 If selStart < owner.Text.Length Then
3734 eHalf = owner.Text.Substring(selStart)
3736 owner.Text = fHalf + eHalf
3737 If selStart > 0 Then
3738 owner.SelectionStart = selStart
3744 Private Sub StatusText_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles StatusText.KeyUp
3746 If Not e.Alt AndAlso Not e.Control AndAlso Not e.Shift Then
3747 If e.KeyCode = Keys.Space OrElse e.KeyCode = Keys.ProcessKey Then
3748 Dim isSpace As Boolean = False
3749 For Each c As Char In StatusText.Text.ToCharArray
3750 If c = " " OrElse c = " " Then
3759 StatusText.Text = ""
3760 JumpUnreadMenuItem_Click(Nothing, Nothing)
3764 Me.StatusText_TextChanged(Nothing, Nothing)
3767 Private Sub StatusText_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StatusText.TextChanged
3769 Dim pLen As Integer = GetRestStatusCount(True, False)
3770 lblLen.Text = pLen.ToString()
3772 StatusText.ForeColor = Color.Red
3774 StatusText.ForeColor = _clInputFont
3776 If StatusText.Text = "" Then
3782 Private Function GetRestStatusCount(ByVal isAuto As Boolean, ByVal isAddFooter As Boolean) As Integer
3784 Dim pLen As Integer = 140 - StatusText.Text.Length
3785 If (isAuto AndAlso Not My.Computer.Keyboard.CtrlKeyDown AndAlso SettingDialog.PostShiftEnter) OrElse _
3786 (isAuto AndAlso Not My.Computer.Keyboard.ShiftKeyDown AndAlso Not SettingDialog.PostShiftEnter) OrElse _
3787 (Not isAuto AndAlso isAddFooter) Then
3788 If SettingDialog.UseRecommendStatus Then
3789 pLen -= SettingDialog.RecommendStatusText.Length
3790 ElseIf SettingDialog.Status.Length > 0 Then
3791 pLen -= SettingDialog.Status.Length + 1
3794 If HashMgr.UseHash <> "" Then
3795 pLen -= HashMgr.UseHash.Length + 1
3800 Private Sub MyList_CacheVirtualItems(ByVal sender As System.Object, ByVal e As System.Windows.Forms.CacheVirtualItemsEventArgs)
3801 If _itemCache IsNot Nothing AndAlso _
3802 e.StartIndex >= _itemCacheIndex AndAlso _
3803 e.EndIndex < _itemCacheIndex + _itemCache.Length AndAlso _
3804 _curList.Equals(sender) Then
3805 'If the newly requested cache is a subset of the old cache,
3806 'no need to rebuild everything, so do nothing.
3810 'Now we need to rebuild the cache.
3811 If _curList.Equals(sender) Then CreateCache(e.StartIndex, e.EndIndex)
3814 Private Sub MyList_RetrieveVirtualItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.RetrieveVirtualItemEventArgs)
3815 If _itemCache IsNot Nothing AndAlso e.ItemIndex >= _itemCacheIndex AndAlso e.ItemIndex < _itemCacheIndex + _itemCache.Length AndAlso _curList.Equals(sender) Then
3816 'A cache hit, so get the ListViewItem from the cache instead of making a new one.
3817 e.Item = _itemCache(e.ItemIndex - _itemCacheIndex)
3819 'A cache miss, so create a new ListViewItem and pass it back.
3820 Dim tb As TabPage = DirectCast(DirectCast(sender, Tween.TweenCustomControl.DetailsListView).Parent, TabPage)
3822 e.Item = CreateItem(tb, _
3823 _statuses.Item(tb.Text, e.ItemIndex), _
3825 Catch ex As Exception
3827 Dim sitem() As String = {"", "", "", "", "", "", "", ""}
3828 e.Item = New ImageListViewItem(sitem, "")
3833 Private Sub CreateCache(ByVal StartIndex As Integer, ByVal EndIndex As Integer)
3835 'キャッシュ要求(要求範囲±30を作成)
3837 If StartIndex < 0 Then StartIndex = 0
3839 If EndIndex >= _statuses.Tabs(_curTab.Text).AllCount Then EndIndex = _statuses.Tabs(_curTab.Text).AllCount - 1
3840 _postCache = _statuses.Item(_curTab.Text, StartIndex, EndIndex) '配列で取得
3841 _itemCacheIndex = StartIndex
3843 _itemCache = New ListViewItem(_postCache.Length - 1) {}
3844 For i As Integer = 0 To _postCache.Length - 1
3845 _itemCache(i) = CreateItem(_curTab, _postCache(i), StartIndex + i)
3847 Catch ex As Exception
3848 'キャッシュ要求が実データとずれるため(イベントの遅延?)
3849 _postCache = Nothing
3850 _itemCache = Nothing
3854 Private Function CreateItem(ByVal Tab As TabPage, ByVal Post As PostClass, ByVal Index As Integer) As ListViewItem
3855 Dim mk As String = ""
3856 If Post.IsMark Then mk += "♪"
3857 If Post.IsProtect Then mk += "Ю"
3858 If Post.InReplyToId > 0 Then mk += "⇒"
3859 Dim itm As ImageListViewItem
3860 If Post.RetweetedId = 0 Then
3861 Dim sitem() As String = {"",
3864 Post.PDate.ToString(SettingDialog.DateTimeFormat),
3869 itm = New ImageListViewItem(sitem, DirectCast(Me.TIconDic, ImageDictionary), Post.ImageUrl)
3871 Dim sitem() As String = {"",
3874 Post.PDate.ToString(SettingDialog.DateTimeFormat),
3875 Post.Name + Environment.NewLine + "(RT:" + Post.RetweetedBy + ")",
3879 itm = New ImageListViewItem(sitem, DirectCast(Me.TIconDic, ImageDictionary), Post.ImageUrl)
3882 Dim read As Boolean = Post.IsRead
3883 '未読管理していなかったら既読として扱う
3884 If Not _statuses.Tabs(Tab.Text).UnreadManage OrElse _
3885 Not SettingDialog.UnreadManage Then read = True
3886 ChangeItemStyleRead(read, itm, Post, Nothing)
3887 If Tab.Equals(_curTab) Then ColorizeList(itm, Index)
3891 Private Sub MyList_DrawColumnHeader(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs)
3892 e.DrawDefault = True
3895 Private Sub MyList_HScrolled(ByVal sender As Object, ByVal e As EventArgs)
3896 Dim listView As DetailsListView = DirectCast(sender, DetailsListView)
3900 Private Sub MyList_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawListViewItemEventArgs)
3901 If e.State = 0 Then Exit Sub
3902 e.DrawDefault = False
3903 If Not e.Item.Selected Then 'e.ItemStateでうまく判定できない???
3904 Dim brs2 As SolidBrush = Nothing
3905 Select Case e.Item.BackColor
3907 brs2 = _brsBackColorMine
3909 brs2 = _brsBackColorAt
3911 brs2 = _brsBackColorYou
3913 brs2 = _brsBackColorAtYou
3914 Case _clAtFromTarget
3915 brs2 = _brsBackColorAtFromTarget
3917 brs2 = _brsBackColorAtTo
3919 brs2 = _brsBackColorNone
3921 e.Graphics.FillRectangle(brs2, e.Bounds)
3924 If DirectCast(sender, Windows.Forms.Control).Focused Then
3925 e.Graphics.FillRectangle(_brsHighLight, e.Bounds)
3927 e.Graphics.FillRectangle(_brsDeactiveSelection, e.Bounds)
3930 If (e.State And ListViewItemStates.Focused) = ListViewItemStates.Focused Then e.DrawFocusRectangle()
3933 Private Sub MyList_DrawSubItem(ByVal sender As Object, ByVal e As DrawListViewSubItemEventArgs)
3934 If e.ItemState = 0 Then Exit Sub
3936 If e.ColumnIndex = 0 Then
3937 Me.DrawListViewItemIcon(e)
3940 Dim rct As RectangleF = e.Bounds
3941 Dim rctB As RectangleF = e.Bounds
3942 rct.Width = e.Header.Width
3943 rctB.Width = e.Header.Width
3945 rct.Y += e.Item.Font.Height
3946 rct.Height -= e.Item.Font.Height
3947 rctB.Height = e.Item.Font.Height
3951 Dim heightDiff As Integer
3952 Dim drawLineCount As Integer = Math.Max(1, Math.DivRem(CType(rct.Height, Integer), e.Item.Font.Height, heightDiff))
3954 'If heightDiff > e.Item.Font.Height * 0.7 Then
3955 ' rct.Height += e.Item.Font.Height
3956 ' drawLineCount += 1
3959 'フォントの高さの半分を足してるのは保険。無くてもいいかも。
3960 If Not _iconCol AndAlso drawLineCount <= 1 Then
3961 'rct.Inflate(0, CType(heightDiff / -2, Integer))
3962 'rct.Height += CType(e.Item.Font.Height / 2, Integer)
3963 ElseIf heightDiff < e.Item.Font.Height * 0.7 Then
3964 '最終行が70%以上欠けていたら、最終行は表示しない
3965 'rct.Height = CType((e.Item.Font.Height * drawLineCount) + (e.Item.Font.Height / 2), Single)
3966 rct.Height = CType((e.Item.Font.Height * drawLineCount), Single) - 1
3971 'If Not _iconCol AndAlso drawLineCount > 1 Then
3972 ' rct.Y += CType(e.Item.Font.Height * 0.2, Single)
3973 ' If heightDiff >= e.Item.Font.Height * 0.8 Then rct.Height -= CType(e.Item.Font.Height * 0.2, Single)
3975 If Not e.Item.Selected Then 'e.ItemStateでうまく判定できない???
3978 Dim brs As SolidBrush = Nothing
3979 Dim flg As Boolean = False
3980 Select Case e.Item.ForeColor
3982 brs = _brsForeColorUnread
3984 brs = _brsForeColorReaded
3986 brs = _brsForeColorFav
3988 brs = _brsForeColorOWL
3990 brs = _brsForeColorRetweet
3992 brs = New SolidBrush(e.Item.ForeColor)
3995 If rct.Width > 0 Then
3997 Dim fnt As New Font(e.Item.Font, FontStyle.Bold)
3998 'e.Graphics.DrawString(System.Environment.NewLine + e.Item.SubItems(2).Text, e.Item.Font, brs, rct, sf)
3999 '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)
4000 TextRenderer.DrawText(e.Graphics,
4001 e.Item.SubItems(2).Text,
4003 Rectangle.Round(rct),
4005 TextFormatFlags.WordBreak Or
4006 TextFormatFlags.EndEllipsis Or
4007 TextFormatFlags.GlyphOverhangPadding Or
4008 TextFormatFlags.NoPrefix)
4009 TextRenderer.DrawText(e.Graphics,
4010 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 + "]",
4012 Rectangle.Round(rctB),
4014 TextFormatFlags.SingleLine Or
4015 TextFormatFlags.EndEllipsis Or
4016 TextFormatFlags.GlyphOverhangPadding Or
4017 TextFormatFlags.NoPrefix)
4019 ElseIf drawLineCount = 1 Then
4020 TextRenderer.DrawText(e.Graphics,
4023 Rectangle.Round(rct),
4025 TextFormatFlags.SingleLine Or
4026 TextFormatFlags.EndEllipsis Or
4027 TextFormatFlags.GlyphOverhangPadding Or
4028 TextFormatFlags.NoPrefix Or
4029 TextFormatFlags.VerticalCenter)
4031 'e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, brs, rct, sf)
4032 TextRenderer.DrawText(e.Graphics,
4035 Rectangle.Round(rct),
4037 TextFormatFlags.WordBreak Or
4038 TextFormatFlags.EndEllipsis Or
4039 TextFormatFlags.GlyphOverhangPadding Or
4040 TextFormatFlags.NoPrefix)
4043 If flg Then brs.Dispose()
4045 If rct.Width > 0 Then
4047 Dim fnt As New Font(e.Item.Font, FontStyle.Bold)
4048 If DirectCast(sender, Windows.Forms.Control).Focused Then
4050 'e.Graphics.DrawString(System.Environment.NewLine + e.Item.SubItems(2).Text, e.Item.Font, _brsHighLightText, rct, sf)
4051 '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)
4052 TextRenderer.DrawText(e.Graphics,
4053 e.Item.SubItems(2).Text,
4055 Rectangle.Round(rct),
4056 _brsHighLightText.Color,
4057 TextFormatFlags.WordBreak Or
4058 TextFormatFlags.EndEllipsis Or
4059 TextFormatFlags.GlyphOverhangPadding Or
4060 TextFormatFlags.NoPrefix)
4061 TextRenderer.DrawText(e.Graphics,
4062 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 + "]",
4064 Rectangle.Round(rctB),
4065 _brsHighLightText.Color,
4066 TextFormatFlags.SingleLine Or
4067 TextFormatFlags.EndEllipsis Or
4068 TextFormatFlags.GlyphOverhangPadding Or
4069 TextFormatFlags.NoPrefix)
4070 ElseIf drawLineCount = 1 Then
4071 TextRenderer.DrawText(e.Graphics,
4074 Rectangle.Round(rct),
4075 _brsHighLightText.Color,
4076 TextFormatFlags.SingleLine Or
4077 TextFormatFlags.EndEllipsis Or
4078 TextFormatFlags.GlyphOverhangPadding Or
4079 TextFormatFlags.NoPrefix Or
4080 TextFormatFlags.VerticalCenter)
4082 'e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, _brsHighLightText, rct, sf)
4083 TextRenderer.DrawText(e.Graphics,
4086 Rectangle.Round(rct),
4087 _brsHighLightText.Color,
4088 TextFormatFlags.WordBreak Or
4089 TextFormatFlags.EndEllipsis Or
4090 TextFormatFlags.GlyphOverhangPadding Or
4091 TextFormatFlags.NoPrefix)
4095 'e.Graphics.DrawString(System.Environment.NewLine + e.Item.SubItems(2).Text, e.Item.Font, _brsForeColorUnread, rct, sf)
4096 '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)
4097 TextRenderer.DrawText(e.Graphics,
4098 e.Item.SubItems(2).Text,
4100 Rectangle.Round(rct),
4101 _brsForeColorUnread.Color,
4102 TextFormatFlags.WordBreak Or
4103 TextFormatFlags.EndEllipsis Or
4104 TextFormatFlags.GlyphOverhangPadding Or
4105 TextFormatFlags.NoPrefix)
4106 TextRenderer.DrawText(e.Graphics,
4107 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 + "]",
4109 Rectangle.Round(rctB),
4110 _brsForeColorUnread.Color,
4111 TextFormatFlags.SingleLine Or
4112 TextFormatFlags.EndEllipsis Or
4113 TextFormatFlags.GlyphOverhangPadding Or
4114 TextFormatFlags.NoPrefix)
4115 ElseIf drawLineCount = 1 Then
4116 TextRenderer.DrawText(e.Graphics,
4119 Rectangle.Round(rct),
4120 _brsForeColorUnread.Color,
4121 TextFormatFlags.SingleLine Or
4122 TextFormatFlags.EndEllipsis Or
4123 TextFormatFlags.GlyphOverhangPadding Or
4124 TextFormatFlags.NoPrefix Or
4125 TextFormatFlags.VerticalCenter)
4127 'e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, _brsForeColorUnread, rct, sf)
4128 TextRenderer.DrawText(e.Graphics,
4131 Rectangle.Round(rct),
4132 _brsForeColorUnread.Color,
4133 TextFormatFlags.WordBreak Or
4134 TextFormatFlags.EndEllipsis Or
4135 TextFormatFlags.GlyphOverhangPadding Or
4136 TextFormatFlags.NoPrefix)
4145 Private Sub DrawListViewItemIcon(ByVal e As DrawListViewSubItemEventArgs)
4146 Dim item As ImageListViewItem = DirectCast(e.Item, ImageListViewItem)
4147 If item.Image IsNot Nothing Then
4148 'e.Bounds.Leftが常に0を指すから自前で計算
4149 Dim itemRect As Rectangle = item.Bounds
4150 itemRect.Width = e.Item.ListView.Columns(0).Width
4152 For Each clm As ColumnHeader In e.Item.ListView.Columns
4153 If clm.DisplayIndex < e.Item.ListView.Columns(0).DisplayIndex Then
4154 itemRect.X += clm.Width
4158 Dim iconRect As Rectangle = Rectangle.Intersect(New Rectangle(e.Item.GetBounds(ItemBoundsPortion.Icon).Location, New Size(_iconSz, _iconSz)), itemRect)
4159 iconRect.Offset(0, CType(Math.Max(0, (itemRect.Height - _iconSz) / 2), Integer))
4161 If iconRect.Width > 0 Then
4162 e.Graphics.FillRectangle(Brushes.White, iconRect)
4163 e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.High
4164 e.Graphics.DrawImage(item.Image, iconRect)
4169 Private Sub DoTabSearch(ByVal _word As String, _
4170 ByVal CaseSensitive As Boolean, _
4171 ByVal UseRegex As Boolean, _
4172 ByVal SType As SEARCHTYPE)
4173 Dim cidx As Integer = 0
4174 Dim fnd As Boolean = False
4175 Dim toIdx As Integer
4176 Dim stp As Integer = 1
4178 If _curList.VirtualListSize = 0 Then
4179 MessageBox.Show(My.Resources.DoTabSearchText2, My.Resources.DoTabSearchText3, MessageBoxButtons.OK, MessageBoxIcon.Information)
4182 If _curList.SelectedIndices.Count > 0 Then
4183 cidx = _curList.SelectedIndices(0)
4185 toIdx = _curList.VirtualListSize - 1
4188 Case SEARCHTYPE.DialogSearch 'ダイアログからの検索
4189 If _curList.SelectedIndices.Count > 0 Then
4190 cidx = _curList.SelectedIndices(0)
4194 Case SEARCHTYPE.NextSearch '次を検索
4195 If _curList.SelectedIndices.Count > 0 Then
4196 cidx = _curList.SelectedIndices(0) + 1
4197 If cidx > toIdx Then cidx = toIdx
4201 Case SEARCHTYPE.PrevSearch '前を検索
4202 If _curList.SelectedIndices.Count > 0 Then
4203 cidx = _curList.SelectedIndices(0) - 1
4204 If cidx < 0 Then cidx = 0
4212 Dim regOpt As RegexOptions = RegexOptions.None
4213 Dim fndOpt As StringComparison = StringComparison.Ordinal
4214 If Not CaseSensitive Then
4215 regOpt = RegexOptions.IgnoreCase
4216 fndOpt = StringComparison.OrdinalIgnoreCase
4222 Dim _search As Regex
4224 _search = New Regex(_word)
4225 For idx As Integer = cidx To toIdx Step stp
4226 Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
4227 If _search.IsMatch(post.Nickname, regOpt) _
4228 OrElse _search.IsMatch(post.Data, regOpt) _
4229 OrElse _search.IsMatch(post.Name, regOpt) _
4231 SelectListItem(_curList, idx)
4232 _curList.EnsureVisible(idx)
4236 Catch ex As ArgumentException
4237 MsgBox(My.Resources.DoTabSearchText1, MsgBoxStyle.Critical)
4242 For idx As Integer = cidx To toIdx Step stp
4243 Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
4244 If post.Nickname.IndexOf(_word, fndOpt) > -1 _
4245 OrElse post.Data.IndexOf(_word, fndOpt) > -1 _
4246 OrElse post.Name.IndexOf(_word, fndOpt) > -1 _
4248 SelectListItem(_curList, idx)
4249 _curList.EnsureVisible(idx)
4257 Case SEARCHTYPE.DialogSearch, SEARCHTYPE.NextSearch
4260 Case SEARCHTYPE.PrevSearch
4262 cidx = _curList.Items.Count - 1
4267 Catch ex As ArgumentOutOfRangeException
4270 MessageBox.Show(My.Resources.DoTabSearchText2, My.Resources.DoTabSearchText3, MessageBoxButtons.OK, MessageBoxIcon.Information)
4273 Private Sub MenuItemSubSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemSubSearch.Click
4275 SearchDialog.Owner = Me
4276 If SearchDialog.ShowDialog() = Windows.Forms.DialogResult.Cancel Then
4277 Me.TopMost = SettingDialog.AlwaysTop
4280 Me.TopMost = SettingDialog.AlwaysTop
4282 If SearchDialog.SWord <> "" Then
4283 DoTabSearch(SearchDialog.SWord, _
4284 SearchDialog.CheckCaseSensitive, _
4285 SearchDialog.CheckRegex, _
4286 SEARCHTYPE.DialogSearch)
4290 Private Sub MenuItemSearchNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemSearchNext.Click
4292 If SearchDialog.SWord = "" Then
4293 If SearchDialog.ShowDialog() = Windows.Forms.DialogResult.Cancel Then
4294 Me.TopMost = SettingDialog.AlwaysTop
4297 Me.TopMost = SettingDialog.AlwaysTop
4298 If SearchDialog.SWord = "" Then Exit Sub
4300 DoTabSearch(SearchDialog.SWord, _
4301 SearchDialog.CheckCaseSensitive, _
4302 SearchDialog.CheckRegex, _
4303 SEARCHTYPE.DialogSearch)
4305 DoTabSearch(SearchDialog.SWord, _
4306 SearchDialog.CheckCaseSensitive, _
4307 SearchDialog.CheckRegex, _
4308 SEARCHTYPE.NextSearch)
4312 Private Sub MenuItemSearchPrev_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemSearchPrev.Click
4314 If SearchDialog.SWord = "" Then
4315 If SearchDialog.ShowDialog() = Windows.Forms.DialogResult.Cancel Then
4316 Me.TopMost = SettingDialog.AlwaysTop
4319 Me.TopMost = SettingDialog.AlwaysTop
4320 If SearchDialog.SWord = "" Then Exit Sub
4323 DoTabSearch(SearchDialog.SWord, _
4324 SearchDialog.CheckCaseSensitive, _
4325 SearchDialog.CheckRegex, _
4326 SEARCHTYPE.PrevSearch)
4329 Private Sub AboutMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AboutMenuItem.Click
4330 TweenAboutBox.ShowDialog()
4331 Me.TopMost = SettingDialog.AlwaysTop
4334 Private Sub JumpUnreadMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles JumpUnreadMenuItem.Click, JumpReadOpMenuItem.Click
4335 Dim bgnIdx As Integer = ListTab.TabPages.IndexOf(_curTab)
4336 Dim idx As Integer = -1
4337 Dim lst As DetailsListView = Nothing
4339 If ImageSelectionPanel.Enabled Then
4344 For i As Integer = bgnIdx To ListTab.TabPages.Count - 1
4346 idx = _statuses.GetOldestUnreadId(ListTab.TabPages(i).Text)
4348 ListTab.SelectedIndex = i
4349 lst = DirectCast(ListTab.TabPages(i).Tag, DetailsListView)
4350 '_curTab = ListTab.TabPages(i)
4355 '未読みつからず&現在タブが先頭ではなかったら、先頭タブから現在タブの手前まで探索
4356 If idx = -1 AndAlso bgnIdx > 0 Then
4357 For i As Integer = 0 To bgnIdx - 1
4358 idx = _statuses.GetOldestUnreadId(ListTab.TabPages(i).Text)
4360 ListTab.SelectedIndex = i
4361 lst = DirectCast(ListTab.TabPages(i).Tag, DetailsListView)
4362 '_curTab = ListTab.TabPages(i)
4368 '全部調べたが未読見つからず→先頭タブの最新発言へ
4370 ListTab.SelectedIndex = 0
4371 lst = DirectCast(ListTab.TabPages(0).Tag, DetailsListView)
4372 '_curTab = ListTab.TabPages(0)
4373 If _statuses.SortOrder = SortOrder.Ascending Then
4374 idx = lst.VirtualListSize - 1
4380 If lst.VirtualListSize > 0 AndAlso idx > -1 AndAlso lst.VirtualListSize > idx Then
4381 SelectListItem(lst, idx)
4382 If _statuses.SortMode = IdComparerClass.ComparerMode.Id Then
4383 If _statuses.SortOrder = SortOrder.Ascending AndAlso lst.Items(idx).Position.Y > lst.ClientSize.Height - _iconSz - 10 OrElse _
4384 _statuses.SortOrder = SortOrder.Descending AndAlso lst.Items(idx).Position.Y < _iconSz + 10 Then
4387 lst.EnsureVisible(idx)
4390 lst.EnsureVisible(idx)
4396 Private Sub StatusOpenMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StatusOpenMenuItem.Click, OpenStatusOpMenuItem.Click
4397 If _curList.SelectedIndices.Count > 0 AndAlso _statuses.Tabs(_curTab.Text).TabType <> TabUsageType.DirectMessage Then
4398 Dim post As PostClass = _statuses.Item(_curTab.Text, _curList.SelectedIndices(0))
4399 If post.RetweetedId = 0 Then
4400 OpenUriAsync("http://twitter.com/" + post.Name + "/status/" + post.Id.ToString)
4402 OpenUriAsync("http://twitter.com/" + post.Name + "/status/" + post.RetweetedId.ToString)
4407 Private Sub FavorareMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles FavorareMenuItem.Click, OpenFavotterOpMenuItem.Click
4408 If _curList.SelectedIndices.Count > 0 Then
4409 Dim post As PostClass = _statuses.Item(_curTab.Text, _curList.SelectedIndices(0))
4410 OpenUriAsync(My.Resources.FavstarUrl + "users/" + post.Name + "/recent")
4414 Private Sub VerUpMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VerUpMenuItem.Click
4418 Private Sub RunTweenUp()
4420 Dim pinfo As New ProcessStartInfo
4421 pinfo.UseShellExecute = True
4422 pinfo.WorkingDirectory = Application.StartupPath
4423 pinfo.FileName = Path.Combine(Application.StartupPath(), "TweenUp.exe")
4425 Process.Start(pinfo)
4426 Catch ex As Exception
4427 MessageBox.Show("Failed to execute TweenUp.exe.")
4431 Private Sub CheckNewVersion(Optional ByVal startup As Boolean = False)
4432 Dim retMsg As String = ""
4433 Dim strVer As String = ""
4434 Dim strDetail As String = ""
4435 Dim forceUpdate As Boolean = My.Computer.Keyboard.ShiftKeyDown
4438 retMsg = tw.GetVersionInfo()
4439 Catch ex As Exception
4440 StatusLabel.Text = My.Resources.CheckNewVersionText9
4441 If Not startup Then MessageBox.Show(My.Resources.CheckNewVersionText10, My.Resources.CheckNewVersionText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2)
4444 If retMsg.Length > 0 Then
4445 strVer = retMsg.Substring(0, 4)
4446 If retMsg.Length > 4 Then
4447 strDetail = retMsg.Substring(5).Trim
4449 If fileVersion <> "" AndAlso strVer.CompareTo(fileVersion.Replace(".", "")) > 0 Then
4450 Dim tmp As String = String.Format(My.Resources.CheckNewVersionText3, strVer)
4451 Using dialogAsShieldicon As New DialogAsShieldIcon
4452 If dialogAsShieldicon.Show(tmp, strDetail, My.Resources.CheckNewVersionText1, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
4453 retMsg = tw.GetTweenBinary(strVer)
4454 If retMsg.Length = 0 Then
4457 dialogAsShieldicon.Dispose()
4461 If Not startup Then MessageBox.Show(My.Resources.CheckNewVersionText5 + System.Environment.NewLine + retMsg, My.Resources.CheckNewVersionText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
4464 dialogAsShieldicon.Dispose()
4468 Dim tmp As String = String.Format(My.Resources.CheckNewVersionText6, strVer)
4469 Using dialogAsShieldicon As New DialogAsShieldIcon
4470 If dialogAsShieldicon.Show(tmp, strDetail, My.Resources.CheckNewVersionText1, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
4471 retMsg = tw.GetTweenBinary(strVer)
4472 If retMsg.Length = 0 Then
4475 dialogAsShieldicon.Dispose()
4479 If Not startup Then MessageBox.Show(My.Resources.CheckNewVersionText5 + System.Environment.NewLine + retMsg, My.Resources.CheckNewVersionText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
4482 dialogAsShieldicon.Dispose()
4484 ElseIf Not startup Then
4485 MessageBox.Show(My.Resources.CheckNewVersionText7 + fileVersion.Replace(".", "") + My.Resources.CheckNewVersionText8 + strVer, My.Resources.CheckNewVersionText2, MessageBoxButtons.OK, MessageBoxIcon.Information)
4489 StatusLabel.Text = My.Resources.CheckNewVersionText9
4490 If Not startup Then MessageBox.Show(My.Resources.CheckNewVersionText10, My.Resources.CheckNewVersionText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
4494 Private Sub Colorize()
4498 If SettingDialog.DispLatestPost <> DispTitleEnum.None AndAlso _
4499 SettingDialog.DispLatestPost <> DispTitleEnum.Post AndAlso _
4500 SettingDialog.DispLatestPost <> DispTitleEnum.Ver AndAlso _
4501 SettingDialog.DispLatestPost <> DispTitleEnum.OwnStatus Then
4502 SetMainWindowTitle()
4504 If Not StatusLabelUrl.Text.StartsWith("http") Then SetStatusLabelUrl()
4505 For Each tb As TabPage In ListTab.TabPages
4506 If _statuses.Tabs(tb.Text).UnreadCount = 0 Then
4507 If SettingDialog.TabIconDisp Then
4508 If tb.ImageIndex = 0 Then tb.ImageIndex = -1
4512 If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
4515 Public Function createDetailHtml(ByVal orgdata As String) As String
4516 Return detailHtmlFormatHeader + orgdata + detailHtmlFormatFooter
4519 Private Sub DispSelectedPost()
4521 If _curList.SelectedIndices.Count = 0 OrElse _curPost Is Nothing Then Exit Sub
4523 Dim dTxt As String = createDetailHtml(_curPost.OriginalData)
4524 If _curPost.IsDm Then
4525 SourceLinkLabel.Tag = Nothing
4526 SourceLinkLabel.Text = ""
4527 'SourceLinkLabel.Visible = False
4529 Dim mc As Match = Regex.Match(_curPost.SourceHtml, "<a href=""(?<sourceurl>.+?)""")
4531 Dim src As String = mc.Groups("sourceurl").Value
4532 SourceLinkLabel.Tag = mc.Groups("sourceurl").Value
4533 mc = Regex.Match(src, "^https?://")
4534 If Not mc.Success Then
4535 src = src.Insert(0, "http://twitter.com")
4537 SourceLinkLabel.Tag = src
4539 SourceLinkLabel.Tag = Nothing
4541 If String.IsNullOrEmpty(_curPost.Source) Then
4542 SourceLinkLabel.Text = ""
4543 'SourceLinkLabel.Visible = False
4545 SourceLinkLabel.Text = "via " + _curPost.Source
4546 'SourceLinkLabel.Visible = True
4549 SourceLinkLabel.TabStop = False
4551 If _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage AndAlso Not _curPost.IsOwl Then
4552 NameLabel.Text = "DM TO -> "
4553 ElseIf _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage Then
4554 NameLabel.Text = "DM FROM <- "
4558 NameLabel.Text += _curPost.Name + "/" + _curPost.Nickname
4559 NameLabel.Tag = _curPost.Name
4560 If Not String.IsNullOrEmpty(_curPost.RetweetedBy) Then
4561 NameLabel.Text += " (RT:" + _curPost.RetweetedBy + ")"
4563 If UserPicture.Image IsNot Nothing Then UserPicture.Image.Dispose()
4564 If Not String.IsNullOrEmpty(_curPost.ImageUrl) AndAlso TIconDic.ContainsKey(_curPost.ImageUrl) Then
4565 UserPicture.Image = TIconDic(_curPost.ImageUrl)
4567 'Dim dummy As Image = DirectCast(TIconDic, ImageDictionary)(_curPost.ImageUrl, Sub(getImg)
4568 ' If img IsNot Nothing Then img.Dispose()
4569 ' If getImg Is Nothing Then Exit Sub
4570 ' img = DirectCast(getImg.Clone(), Image)
4572 ' Me.UserPicture.Image = img
4576 UserPicture.Image = Nothing
4579 NameLabel.ForeColor = System.Drawing.SystemColors.ControlText
4580 DateTimeLabel.Text = _curPost.PDate.ToString()
4581 If _curPost.IsOwl AndAlso (SettingDialog.OneWayLove OrElse _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage) Then NameLabel.ForeColor = _clOWL
4582 If _curPost.RetweetedId > 0 Then NameLabel.ForeColor = _clRetweet
4583 If _curPost.IsFav Then NameLabel.ForeColor = _clFav
4585 If DumpPostClassToolStripMenuItem.Checked Then
4586 Dim sb As New StringBuilder(512)
4588 sb.Append("-----Start PostClass Dump<br>")
4589 sb.AppendFormat("Data : {0}<br>", _curPost.Data)
4590 sb.AppendFormat("(PlainText) : <xmp>{0}</xmp><br>", _curPost.Data)
4591 sb.AppendFormat("Id : {0}<br>", _curPost.Id.ToString)
4592 'sb.AppendFormat("ImageIndex : {0}<br>", _curPost.ImageIndex.ToString)
4593 sb.AppendFormat("ImageUrl : {0}<br>", _curPost.ImageUrl)
4594 sb.AppendFormat("InReplyToId : {0}<br>", _curPost.InReplyToId.ToString)
4595 sb.AppendFormat("InReplyToUser : {0}<br>", _curPost.InReplyToUser)
4596 sb.AppendFormat("IsDM : {0}<br>", _curPost.IsDm.ToString)
4597 sb.AppendFormat("IsFav : {0}<br>", _curPost.IsFav.ToString)
4598 sb.AppendFormat("IsMark : {0}<br>", _curPost.IsMark.ToString)
4599 sb.AppendFormat("IsMe : {0}<br>", _curPost.IsMe.ToString)
4600 sb.AppendFormat("IsOwl : {0}<br>", _curPost.IsOwl.ToString)
4601 sb.AppendFormat("IsProtect : {0}<br>", _curPost.IsProtect.ToString)
4602 sb.AppendFormat("IsRead : {0}<br>", _curPost.IsRead.ToString)
4603 sb.AppendFormat("IsReply : {0}<br>", _curPost.IsReply.ToString)
4605 For Each nm As String In _curPost.ReplyToList
4606 sb.AppendFormat("ReplyToList : {0}<br>", nm)
4609 sb.AppendFormat("Name : {0}<br>", _curPost.Name)
4610 sb.AppendFormat("NickName : {0}<br>", _curPost.Nickname)
4611 sb.AppendFormat("OriginalData : {0}<br>", _curPost.OriginalData)
4612 sb.AppendFormat("(PlainText) : <xmp>{0}</xmp><br>", _curPost.OriginalData)
4613 sb.AppendFormat("PDate : {0}<br>", _curPost.PDate.ToString)
4614 sb.AppendFormat("Source : {0}<br>", _curPost.Source)
4615 sb.AppendFormat("Uid : {0}<br>", _curPost.Uid)
4616 sb.AppendFormat("FilterHit : {0}<br>", _curPost.FilterHit)
4617 sb.AppendFormat("RetweetedBy : {0}<br>", _curPost.RetweetedBy)
4618 sb.AppendFormat("RetweetedId : {0}<br>", _curPost.RetweetedId)
4619 sb.AppendFormat("SearchTabName : {0}<br>", _curPost.RelTabName)
4620 sb.Append("-----End PostClass Dump<br>")
4622 PostBrowser.Visible = False
4623 PostBrowser.DocumentText = detailHtmlFormatHeader + sb.ToString + detailHtmlFormatFooter
4624 PostBrowser.Visible = True
4627 If PostBrowser.DocumentText <> dTxt Then
4628 PostBrowser.Visible = False
4629 PostBrowser.DocumentText = dTxt
4630 Dim lnks As New List(Of String)
4631 For Each lnk As Match In Regex.Matches(dTxt, "<a target=""_self"" href=""(?<url>http[^""]+)""", RegexOptions.IgnoreCase)
4632 lnks.Add(lnk.Result("${url}"))
4634 Thumbnail.thumbnail(_curPost.Id, lnks)
4636 Catch ex As System.Runtime.InteropServices.COMException
4639 PostBrowser.Visible = True
4644 Private Sub MatomeMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MatomeMenuItem.Click
4645 OpenUriAsync("http://sourceforge.jp/projects/tween/wiki/FrontPage")
4648 Private Sub ShortcutKeyListMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShortcutKeyListMenuItem.Click
4649 OpenUriAsync("http://sourceforge.jp/projects/tween/wiki/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC")
4652 Private Sub ListTab_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles ListTab.KeyDown
4653 If ListTab.SelectedTab IsNot Nothing Then
4654 If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.PublicSearch Then
4655 Dim pnl As Control = ListTab.SelectedTab.Controls("panelSearch")
4656 If pnl.Controls("comboSearch").Focused OrElse _
4657 pnl.Controls("comboLang").Focused OrElse _
4658 pnl.Controls("buttonSearch").Focused Then Exit Sub
4662 If e.Modifiers = Keys.None Then
4663 ' ModifierKeyが押されていない場合
4664 If e.KeyCode = Keys.N OrElse e.KeyCode = Keys.Right Then
4666 e.SuppressKeyPress = True
4669 ElseIf e.KeyCode = Keys.P OrElse e.KeyCode = Keys.Left Then
4671 e.SuppressKeyPress = True
4674 ElseIf e.KeyCode = Keys.OemPeriod Then
4676 e.SuppressKeyPress = True
4681 If e.KeyCode = Keys.Space OrElse e.KeyCode = Keys.ProcessKey Then
4683 e.SuppressKeyPress = True
4684 JumpUnreadMenuItem_Click(Nothing, Nothing)
4685 ElseIf e.KeyCode = Keys.Enter OrElse e.KeyCode = Keys.Return Then
4687 e.SuppressKeyPress = True
4688 MakeReplyOrDirectStatus()
4689 ElseIf e.KeyCode = Keys.L Then
4691 e.SuppressKeyPress = True
4693 ElseIf e.KeyCode = Keys.H Then
4695 e.SuppressKeyPress = True
4697 ElseIf e.KeyCode = Keys.J AndAlso Not e.Alt Then
4699 e.SuppressKeyPress = True
4700 SendKeys.Send("{DOWN}")
4701 ElseIf e.KeyCode = Keys.K AndAlso Not e.Alt Then
4703 e.SuppressKeyPress = True
4704 SendKeys.Send("{UP}")
4706 If e.KeyCode = Keys.Z Or e.KeyCode = Keys.Oemcomma Then
4708 e.SuppressKeyPress = True
4710 ElseIf e.KeyCode = Keys.R OrElse e.KeyCode = Keys.F5 Then
4712 e.SuppressKeyPress = True
4714 ElseIf e.KeyCode = Keys.S Then
4716 e.SuppressKeyPress = True
4718 ElseIf e.KeyCode = Keys.A Then
4720 e.SuppressKeyPress = True
4723 'If e.KeyCode = Keys.OemQuestion Then
4725 ' e.SuppressKeyPress = True
4726 ' MenuItemSubSearch_Click(Nothing, Nothing) '/検索
4728 If e.KeyCode = Keys.F Then
4730 e.SuppressKeyPress = True
4731 SendKeys.Send("{PGDN}")
4733 If e.KeyCode = Keys.B Then
4735 e.SuppressKeyPress = True
4736 SendKeys.Send("{PGUP}")
4738 If e.KeyCode = Keys.I Then
4740 e.SuppressKeyPress = True
4741 SendKeys.Send("{TAB}")
4743 If e.KeyCode = Keys.G Then
4745 e.SuppressKeyPress = True
4746 ShowRelatedStatusesMenuItem_Click(Nothing, Nothing)
4748 ' ] in_reply_to参照元へ戻る
4749 If e.KeyCode = Keys.Oem4 Then
4751 e.SuppressKeyPress = True
4754 ' [ in_reply_toへジャンプ
4755 If e.KeyCode = Keys.Oem6 Then
4757 e.SuppressKeyPress = True
4758 GoBackInReplyToPost()
4760 If e.KeyCode = Keys.F1 Then
4762 e.SuppressKeyPress = True
4763 OpenUriAsync("http://sourceforge.jp/projects/tween/wiki/FrontPage")
4764 ElseIf e.KeyCode = Keys.F3 Then
4766 e.SuppressKeyPress = True
4767 MenuItemSearchNext_Click(Nothing, Nothing)
4768 ElseIf e.KeyCode = Keys.F6 Then
4770 e.SuppressKeyPress = True
4771 GetTimeline(WORKERTYPE.Reply, 1, 0, "")
4772 ElseIf e.KeyCode = Keys.F7 Then
4774 e.SuppressKeyPress = True
4775 GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
4781 If e.Control AndAlso Not e.Alt AndAlso Not e.Shift Then
4783 If e.KeyCode = Keys.Home OrElse e.KeyCode = Keys.End Then
4786 If e.KeyCode = Keys.N Then
4788 e.SuppressKeyPress = True
4790 ElseIf e.KeyCode = Keys.P Then
4792 e.SuppressKeyPress = True
4794 ElseIf e.KeyCode = Keys.R Then
4796 e.SuppressKeyPress = True
4797 MakeReplyOrDirectStatus(False, True)
4798 ElseIf e.KeyCode = Keys.M Then
4800 e.SuppressKeyPress = True
4801 MakeReplyOrDirectStatus(False, False)
4802 ElseIf e.KeyCode = Keys.S Then
4804 e.SuppressKeyPress = True
4805 FavoriteChange(True)
4806 ElseIf e.KeyCode = Keys.I Then
4808 e.SuppressKeyPress = True
4809 doRepliedStatusOpen()
4810 ElseIf e.KeyCode = Keys.D Then
4812 e.SuppressKeyPress = True
4814 ElseIf e.KeyCode = Keys.Q Then
4816 e.SuppressKeyPress = True
4818 ElseIf e.KeyCode = Keys.B Then
4820 e.SuppressKeyPress = True
4821 ReadedStripMenuItem_Click(Nothing, Nothing)
4822 ElseIf e.KeyCode = Keys.T Then
4824 e.SuppressKeyPress = True
4825 HashManageMenuItem_Click(Nothing, Nothing)
4826 ElseIf e.KeyCode = Keys.L Then
4828 e.SuppressKeyPress = True
4829 UrlConvertAutoToolStripMenuItem_Click(Nothing, Nothing)
4830 ElseIf e.KeyCode = Keys.Y Then
4832 e.SuppressKeyPress = True
4833 MultiLineMenuItem_Click(Nothing, Nothing)
4834 ElseIf e.KeyCode = Keys.F Then
4836 e.SuppressKeyPress = True
4837 MenuItemSubSearch_Click(Nothing, Nothing)
4838 ElseIf e.KeyCode = Keys.C Then
4839 Dim clstr As String = ""
4841 e.SuppressKeyPress = True
4843 ElseIf e.KeyCode = Keys.J AndAlso Not e.Alt Then
4845 e.SuppressKeyPress = True
4846 SendKeys.Send("{DOWN}")
4847 ElseIf e.KeyCode = Keys.K AndAlso Not e.Alt Then
4849 e.SuppressKeyPress = True
4850 SendKeys.Send("{UP}")
4855 Select Case e.KeyCode
4857 If _curList.SelectedIndices.Count > 0 Then
4858 OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name)
4859 ElseIf _curList.SelectedIndices.Count = 0 Then
4860 OpenUriAsync("http://twitter.com/")
4863 If _curList.SelectedIndices.Count > 0 Then
4864 OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name + "/favorites")
4867 StatusOpenMenuItem_Click(Nothing, Nothing)
4869 OpenURLMenuItem_Click(Nothing, Nothing)
4872 ' タブダイレクト選択(Ctrl+1~8,Ctrl+9)
4874 Select Case e.KeyCode
4875 Case Keys.D1, Keys.D2, Keys.D3, Keys.D4, Keys.D5, Keys.D6, Keys.D7, Keys.D8
4876 Dim tabNo As Integer = e.KeyCode - Keys.D1
4877 If ListTab.TabPages.Count < tabNo Then
4880 ListTab.SelectedIndex = tabNo
4881 ListTabSelect(ListTab.TabPages(tabNo))
4883 ListTab.SelectedIndex = ListTab.TabPages.Count - 1
4884 ListTabSelect(ListTab.TabPages(ListTab.TabPages.Count - 1))
4890 If Not e.Control AndAlso e.Alt AndAlso Not e.Shift Then
4892 ' 別タブの同じ書き込みへ(ALT+←/→)
4893 If e.KeyCode = Keys.Right Then
4895 e.SuppressKeyPress = True
4896 GoSamePostToAnotherTab(False)
4897 ElseIf e.KeyCode = Keys.Left Then
4899 e.SuppressKeyPress = True
4900 GoSamePostToAnotherTab(True)
4901 ElseIf e.KeyCode = Keys.R Then
4903 e.SuppressKeyPress = True
4904 doReTweetOfficial(True)
4905 ElseIf e.KeyCode = Keys.P AndAlso _curPost IsNot Nothing Then
4907 e.SuppressKeyPress = True
4908 doShowUserStatus(_curPost.Name, False)
4910 If e.KeyCode = Keys.Up Then
4911 ScrollDownPostBrowser(False)
4912 ElseIf e.KeyCode = Keys.Down Then
4913 ScrollDownPostBrowser(True)
4914 ElseIf e.KeyCode = Keys.PageUp Then
4915 PageDownPostBrowser(False)
4916 ElseIf e.KeyCode = Keys.PageDown Then
4917 PageDownPostBrowser(True)
4921 If e.Shift AndAlso Not e.Control AndAlso Not e.Alt Then
4923 If e.KeyCode = Keys.H Then
4925 e.SuppressKeyPress = True
4927 ElseIf e.KeyCode = Keys.L Then
4929 e.SuppressKeyPress = True
4931 ElseIf e.KeyCode = Keys.M Then
4933 e.SuppressKeyPress = True
4935 ElseIf e.KeyCode = Keys.G Then
4937 e.SuppressKeyPress = True
4939 ElseIf e.KeyCode = Keys.Z Then
4941 e.SuppressKeyPress = True
4943 ElseIf e.KeyCode = Keys.J AndAlso Not e.Alt Then
4945 e.SuppressKeyPress = True
4946 SendKeys.Send("{DOWN}")
4947 ElseIf e.KeyCode = Keys.K AndAlso Not e.Alt Then
4949 e.SuppressKeyPress = True
4950 SendKeys.Send("{UP}")
4953 ' お気に入り前後ジャンプ(SHIFT+N←/P→)
4954 If e.KeyCode = Keys.N OrElse e.KeyCode = Keys.Right Then
4956 e.SuppressKeyPress = True
4958 ElseIf e.KeyCode = Keys.P OrElse e.KeyCode = Keys.Left Then
4960 e.SuppressKeyPress = True
4962 ElseIf e.KeyCode = Keys.R OrElse e.KeyCode = Keys.F5 Then
4964 e.SuppressKeyPress = True
4967 If e.KeyCode = Keys.F3 Then
4969 e.SuppressKeyPress = True
4970 MenuItemSearchPrev_Click(Nothing, Nothing)
4971 ElseIf e.KeyCode = Keys.F6 Then
4973 e.SuppressKeyPress = True
4974 GetTimeline(WORKERTYPE.Reply, -1, 0, "")
4975 ElseIf e.KeyCode = Keys.F7 Then
4977 e.SuppressKeyPress = True
4978 GetTimeline(WORKERTYPE.DirectMessegeRcv, -1, 0, "")
4982 If e.Control AndAlso Not e.Alt AndAlso e.Shift Then
4983 ' CTRL+SHIFTキーが押されている場合
4984 If e.KeyCode = Keys.R Then
4986 e.SuppressKeyPress = True
4987 MakeReplyOrDirectStatus(False, True, True)
4988 ElseIf e.KeyCode = Keys.C Then
4989 Dim clstr As String = ""
4991 e.SuppressKeyPress = True
4993 ElseIf e.KeyCode = Keys.F Then
4995 e.SuppressKeyPress = True
4996 If ListTab.SelectedTab IsNot Nothing Then
4997 If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.PublicSearch Then Exit Sub
4998 ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch").Focus()
5000 ElseIf e.KeyCode = Keys.S Then
5002 e.SuppressKeyPress = True
5003 FavoriteChange(False)
5004 ElseIf e.KeyCode = Keys.B Then
5006 e.SuppressKeyPress = True
5007 UnreadStripMenuItem_Click(Nothing, Nothing)
5009 If e.KeyCode = Keys.T Then
5011 e.SuppressKeyPress = True
5012 HashToggleMenuItem_Click(Nothing, Nothing)
5013 ElseIf e.KeyCode = Keys.P Then
5015 e.SuppressKeyPress = True
5016 ImageSelectMenuItem_Click(Nothing, Nothing)
5017 ElseIf e.KeyCode = Keys.H Then
5019 e.SuppressKeyPress = True
5021 ElseIf e.KeyCode = Keys.O Then
5023 e.SuppressKeyPress = True
5024 FavorareMenuItem_Click(Nothing, Nothing)
5028 If Not e.Control AndAlso e.Alt AndAlso e.Shift Then
5029 ' ALT+SHIFTキーが押されている場合
5030 If e.KeyCode = Keys.R Then
5032 e.SuppressKeyPress = True
5033 doReTweetUnofficial()
5034 ElseIf e.KeyCode = Keys.C Then
5036 e.SuppressKeyPress = True
5038 ElseIf e.KeyCode = Keys.Up Then
5039 Thumbnail.ScrollThumbnail(False)
5040 ElseIf e.KeyCode = Keys.Down Then
5041 Thumbnail.ScrollThumbnail(True)
5043 If e.KeyCode = Keys.Enter Then
5044 If Not Me.SplitContainer3.Panel2Collapsed Then
5045 Thumbnail.OpenPicture()
5048 e.SuppressKeyPress = True
5052 If e.Alt AndAlso e.Control Then
5053 ' CTRL+ALTキーが押されている場合
5054 If e.KeyCode = Keys.S Then
5056 e.SuppressKeyPress = True
5057 FavoritesRetweetOriginal()
5058 ElseIf e.KeyCode = Keys.R Then
5060 e.SuppressKeyPress = True
5061 FavoritesRetweetUnofficial()
5067 Private Sub ScrollDownPostBrowser(ByVal forward As Boolean)
5068 Dim doc As HtmlDocument = PostBrowser.Document
5069 If doc Is Nothing Then Exit Sub
5070 If doc.Body Is Nothing Then Exit Sub
5073 doc.Body.ScrollTop += SettingDialog.FontDetail.Height
5075 doc.Body.ScrollTop -= SettingDialog.FontDetail.Height
5079 Private Sub PageDownPostBrowser(ByVal forward As Boolean)
5080 Dim doc As HtmlDocument = PostBrowser.Document
5081 If doc Is Nothing Then Exit Sub
5082 If doc.Body Is Nothing Then Exit Sub
5085 doc.Body.ScrollTop += PostBrowser.ClientRectangle.Height - SettingDialog.FontDetail.Height
5087 doc.Body.ScrollTop -= PostBrowser.ClientRectangle.Height - SettingDialog.FontDetail.Height
5091 Private Sub GoNextTab(ByVal forward As Boolean)
5092 Dim idx As Integer = ListTab.SelectedIndex
5095 If idx > ListTab.TabPages.Count - 1 Then idx = 0
5098 If idx < 0 Then idx = ListTab.TabPages.Count - 1
5100 ListTab.SelectedIndex = idx
5101 ListTabSelect(ListTab.TabPages(idx))
5104 Private Sub CopyStot()
5105 Dim clstr As String = ""
5106 Dim sb As New StringBuilder()
5107 Dim IsProtected As Boolean = False
5108 For Each idx As Integer In _curList.SelectedIndices
5109 Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
5110 If post.IsProtect Then
5114 If post.RetweetedId > 0 Then
5115 sb.AppendFormat("{0}:{1} [http://twitter.com/{0}/status/{2}]{3}", post.Name, post.Data, post.RetweetedId, Environment.NewLine)
5117 sb.AppendFormat("{0}:{1} [http://twitter.com/{0}/status/{2}]{3}", post.Name, post.Data, post.Id, Environment.NewLine)
5121 MessageBox.Show(My.Resources.CopyStotText1)
5123 If sb.Length > 0 Then
5124 clstr = sb.ToString()
5126 Clipboard.SetDataObject(clstr, False, 5, 100)
5127 Catch ex As Exception
5128 MessageBox.Show(ex.Message)
5131 ' Dim proc As New Action(Of String)(Sub(text)
5132 ' Me.Invoke(New Action(Of String)(AddressOf Clipboard.SetText), text)
5134 ' proc.BeginInvoke(clstr, Nothing, Nothing)
5135 'Catch ex As Exception
5136 ' MessageBox.Show(ex.Message)
5141 Private Sub CopyIdUri()
5142 Dim clstr As String = ""
5143 Dim sb As New StringBuilder()
5144 For Each idx As Integer In _curList.SelectedIndices
5145 Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
5146 If post.RetweetedId > 0 Then
5147 sb.AppendFormat("http://twitter.com/{0}/status/{1}{2}", post.Name, post.RetweetedId, Environment.NewLine)
5149 sb.AppendFormat("http://twitter.com/{0}/status/{1}{2}", post.Name, post.Id, Environment.NewLine)
5152 If sb.Length > 0 Then
5153 clstr = sb.ToString()
5155 Clipboard.SetDataObject(clstr, False, 5, 100)
5156 Catch ex As Exception
5157 MessageBox.Show(ex.Message)
5162 Private Sub GoFav(ByVal forward As Boolean)
5163 If _curList.VirtualListSize = 0 Then Exit Sub
5164 Dim fIdx As Integer = 0
5165 Dim toIdx As Integer = 0
5166 Dim stp As Integer = 1
5169 If _curList.SelectedIndices.Count = 0 Then
5172 fIdx = _curList.SelectedIndices(0) + 1
5173 If fIdx > _curList.VirtualListSize - 1 Then Exit Sub
5175 toIdx = _curList.VirtualListSize - 1
5178 If _curList.SelectedIndices.Count = 0 Then
5179 fIdx = _curList.VirtualListSize - 1
5181 fIdx = _curList.SelectedIndices(0) - 1
5182 If fIdx < 0 Then Exit Sub
5188 For idx As Integer = fIdx To toIdx Step stp
5189 If _statuses.Item(_curTab.Text, idx).IsFav Then
5190 SelectListItem(_curList, idx)
5191 _curList.EnsureVisible(idx)
5197 Private Sub GoSamePostToAnotherTab(ByVal left As Boolean)
5198 If _curList.VirtualListSize = 0 Then Exit Sub
5199 Dim fIdx As Integer = 0
5200 Dim toIdx As Integer = 0
5201 Dim stp As Integer = 1
5202 Dim targetId As Long = 0
5204 If _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage Then Exit Sub ' Directタブは対象外(見つかるはずがない)
5205 If _curList.SelectedIndices.Count = 0 Then Exit Sub '未選択も処理しない
5207 targetId = GetCurTabPost(_curList.SelectedIndices(0)).Id
5211 If ListTab.SelectedIndex = 0 Then
5214 fIdx = ListTab.SelectedIndex - 1
5220 If ListTab.SelectedIndex = ListTab.TabCount - 1 Then
5223 fIdx = ListTab.SelectedIndex + 1
5225 toIdx = ListTab.TabCount - 1
5229 Dim found As Boolean = False
5230 For tabidx As Integer = fIdx To toIdx Step stp
5231 If _statuses.Tabs(ListTab.TabPages(tabidx).Text).TabType = TabUsageType.DirectMessage Then Continue For ' Directタブは対象外
5232 For idx As Integer = 0 To DirectCast(ListTab.TabPages(tabidx).Tag, DetailsListView).VirtualListSize - 1
5233 If _statuses.Item(ListTab.TabPages(tabidx).Text, idx).Id = targetId Then
5234 ListTab.SelectedIndex = tabidx
5235 ListTabSelect(ListTab.TabPages(tabidx))
5236 SelectListItem(_curList, idx)
5237 _curList.EnsureVisible(idx)
5242 If found Then Exit For
5246 Private Sub GoPost(ByVal forward As Boolean)
5247 If _curList.SelectedIndices.Count = 0 OrElse _curPost Is Nothing Then Exit Sub
5248 Dim fIdx As Integer = 0
5249 Dim toIdx As Integer = 0
5250 Dim stp As Integer = 1
5253 fIdx = _curList.SelectedIndices(0) + 1
5254 If fIdx > _curList.VirtualListSize - 1 Then Exit Sub
5255 toIdx = _curList.VirtualListSize - 1
5258 fIdx = _curList.SelectedIndices(0) - 1
5259 If fIdx < 0 Then Exit Sub
5264 Dim name As String = ""
5265 If _curPost.RetweetedId = 0 Then
5266 name = _curPost.Name
5268 name = _curPost.RetweetedBy
5270 For idx As Integer = fIdx To toIdx Step stp
5271 If _statuses.Item(_curTab.Text, idx).RetweetedId = 0 Then
5272 If _statuses.Item(_curTab.Text, idx).Name = name Then
5273 SelectListItem(_curList, idx)
5274 _curList.EnsureVisible(idx)
5278 If _statuses.Item(_curTab.Text, idx).RetweetedBy = name Then
5279 SelectListItem(_curList, idx)
5280 _curList.EnsureVisible(idx)
5287 Private Sub GoRelPost(ByVal forward As Boolean)
5288 If _curList.SelectedIndices.Count = 0 Then Exit Sub
5290 Dim fIdx As Integer = 0
5291 Dim toIdx As Integer = 0
5292 Dim stp As Integer = 1
5294 fIdx = _curList.SelectedIndices(0) + 1
5295 If fIdx > _curList.VirtualListSize - 1 Then Exit Sub
5296 toIdx = _curList.VirtualListSize - 1
5299 fIdx = _curList.SelectedIndices(0) - 1
5300 If fIdx < 0 Then Exit Sub
5305 If Not _anchorFlag Then
5306 If _curPost Is Nothing Then Exit Sub
5307 _anchorPost = _curPost
5310 If _anchorPost Is Nothing Then Exit Sub
5313 For idx As Integer = fIdx To toIdx Step stp
5314 Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
5315 If post.Name = _anchorPost.Name OrElse _
5316 post.RetweetedBy = _anchorPost.Name OrElse _
5317 post.Name = _anchorPost.RetweetedBy OrElse _
5318 (Not String.IsNullOrEmpty(post.RetweetedBy) AndAlso post.RetweetedBy = _anchorPost.RetweetedBy) OrElse _
5319 _anchorPost.ReplyToList.Contains(post.Name.ToLower()) OrElse _
5320 _anchorPost.ReplyToList.Contains(post.RetweetedBy.ToLower()) OrElse _
5321 post.ReplyToList.Contains(_anchorPost.Name.ToLower()) OrElse _
5322 post.ReplyToList.Contains(_anchorPost.RetweetedBy.ToLower()) Then
5323 SelectListItem(_curList, idx)
5324 _curList.EnsureVisible(idx)
5330 Private Sub GoAnchor()
5331 If _anchorPost Is Nothing Then Exit Sub
5332 Dim idx As Integer = _statuses.Tabs(_curTab.Text).IndexOf(_anchorPost.Id)
5333 If idx = -1 Then Exit Sub
5335 SelectListItem(_curList, idx)
5336 _curList.EnsureVisible(idx)
5339 Private Sub GoTopEnd(ByVal GoTop As Boolean)
5340 Dim _item As ListViewItem
5344 _item = _curList.GetItemAt(0, 25)
5345 If _item Is Nothing Then
5351 _item = _curList.GetItemAt(0, _curList.ClientSize.Height - 1)
5352 If _item Is Nothing Then
5353 idx = _curList.VirtualListSize - 1
5358 SelectListItem(_curList, idx)
5361 Private Sub GoMiddle()
5362 Dim _item As ListViewItem
5367 _item = _curList.GetItemAt(0, 0)
5368 If _item Is Nothing Then
5373 _item = _curList.GetItemAt(0, _curList.ClientSize.Height - 1)
5374 If _item Is Nothing Then
5375 idx2 = _curList.VirtualListSize - 1
5379 idx3 = (idx1 + idx2) \ 2
5381 SelectListItem(_curList, idx3)
5384 Private Sub GoLast()
5385 If _curList.VirtualListSize = 0 Then Exit Sub
5387 If _statuses.SortOrder = SortOrder.Ascending Then
5388 SelectListItem(_curList, _curList.VirtualListSize - 1)
5389 _curList.EnsureVisible(_curList.VirtualListSize - 1)
5391 SelectListItem(_curList, 0)
5392 _curList.EnsureVisible(0)
5396 Private Sub MoveTop()
5397 If _curList.SelectedIndices.Count = 0 Then Exit Sub
5398 Dim idx As Integer = _curList.SelectedIndices(0)
5399 If _statuses.SortOrder = SortOrder.Ascending Then
5400 _curList.EnsureVisible(_curList.VirtualListSize - 1)
5402 _curList.EnsureVisible(0)
5404 _curList.EnsureVisible(idx)
5407 Private Sub GoInReplyToPost()
5408 If _curPost IsNot Nothing AndAlso _curPost.InReplyToUser IsNot Nothing AndAlso _curPost.InReplyToId > 0 Then
5409 If _statuses.Tabs(_curTab.Text).TabType = TabUsageType.Lists Then
5410 If _statuses.Tabs(_curTab.Text).Posts.ContainsKey(_curPost.InReplyToId) Then
5411 Dim idx As Integer = _statuses.Tabs(_curTab.Text).IndexOf(_curPost.InReplyToId)
5413 Dim repPost As PostClass = _statuses.Item(_curPost.InReplyToId)
5414 MessageBox.Show(repPost.Name + " / " + repPost.Nickname + " (" + repPost.PDate.ToString() + ")" + Environment.NewLine + repPost.Data)
5416 If replyChains Is Nothing OrElse (replyChains.Count > 0 AndAlso replyChains.Peek().InReplyToId <> _curPost.Id) Then
5417 replyChains = New Stack(Of ReplyChain)
5419 replyChains.Push(New ReplyChain(_curPost.Id, _curPost.InReplyToId, _curTab))
5420 SelectListItem(_curList, idx)
5421 _curList.EnsureVisible(idx)
5424 OpenUriAsync("http://twitter.com/" + _curPost.InReplyToUser + "/statuses/" + _curPost.InReplyToId.ToString())
5427 If _statuses.ContainsKey(_curPost.InReplyToId) Then
5428 Dim tab As TabPage = _curTab
5429 Dim idx As Integer = _statuses.Tabs(_curTab.Text).IndexOf(_curPost.InReplyToId)
5431 For Each tab In ListTab.TabPages
5432 idx = _statuses.Tabs(tab.Text).IndexOf(_curPost.InReplyToId)
5439 Dim repPost As PostClass = _statuses.Item(_curPost.InReplyToId)
5440 MessageBox.Show(repPost.Name + " / " + repPost.Nickname + " (" + repPost.PDate.ToString() + ")" + Environment.NewLine + repPost.Data)
5442 If replyChains Is Nothing OrElse (replyChains.Count > 0 AndAlso replyChains.Peek().InReplyToId <> _curPost.Id) Then
5443 replyChains = New Stack(Of ReplyChain)
5445 replyChains.Push(New ReplyChain(_curPost.Id, _curPost.InReplyToId, _curTab))
5447 If tab IsNot _curTab Then
5448 ListTab.SelectTab(tab)
5450 SelectListItem(_curList, idx)
5451 _curList.EnsureVisible(idx)
5454 OpenUriAsync("http://twitter.com/" + _curPost.InReplyToUser + "/statuses/" + _curPost.InReplyToId.ToString())
5460 Private Sub GoBackInReplyToPost()
5461 If replyChains Is Nothing OrElse replyChains.Count < 1 Then
5465 Dim chainHead As ReplyChain = replyChains.Pop()
5466 If chainHead.InReplyToId = _curPost.Id Then
5467 Dim idx As Integer = _statuses.Tabs(chainHead.OriginalTab.Text).IndexOf(chainHead.OriginalId)
5469 replyChains = Nothing
5472 ListTab.SelectTab(chainHead.OriginalTab)
5473 Catch ex As Exception
5474 replyChains = Nothing
5476 SelectListItem(_curList, idx)
5477 _curList.EnsureVisible(idx)
5480 replyChains = Nothing
5484 Private Sub MyList_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
5488 Private Sub StatusText_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StatusText.Enter
5489 ' フォーカスの戻り先を StatusText に設定
5491 StatusText.BackColor = _clInputBackcolor
5494 Public Property InputBackColor() As System.Drawing.Color
5496 Return _clInputBackcolor
5498 Set(ByVal value As System.Drawing.Color)
5499 _clInputBackcolor = value
5503 Private Sub StatusText_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StatusText.Leave
5504 ' フォーカスがメニューに遷移しないならばフォーカスはタブに移ることを期待
5505 If ListTab.SelectedTab IsNot Nothing AndAlso MenuStrip1.Tag Is Nothing Then Me.Tag = ListTab.SelectedTab.Tag
5506 StatusText.BackColor = Color.FromKnownColor(KnownColor.Window)
5509 Private Sub StatusText_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles StatusText.KeyDown
5511 If e.Modifiers = Keys.None Then
5512 If e.KeyCode = Keys.F1 Then
5514 e.SuppressKeyPress = True
5515 OpenUriAsync("http://sourceforge.jp/projects/tween/wiki/FrontPage")
5516 ElseIf e.KeyCode = Keys.F3 Then
5518 e.SuppressKeyPress = True
5519 MenuItemSearchNext_Click(Nothing, Nothing)
5520 ElseIf e.KeyCode = Keys.F5 Then
5522 e.SuppressKeyPress = True
5524 ElseIf e.KeyCode = Keys.F6 Then
5526 e.SuppressKeyPress = True
5527 GetTimeline(WORKERTYPE.Reply, 1, 0, "")
5528 ElseIf e.KeyCode = Keys.F7 Then
5530 e.SuppressKeyPress = True
5531 GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
5536 If e.Control AndAlso Not e.Alt AndAlso Not e.Shift Then
5537 If e.KeyCode = Keys.A Then
5538 StatusText.SelectAll()
5539 ElseIf e.KeyCode = Keys.Up OrElse e.KeyCode = Keys.Down Then
5540 If StatusText.Text.Trim() <> "" Then
5541 _history(_hisIdx) = New PostingStatus(StatusText.Text, _reply_to_id, _reply_to_name)
5543 If e.KeyCode = Keys.Up Then
5545 If _hisIdx < 0 Then _hisIdx = 0
5548 If _hisIdx > _history.Count - 1 Then _hisIdx = _history.Count - 1
5550 StatusText.Text = _history(_hisIdx).status
5551 _reply_to_id = _history(_hisIdx).inReplyToId
5552 _reply_to_name = _history(_hisIdx).inReplyToName
5553 StatusText.SelectionStart = StatusText.Text.Length
5555 e.SuppressKeyPress = True
5556 ElseIf e.KeyCode = Keys.PageUp OrElse e.KeyCode = Keys.P Then
5557 If ListTab.SelectedIndex = 0 Then
5558 ListTab.SelectedIndex = ListTab.TabCount - 1
5560 ListTab.SelectedIndex -= 1
5563 e.SuppressKeyPress = True
5565 ElseIf e.KeyCode = Keys.PageDown OrElse e.KeyCode = Keys.N Then
5566 If ListTab.SelectedIndex = ListTab.TabCount - 1 Then
5567 ListTab.SelectedIndex = 0
5569 ListTab.SelectedIndex += 1
5572 e.SuppressKeyPress = True
5574 ElseIf e.KeyCode = Keys.R Then
5576 e.SuppressKeyPress = True
5577 MakeReplyOrDirectStatus(False, True)
5578 ElseIf e.KeyCode = Keys.M Then
5580 e.SuppressKeyPress = True
5581 MakeReplyOrDirectStatus(False, False)
5582 ElseIf e.KeyCode = Keys.S Then
5584 e.SuppressKeyPress = True
5585 FavoriteChange(True)
5586 ElseIf e.KeyCode = Keys.I Then
5588 e.SuppressKeyPress = True
5589 doRepliedStatusOpen()
5590 ElseIf e.KeyCode = Keys.Q Then
5592 e.SuppressKeyPress = True
5594 ElseIf e.KeyCode = Keys.B Then
5596 e.SuppressKeyPress = True
5597 ReadedStripMenuItem_Click(Nothing, Nothing)
5598 ElseIf e.KeyCode = Keys.T Then
5600 e.SuppressKeyPress = True
5601 HashManageMenuItem_Click(Nothing, Nothing)
5602 ElseIf e.KeyCode = Keys.L Then
5604 e.SuppressKeyPress = True
5605 UrlConvertAutoToolStripMenuItem_Click(Nothing, Nothing)
5606 ElseIf e.KeyCode = Keys.Y Then
5608 e.SuppressKeyPress = True
5609 MultiLineMenuItem_Click(Nothing, Nothing)
5610 ElseIf e.KeyCode = Keys.F Then
5612 e.SuppressKeyPress = True
5613 MenuItemSubSearch_Click(Nothing, Nothing)
5616 Select Case e.KeyCode
5618 If _curList.SelectedIndices.Count > 0 Then
5619 OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name)
5620 ElseIf _curList.SelectedIndices.Count = 0 Then
5621 OpenUriAsync("http://twitter.com/")
5624 If _curList.SelectedIndices.Count > 0 Then
5625 OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name + "/favorites")
5628 OpenURLMenuItem_Click(Nothing, Nothing)
5630 StatusOpenMenuItem_Click(Nothing, Nothing)
5636 If e.KeyCode = Keys.F3 Then
5638 e.SuppressKeyPress = True
5639 MenuItemSearchPrev_Click(Nothing, Nothing)
5640 ElseIf e.KeyCode = Keys.F5 Then
5642 e.SuppressKeyPress = True
5644 ElseIf e.KeyCode = Keys.F6 Then
5646 e.SuppressKeyPress = True
5647 GetTimeline(WORKERTYPE.Reply, -1, 0, "")
5648 ElseIf e.KeyCode = Keys.F7 Then
5650 e.SuppressKeyPress = True
5651 GetTimeline(WORKERTYPE.DirectMessegeRcv, -1, 0, "")
5656 If e.Alt AndAlso Not e.Control AndAlso e.Shift Then
5657 If e.KeyCode = Keys.R Then
5659 e.SuppressKeyPress = True
5660 doReTweetOfficial(True)
5661 ElseIf e.KeyCode = Keys.P AndAlso _curPost IsNot Nothing Then
5663 e.SuppressKeyPress = True
5664 doShowUserStatus(_curPost.Name, False)
5666 If e.KeyCode = Keys.Up Then
5667 ScrollDownPostBrowser(False)
5668 ElseIf e.KeyCode = Keys.Down Then
5669 ScrollDownPostBrowser(True)
5670 ElseIf e.KeyCode = Keys.PageUp Then
5671 PageDownPostBrowser(False)
5672 ElseIf e.KeyCode = Keys.PageDown Then
5673 PageDownPostBrowser(True)
5677 If e.KeyCode = Keys.Space AndAlso e.Modifiers = (Keys.Shift Or Keys.Control) Then
5678 If StatusText.SelectionStart > 0 Then
5679 Dim endidx As Integer = StatusText.SelectionStart - 1
5680 Dim startstr As String = ""
5681 For i As Integer = StatusText.SelectionStart - 1 To 0 Step -1
5682 Dim c As Char = StatusText.Text.Chars(i)
5683 If Char.IsLetterOrDigit(c) OrElse c = "_" Then
5687 startstr = StatusText.Text.Substring(i + 1, endidx - i)
5688 ShowSuplDialog(StatusText, AtIdSupl, startstr.Length + 1, startstr)
5690 startstr = StatusText.Text.Substring(i + 1, endidx - i)
5691 ShowSuplDialog(StatusText, HashSupl, startstr.Length + 1, startstr)
5701 If e.Shift AndAlso e.Control Then
5702 If e.KeyCode = Keys.Up Then
5704 e.SuppressKeyPress = True
5705 Dim idx As Integer = 0
5706 If _curList IsNot Nothing AndAlso _curList.Items.Count <> 0 AndAlso _
5707 _curList.SelectedIndices.Count > 0 AndAlso _curList.SelectedIndices(0) > 0 Then
5708 idx = _curList.SelectedIndices(0) - 1
5709 SelectListItem(_curList, idx)
5710 _curList.EnsureVisible(idx)
5712 ElseIf e.KeyCode = Keys.Down Then
5714 e.SuppressKeyPress = True
5715 Dim idx As Integer = 0
5716 If _curList IsNot Nothing AndAlso _curList.Items.Count <> 0 AndAlso _curList.SelectedIndices.Count > 0 _
5717 AndAlso _curList.SelectedIndices(0) < _curList.Items.Count - 1 Then
5718 idx = _curList.SelectedIndices(0) + 1
5719 SelectListItem(_curList, idx)
5720 _curList.EnsureVisible(idx)
5723 If e.KeyCode = Keys.R Then
5725 e.SuppressKeyPress = True
5726 MakeReplyOrDirectStatus(False, True, True)
5727 ElseIf e.KeyCode = Keys.H Then
5729 e.SuppressKeyPress = True
5731 ElseIf e.KeyCode = Keys.T Then
5733 e.SuppressKeyPress = True
5734 HashToggleMenuItem_Click(Nothing, Nothing)
5735 ElseIf e.KeyCode = Keys.S Then
5737 e.SuppressKeyPress = True
5738 FavoriteChange(False)
5739 ElseIf e.KeyCode = Keys.B Then
5741 e.SuppressKeyPress = True
5742 UnreadStripMenuItem_Click(Nothing, Nothing)
5743 ElseIf e.KeyCode = Keys.G Then
5745 e.SuppressKeyPress = True
5746 FavorareMenuItem_Click(Nothing, Nothing)
5747 ElseIf e.KeyCode = Keys.C Then
5748 Dim clstr As String = ""
5750 e.SuppressKeyPress = True
5752 ElseIf e.KeyCode = Keys.O Then
5754 e.SuppressKeyPress = True
5755 FavorareMenuItem_Click(Nothing, Nothing)
5756 ElseIf e.KeyCode = Keys.P Then
5758 e.SuppressKeyPress = True
5759 ImageSelectMenuItem_Click(Nothing, Nothing)
5760 ElseIf e.KeyCode = Keys.F Then
5762 e.SuppressKeyPress = True
5763 If ListTab.SelectedTab IsNot Nothing Then
5764 If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.PublicSearch Then Exit Sub
5765 ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch").Focus()
5771 If e.Alt AndAlso e.Shift Then
5772 If e.KeyCode = Keys.R Then
5774 e.SuppressKeyPress = True
5775 doReTweetUnofficial()
5776 ElseIf e.KeyCode = Keys.C Then
5778 e.SuppressKeyPress = True
5780 ElseIf e.KeyCode = Keys.Up Then
5781 Thumbnail.ScrollThumbnail(False)
5782 ElseIf e.KeyCode = Keys.Down Then
5783 Thumbnail.ScrollThumbnail(True)
5788 If e.Alt AndAlso e.Control Then
5789 If e.KeyCode = Keys.S Then
5791 e.SuppressKeyPress = True
5792 FavoritesRetweetOriginal()
5793 ElseIf e.KeyCode = Keys.R Then
5795 e.SuppressKeyPress = True
5796 FavoritesRetweetUnofficial()
5800 Me.StatusText_TextChanged(Nothing, Nothing)
5803 Private Sub SaveConfigsAll(ByVal ifModified As Boolean)
5804 If Not ifModified Then
5807 'SaveConfigsTab(True) 'True:事前に設定ファイル削除
5810 If _modifySettingCommon Then SaveConfigsCommon()
5811 If _modifySettingLocal Then SaveConfigsLocal()
5812 If _modifySettingAtId AndAlso SettingDialog.UseAtIdSupplement AndAlso AtIdSupl IsNot Nothing Then
5813 _modifySettingAtId = False
5814 Dim cfgAtId As New SettingAtIdList(AtIdSupl.GetItemList)
5820 Private Sub SaveConfigsCommon()
5821 If _ignoreConfigSave Then Exit Sub
5823 _modifySettingCommon = False
5824 SyncLock _syncObject
5825 _cfgCommon.UserName = tw.Username
5826 _cfgCommon.Password = tw.Password
5827 _cfgCommon.IsOAuth = SettingDialog.IsOAuth
5828 _cfgCommon.Token = tw.AccessToken
5829 _cfgCommon.TokenSecret = tw.AccessTokenSecret
5830 _cfgCommon.UserstreamStartup = SettingDialog.UserstreamStartup
5831 _cfgCommon.UserstreamPeriod = SettingDialog.UserstreamPeriodInt
5832 _cfgCommon.TimelinePeriod = SettingDialog.TimelinePeriodInt
5833 _cfgCommon.ReplyPeriod = SettingDialog.ReplyPeriodInt
5834 _cfgCommon.DMPeriod = SettingDialog.DMPeriodInt
5835 _cfgCommon.PubSearchPeriod = SettingDialog.PubSearchPeriodInt
5836 _cfgCommon.ListsPeriod = SettingDialog.ListsPeriodInt
5837 _cfgCommon.Read = SettingDialog.Readed
5838 _cfgCommon.IconSize = SettingDialog.IconSz
5839 _cfgCommon.UnreadManage = SettingDialog.UnreadManage
5840 _cfgCommon.PlaySound = SettingDialog.PlaySound
5841 _cfgCommon.OneWayLove = SettingDialog.OneWayLove
5843 _cfgCommon.NameBalloon = SettingDialog.NameBalloon
5844 _cfgCommon.PostCtrlEnter = SettingDialog.PostCtrlEnter
5845 _cfgCommon.PostShiftEnter = SettingDialog.PostShiftEnter
5846 _cfgCommon.CountApi = SettingDialog.CountApi
5847 _cfgCommon.CountApiReply = SettingDialog.CountApiReply
5848 '_cfgCommon.CheckReply = SettingDialog.CheckReply
5849 _cfgCommon.PostAndGet = SettingDialog.PostAndGet
5850 _cfgCommon.DispUsername = SettingDialog.DispUsername
5851 _cfgCommon.MinimizeToTray = SettingDialog.MinimizeToTray
5852 _cfgCommon.CloseToExit = SettingDialog.CloseToExit
5853 _cfgCommon.DispLatestPost = SettingDialog.DispLatestPost
5854 _cfgCommon.SortOrderLock = SettingDialog.SortOrderLock
5855 _cfgCommon.TinyUrlResolve = SettingDialog.TinyUrlResolve
5856 _cfgCommon.PeriodAdjust = SettingDialog.PeriodAdjust
5857 _cfgCommon.StartupVersion = SettingDialog.StartupVersion
5858 _cfgCommon.StartupFollowers = SettingDialog.StartupFollowers
5859 _cfgCommon.RestrictFavCheck = SettingDialog.RestrictFavCheck
5860 _cfgCommon.AlwaysTop = SettingDialog.AlwaysTop
5861 _cfgCommon.UrlConvertAuto = SettingDialog.UrlConvertAuto
5862 _cfgCommon.Outputz = SettingDialog.OutputzEnabled
5863 _cfgCommon.OutputzKey = SettingDialog.OutputzKey
5864 _cfgCommon.OutputzUrlMode = SettingDialog.OutputzUrlmode
5865 _cfgCommon.UseUnreadStyle = SettingDialog.UseUnreadStyle
5866 _cfgCommon.DateTimeFormat = SettingDialog.DateTimeFormat
5867 _cfgCommon.DefaultTimeOut = SettingDialog.DefaultTimeOut
5868 '_cfgCommon.ProtectNotInclude = SettingDialog.ProtectNotInclude
5869 _cfgCommon.RetweetNoConfirm = SettingDialog.RetweetNoConfirm
5870 _cfgCommon.LimitBalloon = SettingDialog.LimitBalloon
5871 _cfgCommon.AutoShortUrlFirst = SettingDialog.AutoShortUrlFirst
5872 _cfgCommon.TabIconDisp = SettingDialog.TabIconDisp
5873 _cfgCommon.ReplyIconState = SettingDialog.ReplyIconState
5874 _cfgCommon.ReadOwnPost = SettingDialog.ReadOwnPost
5875 _cfgCommon.GetFav = SettingDialog.GetFav
5876 _cfgCommon.IsMonospace = SettingDialog.IsMonospace
5877 If IdeographicSpaceToSpaceToolStripMenuItem IsNot Nothing AndAlso _
5878 IdeographicSpaceToSpaceToolStripMenuItem.IsDisposed = False Then
5879 _cfgCommon.WideSpaceConvert = Me.IdeographicSpaceToSpaceToolStripMenuItem.Checked
5881 _cfgCommon.ReadOldPosts = SettingDialog.ReadOldPosts
5882 _cfgCommon.UseSsl = SettingDialog.UseSsl
5883 _cfgCommon.BilyUser = SettingDialog.BitlyUser
5884 _cfgCommon.BitlyPwd = SettingDialog.BitlyPwd
5885 _cfgCommon.ShowGrid = SettingDialog.ShowGrid
5886 _cfgCommon.UseAtIdSupplement = SettingDialog.UseAtIdSupplement
5887 _cfgCommon.UseHashSupplement = SettingDialog.UseHashSupplement
5888 _cfgCommon.PreviewEnable = SettingDialog.PreviewEnable
5889 _cfgCommon.Language = SettingDialog.Language
5891 _cfgCommon.SortOrder = _statuses.SortOrder
5892 Select Case _statuses.SortMode
5893 Case IdComparerClass.ComparerMode.Nickname 'ニックネーム
5894 _cfgCommon.SortColumn = 1
5895 Case IdComparerClass.ComparerMode.Data '本文
5896 _cfgCommon.SortColumn = 2
5897 Case IdComparerClass.ComparerMode.Id '時刻=発言Id
5898 _cfgCommon.SortColumn = 3
5899 Case IdComparerClass.ComparerMode.Name '名前
5900 _cfgCommon.SortColumn = 4
5901 Case IdComparerClass.ComparerMode.Source 'Source
5902 _cfgCommon.SortColumn = 7
5905 _cfgCommon.Nicoms = SettingDialog.Nicoms
5906 _cfgCommon.HashTags = HashMgr.HashHistories
5907 If HashMgr.IsPermanent Then
5908 _cfgCommon.HashSelected = HashMgr.UseHash
5910 _cfgCommon.HashSelected = ""
5912 _cfgCommon.HashIsHead = HashMgr.IsHead
5913 _cfgCommon.HashIsPermanent = HashMgr.IsPermanent
5914 _cfgCommon.TwitterUrl = SettingDialog.TwitterApiUrl
5915 _cfgCommon.TwitterSearchUrl = SettingDialog.TwitterSearchApiUrl
5916 _cfgCommon.HotkeyEnabled = SettingDialog.HotkeyEnabled
5917 _cfgCommon.HotkeyModifier = SettingDialog.HotkeyMod
5918 _cfgCommon.HotkeyKey = SettingDialog.HotkeyKey
5919 _cfgCommon.HotkeyValue = SettingDialog.HotkeyValue
5920 _cfgCommon.BlinkNewMentions = SettingDialog.BlinkNewMentions
5921 If ToolStripFocusLockMenuItem IsNot Nothing AndAlso _
5922 ToolStripFocusLockMenuItem.IsDisposed = False Then
5923 _cfgCommon.FocusLockToStatusText = Me.ToolStripFocusLockMenuItem.Checked
5925 _cfgCommon.UseAdditionalCount = SettingDialog.UseAdditionalCount
5926 _cfgCommon.MoreCountApi = SettingDialog.MoreCountApi
5927 _cfgCommon.FirstCountApi = SettingDialog.FirstCountApi
5928 _cfgCommon.SearchCountApi = SettingDialog.SearchCountApi
5929 _cfgCommon.FavoritesCountApi = SettingDialog.FavoritesCountApi
5930 _cfgCommon.TrackWord = tw.TrackWord
5931 _cfgCommon.AllAtReply = tw.AllAtReply
5937 Private Sub SaveConfigsLocal()
5938 If _ignoreConfigSave Then Exit Sub
5939 SyncLock _syncObject
5940 _modifySettingLocal = False
5941 _cfgLocal.FormSize = _mySize
5942 _cfgLocal.FormLocation = _myLoc
5943 _cfgLocal.SplitterDistance = _mySpDis
5944 _cfgLocal.PreviewDistance = _mySpDis3
5945 _cfgLocal.StatusMultiline = StatusText.Multiline
5946 _cfgLocal.StatusTextHeight = _mySpDis2
5947 _cfgLocal.StatusText = SettingDialog.Status
5949 _cfgLocal.FontUnread = _fntUnread
5950 _cfgLocal.ColorUnread = _clUnread
5951 _cfgLocal.FontRead = _fntReaded
5952 _cfgLocal.ColorRead = _clReaded
5953 _cfgLocal.FontDetail = _fntDetail
5954 _cfgLocal.ColorDetail = _clDetail
5955 _cfgLocal.ColorDetailBackcolor = _clDetailBackcolor
5956 _cfgLocal.ColorDetailLink = _clDetailLink
5957 _cfgLocal.ColorFav = _clFav
5958 _cfgLocal.ColorOWL = _clOWL
5959 _cfgLocal.ColorRetweet = _clRetweet
5960 _cfgLocal.ColorSelf = _clSelf
5961 _cfgLocal.ColorAtSelf = _clAtSelf
5962 _cfgLocal.ColorTarget = _clTarget
5963 _cfgLocal.ColorAtTarget = _clAtTarget
5964 _cfgLocal.ColorAtFromTarget = _clAtFromTarget
5965 _cfgLocal.ColorAtTo = _clAtTo
5966 _cfgLocal.ColorListBackcolor = _clListBackcolor
5967 _cfgLocal.ColorInputBackcolor = _clInputBackcolor
5968 _cfgLocal.ColorInputFont = _clInputFont
5969 _cfgLocal.FontInputFont = _fntInputFont
5971 _cfgLocal.BrowserPath = SettingDialog.BrowserPath
5972 _cfgLocal.UseRecommendStatus = SettingDialog.UseRecommendStatus
5973 _cfgLocal.ProxyType = SettingDialog.SelectedProxyType
5974 _cfgLocal.ProxyAddress = SettingDialog.ProxyAddress
5975 _cfgLocal.ProxyPort = SettingDialog.ProxyPort
5976 _cfgLocal.ProxyUser = SettingDialog.ProxyUser
5977 _cfgLocal.ProxyPassword = SettingDialog.ProxyPassword
5978 If _ignoreConfigSave Then Exit Sub
5983 Private Sub SaveConfigsTabs()
5984 Dim tabSetting As New SettingTabs
5985 For i As Integer = 0 To ListTab.TabPages.Count - 1
5986 If _statuses.Tabs(ListTab.TabPages(i).Text).TabType <> TabUsageType.Related Then tabSetting.Tabs.Add(_statuses.Tabs(ListTab.TabPages(i).Text))
5991 Private Sub SaveLogMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveLogMenuItem.Click, SaveFileMenuItem.Click
5992 Dim rslt As DialogResult = MessageBox.Show(String.Format(My.Resources.SaveLogMenuItem_ClickText1, Environment.NewLine), _
5993 My.Resources.SaveLogMenuItem_ClickText2, _
5994 MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)
5995 If rslt = Windows.Forms.DialogResult.Cancel Then Exit Sub
5997 SaveFileDialog1.FileName = "TweenPosts" + Format(Now, "yyMMdd-HHmmss") + ".tsv"
5998 SaveFileDialog1.InitialDirectory = My.Application.Info.DirectoryPath
5999 SaveFileDialog1.Filter = My.Resources.SaveLogMenuItem_ClickText3
6000 SaveFileDialog1.FilterIndex = 0
6001 SaveFileDialog1.Title = My.Resources.SaveLogMenuItem_ClickText4
6002 SaveFileDialog1.RestoreDirectory = True
6004 If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
6005 If Not SaveFileDialog1.ValidateNames Then Exit Sub
6006 Using sw As StreamWriter = New StreamWriter(SaveFileDialog1.FileName, False, Encoding.UTF8)
6007 If rslt = Windows.Forms.DialogResult.Yes Then
6009 For idx As Integer = 0 To _curList.VirtualListSize - 1
6010 Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
6011 Dim protect As String = ""
6012 If post.IsProtect Then protect = "Protect"
6013 sw.WriteLine(post.Nickname & vbTab & _
6014 """" & post.Data.Replace(vbLf, "").Replace("""", """""") + """" & vbTab & _
6015 post.PDate.ToString() & vbTab & _
6016 post.Name & vbTab & _
6017 post.Id.ToString() & vbTab & _
6018 post.ImageUrl & vbTab & _
6019 """" & post.OriginalData.Replace(vbLf, "").Replace("""", """""") + """" & vbTab & _
6023 For Each idx As Integer In _curList.SelectedIndices
6024 Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
6025 Dim protect As String = ""
6026 If post.IsProtect Then protect = "Protect"
6027 sw.WriteLine(post.Nickname & vbTab & _
6028 """" & post.Data.Replace(vbLf, "").Replace("""", """""") + """" & vbTab & _
6029 post.PDate.ToString() & vbTab & _
6030 post.Name & vbTab & _
6031 post.Id.ToString() & vbTab & _
6032 post.ImageUrl & vbTab & _
6033 """" & post.OriginalData.Replace(vbLf, "").Replace("""", """""") + """" & vbTab & _
6041 Me.TopMost = SettingDialog.AlwaysTop
6044 Private Sub PostBrowser_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles PostBrowser.PreviewKeyDown
6046 If e.Modifiers = Keys.None Then
6047 Select Case e.KeyCode
6051 JumpUnreadMenuItem_Click(Nothing, Nothing)
6054 ShowRelatedStatusesMenuItem_Click(Nothing, Nothing)
6057 OpenUriAsync("http://sourceforge.jp/projects/tween/wiki/FrontPage")
6060 MenuItemSearchNext_Click(Nothing, Nothing)
6067 GetTimeline(WORKERTYPE.Reply, 1, 0, "")
6070 GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
6077 If e.Modifiers = Keys.Shift Then
6078 Select Case e.KeyCode
6081 MenuItemSearchPrev_Click(Nothing, Nothing)
6088 GetTimeline(WORKERTYPE.Reply, -1, 0, "")
6091 GetTimeline(WORKERTYPE.DirectMessegeRcv, -1, 0, "")
6097 If e.Modifiers = Keys.Control Then
6098 Select Case e.KeyCode
6101 PostBrowser.Document.ExecCommand("SelectAll", False, Nothing)
6102 Case Keys.C, Keys.Insert
6104 Dim _selText As String = WebBrowser_GetSelectionText(PostBrowser)
6105 If Not String.IsNullOrEmpty(_selText) Then
6107 Clipboard.SetDataObject(_selText, False, 5, 100)
6108 Catch ex As Exception
6109 MessageBox.Show(ex.Message)
6114 MakeReplyOrDirectStatus(False, True)
6117 MakeReplyOrDirectStatus(False, False)
6120 doReTweetOfficial(True)
6126 FavoriteChange(True)
6129 ReadedStripMenuItem_Click(Nothing, Nothing)
6132 MultiLineMenuItem.Checked = Not MultiLineMenuItem.Checked
6133 MultiLineMenuItem_Click(Nothing, Nothing)
6139 MenuItemSubSearch_Click(Nothing, Nothing)
6142 If _curList.SelectedIndices.Count > 0 Then
6143 OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name)
6144 ElseIf _curList.SelectedIndices.Count = 0 Then
6145 OpenUriAsync("http://twitter.com/")
6149 If _curList.SelectedIndices.Count > 0 Then
6150 OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name + "/favorites")
6154 MoveToFavToolStripMenuItem_Click(Nothing, Nothing)
6157 OpenURLMenuItem_Click(Nothing, Nothing)
6162 If e.Modifiers = Keys.Alt Then
6163 If e.KeyCode = Keys.R Then
6165 doReTweetOfficial(True)
6166 ElseIf e.KeyCode = Keys.P AndAlso _curPost IsNot Nothing Then
6168 doShowUserStatus(_curPost.Name, False)
6172 ' ControlKey + ShiftKey + 何か
6173 If e.Modifiers = (Keys.Control Or Keys.Shift) Then
6174 Select Case e.KeyCode
6177 MakeReplyOrDirectStatus(False, True, True)
6180 If ListTab.SelectedTab IsNot Nothing Then
6181 If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.PublicSearch Then Exit Sub
6182 ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch").Focus()
6186 FavoriteChange(False)
6189 UnreadStripMenuItem_Click(Nothing, Nothing)
6192 HashToggleMenuItem_Click(Nothing, Nothing)
6195 ImageSelectMenuItem_Click(Nothing, Nothing)
6198 FavorareMenuItem_Click(Nothing, Nothing)
6207 'AltKey + ShiftKey + 何か
6208 If e.Modifiers = (Keys.Alt Or Keys.Shift) Then
6209 Select Case e.KeyCode
6211 e.IsInputKey = False
6212 doReTweetUnofficial()
6214 e.IsInputKey = False
6220 'CtrlKey + AltKey + 何か
6221 If e.Modifiers = (Keys.Control Or Keys.Alt) Then
6222 Select Case e.KeyCode
6225 FavoritesRetweetUnofficial()
6228 FavoritesRetweetOriginal()
6233 Public Function TabRename(ByRef tabName As String) As Boolean
6235 Dim newTabText As String = Nothing
6236 Using inputName As New InputTabName()
6237 inputName.TabName = tabName
6238 inputName.ShowDialog()
6239 If inputName.DialogResult = Windows.Forms.DialogResult.Cancel Then Return False
6240 newTabText = inputName.TabName
6243 Me.TopMost = SettingDialog.AlwaysTop
6244 If Not String.IsNullOrEmpty(newTabText) Then
6246 For i As Integer = 0 To ListTab.TabCount - 1
6247 If ListTab.TabPages(i).Text = newTabText Then
6248 Dim tmp As String = String.Format(My.Resources.Tabs_DoubleClickText1, newTabText)
6249 MessageBox.Show(tmp, My.Resources.Tabs_DoubleClickText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
6253 'タブ名のリスト作り直し(デフォルトタブ以外は再作成)
6254 For i As Integer = 0 To ListTab.TabCount - 1
6255 If _statuses.Tabs(ListTab.TabPages(i).Text).TabType = TabUsageType.Mentions OrElse _
6256 (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
6257 TabDialog.RemoveTab(ListTab.TabPages(i).Text)
6259 If ListTab.TabPages(i).Text = tabName Then
6260 ListTab.TabPages(i).Text = newTabText
6263 _statuses.RenameTab(tabName, newTabText)
6265 For i As Integer = 0 To ListTab.TabCount - 1
6266 If _statuses.Tabs(ListTab.TabPages(i).Text).TabType = TabUsageType.Mentions OrElse _
6267 (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
6268 If ListTab.TabPages(i).Text = tabName Then
6269 ListTab.TabPages(i).Text = newTabText
6271 TabDialog.AddTab(ListTab.TabPages(i).Text)
6276 _rclickTabName = newTabText
6277 tabName = newTabText
6284 Private Sub Tabs_DoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListTab.MouseDoubleClick
6285 Dim tn As String = ListTab.SelectedTab.Text
6289 Private Sub Tabs_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListTab.MouseDown
6290 Dim cpos As New Point(e.X, e.Y)
6291 If e.Button = Windows.Forms.MouseButtons.Left Then
6292 For i As Integer = 0 To ListTab.TabPages.Count - 1
6293 Dim rect As Rectangle = ListTab.GetTabRect(i)
6294 If rect.Left <= cpos.X AndAlso cpos.X <= rect.Right AndAlso _
6295 rect.Top <= cpos.Y AndAlso cpos.Y <= rect.Bottom Then
6305 Private Sub Tabs_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListTab.DragEnter
6306 If e.Data.GetDataPresent(GetType(TabPage)) Then
6307 e.Effect = DragDropEffects.Move
6309 e.Effect = DragDropEffects.None
6313 Private Sub Tabs_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListTab.DragDrop
6314 If Not e.Data.GetDataPresent(GetType(TabPage)) Then Exit Sub
6317 Dim tn As String = ""
6319 Dim cpos As New Point(e.X, e.Y)
6320 Dim spos As Point = ListTab.PointToClient(cpos)
6322 For i = 0 To ListTab.TabPages.Count - 1
6323 Dim rect As Rectangle = ListTab.GetTabRect(i)
6324 If rect.Left <= spos.X AndAlso spos.X <= rect.Right AndAlso _
6325 rect.Top <= spos.Y AndAlso spos.Y <= rect.Bottom Then
6326 tn = ListTab.TabPages(i).Text
6327 If spos.X <= (rect.Left + rect.Right) / 2 Then
6336 'タブのないところにドロップ->最後尾へ移動
6337 If String.IsNullOrEmpty(tn) Then
6338 tn = ListTab.TabPages(ListTab.TabPages.Count - 1).Text
6340 i = ListTab.TabPages.Count - 1
6343 Dim tp As TabPage = DirectCast(e.Data.GetData(GetType(TabPage)), TabPage)
6344 If tp.Text = tn Then Exit Sub
6346 ReOrderTab(tp.Text, tn, bef)
6349 Public Sub ReOrderTab(ByVal targetTabText As String, ByVal baseTabText As String, ByVal isBeforeBaseTab As Boolean)
6350 Dim baseIndex As Integer = 0
6351 For baseIndex = 0 To ListTab.TabPages.Count - 1
6352 If ListTab.TabPages(baseIndex).Text = baseTabText Then Exit For
6355 ListTab.SuspendLayout()
6357 Dim mTp As TabPage = Nothing
6358 For j As Integer = 0 To ListTab.TabPages.Count - 1
6359 If ListTab.TabPages(j).Text = targetTabText Then
6360 mTp = ListTab.TabPages(j)
6361 ListTab.TabPages.Remove(mTp)
6362 If j < baseIndex Then baseIndex -= 1
6366 If isBeforeBaseTab Then
6367 ListTab.TabPages.Insert(baseIndex, mTp)
6369 ListTab.TabPages.Insert(baseIndex + 1, mTp)
6372 ListTab.ResumeLayout()
6377 Private Sub MakeReplyOrDirectStatus(Optional ByVal isAuto As Boolean = True, Optional ByVal isReply As Boolean = True, Optional ByVal isAll As Boolean = False)
6378 'isAuto:True=先頭に挿入、False=カーソル位置に挿入
6379 'isReply:True=@,False=DM
6380 If Not StatusText.Enabled Then Exit Sub
6381 If _curList Is Nothing Then Exit Sub
6382 If _curTab Is Nothing Then Exit Sub
6383 If _curPost Is Nothing Then Exit Sub
6385 ' 複数あてリプライはReplyではなく通常ポスト
6386 '↑仕様変更で全部リプライ扱いでOK(先頭ドット付加しない)
6387 '090403暫定でドットを付加しないようにだけ修正。単独と複数の処理は統合できると思われる。
6388 '090513 all @ replies 廃止の仕様変更によりドット付加に戻し(syo68k)
6390 If _curList.SelectedIndices.Count > 0 Then
6392 If _curList.SelectedIndices.Count = 1 AndAlso Not isAll AndAlso _curPost IsNot Nothing Then
6394 If (_statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.DirectMessage AndAlso isAuto) OrElse (Not isAuto AndAlso Not isReply) Then
6396 StatusText.Text = "D " + _curPost.Name + " " + StatusText.Text
6397 StatusText.SelectionStart = StatusText.Text.Length
6403 If String.IsNullOrEmpty(StatusText.Text) Then
6406 ' ステータステキストが入力されていない場合先頭に@ユーザー名を追加する
6407 StatusText.Text = "@" + _curPost.Name + " "
6408 If _curPost.RetweetedId > 0 Then
6409 _reply_to_id = _curPost.RetweetedId
6411 _reply_to_id = _curPost.Id
6413 _reply_to_name = _curPost.Name
6418 '1件選んでEnter or DoubleClick
6419 If StatusText.Text.Contains("@" + _curPost.Name + " ") Then
6420 If _reply_to_id > 0 AndAlso _reply_to_name = _curPost.Name Then
6422 If _curPost.RetweetedId > 0 Then
6423 _reply_to_id = _curPost.RetweetedId
6425 _reply_to_id = _curPost.Id
6427 _reply_to_name = _curPost.Name
6431 If Not StatusText.Text.StartsWith("@") Then
6433 If StatusText.Text.StartsWith(". ") Then
6435 StatusText.Text = StatusText.Text.Insert(2, "@" + _curPost.Name + " ")
6440 StatusText.Text = "@" + _curPost.Name + " " + StatusText.Text
6441 If _curPost.RetweetedId > 0 Then
6442 _reply_to_id = _curPost.RetweetedId
6444 _reply_to_id = _curPost.Id
6446 _reply_to_name = _curPost.Name
6451 StatusText.Text = ". @" + _curPost.Name + " " + StatusText.Text
6452 'StatusText.Text = "@" + _curPost.Name + " " + StatusText.Text
6457 '1件選んでCtrl-Rの場合(返信先操作せず)
6458 Dim sidx As Integer = StatusText.SelectionStart
6459 Dim id As String = "@" + _curPost.Name + " "
6461 If StatusText.Text.Substring(sidx - 1, 1) <> " " Then
6465 StatusText.Text = StatusText.Text.Insert(sidx, id)
6467 'If StatusText.Text.StartsWith("@") Then
6469 ' StatusText.Text = ". " + StatusText.Text.Insert(sidx, " @" + _curPost.Name + " ")
6470 ' sidx += 5 + _curPost.Name.Length
6473 ' StatusText.Text = StatusText.Text.Insert(sidx, " @" + _curPost.Name + " ")
6474 ' sidx += 3 + _curPost.Name.Length
6476 StatusText.SelectionStart = sidx
6479 '_reply_to_name = Nothing
6485 If Not isAuto AndAlso Not isReply Then Exit Sub
6487 'C-S-rか、複数の宛先を選択中にEnter/DoubleClick/C-r/C-S-r
6490 'Enter or DoubleClick
6492 Dim sTxt As String = StatusText.Text
6493 If Not sTxt.StartsWith(". ") Then
6498 For cnt As Integer = 0 To _curList.SelectedIndices.Count - 1
6499 Dim post As PostClass = _statuses.Item(_curTab.Text, _curList.SelectedIndices(cnt))
6500 If Not sTxt.Contains("@" + post.Name + " ") Then
6501 sTxt = sTxt.Insert(2, "@" + post.Name + " ")
6502 'sTxt = "@" + post.Name + " " + sTxt
6505 StatusText.Text = sTxt
6508 If _curList.SelectedIndices.Count > 1 Then
6511 Dim ids As String = ""
6512 Dim sidx As Integer = StatusText.SelectionStart
6513 For cnt As Integer = 0 To _curList.SelectedIndices.Count - 1
6514 Dim post As PostClass = _statuses.Item(_curTab.Text, _curList.SelectedIndices(cnt))
6515 If Not ids.Contains("@" + post.Name + " ") AndAlso _
6516 Not post.Name.Equals(tw.Username, StringComparison.CurrentCultureIgnoreCase) Then
6517 ids += "@" + post.Name + " "
6520 For Each nm As String In post.ReplyToList
6521 If Not ids.Contains("@" + nm + " ") AndAlso _
6522 Not nm.Equals(tw.Username, StringComparison.CurrentCultureIgnoreCase) Then
6523 Dim m As Match = Regex.Match(post.Data, "[@@](?<id>" + nm + ")([^a-zA-Z0-9]|$)", RegexOptions.IgnoreCase)
6525 ids += "@" + m.Result("${id}") + " "
6527 ids += "@" + nm + " "
6533 If ids.Length = 0 Then Exit Sub
6534 If Not StatusText.Text.StartsWith(". ") Then
6535 StatusText.Text = ". " + StatusText.Text
6541 If StatusText.Text.Substring(sidx - 1, 1) <> " " Then
6545 StatusText.Text = StatusText.Text.Insert(sidx, ids)
6547 'If StatusText.Text.StartsWith("@") Then
6548 ' StatusText.Text = ". " + StatusText.Text.Insert(sidx, ids)
6549 ' sidx += 2 + ids.Length
6551 ' StatusText.Text = StatusText.Text.Insert(sidx, ids)
6552 ' sidx += 1 + ids.Length
6554 StatusText.SelectionStart = sidx
6558 '1件のみ選択のC-S-r(返信元付加する可能性あり)
6560 Dim ids As String = ""
6561 Dim sidx As Integer = StatusText.SelectionStart
6562 Dim post As PostClass = _curPost
6563 If Not ids.Contains("@" + post.Name + " ") AndAlso _
6564 Not post.Name.Equals(tw.Username, StringComparison.CurrentCultureIgnoreCase) Then
6565 ids += "@" + post.Name + " "
6567 For Each nm As String In post.ReplyToList
6568 If Not ids.Contains("@" + nm + " ") AndAlso _
6569 Not nm.Equals(tw.Username, StringComparison.CurrentCultureIgnoreCase) Then
6570 Dim m As Match = Regex.Match(post.Data, "[@@](?<id>" + nm + ")([^a-zA-Z0-9]|$)", RegexOptions.IgnoreCase)
6572 ids += "@" + m.Result("${id}") + " "
6574 ids += "@" + nm + " "
6578 If Not String.IsNullOrEmpty(post.RetweetedBy) Then
6579 If Not ids.Contains("@" + post.RetweetedBy + " ") AndAlso _
6580 Not post.RetweetedBy.Equals(tw.Username, StringComparison.CurrentCultureIgnoreCase) Then
6581 ids += "@" + post.RetweetedBy + " "
6584 If ids.Length = 0 Then Exit Sub
6585 If String.IsNullOrEmpty(StatusText.Text) Then
6587 StatusText.Text = ids
6588 StatusText.SelectionStart = ids.Length
6590 If post.RetweetedId > 0 Then
6591 _reply_to_id = post.RetweetedId
6593 _reply_to_id = post.Id
6595 _reply_to_name = post.Name
6600 If StatusText.Text.Substring(sidx - 1, 1) <> " " Then
6604 StatusText.Text = StatusText.Text.Insert(sidx, ids)
6606 StatusText.SelectionStart = sidx
6612 StatusText.SelectionStart = StatusText.Text.Length
6617 Private Sub ListTab_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListTab.MouseUp
6621 Private Sub TimerRefreshIcon_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerRefreshIcon.Tick
6623 If _colorize Then Colorize()
6624 If Not TimerRefreshIcon.Enabled Then Exit Sub
6625 Static iconCnt As Integer = 0
6626 Static blinkCnt As Integer = 0
6627 Static blink As Boolean = False
6628 Static idle As Boolean = False
6629 'Static usCheckCnt As Integer = 0
6631 Static iconDlListTopItem As ListViewItem = Nothing
6632 If DirectCast(ListTab.SelectedTab.Tag, ListView).TopItem Is iconDlListTopItem Then
6633 DirectCast(Me.TIconDic, ImageDictionary).PauseGetImage = False
6635 DirectCast(Me.TIconDic, ImageDictionary).PauseGetImage = True
6637 iconDlListTopItem = DirectCast(ListTab.SelectedTab.Tag, ListView).TopItem
6643 'If usCheckCnt > 300 Then '1min
6645 ' If Not Me.IsReceivedUserStream Then
6646 ' TraceOut("ReconnectUserStream")
6647 ' tw.ReconnectUserStream()
6651 Dim busy As Boolean = False
6652 For Each bw As BackgroundWorker In Me._bw
6653 If bw IsNot Nothing AndAlso bw.IsBusy Then
6662 If blinkCnt > 10 Then
6665 SaveConfigsAll(True)
6669 NotifyIcon1.Icon = NIconRefresh(iconCnt)
6671 _myStatusError = False
6675 Dim tb As TabClass = _statuses.GetTabByType(TabUsageType.Mentions)
6676 If SettingDialog.ReplyIconState <> REPLY_ICONSTATE.None AndAlso tb IsNot Nothing AndAlso tb.UnreadCount > 0 Then
6677 If blinkCnt > 0 Then Exit Sub
6679 If blink OrElse SettingDialog.ReplyIconState = REPLY_ICONSTATE.StaticIcon Then
6680 NotifyIcon1.Icon = ReplyIcon
6682 NotifyIcon1.Icon = ReplyIconBlink
6688 If idle Then Exit Sub
6692 If _myStatusError Then
6693 NotifyIcon1.Icon = NIconAtRed
6696 If _myStatusOnline Then
6697 NotifyIcon1.Icon = NIconAt
6699 NotifyIcon1.Icon = NIconAtSmoke
6703 Private Sub ContextMenuTabProperty_Opening(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ContextMenuTabProperty.Opening
6704 '右クリックの場合はタブ名が設定済。アプリケーションキーの場合は現在のタブを対象とする
6705 If String.IsNullOrEmpty(_rclickTabName) OrElse sender IsNot ContextMenuTabProperty Then
6706 If ListTab IsNot Nothing AndAlso ListTab.SelectedTab IsNot Nothing Then
6707 _rclickTabName = ListTab.SelectedTab.Text
6713 If _statuses Is Nothing Then Exit Sub
6714 If _statuses.Tabs Is Nothing Then Exit Sub
6716 Dim tb As TabClass = _statuses.Tabs(_rclickTabName)
6717 If tb Is Nothing Then Exit Sub
6719 NotifyDispMenuItem.Checked = tb.Notify
6720 Me.NotifyTbMenuItem.Checked = tb.Notify
6722 soundfileListup = True
6723 SoundFileComboBox.Items.Clear()
6724 Me.SoundFileTbComboBox.Items.Clear()
6725 SoundFileComboBox.Items.Add("")
6726 Me.SoundFileTbComboBox.Items.Add("")
6727 Dim oDir As IO.DirectoryInfo = New IO.DirectoryInfo(My.Application.Info.DirectoryPath + IO.Path.DirectorySeparatorChar)
6728 If IO.Directory.Exists(IO.Path.Combine(My.Application.Info.DirectoryPath, "Sounds")) Then
6729 oDir = oDir.GetDirectories("Sounds")(0)
6731 For Each oFile As IO.FileInfo In oDir.GetFiles("*.wav")
6732 SoundFileComboBox.Items.Add(oFile.Name)
6733 Me.SoundFileTbComboBox.Items.Add(oFile.Name)
6735 Dim idx As Integer = SoundFileComboBox.Items.IndexOf(tb.SoundFile)
6736 If idx = -1 Then idx = 0
6737 SoundFileComboBox.SelectedIndex = idx
6738 Me.SoundFileTbComboBox.SelectedIndex = idx
6739 soundfileListup = False
6740 UreadManageMenuItem.Checked = tb.UnreadManage
6741 Me.UnreadMngTbMenuItem.Checked = tb.UnreadManage
6743 TabMenuControl(_rclickTabName)
6746 Private Sub TabMenuControl(ByVal tabName As String)
6747 If _statuses.Tabs(tabName).TabType <> TabUsageType.Mentions AndAlso _statuses.IsDefaultTab(tabName) Then
6748 FilterEditMenuItem.Enabled = True
6749 Me.EditRuleTbMenuItem.Enabled = True
6750 DeleteTabMenuItem.Enabled = False
6751 Me.DeleteTbMenuItem.Enabled = False
6752 ElseIf _statuses.Tabs(tabName).TabType = TabUsageType.Mentions Then
6753 FilterEditMenuItem.Enabled = True
6754 Me.EditRuleTbMenuItem.Enabled = True
6755 DeleteTabMenuItem.Enabled = False
6756 Me.DeleteTbMenuItem.Enabled = False
6758 FilterEditMenuItem.Enabled = True
6759 Me.EditRuleTbMenuItem.Enabled = True
6760 DeleteTabMenuItem.Enabled = True
6761 Me.DeleteTbMenuItem.Enabled = True
6765 Private Sub UreadManageMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UreadManageMenuItem.Click, UnreadMngTbMenuItem.Click
6766 UreadManageMenuItem.Checked = DirectCast(sender, ToolStripMenuItem).Checked
6767 Me.UnreadMngTbMenuItem.Checked = UreadManageMenuItem.Checked
6769 If String.IsNullOrEmpty(_rclickTabName) Then Exit Sub
6770 ChangeTabUnreadManage(_rclickTabName, UreadManageMenuItem.Checked)
6775 Public Sub ChangeTabUnreadManage(ByVal tabName As String, ByVal isManage As Boolean)
6778 For idx = 0 To ListTab.TabCount
6779 If ListTab.TabPages(idx).Text = tabName Then Exit For
6782 _statuses.SetTabUnreadManage(tabName, isManage)
6783 If SettingDialog.TabIconDisp Then
6784 If _statuses.Tabs(tabName).UnreadCount > 0 Then
6785 ListTab.TabPages(idx).ImageIndex = 0
6787 ListTab.TabPages(idx).ImageIndex = -1
6791 If _curTab.Text = tabName Then
6792 _itemCache = Nothing
6793 _postCache = Nothing
6797 SetMainWindowTitle()
6799 If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
6802 Private Sub NotifyDispMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NotifyDispMenuItem.Click, NotifyTbMenuItem.Click
6803 NotifyDispMenuItem.Checked = DirectCast(sender, ToolStripMenuItem).Checked
6804 Me.NotifyTbMenuItem.Checked = NotifyDispMenuItem.Checked
6806 If String.IsNullOrEmpty(_rclickTabName) Then Exit Sub
6808 _statuses.Tabs(_rclickTabName).Notify = NotifyDispMenuItem.Checked
6813 Private Sub SoundFileComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SoundFileComboBox.SelectedIndexChanged, SoundFileTbComboBox.SelectedIndexChanged
6814 If soundfileListup OrElse _rclickTabName = "" Then Exit Sub
6816 _statuses.Tabs(_rclickTabName).SoundFile = DirectCast(DirectCast(sender, ToolStripComboBox).SelectedItem, String)
6821 Private Sub DeleteTabMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DeleteTabMenuItem.Click, DeleteTbMenuItem.Click
6822 If String.IsNullOrEmpty(_rclickTabName) OrElse sender Is Me.DeleteTbMenuItem Then _rclickTabName = ListTab.SelectedTab.Text
6824 RemoveSpecifiedTab(_rclickTabName)
6828 Private Sub FilterEditMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FilterEditMenuItem.Click, EditRuleTbMenuItem.Click
6830 If String.IsNullOrEmpty(_rclickTabName) Then _rclickTabName = _statuses.GetTabByType(TabUsageType.Home).TabName
6831 fDialog.SetCurrent(_rclickTabName)
6832 fDialog.ShowDialog()
6833 Me.TopMost = SettingDialog.AlwaysTop
6836 Me.Cursor = Cursors.WaitCursor
6837 _itemCache = Nothing
6838 _postCache = Nothing
6841 _statuses.FilterAll()
6842 For Each tb As TabPage In ListTab.TabPages
6843 DirectCast(tb.Tag, DetailsListView).VirtualListSize = _statuses.Tabs(tb.Text).AllCount
6844 If _statuses.Tabs(tb.Text).UnreadCount > 0 Then
6845 If SettingDialog.TabIconDisp Then
6849 If SettingDialog.TabIconDisp Then
6854 If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
6856 Me.Cursor = Cursors.Default
6861 Private Sub AddTabMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddTabMenuItem.Click, CreateTbMenuItem.Click
6862 Dim tabName As String = Nothing
6863 Dim tabUsage As TabUsageType
6864 Using inputName As New InputTabName()
6865 inputName.TabName = _statuses.GetUniqueTabName
6866 inputName.IsShowUsage = True
6867 inputName.ShowDialog()
6868 If inputName.DialogResult = Windows.Forms.DialogResult.Cancel Then Exit Sub
6869 tabName = inputName.TabName
6870 tabUsage = inputName.Usage
6873 Me.TopMost = SettingDialog.AlwaysTop
6874 If Not String.IsNullOrEmpty(tabName) Then
6876 Dim list As ListElement = Nothing
6877 If tabUsage = TabUsageType.Lists Then
6878 Using listAvail As New ListAvailable
6879 If listAvail.ShowDialog(Me) = Windows.Forms.DialogResult.Cancel Then Exit Sub
6880 If listAvail.SelectedList Is Nothing Then Exit Sub
6881 list = listAvail.SelectedList
6884 If Not AddNewTab(tabName, False, tabUsage) Then
6885 Dim tmp As String = String.Format(My.Resources.AddTabMenuItem_ClickText1, tabName)
6886 MessageBox.Show(tmp, My.Resources.AddTabMenuItem_ClickText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
6889 _statuses.AddTab(tabName, tabUsage, list)
6891 If tabUsage = TabUsageType.PublicSearch Then
6892 ListTab.SelectedIndex = ListTab.TabPages.Count - 1
6893 ListTabSelect(ListTab.TabPages(ListTab.TabPages.Count - 1))
6894 ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch").Focus()
6896 If tabUsage = TabUsageType.Lists Then
6897 ListTab.SelectedIndex = ListTab.TabPages.Count - 1
6898 ListTabSelect(ListTab.TabPages(ListTab.TabPages.Count - 1))
6899 GetTimeline(WORKERTYPE.List, 1, 0, tabName)
6905 Private Sub TabMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabMenuItem.Click, CreateTabRuleOpMenuItem.Click
6907 For Each idx As Integer In _curList.SelectedIndices
6908 Dim tabName As String = ""
6910 If Not SelectTab(tabName) Then Exit Sub
6912 fDialog.SetCurrent(tabName)
6913 If _statuses.Item(_curTab.Text, idx).RetweetedId = 0 Then
6914 fDialog.AddNewFilter(_statuses.Item(_curTab.Text, idx).Name, _statuses.Item(_curTab.Text, idx).Data)
6916 fDialog.AddNewFilter(_statuses.Item(_curTab.Text, idx).RetweetedBy, _statuses.Item(_curTab.Text, idx).Data)
6918 fDialog.ShowDialog()
6919 Me.TopMost = SettingDialog.AlwaysTop
6923 Me.Cursor = Cursors.WaitCursor
6924 _itemCache = Nothing
6925 _postCache = Nothing
6928 _statuses.FilterAll()
6929 For Each tb As TabPage In ListTab.TabPages
6930 DirectCast(tb.Tag, DetailsListView).VirtualListSize = _statuses.Tabs(tb.Text).AllCount
6931 If _statuses.Tabs(tb.Text).UnreadCount > 0 Then
6932 If SettingDialog.TabIconDisp Then
6936 If SettingDialog.TabIconDisp Then
6941 If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
6943 Me.Cursor = Cursors.Default
6946 If Me.ListTab.SelectedTab IsNot Nothing AndAlso
6947 DirectCast(Me.ListTab.SelectedTab.Tag, DetailsListView).SelectedIndices.Count > 0 Then
6948 _curPost = _statuses.Item(Me.ListTab.SelectedTab.Text, DirectCast(Me.ListTab.SelectedTab.Tag, DetailsListView).SelectedIndices(0))
6952 Protected Overrides Function ProcessDialogKey( _
6953 ByVal keyData As Keys) As Boolean
6954 'TextBox1でEnterを押してもビープ音が鳴らないようにする
6955 If (keyData And Keys.KeyCode) = Keys.Enter Then
6956 If StatusText.Focused Then
6958 If StatusText.Multiline AndAlso _
6959 (Not SettingDialog.PostShiftEnter AndAlso (keyData And Keys.Shift) = Keys.Shift AndAlso _
6960 (keyData And Keys.Control) <> Keys.Control) OrElse _
6961 (SettingDialog.PostShiftEnter AndAlso (keyData And Keys.Control) = Keys.Control AndAlso _
6962 (keyData And Keys.Shift) <> Keys.Shift) Then
6963 Dim pos1 As Integer = StatusText.SelectionStart
6964 If StatusText.SelectionLength > 0 Then
6965 StatusText.Text = StatusText.Text.Remove(pos1, StatusText.SelectionLength) '選択状態文字列削除
6967 StatusText.Text = StatusText.Text.Insert(pos1, Environment.NewLine) '改行挿入
6968 StatusText.SelectionStart = pos1 + Environment.NewLine.Length 'カーソルを改行の次の文字へ移動
6972 If (Not StatusText.Multiline AndAlso _
6973 ((keyData And Keys.Control) = Keys.Control AndAlso SettingDialog.PostCtrlEnter) OrElse _
6974 ((keyData And Keys.Shift) = Keys.Shift AndAlso SettingDialog.PostShiftEnter) OrElse _
6975 (((keyData And Keys.Control) <> Keys.Control AndAlso Not SettingDialog.PostCtrlEnter) AndAlso _
6976 ((keyData And Keys.Shift) <> Keys.Shift AndAlso Not SettingDialog.PostShiftEnter))) OrElse _
6977 (StatusText.Multiline AndAlso _
6978 (Not SettingDialog.PostCtrlEnter AndAlso Not SettingDialog.PostShiftEnter AndAlso _
6979 ((keyData And Keys.Control) <> Keys.Control AndAlso (keyData And Keys.Shift) <> Keys.Shift) OrElse _
6980 ((keyData And Keys.Control) = Keys.Control AndAlso (keyData And Keys.Shift) = Keys.Shift)) OrElse _
6981 (SettingDialog.PostCtrlEnter AndAlso (keyData And Keys.Control) = Keys.Control) OrElse _
6982 (SettingDialog.PostShiftEnter AndAlso (keyData And Keys.Shift) = Keys.Shift)) Then
6983 PostButton_Click(Nothing, Nothing)
6986 ElseIf _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.PublicSearch AndAlso _
6987 (ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch").Focused OrElse _
6988 ListTab.SelectedTab.Controls("panelSearch").Controls("comboLang").Focused) Then
6989 Me.SearchButton_Click(ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch"), Nothing)
6994 Return MyBase.ProcessDialogKey(keyData)
6997 Private Sub ReplyAllStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReplyAllStripMenuItem.Click, ReplyAllOpMenuItem.Click
6998 MakeReplyOrDirectStatus(False, True, True)
7001 Private Sub IDRuleMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IDRuleMenuItem.Click, CreateIdRuleOpMenuItem.Click
7002 Dim tabName As String = ""
7005 If _curList.SelectedIndices.Count = 0 Then Exit Sub
7008 If Not SelectTab(tabName) Then Exit Sub
7010 Dim mv As Boolean = False
7011 Dim mk As Boolean = False
7014 Dim ids As New List(Of String)
7015 For Each idx As Integer In _curList.SelectedIndices
7016 Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
7017 If Not ids.Contains(post.Name) Then
7018 Dim fc As New FiltersClass
7020 If post.RetweetedId = 0 Then
7021 fc.NameFilter = post.Name
7023 fc.NameFilter = post.RetweetedBy
7025 fc.SearchBoth = True
7029 fc.SearchUrl = False
7030 _statuses.Tabs(tabName).AddFilter(fc)
7033 If ids.Count <> 0 Then
7034 Dim atids As New List(Of String)
7035 For Each id As String In ids
7038 Dim cnt As Integer = AtIdSupl.ItemCount
7039 AtIdSupl.AddRangeItem(atids.ToArray)
7040 If AtIdSupl.ItemCount <> cnt Then _modifySettingAtId = True
7044 Me.Cursor = Cursors.WaitCursor
7045 _itemCache = Nothing
7046 _postCache = Nothing
7049 _statuses.FilterAll()
7050 For Each tb As TabPage In ListTab.TabPages
7051 DirectCast(tb.Tag, DetailsListView).VirtualListSize = _statuses.Tabs(tb.Text).AllCount
7052 If _statuses.ContainsTab(tb.Text) Then
7053 If _statuses.Tabs(tb.Text).UnreadCount > 0 Then
7054 If SettingDialog.TabIconDisp Then
7058 If SettingDialog.TabIconDisp Then
7064 If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
7066 Me.Cursor = Cursors.Default
7071 Private Function SelectTab(ByRef tabName As String) As Boolean
7074 If TabDialog.ShowDialog = Windows.Forms.DialogResult.Cancel Then
7075 Me.TopMost = SettingDialog.AlwaysTop
7078 Me.TopMost = SettingDialog.AlwaysTop
7079 tabName = TabDialog.SelectedTabName
7081 ListTab.SelectedTab.Focus()
7083 If tabName = My.Resources.IDRuleMenuItem_ClickText1 Then
7084 Using inputName As New InputTabName()
7085 inputName.TabName = _statuses.GetUniqueTabName
7086 inputName.ShowDialog()
7087 If inputName.DialogResult = Windows.Forms.DialogResult.Cancel Then Return False
7088 tabName = inputName.TabName
7091 Me.TopMost = SettingDialog.AlwaysTop
7092 If Not String.IsNullOrEmpty(tabName) Then
7093 If Not AddNewTab(tabName, False, TabUsageType.UserDefined) Then
7094 Dim tmp As String = String.Format(My.Resources.IDRuleMenuItem_ClickText2, tabName)
7095 MessageBox.Show(tmp, My.Resources.IDRuleMenuItem_ClickText3, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
7098 _statuses.AddTab(tabName, TabUsageType.UserDefined, Nothing)
7110 Private Sub MoveOrCopy(ByRef move As Boolean, ByRef mark As Boolean)
7113 Dim _tmp As String = String.Format(My.Resources.IDRuleMenuItem_ClickText4, Environment.NewLine)
7114 If MessageBox.Show(_tmp, My.Resources.IDRuleMenuItem_ClickText5, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
7122 Dim _tmp As String = String.Format(My.Resources.IDRuleMenuItem_ClickText6, vbCrLf)
7123 If MessageBox.Show(_tmp, My.Resources.IDRuleMenuItem_ClickText7, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
7130 Private Sub CopySTOTMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CopySTOTMenuItem.Click
7134 Private Sub CopyURLMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CopyURLMenuItem.Click
7138 Private Sub SelectAllMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SelectAllMenuItem.Click, SelAllOpMenuItem.Click
7139 If StatusText.Focused Then
7141 StatusText.SelectAll()
7144 For i As Integer = 0 To _curList.VirtualListSize - 1
7145 _curList.SelectedIndices.Add(i)
7150 Private Sub MoveMiddle()
7151 Dim _item As ListViewItem
7155 If _curList.SelectedIndices.Count = 0 Then Exit Sub
7157 Dim idx As Integer = _curList.SelectedIndices(0)
7159 _item = _curList.GetItemAt(0, 25)
7160 If _item Is Nothing Then
7165 _item = _curList.GetItemAt(0, _curList.ClientSize.Height - 1)
7166 If _item Is Nothing Then
7167 idx2 = _curList.VirtualListSize - 1
7172 idx -= Math.Abs(idx1 - idx2) \ 2
7173 If idx < 0 Then idx = 0
7175 _curList.EnsureVisible(_curList.VirtualListSize - 1)
7176 _curList.EnsureVisible(idx)
7179 Private Sub OpenURLMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenURLMenuItem.Click, OpenUrlOpMenuItem.Click
7180 If PostBrowser.Document.Links.Count > 0 Then
7181 UrlDialog.ClearUrl()
7183 Dim openUrlStr As String = ""
7185 If PostBrowser.Document.Links.Count = 1 Then
7186 Dim urlStr As String = ""
7188 urlStr = IDNDecode(PostBrowser.Document.Links(0).GetAttribute("href"))
7189 Catch ex As ArgumentException
7193 If String.IsNullOrEmpty(urlStr) Then Exit Sub
7194 openUrlStr = urlEncodeMultibyteChar(urlStr)
7196 For Each linkElm As HtmlElement In PostBrowser.Document.Links
7197 Dim urlStr As String = ""
7198 Dim linkText As String = ""
7200 urlStr = IDNDecode(linkElm.GetAttribute("href"))
7201 linkText = linkElm.InnerText
7202 If Not linkText.StartsWith("http") AndAlso Not linkText.StartsWith("#") Then
7203 linkText = "@" + linkText
7205 Catch ex As ArgumentException
7209 If String.IsNullOrEmpty(urlStr) Then Continue For
7210 UrlDialog.AddUrl(New OpenUrlItem(linkText, urlEncodeMultibyteChar(urlStr)))
7213 If UrlDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
7214 openUrlStr = UrlDialog.SelectedUrl
7216 Catch ex As Exception
7219 Me.TopMost = SettingDialog.AlwaysTop
7221 If String.IsNullOrEmpty(openUrlStr) Then Exit Sub
7223 If openUrlStr.StartsWith("http://twitter.com/search?q=%23") OrElse _
7224 openUrlStr.StartsWith("https://twitter.com/search?q=%23") Then
7226 Dim urlStr As String = HttpUtility.UrlDecode(openUrlStr)
7227 Dim hash As String = urlStr.Substring(urlStr.IndexOf("#"))
7228 HashSupl.AddItem(hash)
7229 HashMgr.AddHashToHistory(hash.Trim, False)
7230 AddNewTabForSearch(hash)
7234 openUrlStr = openUrlStr.Replace("://twitter.com/search?q=#", "://twitter.com/search?q=%23")
7235 OpenUriAsync(openUrlStr)
7239 Private Sub ClearTabMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ClearTabMenuItem.Click, ClearTbMenuItem.Click
7240 If String.IsNullOrEmpty(_rclickTabName) Then Exit Sub
7241 ClearTab(_rclickTabName, True)
7244 Private Sub ClearTab(ByVal tabName As String, ByVal showWarning As Boolean)
7246 Dim tmp As String = String.Format(My.Resources.ClearTabMenuItem_ClickText1, Environment.NewLine)
7247 If MessageBox.Show(tmp, tabName + " " + My.Resources.ClearTabMenuItem_ClickText2, MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then
7252 _statuses.ClearTabIds(tabName)
7253 If ListTab.SelectedTab.Text = tabName Then
7254 _anchorPost = Nothing
7256 _itemCache = Nothing
7257 _postCache = Nothing
7258 _itemCacheIndex = -1
7262 For Each tb As TabPage In ListTab.TabPages
7263 If tb.Text = tabName Then
7265 DirectCast(tb.Tag, DetailsListView).VirtualListSize = 0
7269 If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
7271 SetMainWindowTitle()
7275 Private Sub SetMainWindowTitle()
7277 Dim ttl As New StringBuilder(256)
7278 Dim ur As Integer = 0
7279 Dim al As Integer = 0
7280 Static myVer As String = fileVersion
7281 Static followers As Long = 0
7282 If SettingDialog.DispLatestPost <> DispTitleEnum.None AndAlso _
7283 SettingDialog.DispLatestPost <> DispTitleEnum.Post AndAlso _
7284 SettingDialog.DispLatestPost <> DispTitleEnum.Ver AndAlso _
7285 SettingDialog.DispLatestPost <> DispTitleEnum.OwnStatus Then
7286 For Each key As String In _statuses.Tabs.Keys
7287 ur += _statuses.Tabs(key).UnreadCount
7288 al += _statuses.Tabs(key).AllCount
7292 If SettingDialog.DispUsername Then ttl.Append(tw.Username).Append(" - ")
7293 ttl.Append("Tween ")
7294 Select Case SettingDialog.DispLatestPost
7295 Case DispTitleEnum.Ver
7296 ttl.Append("Ver:").Append(myVer)
7297 Case DispTitleEnum.Post
7298 If _history IsNot Nothing AndAlso _history.Count > 1 Then
7299 ttl.Append(_history(_history.Count - 2).status.Replace(vbCrLf, ""))
7301 Case DispTitleEnum.UnreadRepCount
7302 ttl.AppendFormat(My.Resources.SetMainWindowTitleText1, _statuses.GetTabByType(TabUsageType.Mentions).UnreadCount + _statuses.GetTabByType(TabUsageType.DirectMessage).UnreadCount)
7303 Case DispTitleEnum.UnreadAllCount
7304 ttl.AppendFormat(My.Resources.SetMainWindowTitleText2, ur)
7305 Case DispTitleEnum.UnreadAllRepCount
7306 ttl.AppendFormat(My.Resources.SetMainWindowTitleText3, ur, _statuses.GetTabByType(TabUsageType.Mentions).UnreadCount + _statuses.GetTabByType(TabUsageType.DirectMessage).UnreadCount)
7307 Case DispTitleEnum.UnreadCountAllCount
7308 ttl.AppendFormat(My.Resources.SetMainWindowTitleText4, ur, al)
7309 Case DispTitleEnum.OwnStatus
7310 If followers = 0 AndAlso tw.FollowersCount > 0 Then followers = tw.FollowersCount
7311 ttl.AppendFormat(My.Resources.OwnStatusTitle, tw.StatusesCount, tw.FriendsCount, tw.FollowersCount, tw.FollowersCount - followers)
7315 Me.Text = ttl.ToString()
7316 Catch ex As AccessViolationException
7317 '原因不明。ポスト内容に依存か?たまーに発生するが再現せず。
7321 Private Function GetStatusLabelText() As String
7323 'タブ未読数/タブ発言数 全未読数/総発言数 (未読@+未読DM数)
7324 If _statuses Is Nothing Then Return ""
7325 Dim tbRep As TabClass = _statuses.GetTabByType(TabUsageType.Mentions)
7326 Dim tbDm As TabClass = _statuses.GetTabByType(TabUsageType.DirectMessage)
7327 If tbRep Is Nothing OrElse tbDm Is Nothing Then Return ""
7328 Dim urat As Integer = tbRep.UnreadCount + tbDm.UnreadCount
7329 Dim ur As Integer = 0
7330 Dim al As Integer = 0
7331 Dim tur As Integer = 0
7332 Dim tal As Integer = 0
7333 Dim slbl As StringBuilder = New StringBuilder(256)
7335 For Each key As String In _statuses.Tabs.Keys
7336 ur += _statuses.Tabs(key).UnreadCount
7337 al += _statuses.Tabs(key).AllCount
7338 If key.Equals(_curTab.Text) Then
7339 tur = _statuses.Tabs(key).UnreadCount
7340 tal = _statuses.Tabs(key).AllCount
7343 Catch ex As Exception
7348 UnreadAtCounter = urat
7350 slbl.AppendFormat(My.Resources.SetStatusLabelText1, tur, tal, ur, al, urat, _postTimestamps.Count, _favTimestamps.Count, _tlCount)
7351 If SettingDialog.TimelinePeriodInt = 0 Then
7352 slbl.Append(My.Resources.SetStatusLabelText2)
7354 slbl.Append(SettingDialog.TimelinePeriodInt.ToString() + My.Resources.SetStatusLabelText3)
7356 Return slbl.ToString()
7359 Delegate Sub SetStatusLabelApiDelegate()
7361 Private Sub SetStatusLabelApiHandler(ByVal sender As Object, ByVal e As ApiInformationChangedEventArgs)
7362 If InvokeRequired Then
7363 Invoke(New SetStatusLabelApiDelegate(AddressOf SetStatusLabelApi))
7369 Private Sub SetStatusLabelApi()
7370 Me._apiGauge.RemainCount = TwitterApiInfo.RemainCount
7371 Me._apiGauge.MaxCount = TwitterApiInfo.MaxCount
7372 Me._apiGauge.ResetTime = TwitterApiInfo.ResetTime
7375 Private Sub SetStatusLabelUrl()
7376 StatusLabelUrl.Text = GetStatusLabelText()
7379 Public Sub SetStatusLabel(ByVal text As String)
7380 StatusLabel.Text = text
7383 Private Sub SetNotifyIconText()
7384 ' タスクトレイアイコンのツールチップテキスト書き換え
7386 Static ur As New StringBuilder(64)
7387 ur.Remove(0, ur.Length)
7388 If SettingDialog.DispUsername Then
7389 ur.Append(tw.Username)
7394 ur.Append("(Debug Build)")
7396 If UnreadCounter <> -1 AndAlso UnreadAtCounter <> -1 Then
7398 ur.Append(UnreadCounter)
7400 ur.Append(UnreadAtCounter)
7403 NotifyIcon1.Text = ur.ToString()
7406 Friend Sub CheckReplyTo(ByVal StatusText As String)
7407 Dim m As MatchCollection
7409 m = Regex.Matches(StatusText, "(^|[^a-zA-Z0-9_/])(#|#)(?<hash>[a-zA-Z0-9_]+)")
7410 Dim hstr As String = ""
7411 For Each hm As Match In m
7412 If Not IsNumeric(hm.Result("${hash}")) Then
7413 If Not hstr.Contains("#" + hm.Result("${hash}") + " ") Then
7414 hstr += "#" + hm.Result("${hash}") + " "
7415 HashSupl.AddItem("#" + hm.Result("${hash}"))
7419 If Not String.IsNullOrEmpty(HashMgr.UseHash) AndAlso Not hstr.Contains(HashMgr.UseHash + " ") Then
7420 hstr += HashMgr.UseHash
7422 If Not String.IsNullOrEmpty(hstr) Then HashMgr.AddHashToHistory(hstr.Trim, False)
7424 ' 本当にリプライ先指定すべきかどうかの判定
7425 m = Regex.Matches(StatusText, "(^|[ -/:-@[-^`{-~])(?<id>@[a-zA-Z0-9_]+)")
7427 If SettingDialog.UseAtIdSupplement Then
7428 Dim bCnt As Integer = AtIdSupl.ItemCount
7429 For Each mid As Match In m
7430 AtIdSupl.AddItem(mid.Result("${id}"))
7432 If bCnt <> AtIdSupl.ItemCount Then _modifySettingAtId = True
7435 ' リプライ先ステータスIDの指定がない場合は指定しない
7436 If _reply_to_id = 0 Then Exit Sub
7438 ' リプライ先ユーザー名がない場合も指定しない
7439 If String.IsNullOrEmpty(_reply_to_name) Then
7445 ' 次の条件を満たす場合に in_reply_to_status_id 指定
7446 ' 1. Twitterによりリンクと判定される @idが文中に1つ含まれる (2009/5/28 リンク化される@IDのみカウントするように修正)
7447 ' 2. リプライ先ステータスIDが設定されている(リストをダブルクリックで返信している)
7448 ' 3. 文中に含まれた@idがリプライ先のポスト者のIDと一致する
7450 If m IsNot Nothing Then
7451 If StatusText.StartsWith("@") Then
7452 If StatusText.StartsWith("@" + _reply_to_name) Then Exit Sub
7454 For Each mid As Match In m
7455 If StatusText.Contains("QT " + mid.Result("${id}") + ":") AndAlso mid.Result("${id}") = "@" + _reply_to_name Then Exit Sub
7465 Private Sub TweenMain_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize
7466 If Not _initialLayout AndAlso SettingDialog.MinimizeToTray AndAlso WindowState = FormWindowState.Minimized Then
7469 If _initialLayout AndAlso _cfgLocal IsNot Nothing AndAlso Me.WindowState = FormWindowState.Normal AndAlso Me.Visible Then
7470 Me.ClientSize = _cfgLocal.FormSize
7471 '_mySize = Me.ClientSize 'サイズ保持(最小化・最大化されたまま終了した場合の対応用)
7472 Me.DesktopLocation = _cfgLocal.FormLocation
7473 '_myLoc = Me.DesktopLocation '位置保持(最小化・最大化されたまま終了した場合の対応用)
7474 If _cfgLocal.SplitterDistance > Me.SplitContainer1.Panel1MinSize AndAlso _cfgLocal.SplitterDistance < Me.SplitContainer1.Height - Me.SplitContainer1.Panel2MinSize - Me.SplitContainer1.SplitterWidth Then
7475 Me.SplitContainer1.SplitterDistance = _cfgLocal.SplitterDistance 'Splitterの位置設定
7478 StatusText.Multiline = _cfgLocal.StatusMultiline
7479 If StatusText.Multiline Then
7480 Dim dis As Integer = SplitContainer2.Height - _cfgLocal.StatusTextHeight - SplitContainer2.SplitterWidth
7481 If dis > SplitContainer2.Panel1MinSize AndAlso dis < SplitContainer2.Height - SplitContainer2.Panel2MinSize - SplitContainer2.SplitterWidth Then
7482 SplitContainer2.SplitterDistance = SplitContainer2.Height - _cfgLocal.StatusTextHeight - SplitContainer2.SplitterWidth
7484 StatusText.Height = _cfgLocal.StatusTextHeight
7486 If SplitContainer2.Height - SplitContainer2.Panel2MinSize - SplitContainer2.SplitterWidth > 0 Then
7487 SplitContainer2.SplitterDistance = SplitContainer2.Height - SplitContainer2.Panel2MinSize - SplitContainer2.SplitterWidth
7490 If _cfgLocal.PreviewDistance > Me.SplitContainer3.Panel1MinSize AndAlso _cfgLocal.PreviewDistance < Me.SplitContainer3.Width - Me.SplitContainer3.Panel2MinSize - Me.SplitContainer3.SplitterWidth Then
7491 Me.SplitContainer3.SplitterDistance = _cfgLocal.PreviewDistance
7493 _initialLayout = False
7497 Private Sub PlaySoundMenuItem_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PlaySoundMenuItem.CheckedChanged, PlaySoundFileMenuItem.CheckStateChanged
7498 PlaySoundMenuItem.Checked = DirectCast(sender, ToolStripMenuItem).Checked
7499 Me.PlaySoundFileMenuItem.Checked = PlaySoundMenuItem.Checked
7500 If PlaySoundMenuItem.Checked Then
7501 SettingDialog.PlaySound = True
7503 SettingDialog.PlaySound = False
7505 _modifySettingCommon = True
7508 Private Sub SplitContainer1_SplitterMoved(ByVal sender As Object, ByVal e As System.Windows.Forms.SplitterEventArgs) Handles SplitContainer1.SplitterMoved
7509 If Me.WindowState = FormWindowState.Normal AndAlso Not _initialLayout Then
7510 _mySpDis = SplitContainer1.SplitterDistance
7511 If StatusText.Multiline Then _mySpDis2 = StatusText.Height
7512 _modifySettingLocal = True
7516 Private Sub doRepliedStatusOpen()
7517 If _curPost IsNot Nothing AndAlso _curPost.InReplyToUser IsNot Nothing AndAlso _curPost.InReplyToId > 0 Then
7518 If My.Computer.Keyboard.ShiftKeyDown Then
7519 OpenUriAsync("http://twitter.com/" + _curPost.InReplyToUser + "/status/" + _curPost.InReplyToId.ToString())
7522 If _statuses.ContainsKey(_curPost.InReplyToId) Then
7523 Dim repPost As PostClass = _statuses.Item(_curPost.InReplyToId)
7524 MessageBox.Show(repPost.Name + " / " + repPost.Nickname + " (" + repPost.PDate.ToString() + ")" + Environment.NewLine + repPost.Data)
7526 For Each tb As TabClass In _statuses.GetTabsByType(TabUsageType.Lists Or TabUsageType.PublicSearch)
7527 If tb Is Nothing OrElse Not tb.Contains(_curPost.InReplyToId) Then Exit For
7528 Dim repPost As PostClass = _statuses.Item(_curPost.InReplyToId)
7529 MessageBox.Show(repPost.Name + " / " + repPost.Nickname + " (" + repPost.PDate.ToString() + ")" + Environment.NewLine + repPost.Data)
7532 OpenUriAsync("http://twitter.com/" + _curPost.InReplyToUser + "/status/" + _curPost.InReplyToId.ToString())
7537 Private Sub RepliedStatusOpenMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RepliedStatusOpenMenuItem.Click, OpenRepSourceOpMenuItem.Click
7538 doRepliedStatusOpen()
7541 Private Sub ContextMenuUserPicture_Opening(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ContextMenuUserPicture.Opening
7542 '発言詳細のアイコン右クリック時のメニュー制御
7543 If _curList.SelectedIndices.Count > 0 AndAlso _curPost IsNot Nothing Then
7544 Dim name As String = _curPost.ImageUrl
7545 If name IsNot Nothing AndAlso name.Length > 0 Then
7546 Dim idx As Integer = name.LastIndexOf("/"c)
7548 name = IO.Path.GetFileName(name.Substring(idx))
7549 If name.Contains("_normal.") Then
7550 name = name.Replace("_normal", "")
7551 Me.IconNameToolStripMenuItem.Text = name
7552 Me.IconNameToolStripMenuItem.Enabled = True
7554 Me.IconNameToolStripMenuItem.Enabled = False
7555 Me.IconNameToolStripMenuItem.Text = My.Resources.ContextMenuStrip3_OpeningText1
7558 Me.IconNameToolStripMenuItem.Enabled = False
7559 Me.IconNameToolStripMenuItem.Text = My.Resources.ContextMenuStrip3_OpeningText1
7561 If Me.TIconDic.ContainsKey(_curPost.ImageUrl) AndAlso Me.TIconDic(_curPost.ImageUrl) IsNot Nothing Then
7562 Me.SaveIconPictureToolStripMenuItem.Enabled = True
7564 Me.SaveIconPictureToolStripMenuItem.Enabled = False
7567 Me.IconNameToolStripMenuItem.Enabled = False
7568 Me.SaveIconPictureToolStripMenuItem.Enabled = False
7569 Me.IconNameToolStripMenuItem.Text = My.Resources.ContextMenuStrip3_OpeningText1
7572 Me.IconNameToolStripMenuItem.Enabled = False
7573 Me.SaveIconPictureToolStripMenuItem.Enabled = False
7574 Me.IconNameToolStripMenuItem.Text = My.Resources.ContextMenuStrip3_OpeningText2
7576 If NameLabel.Tag IsNot Nothing Then
7577 Dim id As String = DirectCast(NameLabel.Tag, String)
7578 If id = tw.Username Then
7579 FollowToolStripMenuItem.Enabled = False
7580 UnFollowToolStripMenuItem.Enabled = False
7581 ShowFriendShipToolStripMenuItem.Enabled = False
7582 ShowUserStatusToolStripMenuItem.Enabled = True
7583 SearchPostsDetailNameToolStripMenuItem.Enabled = True
7584 SearchAtPostsDetailNameToolStripMenuItem.Enabled = False
7585 ListManageUserContextToolStripMenuItem3.Enabled = True
7587 FollowToolStripMenuItem.Enabled = True
7588 UnFollowToolStripMenuItem.Enabled = True
7589 ShowFriendShipToolStripMenuItem.Enabled = True
7590 ShowUserStatusToolStripMenuItem.Enabled = True
7591 SearchPostsDetailNameToolStripMenuItem.Enabled = True
7592 SearchAtPostsDetailNameToolStripMenuItem.Enabled = True
7593 ListManageUserContextToolStripMenuItem3.Enabled = True
7596 FollowToolStripMenuItem.Enabled = False
7597 UnFollowToolStripMenuItem.Enabled = False
7598 ShowFriendShipToolStripMenuItem.Enabled = False
7599 ShowUserStatusToolStripMenuItem.Enabled = False
7600 SearchPostsDetailNameToolStripMenuItem.Enabled = False
7601 SearchAtPostsDetailNameToolStripMenuItem.Enabled = False
7602 ListManageUserContextToolStripMenuItem3.Enabled = False
7606 Private Sub IconNameToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IconNameToolStripMenuItem.Click
7607 If _curPost Is Nothing Then Exit Sub
7608 Dim name As String = _curPost.ImageUrl
7609 OpenUriAsync(name.Remove(name.LastIndexOf("_normal"), 7)) ' "_normal".Length
7612 Private Sub SaveOriginalSizeIconPictureToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
7613 If _curPost Is Nothing Then Exit Sub
7614 Dim name As String = _curPost.ImageUrl
7615 name = IO.Path.GetFileNameWithoutExtension(name.Substring(name.LastIndexOf("/"c)))
7617 Me.SaveFileDialog1.FileName = name.Substring(0, name.Length - 8) ' "_normal".Length + 1
7619 If Me.SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
7624 Private Sub SaveIconPictureToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveIconPictureToolStripMenuItem.Click
7625 If _curPost Is Nothing Then Exit Sub
7626 Dim name As String = _curPost.ImageUrl
7628 Me.SaveFileDialog1.FileName = name.Substring(name.LastIndexOf("/"c) + 1)
7630 If Me.SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
7631 Using bmp2 As New Bitmap(TIconDic(name).Size.Width, TIconDic(name).Size.Height)
7632 Using g As Graphics = Graphics.FromImage(bmp2)
7633 g.InterpolationMode = Drawing2D.InterpolationMode.High
7634 g.DrawImage(TIconDic(name), 0, 0, TIconDic(name).Size.Width, TIconDic(name).Size.Height)
7637 bmp2.Save(Me.SaveFileDialog1.FileName)
7643 Private Sub SplitContainer2_Panel2_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SplitContainer2.Panel2.Resize
7644 Me.StatusText.Multiline = Me.SplitContainer2.Panel2.Height > Me.SplitContainer2.Panel2MinSize + 2
7645 MultiLineMenuItem.Checked = Me.StatusText.Multiline
7646 _modifySettingLocal = True
7649 Private Sub StatusText_MultilineChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StatusText.MultilineChanged
7650 If Me.StatusText.Multiline Then
7651 Me.StatusText.ScrollBars = ScrollBars.Vertical
7653 Me.StatusText.ScrollBars = ScrollBars.None
7655 _modifySettingLocal = True
7658 Private Sub MultiLineMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MultiLineMenuItem.Click
7660 StatusText.Multiline = MultiLineMenuItem.Checked
7661 _cfgLocal.StatusMultiline = MultiLineMenuItem.Checked
7662 If MultiLineMenuItem.Checked Then
7663 If SplitContainer2.Height - _mySpDis2 - SplitContainer2.SplitterWidth < 0 Then
7664 SplitContainer2.SplitterDistance = 0
7666 SplitContainer2.SplitterDistance = SplitContainer2.Height - _mySpDis2 - SplitContainer2.SplitterWidth
7669 SplitContainer2.SplitterDistance = SplitContainer2.Height - SplitContainer2.Panel2MinSize - SplitContainer2.SplitterWidth
7671 _modifySettingLocal = True
7674 Private Function UrlConvert(ByVal Converter_Type As UrlConverter) As Boolean
7675 'Converter_Type=Nicomsの場合は、nicovideoのみ短縮する
7676 '参考資料 RFC3986 Uniform Resource Identifier (URI): Generic Syntax
7677 'Appendix A. Collected ABNF for URI
7678 'http://www.ietf.org/rfc/rfc3986.txt
7680 Dim result As String = ""
7681 Const url As String = "(?<before>(?:[^\""':!=]|^|\:))" + _
7682 "(?<url>(?<protocol>https?://)" + _
7683 "(?<domain>(?:[\.-]|[^\p{P}\s])+\.[a-z]{2,}(?::[0-9]+)?)" + _
7684 "(?<path>/[a-z0-9!*'();:&=+$/%#\-_.,~@]*[a-z0-9)=#/]?)?" + _
7685 "(?<query>\?[a-z0-9!*'();:&=+$/%#\-_.,~@?]*[a-z0-9_&=#/])?)"
7687 Const nico As String = "^https?://[a-z]+\.(nicovideo|niconicommons|nicolive)\.jp/[a-z]+/[a-z0-9]+$"
7689 If StatusText.SelectionLength > 0 Then
7690 Dim tmp As String = StatusText.SelectedText
7691 ' httpから始まらない場合、ExcludeStringで指定された文字列で始まる場合は対象としない
7692 If tmp.StartsWith("http") Then
7693 ' 文字列が選択されている場合はその文字列について処理
7695 'nico.ms使用、nicovideoにマッチしたら変換
7696 If SettingDialog.Nicoms AndAlso Regex.IsMatch(tmp, nico) Then
7697 result = nicoms.Shorten(tmp)
7698 ElseIf Converter_Type <> UrlConverter.Nicoms Then
7699 '短縮URL変換 日本語を含むかもしれないのでURLエンコードする
7700 result = ShortUrl.Make(Converter_Type, tmp)
7701 If result.Equals("Can't convert") Then
7702 StatusLabel.Text = result.Insert(0, Converter_Type.ToString() + ":")
7709 If Not String.IsNullOrEmpty(result) Then
7710 Dim undotmp As New urlUndo
7712 StatusText.Select(StatusText.Text.IndexOf(tmp, StringComparison.Ordinal), tmp.Length)
7713 StatusText.SelectedText = result
7716 undotmp.Before = tmp
7717 undotmp.After = result
7719 If urlUndoBuffer Is Nothing Then
7720 urlUndoBuffer = New List(Of urlUndo)
7721 UrlUndoToolStripMenuItem.Enabled = True
7724 urlUndoBuffer.Add(undotmp)
7728 ' 正規表現にマッチしたURL文字列をtinyurl化
7729 For Each mt As Match In Regex.Matches(StatusText.Text, url, RegexOptions.IgnoreCase)
7730 If StatusText.Text.IndexOf(mt.Result("${url}"), StringComparison.Ordinal) = -1 Then Continue For
7731 Dim tmp As String = mt.Result("${url}")
7732 If tmp.StartsWith("w", StringComparison.OrdinalIgnoreCase) Then tmp = "http://" + tmp
7733 Dim undotmp As New urlUndo
7736 StatusText.Select(StatusText.Text.IndexOf(mt.Result("${url}"), StringComparison.Ordinal), mt.Result("${url}").Length)
7738 'nico.ms使用、nicovideoにマッチしたら変換
7739 If SettingDialog.Nicoms AndAlso Regex.IsMatch(tmp, nico) Then
7740 result = nicoms.Shorten(tmp)
7741 ElseIf Converter_Type <> UrlConverter.Nicoms Then
7742 '短縮URL変換 日本語を含むかもしれないのでURLエンコードする
7743 result = ShortUrl.Make(Converter_Type, tmp)
7744 If result.Equals("Can't convert") Then
7745 StatusLabel.Text = result.Insert(0, Converter_Type.ToString() + ":")
7752 If Not String.IsNullOrEmpty(result) Then
7753 StatusText.Select(StatusText.Text.IndexOf(mt.Result("${url}"), StringComparison.Ordinal), mt.Result("${url}").Length)
7754 StatusText.SelectedText = result
7756 undotmp.Before = mt.Result("${url}")
7757 undotmp.After = result
7759 If urlUndoBuffer Is Nothing Then
7760 urlUndoBuffer = New List(Of urlUndo)
7761 UrlUndoToolStripMenuItem.Enabled = True
7764 urlUndoBuffer.Add(undotmp)
7773 Private Sub doUrlUndo()
7774 If urlUndoBuffer IsNot Nothing Then
7775 Dim tmp As String = StatusText.Text
7776 For Each data As urlUndo In urlUndoBuffer
7777 tmp = tmp.Replace(data.After, data.Before)
7779 StatusText.Text = tmp
7780 urlUndoBuffer = Nothing
7781 UrlUndoToolStripMenuItem.Enabled = False
7785 Private Sub TinyURLToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TinyURLToolStripMenuItem.Click
7786 UrlConvert(UrlConverter.TinyUrl)
7789 Private Sub IsgdToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IsgdToolStripMenuItem.Click
7790 UrlConvert(UrlConverter.Isgd)
7793 Private Sub TwurlnlToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TwurlnlToolStripMenuItem.Click
7794 UrlConvert(UrlConverter.Twurl)
7797 Private Sub UrlConvertAutoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UrlConvertAutoToolStripMenuItem.Click
7798 If Not UrlConvert(SettingDialog.AutoShortUrlFirst) Then
7799 Dim svc As UrlConverter = SettingDialog.AutoShortUrlFirst
7800 Dim rnd As New Random()
7801 ' 前回使用した短縮URLサービス以外を選択する
7803 svc = CType(rnd.Next(System.Enum.GetNames(GetType(UrlConverter)).Length), UrlConverter)
7804 Loop Until svc <> SettingDialog.AutoShortUrlFirst
7809 Private Sub UrlUndoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UrlUndoToolStripMenuItem.Click
7813 Private Sub NewPostPopMenuItem_CheckStateChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles NewPostPopMenuItem.CheckStateChanged, NotifyFileMenuItem.CheckStateChanged
7814 Me.NotifyFileMenuItem.Checked = DirectCast(sender, ToolStripMenuItem).Checked
7815 Me.NewPostPopMenuItem.Checked = Me.NotifyFileMenuItem.Checked
7816 _cfgCommon.NewAllPop = NewPostPopMenuItem.Checked
7817 _modifySettingCommon = True
7820 Private Sub ListLockMenuItem_CheckStateChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListLockMenuItem.CheckStateChanged, LockListFileMenuItem.CheckStateChanged
7821 ListLockMenuItem.Checked = DirectCast(sender, ToolStripMenuItem).Checked
7822 Me.LockListFileMenuItem.Checked = ListLockMenuItem.Checked
7823 _cfgCommon.ListLock = ListLockMenuItem.Checked
7824 _modifySettingCommon = True
7827 Private Sub MenuStrip1_MenuActivate(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuActivate
7828 ' フォーカスがメニューに移る (MenuStrip1.Tag フラグを立てる)
7829 MenuStrip1.Tag = New Object()
7830 MenuStrip1.Select() ' StatusText がフォーカスを持っている場合 Leave が発生
7833 Private Sub MenuStrip1_MenuDeactivate(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuDeactivate
7834 If Me.Tag IsNot Nothing Then ' 設定された戻り先へ遷移
7835 If Me.Tag Is Me.ListTab.SelectedTab Then
7836 DirectCast(Me.ListTab.SelectedTab.Tag, Control).Select()
7838 DirectCast(Me.Tag, Control).Select()
7840 Else ' 戻り先が指定されていない (初期状態) 場合はタブに遷移
7841 If ListTab.SelectedIndex > -1 AndAlso ListTab.SelectedTab.HasChildren Then
7842 Me.Tag = ListTab.SelectedTab.Tag
7843 DirectCast(Me.Tag, Control).Select()
7846 ' フォーカスがメニューに遷移したかどうかを表すフラグを降ろす
7847 MenuStrip1.Tag = Nothing
7850 Private Sub MyList_ColumnReordered(ByVal sender As System.Object, ByVal e As ColumnReorderedEventArgs)
7851 Dim lst As DetailsListView = DirectCast(sender, DetailsListView)
7852 If _cfgLocal Is Nothing Then Exit Sub
7855 _cfgLocal.Width1 = lst.Columns(0).Width
7856 _cfgLocal.Width3 = lst.Columns(1).Width
7858 Dim darr(lst.Columns.Count - 1) As Integer
7859 For i As Integer = 0 To lst.Columns.Count - 1
7860 darr(lst.Columns(i).DisplayIndex) = i
7862 MoveArrayItem(darr, e.OldDisplayIndex, e.NewDisplayIndex)
7864 For i As Integer = 0 To lst.Columns.Count - 1
7867 _cfgLocal.DisplayIndex1 = i
7869 _cfgLocal.DisplayIndex2 = i
7871 _cfgLocal.DisplayIndex3 = i
7873 _cfgLocal.DisplayIndex4 = i
7875 _cfgLocal.DisplayIndex5 = i
7877 _cfgLocal.DisplayIndex6 = i
7879 _cfgLocal.DisplayIndex7 = i
7881 _cfgLocal.DisplayIndex8 = i
7884 _cfgLocal.Width1 = lst.Columns(0).Width
7885 _cfgLocal.Width2 = lst.Columns(1).Width
7886 _cfgLocal.Width3 = lst.Columns(2).Width
7887 _cfgLocal.Width4 = lst.Columns(3).Width
7888 _cfgLocal.Width5 = lst.Columns(4).Width
7889 _cfgLocal.Width6 = lst.Columns(5).Width
7890 _cfgLocal.Width7 = lst.Columns(6).Width
7891 _cfgLocal.Width8 = lst.Columns(7).Width
7893 _modifySettingLocal = True
7894 _isColumnChanged = True
7897 Private Sub MyList_ColumnWidthChanged(ByVal sender As System.Object, ByVal e As ColumnWidthChangedEventArgs)
7898 Dim lst As DetailsListView = DirectCast(sender, DetailsListView)
7899 If _cfgLocal Is Nothing Then Exit Sub
7901 If _cfgLocal.Width1 <> lst.Columns(0).Width Then
7902 _cfgLocal.Width1 = lst.Columns(0).Width
7903 _modifySettingLocal = True
7904 _isColumnChanged = True
7906 If _cfgLocal.Width3 <> lst.Columns(1).Width Then
7907 _cfgLocal.Width3 = lst.Columns(1).Width
7908 _modifySettingLocal = True
7909 _isColumnChanged = True
7912 If _cfgLocal.Width1 <> lst.Columns(0).Width Then
7913 _cfgLocal.Width1 = lst.Columns(0).Width
7914 _modifySettingLocal = True
7915 _isColumnChanged = True
7917 If _cfgLocal.Width2 <> lst.Columns(1).Width Then
7918 _cfgLocal.Width2 = lst.Columns(1).Width
7919 _modifySettingLocal = True
7920 _isColumnChanged = True
7922 If _cfgLocal.Width3 <> lst.Columns(2).Width Then
7923 _cfgLocal.Width3 = lst.Columns(2).Width
7924 _modifySettingLocal = True
7925 _isColumnChanged = True
7927 If _cfgLocal.Width4 <> lst.Columns(3).Width Then
7928 _cfgLocal.Width4 = lst.Columns(3).Width
7929 _modifySettingLocal = True
7930 _isColumnChanged = True
7932 If _cfgLocal.Width5 <> lst.Columns(4).Width Then
7933 _cfgLocal.Width5 = lst.Columns(4).Width
7934 _modifySettingLocal = True
7935 _isColumnChanged = True
7937 If _cfgLocal.Width6 <> lst.Columns(5).Width Then
7938 _cfgLocal.Width6 = lst.Columns(5).Width
7939 _modifySettingLocal = True
7940 _isColumnChanged = True
7942 If _cfgLocal.Width7 <> lst.Columns(6).Width Then
7943 _cfgLocal.Width7 = lst.Columns(6).Width
7944 _modifySettingLocal = True
7945 _isColumnChanged = True
7947 If _cfgLocal.Width8 <> lst.Columns(7).Width Then
7948 _cfgLocal.Width8 = lst.Columns(7).Width
7949 _modifySettingLocal = True
7950 _isColumnChanged = True
7953 ' 非表示の時にColumnChangedが呼ばれた場合はForm初期化処理中なので保存しない
7955 ' SaveConfigsLocal()
7959 Public Function WebBrowser_GetSelectionText(ByRef ComponentInstance As WebBrowser) As String
7960 '発言詳細で「選択文字列をコピー」を行う
7961 'WebBrowserコンポーネントのインスタンスを渡す
7962 Dim typ As Type = ComponentInstance.ActiveXInstance.GetType()
7963 Dim _SelObj As Object = typ.InvokeMember("selection", BindingFlags.GetProperty, Nothing, ComponentInstance.Document.DomDocument, Nothing)
7964 Dim _objRange As Object = _SelObj.GetType().InvokeMember("createRange", BindingFlags.InvokeMethod, Nothing, _SelObj, Nothing)
7965 Return DirectCast(_objRange.GetType().InvokeMember("text", BindingFlags.GetProperty, Nothing, _objRange, Nothing), String)
7968 Private Sub SelectionCopyContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SelectionCopyContextMenuItem.Click
7970 Dim _selText As String = WebBrowser_GetSelectionText(PostBrowser)
7972 Clipboard.SetDataObject(_selText, False, 5, 100)
7973 Catch ex As Exception
7974 MessageBox.Show(ex.Message)
7978 Private Sub doSearchToolStrip(ByVal url As String)
7979 '発言詳細で「選択文字列で検索」(選択文字列取得)
7980 Dim _selText As String = WebBrowser_GetSelectionText(PostBrowser)
7982 If _selText IsNot Nothing Then
7983 If url = My.Resources.SearchItem4Url Then
7985 AddNewTabForSearch(_selText)
7989 Dim tmp As String = String.Format(url, HttpUtility.UrlEncode(_selText))
7994 Private Sub SelectionAllContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SelectionAllContextMenuItem.Click
7996 PostBrowser.Document.ExecCommand("SelectAll", False, Nothing)
7999 Private Sub SearchWikipediaContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchWikipediaContextMenuItem.Click
8000 doSearchToolStrip(My.Resources.SearchItem1Url)
8003 Private Sub SearchGoogleContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchGoogleContextMenuItem.Click
8004 doSearchToolStrip(My.Resources.SearchItem2Url)
8007 Private Sub SearchYatsContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchYatsContextMenuItem.Click
8008 doSearchToolStrip(My.Resources.SearchItem3Url)
8011 Private Sub SearchPublicSearchContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchPublicSearchContextMenuItem.Click
8012 doSearchToolStrip(My.Resources.SearchItem4Url)
8015 Private Sub UrlCopyContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UrlCopyContextMenuItem.Click
8017 Clipboard.SetDataObject(Me._postBrowserStatusText, False, 5, 100)
8018 Catch ex As Exception
8019 MessageBox.Show(ex.Message)
8023 Private Sub ContextMenuPostBrowser_Opening(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ContextMenuPostBrowser.Opening
8025 If PostBrowser.StatusText.StartsWith("http") Then
8026 Me._postBrowserStatusText = PostBrowser.StatusText
8027 Dim name As String = GetUserId()
8028 UrlCopyContextMenuItem.Enabled = True
8029 If name IsNot Nothing Then
8030 FollowContextMenuItem.Enabled = True
8031 RemoveContextMenuItem.Enabled = True
8032 FriendshipContextMenuItem.Enabled = True
8033 ShowUserStatusContextMenuItem.Enabled = True
8034 SearchPostsDetailToolStripMenuItem.Enabled = True
8035 IdFilterAddMenuItem.Enabled = True
8036 ListManageUserContextToolStripMenuItem.Enabled = True
8037 SearchAtPostsDetailToolStripMenuItem.Enabled = True
8039 FollowContextMenuItem.Enabled = False
8040 RemoveContextMenuItem.Enabled = False
8041 FriendshipContextMenuItem.Enabled = False
8042 ShowUserStatusContextMenuItem.Enabled = False
8043 SearchPostsDetailToolStripMenuItem.Enabled = False
8044 IdFilterAddMenuItem.Enabled = False
8045 ListManageUserContextToolStripMenuItem.Enabled = False
8046 SearchAtPostsDetailToolStripMenuItem.Enabled = False
8049 If Regex.IsMatch(Me._postBrowserStatusText, "^https?://twitter.com/search\?q=%23") Then
8050 UseHashtagMenuItem.Enabled = True
8052 UseHashtagMenuItem.Enabled = False
8055 Me._postBrowserStatusText = ""
8056 UrlCopyContextMenuItem.Enabled = False
8057 FollowContextMenuItem.Enabled = False
8058 RemoveContextMenuItem.Enabled = False
8059 FriendshipContextMenuItem.Enabled = False
8060 ShowUserStatusContextMenuItem.Enabled = False
8061 SearchPostsDetailToolStripMenuItem.Enabled = False
8062 SearchAtPostsDetailToolStripMenuItem.Enabled = False
8063 UseHashtagMenuItem.Enabled = False
8064 IdFilterAddMenuItem.Enabled = False
8065 ListManageUserContextToolStripMenuItem.Enabled = False
8067 ' 文字列選択されていないときは選択文字列関係の項目を非表示に
8068 Dim _selText As String = WebBrowser_GetSelectionText(PostBrowser)
8069 If _selText Is Nothing Then
8070 SelectionSearchContextMenuItem.Enabled = False
8071 SelectionCopyContextMenuItem.Enabled = False
8073 SelectionSearchContextMenuItem.Enabled = True
8074 SelectionCopyContextMenuItem.Enabled = True
8076 '発言内に自分以外のユーザーが含まれてればフォロー状態全表示を有効に
8077 Dim ma As MatchCollection = Regex.Matches(Me.PostBrowser.DocumentText, "href=""https?://twitter.com/(#!/)?(?<name>[a-zA-Z0-9_]+)(/status(es)?/[0-9]+)?""")
8078 Dim fAllFlag As Boolean = False
8079 For Each mu As Match In ma
8080 If mu.Result("${name}").ToLower <> tw.Username.ToLower Then
8085 Me.FriendshipAllMenuItem.Enabled = fAllFlag
8090 Private Sub CurrentTabToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CurrentTabToolStripMenuItem.Click
8091 '発言詳細の選択文字列で現在のタブを検索
8092 Dim _selText As String = WebBrowser_GetSelectionText(PostBrowser)
8094 If _selText IsNot Nothing Then
8095 SearchDialog.SWord = _selText
8096 SearchDialog.CheckCaseSensitive = False
8097 SearchDialog.CheckRegex = False
8099 DoTabSearch(SearchDialog.SWord, _
8100 SearchDialog.CheckCaseSensitive, _
8101 SearchDialog.CheckRegex, _
8102 SEARCHTYPE.NextSearch)
8106 Private Sub SplitContainer2_SplitterMoved(ByVal sender As Object, ByVal e As System.Windows.Forms.SplitterEventArgs) Handles SplitContainer2.SplitterMoved
8107 If StatusText.Multiline Then _mySpDis2 = StatusText.Height
8108 _modifySettingLocal = True
8111 Private Sub TweenMain_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
8112 If e.Data.GetDataPresent(DataFormats.FileDrop) Then
8113 ImageSelectionPanel.Visible = True
8114 ImageSelectionPanel.Enabled = True
8115 TimelinePanel.Visible = False
8116 TimelinePanel.Enabled = False
8117 ImagefilePathText.Text = CType(e.Data.GetData(DataFormats.FileDrop, False), String())(0)
8118 ImageFromSelectedFile()
8121 ElseIf e.Data.GetDataPresent(DataFormats.StringFormat) Then
8122 Dim data As String = TryCast(e.Data.GetData(DataFormats.StringFormat, True), String)
8123 If data IsNot Nothing Then StatusText.Text += data
8127 Private Sub TweenMain_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragOver
8128 If e.Data.GetDataPresent(DataFormats.FileDrop) Then
8129 Dim filename As String = CType(e.Data.GetData(DataFormats.FileDrop, False), String())(0)
8130 Dim fl As New FileInfo(filename)
8131 Dim ext As String = fl.Extension
8132 Dim picsvc As New PictureService(tw)
8134 If picsvc.IsValidExtension(ext, ImageService) AndAlso _
8135 picsvc.GetMaxFileSize(ext, ImageService) >= fl.Length Then
8136 e.Effect = DragDropEffects.Copy
8139 For Each svc As String In ImageServiceCombo.Items
8140 If picsvc.IsValidExtension(ext, svc) AndAlso _
8141 picsvc.GetMaxFileSize(ext, svc) >= fl.Length Then
8142 ImageServiceCombo.SelectedItem = svc
8143 e.Effect = DragDropEffects.Copy
8149 e.Effect = DragDropEffects.None
8150 ElseIf e.Data.GetDataPresent(DataFormats.StringFormat) Then
8151 e.Effect = DragDropEffects.Copy
8153 e.Effect = DragDropEffects.None
8157 Public Function IsNetworkAvailable() As Boolean
8158 Dim nw As Boolean = True
8160 nw = My.Computer.Network.IsAvailable
8161 Catch ex As Exception
8164 _myStatusOnline = nw
8168 Public Sub OpenUriAsync(ByVal UriString As String)
8169 Dim args As New GetWorkerArg
8170 args.type = WORKERTYPE.OpenUri
8171 args.url = UriString
8176 Private Sub ListTabSelect(ByVal _tab As TabPage)
8179 _itemCache = Nothing
8180 _itemCacheIndex = -1
8181 _postCache = Nothing
8184 _curList = DirectCast(_tab.Tag, DetailsListView)
8185 If _curList.SelectedIndices.Count > 0 Then
8186 _curItemIndex = _curList.SelectedIndices(0)
8187 _curPost = GetCurTabPost(_curItemIndex)
8193 _anchorPost = Nothing
8197 DirectCast(_tab.Tag, DetailsListView).Columns.Item(1).Text = ColumnText(2)
8199 For i As Integer = 0 To _curList.Columns.Count - 1
8200 DirectCast(_tab.Tag, DetailsListView).Columns.Item(i).Text = ColumnText(i)
8205 Private Sub ListTab_Selecting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TabControlCancelEventArgs) Handles ListTab.Selecting
8206 ListTabSelect(e.TabPage)
8209 Private Sub SelectListItem(ByVal LView As DetailsListView, ByVal Index As Integer)
8211 Dim bnd As Rectangle
8212 Dim flg As Boolean = False
8213 If LView.FocusedItem IsNot Nothing Then
8214 bnd = LView.FocusedItem.Bounds
8218 LView.SelectedIndices.Clear()
8219 LView.Items(Index).Selected = True
8220 LView.Items(Index).Focused = True
8222 If flg Then LView.Invalidate(bnd)
8225 Private Sub SelectListItem(ByVal LView As DetailsListView, ByVal Index() As Integer, ByVal FocusedIndex As Integer)
8227 Dim bnd As Rectangle
8228 Dim flg As Boolean = False
8229 If LView.FocusedItem IsNot Nothing Then
8230 bnd = LView.FocusedItem.Bounds
8234 If Index IsNot Nothing AndAlso Index(0) > -1 Then
8235 LView.SelectedIndices.Clear()
8236 For Each idx As Integer In Index
8237 LView.SelectedIndices.Add(idx)
8240 If FocusedIndex > -1 Then
8241 LView.Items(FocusedIndex).Focused = True
8243 If flg Then LView.Invalidate(bnd)
8246 Private Sub RunAsync(ByVal args As GetWorkerArg)
8247 Dim bw As BackgroundWorker = Nothing
8248 If args.type <> WORKERTYPE.Follower Then
8249 For i As Integer = 0 To _bw.Length - 1
8250 If _bw(i) IsNot Nothing AndAlso Not _bw(i).IsBusy Then
8255 If bw Is Nothing Then
8256 For i As Integer = 0 To _bw.Length - 1
8257 If _bw(i) Is Nothing Then
8258 _bw(i) = New BackgroundWorker
8260 bw.WorkerReportsProgress = True
8261 bw.WorkerSupportsCancellation = True
8262 AddHandler bw.DoWork, AddressOf GetTimelineWorker_DoWork
8263 AddHandler bw.ProgressChanged, AddressOf GetTimelineWorker_ProgressChanged
8264 AddHandler bw.RunWorkerCompleted, AddressOf GetTimelineWorker_RunWorkerCompleted
8270 If _bwFollower Is Nothing Then
8271 _bwFollower = New BackgroundWorker
8273 bw.WorkerReportsProgress = True
8274 bw.WorkerSupportsCancellation = True
8275 AddHandler bw.DoWork, AddressOf GetTimelineWorker_DoWork
8276 AddHandler bw.ProgressChanged, AddressOf GetTimelineWorker_ProgressChanged
8277 AddHandler bw.RunWorkerCompleted, AddressOf GetTimelineWorker_RunWorkerCompleted
8279 If _bwFollower.IsBusy = False Then
8284 If bw Is Nothing Then Exit Sub
8286 bw.RunWorkerAsync(args)
8289 Private Sub TweenMain_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
8291 PostBrowser.Url = New Uri("about:blank")
8292 PostBrowser.DocumentText = "" '発言詳細部初期化
8293 Catch ex As Exception
8297 NotifyIcon1.Visible = True
8299 If IsNetworkAvailable() Then
8300 If SettingDialog.StartupFollowers Then
8301 GetTimeline(WORKERTYPE.Follower, 0, 0, "")
8303 _waitTimeline = True
8304 GetTimeline(WORKERTYPE.Timeline, 1, 1, "")
8306 GetTimeline(WORKERTYPE.Reply, 1, 1, "")
8308 GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 1, "")
8309 If SettingDialog.GetFav Then
8311 GetTimeline(WORKERTYPE.Favorites, 1, 1, "")
8313 _waitPubSearch = True
8314 GetTimeline(WORKERTYPE.PublicSearch, 1, 0, "") 'tabname="":全タブ
8316 GetTimeline(WORKERTYPE.List, 1, 0, "") 'tabname="":全タブ
8317 Dim i As Integer = 0
8318 Dim j As Integer = 0
8319 Do While (_waitTimeline OrElse _waitReply OrElse _waitDm OrElse _waitFav OrElse _waitPubSearch OrElse _waitLists) AndAlso Not _endingFlag
8320 System.Threading.Thread.Sleep(100)
8321 My.Application.DoEvents()
8324 If j > 1200 Then Exit Do ' 120秒間初期処理が終了しなかったら強制的に打ち切る
8333 If _endingFlag Then Exit Sub
8335 'バージョンチェック(引数:起動時チェックの場合はTrue・・・チェック結果のメッセージを表示しない)
8336 If SettingDialog.StartupVersion Then
8337 CheckNewVersion(True)
8341 If Not tw.GetFollowersSuccess AndAlso SettingDialog.StartupFollowers Then
8342 GetTimeline(WORKERTYPE.Follower, 0, 0, "")
8346 AddHandler tw.NewPostFromStream, AddressOf tw_NewPostFromStream
8347 AddHandler tw.UserStreamStarted, AddressOf tw_UserStreamStarted
8348 AddHandler tw.UserStreamStopped, AddressOf tw_UserStreamStopped
8349 AddHandler tw.PostDeleted, AddressOf tw_PostDeleted
8350 AddHandler tw.UserStreamEventReceived, AddressOf tw_UserStreamEventArrived
8352 MenuItemUserStream.Text = "&UserStream ■"
8353 MenuItemUserStream.Enabled = True
8354 StopToolStripMenuItem.Text = "&Start"
8355 StopToolStripMenuItem.Enabled = True
8356 If SettingDialog.UserstreamStartup Then tw.StartUserStream()
8357 TimerTimeline.Enabled = True
8360 Private Sub doGetFollowersMenu()
8361 GetTimeline(WORKERTYPE.Follower, 1, 0, "")
8365 Private Sub GetFollowersAllToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UpdateFollowersMenuItem1.Click
8366 doGetFollowersMenu()
8369 Private Sub doReTweetUnofficial()
8371 If _curPost IsNot Nothing Then
8372 If _curPost.IsDm OrElse _
8373 Not StatusText.Enabled Then Exit Sub
8375 If _curPost.IsProtect Then
8376 MessageBox.Show("Protected.")
8379 Dim rtdata As String = _curPost.OriginalData
8380 rtdata = CreateRetweetUnofficial(rtdata)
8382 StatusText.Text = "RT @" + _curPost.Name + ": " + HttpUtility.HtmlDecode(rtdata)
8384 StatusText.SelectionStart = 0
8389 Private Sub ReTweetStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReTweetStripMenuItem.Click, RtUnOpMenuItem.Click
8390 doReTweetUnofficial()
8393 Private Sub doReTweetOfficial(ByVal isConfirm As Boolean)
8395 If _curPost IsNot Nothing Then
8396 If _curPost.IsProtect Then
8397 MessageBox.Show("Protected.")
8398 _DoFavRetweetFlags = False
8401 If _curList.SelectedIndices.Count > 15 Then
8402 MessageBox.Show(My.Resources.RetweetLimitText)
8403 _DoFavRetweetFlags = False
8405 ElseIf _curList.SelectedIndices.Count > 1 Then
8406 Dim QuestionText As String = My.Resources.RetweetQuestion2
8407 If _DoFavRetweetFlags Then QuestionText = My.Resources.FavoriteRetweetQuestionText1
8408 Select Case MessageBox.Show(QuestionText, "Retweet", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)
8409 Case Windows.Forms.DialogResult.Cancel, Windows.Forms.DialogResult.No
8410 _DoFavRetweetFlags = False
8414 If _curPost.IsDm OrElse _curPost.IsMe Then
8415 _DoFavRetweetFlags = False
8418 If Not SettingDialog.RetweetNoConfirm Then
8419 Dim Questiontext As String = My.Resources.RetweetQuestion1
8420 If _DoFavRetweetFlags Then Questiontext = My.Resources.FavoritesRetweetQuestionText2
8421 If isConfirm AndAlso MessageBox.Show(Questiontext, "Retweet", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then
8422 _DoFavRetweetFlags = False
8427 Dim args As New GetWorkerArg
8428 args.ids = New List(Of Long)
8429 args.sIds = New List(Of Long)
8430 args.tName = _curTab.Text
8431 args.type = WORKERTYPE.Retweet
8432 For Each idx As Integer In _curList.SelectedIndices
8433 Dim post As PostClass = GetCurTabPost(idx)
8434 If Not post.IsMe AndAlso Not post.IsProtect AndAlso Not post.IsDm Then args.ids.Add(post.Id)
8440 Private Sub ReTweetOriginalStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReTweetOriginalStripMenuItem.Click, RtOpMenuItem.Click
8441 doReTweetOfficial(True)
8444 Private Sub FavoritesRetweetOriginal()
8445 If _curPost Is Nothing Then Exit Sub
8446 _DoFavRetweetFlags = True
8447 doReTweetOfficial(True)
8448 If _DoFavRetweetFlags Then
8449 _DoFavRetweetFlags = False
8450 FavoriteChange(True, False)
8454 Private Sub FavoritesRetweetUnofficial()
8455 If _curPost IsNot Nothing AndAlso Not _curPost.IsDm Then
8456 _DoFavRetweetFlags = True
8457 FavoriteChange(True)
8458 If Not _curPost.IsProtect AndAlso _DoFavRetweetFlags Then
8459 _DoFavRetweetFlags = False
8460 doReTweetUnofficial()
8465 Private Function CreateRetweetUnofficial(ByVal status As String) As String
8467 ' Twitterにより省略されているURLを含むaタグをキャプチャしてリンク先URLへ置き換える
8470 Dim isUrl As Boolean = False
8471 Dim ms As MatchCollection = Regex.Matches(status, "<a target=""_self"" href=""(?<url>[^""]+)""[^>]*>(?<link>(https?|shttp|ftps?)://[^<]+)</a>")
8472 For Each m As Match In ms
8473 If m.Result("${link}").EndsWith("...") Then
8479 status = Regex.Replace(status, "<a target=""_self"" href=""(?<url>[^""]+)""[^>]*>(?<link>(https?|shttp|ftps?)://[^<]+)</a>", "${url}")
8481 status = Regex.Replace(status, "<a target=""_self"" href=""(?<url>[^""]+)""[^>]*>(?<link>(https?|shttp|ftps?)://[^<]+)</a>", "${link}")
8484 'その他のリンク(@IDなど)を置き換える
8485 status = Regex.Replace(status, "@<a target=""_self"" href=""https?://twitter.com/(#!/)?(?<url>[^""]+)""[^>]*>(?<link>[^<]+)</a>", "@${url}")
8487 status = Regex.Replace(status, "<a target=""_self"" href=""(?<url>[^""]+)""[^>]*>(?<link>[^<]+)</a>", "${link}")
8489 If StatusText.Multiline Then
8490 status = Regex.Replace(status, "(\r\n|\n|\r)?<br>", vbCrLf, RegexOptions.IgnoreCase Or RegexOptions.Multiline)
8492 status = Regex.Replace(status, "(\r\n|\n|\r)?<br>", "", RegexOptions.IgnoreCase Or RegexOptions.Multiline)
8497 status = status.Replace(" ", " ")
8502 Private Sub DumpPostClassToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DumpPostClassToolStripMenuItem.Click
8503 If _curPost IsNot Nothing Then
8508 Private Sub MenuItemHelp_DropDownOpening(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuItemHelp.DropDownOpening
8509 If DebugBuild OrElse My.Computer.Keyboard.CapsLock AndAlso My.Computer.Keyboard.CtrlKeyDown AndAlso My.Computer.Keyboard.ShiftKeyDown Then
8510 DebugModeToolStripMenuItem.Visible = True
8512 DebugModeToolStripMenuItem.Visible = False
8516 Private Sub ToolStripMenuItemUrlAutoShorten_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItemUrlAutoShorten.CheckedChanged
8517 SettingDialog.UrlConvertAuto = ToolStripMenuItemUrlAutoShorten.Checked
8520 Private Sub ContextMenuPostMode_Opening(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ContextMenuPostMode.Opening
8521 ToolStripMenuItemUrlAutoShorten.Checked = SettingDialog.UrlConvertAuto
8524 Private Sub TraceOutToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TraceOutToolStripMenuItem.Click
8525 If TraceOutToolStripMenuItem.Checked Then
8532 Private Sub TweenMain_Deactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Deactivate
8533 '画面が非アクティブになったら、発言欄の背景色をデフォルトへ
8534 Me.StatusText_Leave(StatusText, System.EventArgs.Empty)
8537 Private Sub TabRenameMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabRenameMenuItem.Click, RenameTbMenuItem.Click
8538 If String.IsNullOrEmpty(_rclickTabName) Then Exit Sub
8539 TabRename(_rclickTabName)
8542 Private Sub BitlyToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BitlyToolStripMenuItem.Click
8543 UrlConvert(UrlConverter.Bitly)
8546 Private Sub JmpToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles JmpStripMenuItem.Click
8547 UrlConvert(UrlConverter.Jmp)
8551 Private Class GetApiInfoArgs
8552 Public tw As Twitter
8553 Public info As ApiInfo
8556 Private Sub GetApiInfo_Dowork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
8557 Dim args As GetApiInfoArgs = DirectCast(e.Argument, GetApiInfoArgs)
8558 e.Result = tw.GetInfoApi(args.info)
8561 Private Sub ApiInfoMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ApiInfoMenuItem.Click
8562 Dim info As New ApiInfo
8564 Dim args As New GetApiInfoArgs With {.tw = tw, .info = info}
8566 Using dlg As New FormInfo(Me, My.Resources.ApiInfo6, AddressOf GetApiInfo_Dowork, Nothing, args)
8568 If CBool(dlg.Result) Then
8569 tmp = My.Resources.ApiInfo1 + args.info.MaxCount.ToString() + Environment.NewLine + _
8570 My.Resources.ApiInfo2 + args.info.RemainCount.ToString + Environment.NewLine + _
8571 My.Resources.ApiInfo3 + args.info.ResetTime.ToString()
8574 tmp = My.Resources.ApiInfo5
8578 MessageBox.Show(tmp, My.Resources.ApiInfo4, MessageBoxButtons.OK, MessageBoxIcon.Information)
8581 Private Sub FollowCommandMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FollowCommandMenuItem.Click
8582 Dim id As String = ""
8583 If _curPost IsNot Nothing Then id = _curPost.Name
8587 Private Sub FollowCommand_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
8588 Dim arg As FollowRemoveCommandArgs = DirectCast(e.Argument, FollowRemoveCommandArgs)
8589 e.Result = arg.tw.PostFollowCommand(arg.id)
8592 Private Sub FollowCommand(ByVal id As String)
8593 Using inputName As New InputTabName()
8594 inputName.FormTitle = "Follow"
8595 inputName.FormDescription = My.Resources.FRMessage1
8596 inputName.TabName = id
8597 If inputName.ShowDialog() = Windows.Forms.DialogResult.OK AndAlso _
8598 Not String.IsNullOrEmpty(inputName.TabName.Trim()) Then
8599 Dim arg As New FollowRemoveCommandArgs
8601 arg.id = inputName.TabName.Trim()
8602 Using _info As New FormInfo(Me, My.Resources.FollowCommandText1, _
8603 AddressOf FollowCommand_DoWork, _
8607 Dim ret As String = DirectCast(_info.Result, String)
8608 If Not String.IsNullOrEmpty(ret) Then
8609 MessageBox.Show(My.Resources.FRMessage2 + ret)
8611 MessageBox.Show(My.Resources.FRMessage3)
8618 Private Sub RemoveCommandMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RemoveCommandMenuItem.Click
8619 Dim id As String = ""
8620 If _curPost IsNot Nothing Then id = _curPost.Name
8621 RemoveCommand(id, False)
8624 Private Class FollowRemoveCommandArgs
8625 Public tw As Tween.Twitter
8629 Private Sub RemoveCommand_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
8630 Dim arg As FollowRemoveCommandArgs = DirectCast(e.Argument, FollowRemoveCommandArgs)
8631 e.Result = arg.tw.PostRemoveCommand(arg.id)
8634 Private Sub RemoveCommand(ByVal id As String, ByVal skipInput As Boolean)
8635 Dim arg As New FollowRemoveCommandArgs
8638 If Not skipInput Then
8639 Using inputName As New InputTabName()
8640 inputName.FormTitle = "Unfollow"
8641 inputName.FormDescription = My.Resources.FRMessage1
8642 inputName.TabName = id
8643 If inputName.ShowDialog() = Windows.Forms.DialogResult.OK AndAlso _
8644 Not String.IsNullOrEmpty(inputName.TabName.Trim()) Then
8646 arg.id = inputName.TabName.Trim()
8653 Using _info As New FormInfo(Me, My.Resources.RemoveCommandText1, _
8654 AddressOf RemoveCommand_DoWork, _
8658 Dim ret As String = DirectCast(_info.Result, String)
8659 If Not String.IsNullOrEmpty(ret) Then
8660 MessageBox.Show(My.Resources.FRMessage2 + ret)
8662 MessageBox.Show(My.Resources.FRMessage3)
8667 Private Sub FriendshipMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FriendshipMenuItem.Click
8668 Dim id As String = ""
8669 If _curPost IsNot Nothing Then
8675 Private Class ShowFriendshipArgs
8676 Public tw As Tween.Twitter
8677 Public Class FriendshipInfo
8678 Public id As String = ""
8679 Public isFollowing As Boolean = False
8680 Public isFollowed As Boolean = False
8681 Public isError As Boolean = False
8682 Public Sub New(ByVal id As String)
8686 Public ids As New List(Of FriendshipInfo)
8689 Private Sub ShowFriendship_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
8690 Dim arg As ShowFriendshipArgs = DirectCast(e.Argument, ShowFriendshipArgs)
8691 Dim result As String = ""
8692 For Each fInfo As ShowFriendshipArgs.FriendshipInfo In arg.ids
8693 Dim rt As String = arg.tw.GetFriendshipInfo(fInfo.id, fInfo.isFollowing, fInfo.isFollowed)
8694 If Not String.IsNullOrEmpty(rt) Then
8695 If String.IsNullOrEmpty(result) Then result = rt
8696 fInfo.isError = True
8702 Private Sub ShowFriendship(ByVal id As String)
8703 Dim args As New ShowFriendshipArgs
8705 Using inputName As New InputTabName()
8706 inputName.FormTitle = "Show Friendships"
8707 inputName.FormDescription = My.Resources.FRMessage1
8708 inputName.TabName = id
8709 If inputName.ShowDialog() = Windows.Forms.DialogResult.OK AndAlso _
8710 Not String.IsNullOrEmpty(inputName.TabName.Trim()) Then
8711 Dim ret As String = ""
8712 args.ids.Add(New ShowFriendshipArgs.FriendshipInfo(inputName.TabName.Trim))
8713 Using _info As New FormInfo(Me, My.Resources.ShowFriendshipText1, _
8714 AddressOf ShowFriendship_DoWork, _
8718 ret = DirectCast(_info.Result, String)
8720 Dim result As String = ""
8721 If String.IsNullOrEmpty(ret) Then
8722 If args.ids(0).isFollowing Then
8723 result = My.Resources.GetFriendshipInfo1 + System.Environment.NewLine
8725 result = My.Resources.GetFriendshipInfo2 + System.Environment.NewLine
8727 If args.ids(0).isFollowed Then
8728 result += My.Resources.GetFriendshipInfo3
8730 result += My.Resources.GetFriendshipInfo4
8732 result = args.ids(0).id + My.Resources.GetFriendshipInfo5 + System.Environment.NewLine + result
8736 MessageBox.Show(result)
8741 Private Sub ShowFriendship(ByVal ids() As String)
8742 For Each id As String In ids
8743 Dim ret As String = ""
8744 Dim args As New ShowFriendshipArgs
8746 args.ids.Add(New ShowFriendshipArgs.FriendshipInfo(id.Trim))
8747 Using _info As New FormInfo(Me, My.Resources.ShowFriendshipText1, _
8748 AddressOf ShowFriendship_DoWork, _
8752 ret = DirectCast(_info.Result, String)
8754 Dim result As String = ""
8755 Dim fInfo As ShowFriendshipArgs.FriendshipInfo = args.ids(0)
8756 Dim ff As String = ""
8757 If String.IsNullOrEmpty(ret) Then
8759 If fInfo.isFollowing Then
8760 ff += My.Resources.GetFriendshipInfo1
8762 ff += My.Resources.GetFriendshipInfo2
8764 ff += System.Environment.NewLine + " "
8765 If fInfo.isFollowed Then
8766 ff += My.Resources.GetFriendshipInfo3
8768 ff += My.Resources.GetFriendshipInfo4
8770 result += fInfo.id + My.Resources.GetFriendshipInfo5 + System.Environment.NewLine + ff
8771 If fInfo.isFollowing Then
8772 If MessageBox.Show( _
8773 My.Resources.GetFriendshipInfo7 + System.Environment.NewLine + result, My.Resources.GetFriendshipInfo8, _
8774 MessageBoxButtons.YesNo, _
8775 MessageBoxIcon.Question, _
8776 MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then
8777 RemoveCommand(fInfo.id, True)
8780 MessageBox.Show(result)
8783 MessageBox.Show(ret)
8788 Private Sub OwnStatusMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OwnStatusMenuItem.Click
8789 doShowUserStatus(tw.Username, False)
8790 'If Not String.IsNullOrEmpty(tw.UserInfoXml) Then
8791 ' doShowUserStatus(tw.Username, False)
8793 ' MessageBox.Show(My.Resources.ShowYourProfileText1, "Your status", MessageBoxButtons.OK, MessageBoxIcon.Information)
8798 ' TwitterIDでない固定文字列を調べる(文字列検証のみ 実際に取得はしない)
8801 Private Function IsTwitterId(ByVal name As String) As Boolean
8802 Return Not Regex.Match(name, "^(about|jobs|tos|privacy)$").Success
8805 Private Function GetUserId() As String
8806 Dim m As Match = Regex.Match(Me._postBrowserStatusText, "^https?://twitter.com/(#!/)?(?<name>[a-zA-Z0-9_]+)(/status(es)?/[0-9]+)?$")
8807 If m.Success AndAlso IsTwitterId(m.Result("${name}")) Then
8808 Return m.Result("${name}")
8814 Private Sub FollowContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FollowContextMenuItem.Click
8815 Dim name As String = GetUserId()
8816 If name IsNot Nothing Then FollowCommand(name)
8819 Private Sub RemoveContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RemoveContextMenuItem.Click
8820 Dim name As String = GetUserId()
8821 If name IsNot Nothing Then RemoveCommand(name, False)
8824 Private Sub FriendshipContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FriendshipContextMenuItem.Click
8825 Dim name As String = GetUserId()
8826 If name IsNot Nothing Then ShowFriendship(name)
8829 Private Sub FriendshipAllMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FriendshipAllMenuItem.Click
8830 Dim ma As MatchCollection = Regex.Matches(Me.PostBrowser.DocumentText, "href=""https?://twitter.com/(#!/)?(?<name>[a-zA-Z0-9_]+)(/status(es)?/[0-9]+)?""")
8831 Dim ids As New List(Of String)
8832 For Each mu As Match In ma
8833 If mu.Result("${name}").ToLower <> tw.Username.ToLower Then
8834 ids.Add(mu.Result("${name}"))
8837 ShowFriendship(ids.ToArray)
8840 Private Sub ShowUserStatusContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShowUserStatusContextMenuItem.Click
8841 Dim name As String = GetUserId()
8842 If name IsNot Nothing Then ShowUserStatus(name)
8845 Private Sub SearchPostsDetailToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchPostsDetailToolStripMenuItem.Click
8846 Dim name As String = GetUserId()
8847 If name IsNot Nothing Then AddNewTabForSearch("from:" + name)
8850 Private Sub SearchAtPostsDetailToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchAtPostsDetailToolStripMenuItem.Click
8851 Dim name As String = GetUserId()
8852 If name IsNot Nothing Then AddNewTabForSearch("@" + name)
8855 Private Sub IdeographicSpaceToSpaceToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IdeographicSpaceToSpaceToolStripMenuItem.Click
8856 _modifySettingCommon = True
8859 Private Sub ToolStripFocusLockMenuItem_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripFocusLockMenuItem.Click
8860 _modifySettingCommon = True
8863 Private Sub doQuote()
8866 If _curPost IsNot Nothing Then
8867 If _curPost.IsDm OrElse _
8868 Not StatusText.Enabled Then Exit Sub
8870 If _curPost.IsProtect Then
8871 MessageBox.Show("Protected.")
8874 Dim rtdata As String = _curPost.OriginalData
8875 rtdata = CreateRetweetUnofficial(rtdata)
8877 StatusText.Text = " QT @" + _curPost.Name + ": " + HttpUtility.HtmlDecode(rtdata)
8878 If _curPost.RetweetedId = 0 Then
8879 _reply_to_id = _curPost.Id
8881 _reply_to_id = _curPost.RetweetedId
8883 _reply_to_name = _curPost.Name
8885 StatusText.SelectionStart = 0
8890 Private Sub QuoteStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles QuoteStripMenuItem.Click, QtOpMenuItem.Click
8894 Private Sub SearchButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
8896 Dim pnl As Control = DirectCast(sender, Control).Parent
8897 If pnl Is Nothing Then Exit Sub
8898 Dim tbName As String = pnl.Parent.Text
8899 Dim tb As TabClass = _statuses.Tabs(tbName)
8900 Dim cmb As ComboBox = DirectCast(pnl.Controls("comboSearch"), ComboBox)
8901 Dim cmbLang As ComboBox = DirectCast(pnl.Controls("comboLang"), ComboBox)
8902 cmb.Text = cmb.Text.Trim
8903 ' 検索式演算子 OR についてのみ大文字しか認識しないので強制的に大文字とする
8904 Dim Quote As Boolean = False
8905 Dim buf As New StringBuilder()
8906 Dim c As Char() = cmb.Text.ToCharArray()
8907 For cnt As Integer = 0 To cmb.Text.Length - 1
8908 If cnt > cmb.Text.Length - 4 Then
8909 buf.Append(cmb.Text.Substring(cnt))
8912 If c(cnt) = CChar("""") Then
8915 If Not Quote AndAlso cmb.Text.Substring(cnt, 4).Equals(" or ", StringComparison.OrdinalIgnoreCase) Then
8923 cmb.Text = buf.ToString()
8925 tb.SearchWords = cmb.Text
8926 tb.SearchLang = cmbLang.Text
8927 If cmb.Text = "" Then
8928 DirectCast(ListTab.SelectedTab.Tag, DetailsListView).Focus()
8932 If tb.IsQueryChanged Then
8933 Dim idx As Integer = DirectCast(pnl.Controls("comboSearch"), ComboBox).Items.IndexOf(tb.SearchWords)
8934 If idx > -1 Then DirectCast(pnl.Controls("comboSearch"), ComboBox).Items.RemoveAt(idx)
8935 DirectCast(pnl.Controls("comboSearch"), ComboBox).Items.Insert(0, tb.SearchWords)
8936 cmb.Text = tb.SearchWords
8938 Dim lst As DetailsListView = DirectCast(pnl.Parent.Tag, DetailsListView)
8939 lst.VirtualListSize = 0
8941 _statuses.ClearTabIds(tbName)
8942 SaveConfigsTabs() '検索条件の保存
8945 GetTimeline(WORKERTYPE.PublicSearch, 1, 0, tbName)
8946 DirectCast(ListTab.SelectedTab.Tag, DetailsListView).Focus()
8949 Private Sub RefreshMoreStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RefreshMoreStripMenuItem.Click, RefreshPrevOpMenuItem.Click
8954 Private Sub UndoRemoveTabMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UndoRemoveTabMenuItem.Click
8955 If _statuses.RemovedTab Is Nothing Then
8956 MessageBox.Show("There isn't removed tab.", "Undo", MessageBoxButtons.OK, MessageBoxIcon.Information)
8959 Dim tb As TabClass = _statuses.RemovedTab
8960 _statuses.RemovedTab = Nothing
8961 Dim renamed As String = tb.TabName
8962 For i As Integer = 1 To Integer.MaxValue
8963 If Not _statuses.ContainsTab(renamed) Then Exit For
8964 renamed = tb.TabName + "(" + i.ToString + ")"
8966 tb.TabName = renamed
8967 _statuses.Tabs.Add(renamed, tb)
8968 AddNewTab(renamed, False, tb.TabType)
8969 ListTab.SelectedIndex = ListTab.TabPages.Count - 1
8974 Private Sub doMoveToRTHome()
8975 If _curList.SelectedIndices.Count > 0 Then
8976 Dim post As PostClass = GetCurTabPost(_curList.SelectedIndices(0))
8977 If post.RetweetedId > 0 Then
8978 OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).RetweetedBy)
8983 Private Sub MoveToRTHomeMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MoveToRTHomeMenuItem.Click, OpenRterHomeMenuItem.Click
8987 Private Sub IdFilterAddMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IdFilterAddMenuItem.Click
8988 Dim name As String = GetUserId()
8989 If name IsNot Nothing Then
8990 Dim tabName As String = ""
8993 If _curList.SelectedIndices.Count = 0 Then Exit Sub
8996 If Not SelectTab(tabName) Then Exit Sub
8998 Dim mv As Boolean = False
8999 Dim mk As Boolean = False
9002 Dim fc As New FiltersClass
9003 fc.NameFilter = name
9004 fc.SearchBoth = True
9008 fc.SearchUrl = False
9009 _statuses.Tabs(tabName).AddFilter(fc)
9012 Me.Cursor = Cursors.WaitCursor
9013 _itemCache = Nothing
9014 _postCache = Nothing
9017 _statuses.FilterAll()
9018 For Each tb As TabPage In ListTab.TabPages
9019 DirectCast(tb.Tag, DetailsListView).VirtualListSize = _statuses.Tabs(tb.Text).AllCount
9020 If _statuses.Tabs(tb.Text).UnreadCount > 0 Then
9021 If SettingDialog.TabIconDisp Then
9025 If SettingDialog.TabIconDisp Then
9030 If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
9032 Me.Cursor = Cursors.Default
9038 Private Sub ListManageUserContextToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListManageUserContextToolStripMenuItem.Click, ListManageMenuItem.Click, ListManageUserContextToolStripMenuItem2.Click, ListManageUserContextToolStripMenuItem3.Click
9041 Dim menuItem As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
9043 If menuItem.Owner Is Me.ContextMenuPostBrowser Then
9045 If user Is Nothing Then Return
9046 ElseIf Me._curPost IsNot Nothing Then
9047 user = Me._curPost.Name
9052 Dim list As ListElement = Nothing
9054 If TabInformations.GetInstance().SubscribableLists.Count = 0 Then
9055 Dim res As String = Me.tw.GetListsApi()
9058 MessageBox.Show("Failed to get lists. (" + res + ")")
9063 Using listSelectForm As New MyLists(user, Me.tw)
9064 listSelectForm.ShowDialog()
9068 Private Sub SearchControls_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs)
9069 Dim pnl As Control = DirectCast(sender, Control)
9070 For Each ctl As Control In pnl.Controls
9075 Private Sub SearchControls_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs)
9076 Dim pnl As Control = DirectCast(sender, Control)
9077 For Each ctl As Control In pnl.Controls
9082 Private Sub PublicSearchQueryMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PublicSearchQueryMenuItem.Click
9083 If ListTab.SelectedTab IsNot Nothing Then
9084 If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.PublicSearch Then Exit Sub
9085 ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch").Focus()
9089 Private Sub UseHashtagMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UseHashtagMenuItem.Click
9090 Dim m As Match = Regex.Match(Me._postBrowserStatusText, "^https?://twitter.com/search\?q=%23(?<hash>[a-zA-Z0-9_]+)$")
9092 HashMgr.SetPermanentHash("#" + m.Result("${hash}"))
9093 HashStripSplitButton.Text = HashMgr.UseHash
9094 HashToggleMenuItem.Checked = True
9095 HashToggleToolStripMenuItem.Checked = True
9097 _modifySettingCommon = True
9101 Private Sub StatusLabel_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StatusLabel.DoubleClick
9102 MessageBox.Show(StatusLabel.TextHistory, "Logs", MessageBoxButtons.OK, MessageBoxIcon.None)
9105 Private Sub HashManageMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles HashManageMenuItem.Click, HashManageToolStripMenuItem.Click
9106 Dim rslt As DialogResult
9108 rslt = HashMgr.ShowDialog()
9109 Catch ex As Exception
9112 Me.TopMost = SettingDialog.AlwaysTop
9113 If rslt = Windows.Forms.DialogResult.Cancel Then Exit Sub
9114 If HashMgr.UseHash <> "" Then
9115 HashStripSplitButton.Text = HashMgr.UseHash
9116 HashToggleMenuItem.Checked = True
9117 HashToggleToolStripMenuItem.Checked = True
9119 HashStripSplitButton.Text = "#[-]"
9120 HashToggleMenuItem.Checked = False
9121 HashToggleToolStripMenuItem.Checked = False
9123 'If HashMgr.IsInsert AndAlso HashMgr.UseHash <> "" Then
9124 ' Dim sidx As Integer = StatusText.SelectionStart
9125 ' Dim hash As String = HashMgr.UseHash + " "
9127 ' If StatusText.Text.Substring(sidx - 1, 1) <> " " Then
9131 ' StatusText.Text = StatusText.Text.Insert(sidx, hash)
9132 ' sidx += hash.Length
9133 ' StatusText.SelectionStart = sidx
9134 ' StatusText.Focus()
9136 _modifySettingCommon = True
9137 Me.StatusText_TextChanged(Nothing, Nothing)
9140 Private Sub HashToggleMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles HashToggleMenuItem.Click, HashToggleToolStripMenuItem.Click
9141 HashMgr.ToggleHash()
9142 If HashMgr.UseHash <> "" Then
9143 HashStripSplitButton.Text = HashMgr.UseHash
9144 HashToggleMenuItem.Checked = True
9145 HashToggleToolStripMenuItem.Checked = True
9147 HashStripSplitButton.Text = "#[-]"
9148 HashToggleMenuItem.Checked = False
9149 HashToggleToolStripMenuItem.Checked = False
9151 _modifySettingCommon = True
9152 Me.StatusText_TextChanged(Nothing, Nothing)
9155 Private Sub HashStripSplitButton_ButtonClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles HashStripSplitButton.ButtonClick
9156 HashToggleMenuItem_Click(Nothing, Nothing)
9159 Private Sub MenuItemOperate_DropDownOpening(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemOperate.DropDownOpening
9160 If ListTab.SelectedTab Is Nothing Then Exit Sub
9161 If _statuses Is Nothing OrElse _statuses.Tabs Is Nothing OrElse Not _statuses.Tabs.ContainsKey(ListTab.SelectedTab.Text) Then Exit Sub
9162 If _curPost Is Nothing Then
9163 Me.ReplyOpMenuItem.Enabled = False
9164 Me.ReplyAllOpMenuItem.Enabled = False
9165 Me.DmOpMenuItem.Enabled = False
9166 Me.ShowProfMenuItem.Enabled = False
9167 Me.ListManageMenuItem.Enabled = False
9168 Me.OpenFavOpMenuItem.Enabled = False
9169 Me.CreateTabRuleOpMenuItem.Enabled = False
9170 Me.CreateIdRuleOpMenuItem.Enabled = False
9171 Me.ReadOpMenuItem.Enabled = False
9172 Me.UnreadOpMenuItem.Enabled = False
9174 Me.ReplyOpMenuItem.Enabled = True
9175 Me.ReplyAllOpMenuItem.Enabled = True
9176 Me.DmOpMenuItem.Enabled = True
9177 Me.ShowProfMenuItem.Enabled = True
9178 Me.ListManageMenuItem.Enabled = True
9179 Me.OpenFavOpMenuItem.Enabled = True
9180 Me.CreateTabRuleOpMenuItem.Enabled = True
9181 Me.CreateIdRuleOpMenuItem.Enabled = True
9182 Me.ReadOpMenuItem.Enabled = True
9183 Me.UnreadOpMenuItem.Enabled = True
9186 If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.DirectMessage OrElse _curPost Is Nothing OrElse _curPost.IsDm Then
9187 Me.FavOpMenuItem.Enabled = False
9188 Me.UnFavOpMenuItem.Enabled = False
9189 Me.OpenStatusOpMenuItem.Enabled = False
9190 Me.OpenFavotterOpMenuItem.Enabled = False
9191 Me.ShowRelatedStatusesMenuItem2.Enabled = False
9192 Me.RtOpMenuItem.Enabled = False
9193 Me.RtUnOpMenuItem.Enabled = False
9194 Me.QtOpMenuItem.Enabled = False
9195 Me.FavoriteRetweetMenuItem.Enabled = False
9196 Me.FavoriteRetweetUnofficialMenuItem.Enabled = False
9197 If _curPost IsNot Nothing AndAlso _curPost.IsDm Then Me.DelOpMenuItem.Enabled = True
9199 Me.FavOpMenuItem.Enabled = True
9200 Me.UnFavOpMenuItem.Enabled = True
9201 Me.OpenStatusOpMenuItem.Enabled = True
9202 Me.OpenFavotterOpMenuItem.Enabled = True
9203 Me.ShowRelatedStatusesMenuItem2.Enabled = True 'PublicSearchの時問題出るかも
9205 If _curPost.IsMe Then
9206 Me.RtOpMenuItem.Enabled = False
9207 Me.FavoriteRetweetMenuItem.Enabled = False
9208 Me.DelOpMenuItem.Enabled = True
9210 Me.DelOpMenuItem.Enabled = False
9211 If _curPost.IsProtect Then
9212 Me.RtOpMenuItem.Enabled = False
9213 Me.RtUnOpMenuItem.Enabled = False
9214 Me.QtOpMenuItem.Enabled = False
9215 Me.FavoriteRetweetMenuItem.Enabled = False
9216 Me.FavoriteRetweetUnofficialMenuItem.Enabled = False
9218 Me.RtOpMenuItem.Enabled = True
9219 Me.RtUnOpMenuItem.Enabled = True
9220 Me.QtOpMenuItem.Enabled = True
9221 Me.FavoriteRetweetMenuItem.Enabled = True
9222 Me.FavoriteRetweetUnofficialMenuItem.Enabled = True
9227 If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.Favorites Then
9228 Me.RefreshPrevOpMenuItem.Enabled = True
9230 Me.RefreshPrevOpMenuItem.Enabled = False
9232 If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.PublicSearch _
9233 OrElse _curPost Is Nothing _
9234 OrElse Not _curPost.InReplyToId > 0 Then
9235 OpenRepSourceOpMenuItem.Enabled = False
9237 OpenRepSourceOpMenuItem.Enabled = True
9239 If _curPost Is Nothing OrElse _curPost.RetweetedBy = "" Then
9240 OpenRterHomeMenuItem.Enabled = False
9242 OpenRterHomeMenuItem.Enabled = True
9246 Private Sub MenuItemTab_DropDownOpening(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemTab.DropDownOpening
9247 ContextMenuTabProperty_Opening(sender, Nothing)
9250 Public ReadOnly Property TwitterInstance() As Twitter
9257 Private Sub SplitContainer3_SplitterMoved(ByVal sender As System.Object, ByVal e As System.Windows.Forms.SplitterEventArgs) Handles SplitContainer3.SplitterMoved
9258 If Me.WindowState = FormWindowState.Normal AndAlso Not _initialLayout Then
9259 _mySpDis3 = SplitContainer3.SplitterDistance
9260 _modifySettingLocal = True
9264 Private Sub MenuItemEdit_DropDownOpening(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemEdit.DropDownOpening
9265 If _statuses.RemovedTab Is Nothing Then
9266 UndoRemoveTabMenuItem.Enabled = False
9268 UndoRemoveTabMenuItem.Enabled = True
9270 If ListTab.SelectedTab IsNot Nothing Then
9271 If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.PublicSearch Then
9272 PublicSearchQueryMenuItem.Enabled = True
9274 PublicSearchQueryMenuItem.Enabled = False
9277 PublicSearchQueryMenuItem.Enabled = False
9279 If _curPost Is Nothing Then
9280 Me.CopySTOTMenuItem.Enabled = False
9281 Me.CopyURLMenuItem.Enabled = False
9282 Me.CopyUserIdStripMenuItem.Enabled = False
9284 Me.CopySTOTMenuItem.Enabled = True
9285 Me.CopyURLMenuItem.Enabled = True
9286 Me.CopyUserIdStripMenuItem.Enabled = True
9287 If _curPost.IsProtect Then Me.CopySTOTMenuItem.Enabled = False
9291 Private Sub NotifyIcon1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseMove
9295 Private Sub UserStatusToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UserStatusToolStripMenuItem.Click
9296 Dim id As String = ""
9297 If _curPost IsNot Nothing Then
9303 Private Class GetUserInfoArgs
9304 Public tw As Tween.Twitter
9306 Public user As TwitterDataModel.User
9309 Private Sub GetUserInfo_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
9310 Dim args As GetUserInfoArgs = DirectCast(e.Argument, GetUserInfoArgs)
9311 e.Result = args.tw.GetUserInfo(args.id, args.user)
9314 Private Overloads Sub doShowUserStatus(ByVal id As String, ByVal ShowInputDialog As Boolean)
9315 Dim result As String = ""
9316 Dim user As TwitterDataModel.User = Nothing
9317 Dim args As New GetUserInfoArgs
9318 If ShowInputDialog Then
9319 Using inputName As New InputTabName()
9320 inputName.FormTitle = "Show UserStatus"
9321 inputName.FormDescription = My.Resources.FRMessage1
9322 inputName.TabName = id
9323 If inputName.ShowDialog() = Windows.Forms.DialogResult.OK AndAlso _
9324 Not String.IsNullOrEmpty(inputName.TabName.Trim()) Then
9325 id = inputName.TabName.Trim
9329 Using _info As New FormInfo(Me, My.Resources.doShowUserStatusText1, _
9330 AddressOf GetUserInfo_DoWork, _
9334 Dim ret As String = DirectCast(_info.Result, String)
9335 If String.IsNullOrEmpty(ret) Then
9336 doShowUserStatus(args.user)
9338 MessageBox.Show(ret)
9347 Using _info As New FormInfo(Me, My.Resources.doShowUserStatusText1, _
9348 AddressOf GetUserInfo_DoWork, _
9352 Dim ret As String = DirectCast(_info.Result, String)
9353 If String.IsNullOrEmpty(ret) Then
9354 doShowUserStatus(args.user)
9356 MessageBox.Show(ret)
9362 Private Overloads Sub doShowUserStatus(ByVal user As TwitterDataModel.User)
9363 Using userinfo As New ShowUserInfo()
9364 userinfo.User = user
9365 userinfo.ShowDialog(Me)
9369 Private Overloads Sub ShowUserStatus(ByVal id As String, ByVal ShowInputDialog As Boolean)
9370 doShowUserStatus(id, ShowInputDialog)
9373 Private Overloads Sub ShowUserStatus(ByVal id As String)
9374 doShowUserStatus(id, True)
9377 Private Sub FollowToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FollowToolStripMenuItem.Click
9378 If NameLabel.Tag IsNot Nothing Then
9379 Dim id As String = DirectCast(NameLabel.Tag, String)
9380 If id <> tw.Username Then
9386 Private Sub UnFollowToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UnFollowToolStripMenuItem.Click
9387 If NameLabel.Tag IsNot Nothing Then
9388 Dim id As String = DirectCast(NameLabel.Tag, String)
9389 If id <> tw.Username Then
9390 RemoveCommand(id, False)
9395 Private Sub ShowFriendShipToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShowFriendShipToolStripMenuItem.Click
9396 If NameLabel.Tag IsNot Nothing Then
9397 Dim id As String = DirectCast(NameLabel.Tag, String)
9398 If id <> tw.Username Then
9404 Private Sub ShowUserStatusToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShowUserStatusToolStripMenuItem.Click
9405 If NameLabel.Tag IsNot Nothing Then
9406 Dim id As String = DirectCast(NameLabel.Tag, String)
9407 ShowUserStatus(id, False)
9411 Private Sub SearchPostsDetailNameToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchPostsDetailNameToolStripMenuItem.Click
9412 If NameLabel.Tag IsNot Nothing Then
9413 Dim id As String = DirectCast(NameLabel.Tag, String)
9414 AddNewTabForSearch("from:" + id)
9418 Private Sub SearchAtPostsDetailNameToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchAtPostsDetailNameToolStripMenuItem.Click
9419 If NameLabel.Tag IsNot Nothing Then
9420 Dim id As String = DirectCast(NameLabel.Tag, String)
9421 AddNewTabForSearch("@" + id)
9425 Private Sub ShowProfileMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShowProfileMenuItem.Click, ShowProfMenuItem.Click
9426 If _curPost IsNot Nothing Then
9427 ShowUserStatus(_curPost.Name, False)
9431 Private Sub GetRetweet_DoWork(ByVal sender As Object, ByVal e As ComponentModel.DoWorkEventArgs)
9432 Dim counter As Integer = 0
9434 Dim statusid As Long
9435 If _curPost.RetweetedId > 0 Then
9436 statusid = _curPost.RetweetedId
9438 statusid = _curPost.Id
9440 tw.GetStatus_Retweeted_Count(statusid, counter)
9445 Private Sub RtCountMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RtCountMenuItem.Click
9446 If _curPost IsNot Nothing Then
9447 Using _info As New FormInfo(Me, My.Resources.RtCountMenuItem_ClickText1, _
9448 AddressOf GetRetweet_DoWork)
9449 Dim retweet_count As Integer = 0
9453 retweet_count = CType(_info.Result, Integer)
9454 If retweet_count < 0 Then
9455 MessageBox.Show(My.Resources.RtCountText2)
9457 MessageBox.Show(retweet_count.ToString + My.Resources.RtCountText1)
9463 Private WithEvents _hookGlobalHotkey As HookGlobalHotkey
9466 _hookGlobalHotkey = New HookGlobalHotkey(Me)
9467 ' この呼び出しは、Windows フォーム デザイナで必要です。
9468 InitializeComponent()
9470 ' InitializeComponent() 呼び出しの後で初期化を追加します。
9472 Me._apiGauge.Control.Size = New Size(70, 22)
9473 Me._apiGauge.Control.Margin = New Padding(0, 3, 0, 2)
9474 Me._apiGauge.GaugeHeight = 8
9475 AddHandler Me._apiGauge.Control.DoubleClick, AddressOf Me.ApiInfoMenuItem_Click
9476 Me.StatusStrip1.Items.Insert(2, Me._apiGauge)
9479 Private Sub _hookGlobalHotkey_HotkeyPressed(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles _hookGlobalHotkey.HotkeyPressed
9480 If (Me.WindowState = FormWindowState.Normal OrElse Me.WindowState = FormWindowState.Maximized) AndAlso Me.Visible AndAlso Form.ActiveForm Is Me Then
9483 ElseIf Form.ActiveForm Is Nothing Then
9485 If Me.WindowState = FormWindowState.Minimized Then Me.WindowState = FormWindowState.Normal
9487 Me.StatusText.Focus()
9491 Private Sub UserPicture_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UserPicture.MouseEnter
9492 Me.UserPicture.Cursor = Cursors.Hand
9495 Private Sub UserPicture_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UserPicture.MouseLeave
9496 Me.UserPicture.Cursor = Cursors.Default
9499 Private Sub UserPicture_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UserPicture.DoubleClick
9500 If NameLabel.Tag IsNot Nothing Then
9501 OpenUriAsync("http://twitter.com/" + NameLabel.Tag.ToString)
9505 Private Sub SplitContainer2_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles SplitContainer2.MouseDoubleClick
9506 Me.MultiLineMenuItem.PerformClick()
9509 Public ReadOnly Property CurPost As PostClass
9515 Public ReadOnly Property IsPreviewEnable As Boolean
9517 Return SettingDialog.PreviewEnable
9522 Private Sub ImageSelectMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ImageSelectMenuItem.Click
9523 If ImageSelectionPanel.Visible = True Then
9524 ImagefilePathText.CausesValidation = False
9525 TimelinePanel.Visible = True
9526 TimelinePanel.Enabled = True
9527 ImageSelectionPanel.Visible = False
9528 ImageSelectionPanel.Enabled = False
9529 DirectCast(ListTab.SelectedTab.Tag, DetailsListView).Focus()
9530 ImagefilePathText.CausesValidation = True
9532 ImageSelectionPanel.Visible = True
9533 ImageSelectionPanel.Enabled = True
9534 TimelinePanel.Visible = False
9535 TimelinePanel.Enabled = False
9536 ImagefilePathText.Focus()
9540 Private Sub FilePickButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FilePickButton.Click
9541 OpenFileDialog1.Filter = (New PictureService(tw)).GetFileOpenDialogFilter(ImageService)
9542 OpenFileDialog1.Title = My.Resources.PickPictureDialog1
9543 OpenFileDialog1.FileName = ""
9546 Me.AllowDrop = False
9547 If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.Cancel Then Exit Sub
9552 ImagefilePathText.Text = OpenFileDialog1.FileName
9553 ImageFromSelectedFile()
9556 Private Sub ImagefilePathText_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ImagefilePathText.Validating
9557 If ImageCancelButton.Focused Then
9558 ImagefilePathText.CausesValidation = False
9561 ImagefilePathText.Text = Trim(ImagefilePathText.Text)
9562 If ImagefilePathText.Text = "" Then
9563 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9564 ImageSelectedPicture.Tag = UploadFileType.Invalid
9566 ImageFromSelectedFile()
9570 Private Sub ImageFromSelectedFile()
9572 Dim svc As New PictureService(tw)
9573 If String.IsNullOrEmpty(Trim(ImagefilePathText.Text)) Then
9574 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9575 ImageSelectedPicture.Tag = UploadFileType.Invalid
9576 ImagefilePathText.Text = ""
9580 Dim fl As New FileInfo(Trim(ImagefilePathText.Text))
9581 If Not svc.IsValidExtension(fl.Extension.ToLower, ImageService) Then
9583 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9584 ImageSelectedPicture.Tag = UploadFileType.Invalid
9585 ImagefilePathText.Text = ""
9589 If svc.GetMaxFileSize(fl.Extension, ImageService) < fl.Length Then
9591 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9592 ImageSelectedPicture.Tag = UploadFileType.Invalid
9593 ImagefilePathText.Text = ""
9594 MessageBox.Show("File is too large.")
9598 Select Case svc.GetFileType(fl.Extension.ToLower, ImageService)
9599 Case UploadFileType.Invalid
9600 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9601 ImageSelectedPicture.Tag = UploadFileType.Invalid
9602 ImagefilePathText.Text = ""
9603 Case UploadFileType.Picture
9604 Dim img As Image = Nothing
9605 Using fs As New FileStream(ImagefilePathText.Text, FileMode.Open, FileAccess.Read)
9606 img = Image.FromStream(fs)
9609 ImageSelectedPicture.Image = (New HttpVarious).CheckValidImage( _
9613 ImageSelectedPicture.Tag = UploadFileType.Picture
9614 Case UploadFileType.MultiMedia
9615 ImageSelectedPicture.Image = My.Resources.MultiMediaImage
9616 ImageSelectedPicture.Tag = UploadFileType.MultiMedia
9618 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9619 ImageSelectedPicture.Tag = UploadFileType.Invalid
9620 ImagefilePathText.Text = ""
9623 Catch ex As FileNotFoundException
9624 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9625 ImageSelectedPicture.Tag = UploadFileType.Invalid
9626 ImagefilePathText.Text = ""
9627 MessageBox.Show("File not found.")
9628 Catch ex As Exception
9629 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9630 ImageSelectedPicture.Tag = UploadFileType.Invalid
9631 ImagefilePathText.Text = ""
9632 MessageBox.Show("The type of this file is not image.")
9636 Private Sub ImageSelection_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles _
9637 ImagefilePathText.KeyDown, _
9638 FilePickButton.KeyDown, _
9639 ImageServiceCombo.KeyDown
9640 If e.KeyCode = Keys.Escape Then
9641 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9642 ImageSelectedPicture.Tag = UploadFileType.Invalid
9643 TimelinePanel.Visible = True
9644 TimelinePanel.Enabled = True
9645 ImageSelectionPanel.Visible = False
9646 ImageSelectionPanel.Enabled = False
9647 DirectCast(ListTab.SelectedTab.Tag, DetailsListView).Focus()
9648 ImagefilePathText.CausesValidation = True
9652 Private Sub ImageSelection_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles _
9653 ImagefilePathText.KeyPress, _
9654 FilePickButton.KeyPress, _
9655 ImageServiceCombo.KeyPress
9656 If Convert.ToInt32(e.KeyChar) = &H1B Then
9657 ImagefilePathText.CausesValidation = False
9662 Private Sub ImageSelection_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles _
9663 ImagefilePathText.PreviewKeyDown, _
9664 FilePickButton.PreviewKeyDown, _
9665 ImageServiceCombo.PreviewKeyDown
9666 If e.KeyCode = Keys.Escape Then
9667 ImagefilePathText.CausesValidation = False
9671 Private Sub SetImageServiceCombo()
9672 Dim svc As String = ""
9673 If ImageServiceCombo.SelectedIndex > -1 Then svc = ImageServiceCombo.SelectedItem.ToString
9674 ImageServiceCombo.Items.Clear()
9675 If SettingDialog.IsOAuth Then
9676 ImageServiceCombo.Items.Add("TwitPic")
9677 ImageServiceCombo.Items.Add("img.ly")
9678 ImageServiceCombo.Items.Add("yfrog")
9680 'ImageServiceCombo.Items.Add("TwitVideo")
9682 ImageServiceCombo.SelectedIndex = 0
9684 Dim idx As Integer = ImageServiceCombo.Items.IndexOf(svc)
9686 ImageServiceCombo.SelectedIndex = 0
9688 ImageServiceCombo.SelectedIndex = idx
9693 Private ReadOnly Property ImageService() As String
9695 Return CStr(ImageServiceCombo.SelectedItem)
9699 Private Sub ImageCancelButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ImageCancelButton.Click
9700 ImagefilePathText.CausesValidation = False
9701 TimelinePanel.Visible = True
9702 TimelinePanel.Enabled = True
9703 ImageSelectionPanel.Visible = False
9704 ImageSelectionPanel.Enabled = False
9705 DirectCast(ListTab.SelectedTab.Tag, DetailsListView).Focus()
9706 ImagefilePathText.CausesValidation = True
9709 Private Sub ImageServiceCombo_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ImageServiceCombo.SelectedIndexChanged
9710 If ImageSelectedPicture.Tag IsNot Nothing Then
9711 Dim svc As New PictureService(tw)
9713 Dim fi As New FileInfo(ImagefilePathText.Text.Trim)
9714 If Not (svc.IsValidExtension(fi.Extension, ImageService) AndAlso _
9715 svc.GetMaxFileSize(fi.Extension, ImageService) >= fi.Length) Then
9716 ImagefilePathText.Text = ""
9717 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9718 ImageSelectedPicture.Tag = UploadFileType.Invalid
9720 Catch ex As Exception
9727 Private Sub ListManageToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListManageToolStripMenuItem.Click
9728 Using form As New ListManage(tw)
9733 Public WriteOnly Property ModifySettingCommon() As Boolean
9734 Set(ByVal value As Boolean)
9735 _modifySettingCommon = value
9739 Public WriteOnly Property ModifySettingLocal() As Boolean
9740 Set(ByVal value As Boolean)
9741 _modifySettingLocal = value
9745 Public WriteOnly Property ModifySettingAtId() As Boolean
9746 Set(ByVal value As Boolean)
9747 _modifySettingAtId = value
9751 Private Sub SourceLinkLabel_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles SourceLinkLabel.LinkClicked
9752 Dim link As String = CType(SourceLinkLabel.Tag, String)
9753 If Not String.IsNullOrEmpty(link) Then
9758 Private Sub SourceLinkLabel_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SourceLinkLabel.MouseEnter
9759 Dim link As String = CType(SourceLinkLabel.Tag, String)
9760 If Not String.IsNullOrEmpty(link) Then
9761 StatusLabelUrl.Text = link
9765 Private Sub SourceLinkLabel_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SourceLinkLabel.MouseLeave
9769 Private Sub MenuItemCommand_DropDownOpening(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuItemCommand.DropDownOpening
9770 If _curPost IsNot Nothing AndAlso Not _curPost.IsDm Then
9771 RtCountMenuItem.Enabled = True
9773 RtCountMenuItem.Enabled = False
9777 Private Sub CopyUserIdStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CopyUserIdStripMenuItem.Click
9780 Private Sub CopyUserId()
9781 If _curPost Is Nothing Then Exit Sub
9782 Dim clstr As String = _curPost.Name
9784 Clipboard.SetDataObject(clstr, False, 5, 100)
9785 Catch ex As Exception
9786 MessageBox.Show(ex.Message)
9790 Private Sub ShowRelatedStatusesMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShowRelatedStatusesMenuItem.Click, ShowRelatedStatusesMenuItem2.Click
9791 If _curPost IsNot Nothing AndAlso Not _curPost.IsDm Then
9792 'PublicSearchも除外した方がよい?
9793 If _statuses.GetTabByType(TabUsageType.Related) Is Nothing Then
9794 Const TabName As String = "Related Tweets"
9795 Dim tName As String = TabName
9796 If Not Me.AddNewTab(tName, False, TabUsageType.Related) Then
9797 For i As Integer = 2 To 100
9798 tName = TabName + i.ToString()
9799 If Me.AddNewTab(tName, False, TabUsageType.Related) Then
9800 _statuses.AddTab(tName, TabUsageType.Related, Nothing)
9805 _statuses.AddTab(tName, TabUsageType.Related, Nothing)
9807 _statuses.GetTabByName(tName).UnreadManage = False
9810 Dim tb As TabClass = _statuses.GetTabByType(TabUsageType.Related)
9811 tb.RelationTargetPost = _curPost
9812 Me.ClearTab(tb.TabName, False)
9813 For i As Integer = 0 To ListTab.TabPages.Count - 1
9814 If tb.TabName = ListTab.TabPages(i).Text Then
9815 ListTab.SelectedIndex = i
9816 ListTabSelect(ListTab.TabPages(i))
9821 GetTimeline(WORKERTYPE.Related, 1, 1, tb.TabName)
9825 Private Sub CacheInfoMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CacheInfoMenuItem.Click
9826 Dim buf As New StringBuilder
9827 buf.AppendFormat("キャッシュメモリ容量 : {0}bytes({1}MB)" + vbCrLf, DirectCast(TIconDic, ImageDictionary).CacheMemoryLimit, DirectCast(TIconDic, ImageDictionary).CacheMemoryLimit / 1048576)
9828 buf.AppendFormat("物理メモリ使用割合 : {0}%" + vbCrLf, DirectCast(TIconDic, ImageDictionary).PhysicalMemoryLimit)
9829 buf.AppendFormat("キャッシュエントリ保持数 : {0}" + vbCrLf, DirectCast(TIconDic, ImageDictionary).CacheCount)
9830 buf.AppendFormat("キャッシュエントリ破棄数 : {0}" + vbCrLf, DirectCast(TIconDic, ImageDictionary).CacheRemoveCount)
9831 MessageBox.Show(buf.ToString, "アイコンキャッシュ使用状況")
9834 #Region "Userstream"
9835 Private _isActiveUserstream As Boolean = False
9837 Private Sub tw_PostDeleted(ByVal id As Long, ByRef post As PostClass)
9838 _statuses.RemovePostReserve(id, post)
9841 Private Sub tw_NewPostFromStream()
9842 If SettingDialog.ReadOldPosts Then
9843 _statuses.SetRead() '新着時未読クリア
9846 Dim rsltAddCount As Integer = _statuses.DistributePosts()
9847 SyncLock _syncObject
9848 Dim tm As Date = Now
9849 If _tlTimestamps.ContainsKey(tm) Then
9850 _tlTimestamps(tm) += rsltAddCount
9852 _tlTimestamps.Add(Now, rsltAddCount)
9854 Dim oneHour As Date = Now.Subtract(New TimeSpan(1, 0, 0))
9855 Dim keys As New List(Of Date)
9857 For Each key As Date In _tlTimestamps.Keys
9858 If key.CompareTo(oneHour) < 0 Then
9861 _tlCount += _tlTimestamps(key)
9864 For Each key As Date In keys
9865 _tlTimestamps.Remove(key)
9869 'Static before As DateTime = Now
9870 'If before.Subtract(Now).Seconds > -5 Then Exit Sub
9874 If SettingDialog.UserstreamPeriodInt > 0 Then Exit Sub
9877 If InvokeRequired AndAlso Not IsDisposed Then
9878 Invoke(New Action(Of Boolean)(AddressOf RefreshTimeline), True)
9881 Catch ex As ObjectDisposedException
9886 Private Sub tw_UserStreamStarted()
9887 Me._isActiveUserstream = True
9888 If InvokeRequired Then
9889 Invoke(New MethodInvoker(AddressOf tw_UserStreamStarted))
9893 MenuItemUserStream.Text = "&UserStream ▶"
9894 MenuItemUserStream.Enabled = True
9895 StopToolStripMenuItem.Text = "&Stop"
9896 StopToolStripMenuItem.Enabled = True
9898 StatusLabel.Text = "UserStream Started."
9901 Private Sub tw_UserStreamStopped()
9902 Me._isActiveUserstream = False
9903 If InvokeRequired Then
9904 Invoke(New MethodInvoker(AddressOf tw_UserStreamStopped))
9908 MenuItemUserStream.Text = "&UserStream ■"
9909 MenuItemUserStream.Enabled = True
9910 StopToolStripMenuItem.Text = "&Start"
9911 StopToolStripMenuItem.Enabled = True
9913 StatusLabel.Text = "UserStream Stopped."
9916 Private Sub tw_UserStreamEventArrived(ByVal eventType As String)
9917 If InvokeRequired Then
9918 Invoke(New Action(Of String)(AddressOf tw_UserStreamEventArrived), eventType)
9921 StatusLabel.Text = "Event: " + eventType
9924 Private Sub StopToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopToolStripMenuItem.Click
9925 MenuItemUserStream.Enabled = False
9926 If Me._isActiveUserstream Then
9929 tw.StartUserStream()
9933 Private Sub TrackToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackToolStripMenuItem.Click
9934 Static inputTrack As String = ""
9935 If TrackToolStripMenuItem.Checked Then
9936 Using inputForm As New InputTabName
9937 inputForm.TabName = inputTrack
9938 inputForm.FormTitle = "Input track word"
9939 inputForm.FormDescription = "Track word"
9940 If inputForm.ShowDialog() <> Windows.Forms.DialogResult.OK Then
9941 TrackToolStripMenuItem.Checked = False
9944 inputTrack = inputForm.TabName.Trim()
9946 If Not inputTrack.Equals(tw.TrackWord) Then
9947 tw.TrackWord = inputTrack
9948 Me._modifySettingCommon = True
9949 TrackToolStripMenuItem.Checked = Not String.IsNullOrEmpty(inputTrack)
9950 tw.ReconnectUserStream()
9954 tw.ReconnectUserStream()
9958 Private Sub AllrepliesToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AllrepliesToolStripMenuItem.Click
9959 tw.AllAtReply = AllrepliesToolStripMenuItem.Checked
9960 Me._modifySettingCommon = True
9961 tw.ReconnectUserStream()
9964 Private Sub TweenRestartMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles TweenRestartMenuItem.Click
9966 Application.Restart()
9969 Private Sub EventViewerMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EventViewerMenuItem.Click
9970 Using dlg As New EventViewerDialog
9972 dlg.EventSource = tw.StoredEvent
9974 Me.TopMost = SettingDialog.AlwaysTop
9979 Private Sub OpenOwnFavedMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles OpenOwnFavedMenuItem.Click
9980 If Not tw.Username = "" Then OpenUriAsync(My.Resources.FavstarUrl + "users/" + tw.Username + "/recent")
9983 Private Sub OpenOwnHomeMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles OpenOwnHomeMenuItem.Click
9984 OpenUriAsync("http://twitter.com/" + tw.Username)