OSDN Git Service

関連発言タブの未読管理を初期値未読管理しないように
[opentween/open-tween.git] / Tween / Tween.vb
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/>
5 ' All rights reserved.
6
7 ' This file is part of Tween.
8
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)
12 ' any later version.
13
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
17 ' for more details. 
18
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.
23
24 'コンパイル後コマンド
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)"
27
28
29 Imports System
30 Imports System.Text
31 Imports System.Text.RegularExpressions
32 Imports Tween.TweenCustomControl
33 Imports System.IO
34 Imports System.Web
35 Imports System.Reflection
36 Imports System.ComponentModel
37 Imports System.Diagnostics
38 Imports Microsoft.Win32
39 Imports System.Xml
40 Imports System.Timers
41 Imports System.Threading
42
43 Public Class TweenMain
44
45     '各種設定
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サイズのとき)
53
54     '雑多なフラグ類
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
77
78     '設定ファイル関連
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
85
86     'twitter解析部
87     Private tw As New Twitter
88
89     'サブ画面インスタンス
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
99
100     '表示フォント、色、アイコン
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
131
132     Private _anchorPost As PostClass
133     Private _anchorFlag As Boolean        'True:関連発言移動中(関連移動以外のオペレーションをするとFalseへ。Trueだとリスト背景色をアンカー発言選択中として描画)
134
135     Private _history As New List(Of PostingStatus)   '発言履歴
136     Private _hisIdx As Integer                  '発言履歴カレントインデックス
137
138     '発言投稿時のAPI引数(発言編集時に設定。手書きreplyでは設定されない)
139     Private _reply_to_id As Long     ' リプライ先のステータスID 0の場合はリプライではない 注:複数あてのものはリプライではない
140     Private _reply_to_name As String    ' リプライ先ステータスの書き込み者の名前
141
142     '時速表示用
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
147
148     ' 以下DrawItem関連
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()
166
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
191
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
198
199     Private UnreadCounter As Integer = -1
200     Private UnreadAtCounter As Integer = -1
201
202     Private ColumnOrgText(8) As String
203     Private ColumnText(8) As String
204
205     'Private _UseAdditionalFlags As Boolean = False
206     'Private _FirstRefreshFlags As Boolean = False
207     'Private _FirstListsRefreshFlags As Boolean = False
208
209     Private _DoFavRetweetFlags As Boolean = False
210
211     '''''''''''''''''''''''''''''''''''''''''''''''''''''
212     Private _postBrowserStatusText As String = ""
213
214     Private _colorize As Boolean = False
215
216     Private WithEvents TimerTimeline As New System.Timers.Timer
217
218     'URL短縮のUndo用
219     Private Structure urlUndo
220         Public Before As String
221         Public After As String
222     End Structure
223
224     Private urlUndoBuffer As Generic.List(Of urlUndo) = Nothing
225
226     Private Structure ReplyChain
227         Public OriginalId As Long
228         Public InReplyToId As Long
229         Public OriginalTab As TabPage
230
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
235         End Sub
236     End Structure
237
238     Private replyChains As Stack(Of ReplyChain)
239
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
253     End Class
254
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追加・削除時のタブ名
265     End Class
266
267     '検索処理タイプ
268     Private Enum SEARCHTYPE
269         DialogSearch
270         NextSearch
271         PrevSearch
272     End Enum
273
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 = ""
280         Public Sub New()
281
282         End Sub
283         Public Sub New(ByVal status As String, ByVal replyToId As Long, ByVal replyToName As String)
284             Me.status = status
285             Me.inReplyToId = replyToId
286             Me.inReplyToName = replyToName
287         End Sub
288     End Class
289
290     Private Class SpaceKeyCanceler
291         Inherits NativeWindow
292         Implements IDisposable
293
294         Dim WM_KEYDOWN As Integer = &H100
295         Dim VK_SPACE As Integer = &H20
296
297         Public Sub New(ByVal control As Control)
298             Me.AssignHandle(control.Handle)
299         End Sub
300
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)
304                 Exit Sub
305             End If
306
307             MyBase.WndProc(m)
308         End Sub
309
310         Public Event SpaceCancel As EventHandler
311
312         Public Sub Dispose() Implements IDisposable.Dispose
313             Me.ReleaseHandle()
314         End Sub
315     End Class
316
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)
321         End If
322     End Sub
323
324     Private Sub TweenMain_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
325         '後始末
326         SettingDialog.Dispose()
327         TabDialog.Dispose()
328         SearchDialog.Dispose()
329         fDialog.Dispose()
330         UrlDialog.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()
358         shield.Dispose()
359         'sf.Dispose()
360         sfTab.Dispose()
361         For Each bw As BackgroundWorker In _bw
362             If bw IsNot Nothing Then
363                 bw.Dispose()
364             End If
365         Next
366         If _bwFollower IsNot Nothing Then
367             _bwFollower.Dispose()
368         End If
369         Me._apiGauge.Dispose()
370         If TIconDic IsNot Nothing Then DirectCast(TIconDic, IDisposable).Dispose()
371     End Sub
372
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
376             Try
377                 IconInstance = New Icon(Path.Combine(dir, FileName))
378             Catch ex As Exception
379             End Try
380         End If
381     End Sub
382
383     Private Sub LoadIcons()
384         '着せ替えアイコン対応
385         'タスクトレイ通常時アイコン
386         Dim dir As String = Application.StartupPath
387
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
399
400         If Not Directory.Exists(Path.Combine(dir, "Icons")) Then
401             Exit Sub
402         End If
403
404         LoadIcon(NIconAt, "Icons\At.ico")
405
406         'タスクトレイエラー時アイコン
407         LoadIcon(NIconAtRed, "Icons\AtRed.ico")
408
409         'タスクトレイオフライン時アイコン
410         LoadIcon(NIconAtSmoke, "Icons\AtSmoke.ico")
411
412         'タスクトレイ更新中アイコン
413         'アニメーション対応により4種類読み込み
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")
418
419         'タブ見出し未読表示アイコン
420         LoadIcon(TabIcon, "Icons\Tab.ico")
421
422         '画面のアイコン
423         LoadIcon(MainIcon, "Icons\MIcon.ico")
424
425         'Replyのアイコン
426         LoadIcon(ReplyIcon, "Icons\Reply.ico")
427
428         'Reply点滅のアイコン
429         LoadIcon(ReplyIconBlink, "Icons\ReplyBlink.ico")
430     End Sub
431
432     Private Sub InitColumnText()
433
434         ColumnText(0) = ""
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
439         ColumnText(5) = ""
440         ColumnText(6) = ""
441         ColumnText(7) = "Source"
442
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"
451
452         Dim c As Integer = 0
453         Select Case _statuses.SortMode
454             Case IdComparerClass.ComparerMode.Nickname  'ニックネーム
455                 c = 1
456             Case IdComparerClass.ComparerMode.Data  '本文
457                 c = 2
458             Case IdComparerClass.ComparerMode.Id  '時刻=発言Id
459                 c = 3
460             Case IdComparerClass.ComparerMode.Name  '名前
461                 c = 4
462             Case IdComparerClass.ComparerMode.Source  'Source
463                 c = 7
464         End Select
465
466         If _iconCol Then
467             If _statuses.SortOrder() = SortOrder.Descending Then
468                 ' U+25BE BLACK DOWN-POINTING SMALL TRIANGLE
469                 ColumnText(2) = ColumnOrgText(2) + "▾"
470             Else
471                 ' U+25B4 BLACK UP-POINTING SMALL TRIANGLE
472                 ColumnText(2) = ColumnOrgText(2) + "▴"
473             End If
474         Else
475             If _statuses.SortOrder() = SortOrder.Descending Then
476                 ' U+25BE BLACK DOWN-POINTING SMALL TRIANGLE
477                 ColumnText(c) = ColumnOrgText(c) + "▾"
478             Else
479                 ' U+25B4 BLACK UP-POINTING SMALL TRIANGLE
480                 ColumnText(c) = ColumnOrgText(c) + "▴"
481             End If
482         End If
483     End Sub
484
485     Private Sub InitializeTraceFrag()
486 #If DEBUG Then
487         TraceOutToolStripMenuItem.Checked = True
488         TraceFlag = True
489 #End If
490         If Not fileVersion.EndsWith("0") Then
491             TraceOutToolStripMenuItem.Checked = True
492             TraceFlag = True
493         End If
494     End Sub
495
496     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
497         _ignoreConfigSave = True
498         Me.Visible = False
499         SecurityManager = New InternetSecurityManager(PostBrowser)
500         Thumbnail = New Thumbnail(Me)
501
502         AddHandler TwitterApiInfo.Changed, AddressOf SetStatusLabelApiHandler
503
504         VerUpMenuItem.Image = shield.Icon
505         If Not My.Application.CommandLineArgs.Count = 0 AndAlso My.Application.CommandLineArgs.Contains("/d") Then TraceFlag = True
506
507         Me._spaceKeyCanceler = New SpaceKeyCanceler(Me.PostButton)
508         AddHandler Me._spaceKeyCanceler.SpaceCancel, AddressOf spaceKeyCanceler_SpaceCancel
509
510         Regex.CacheSize = 100
511
512         fileVersion = DirectCast(Assembly.GetExecutingAssembly().GetCustomAttributes(GetType(AssemblyFileVersionAttribute), False)(0), AssemblyFileVersionAttribute).Version
513         InitializeTraceFrag()
514         LoadIcons() ' アイコン読み込み
515
516         '発言保持クラス
517         _statuses = TabInformations.GetInstance()
518
519         'アイコン設定
520         Me.Icon = MainIcon              'メインフォーム(TweenMain)
521         NotifyIcon1.Icon = NIconAt      'タスクトレイ
522         TabImage.Images.Add(TabIcon)    'タブ見出し
523
524         SettingDialog.Owner = Me
525         SearchDialog.Owner = Me
526         fDialog.Owner = Me
527         TabDialog.Owner = Me
528         UrlDialog.Owner = Me
529
530         _history.Add(New PostingStatus)
531         _hisIdx = 0
532         _reply_to_id = 0
533         _reply_to_name = ""
534
535         '<<<<<<<<<設定関連>>>>>>>>>
536         '設定コンバージョン
537         'ConvertConfig()
538
539         ''設定読み出し
540         LoadConfig()
541
542         '新着バルーン通知のチェック状態設定
543         NewPostPopMenuItem.Checked = _cfgCommon.NewAllPop
544         Me.NotifyFileMenuItem.Checked = NewPostPopMenuItem.Checked
545
546         'フォント&文字色&背景色保持
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
568
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)
582
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
589
590         '設定画面への反映
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
596         '認証関連
597         If _cfgCommon.IsOAuth Then
598             If _cfgCommon.Token = "" Then _cfgCommon.UserName = ""
599             tw.Initialize(_cfgCommon.Token, _cfgCommon.TokenSecret, _cfgCommon.UserName)
600         Else
601             tw.Initialize(_cfgCommon.UserName, _cfgCommon.Password)
602         End If
603
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
609         '不正値チェック
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
616         End If
617
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
624         '文末ステータス
625         SettingDialog.Status = _cfgLocal.StatusText
626         '未読管理。Trueなら未読管理する
627         SettingDialog.UnreadManage = _cfgCommon.UnreadManage
628         'サウンド再生(タブ別設定より優先)
629         SettingDialog.PlaySound = _cfgCommon.PlaySound
630         PlaySoundMenuItem.Checked = SettingDialog.PlaySound
631         Me.PlaySoundFileMenuItem.Checked = SettingDialog.PlaySound
632         '片思い表示。Trueなら片思い表示する
633         SettingDialog.OneWayLove = _cfgCommon.OneWayLove
634         'フォント&文字色&背景色
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
656
657         SettingDialog.NameBalloon = _cfgCommon.NameBalloon
658         SettingDialog.PostCtrlEnter = _cfgCommon.PostCtrlEnter
659         SettingDialog.PostShiftEnter = _cfgCommon.PostShiftEnter
660
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
665
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
675
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
681
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
688
689         SettingDialog.OutputzEnabled = _cfgCommon.Outputz
690         SettingDialog.OutputzKey = _cfgCommon.OutputzKey
691         SettingDialog.OutputzUrlmode = _cfgCommon.OutputzUrlMode
692
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
700
701         '廃止サービスが選択されていた場合bit.lyへ読み替え
702         If _cfgCommon.AutoShortUrlFirst < 0 Then
703             _cfgCommon.AutoShortUrlFirst = Tween.UrlConverter.Bitly
704         End If
705
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, "@")
721
722         SettingDialog.IsMonospace = _cfgCommon.IsMonospace
723         If SettingDialog.IsMonospace Then
724             detailHtmlFormatHeader = detailHtmlFormatMono1
725             detailHtmlFormatFooter = detailHtmlFormatMono7
726         Else
727             detailHtmlFormatHeader = detailHtmlFormat1
728             detailHtmlFormatFooter = detailHtmlFormat7
729         End If
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
733         Else
734             detailHtmlFormatHeader += detailHtmlFormat6
735         End If
736         Me.IdeographicSpaceToSpaceToolStripMenuItem.Checked = _cfgCommon.WideSpaceConvert
737         Me.ToolStripFocusLockMenuItem.Checked = _cfgCommon.FocusLockToStatusText
738
739         'Dim statregex As New Regex("^0*")
740         SettingDialog.RecommendStatusText = " [TWNv" + Regex.Replace(fileVersion.Replace(".", ""), "^0*", "") + "]"
741
742         '書式指定文字列エラーチェック
743         Try
744             If DateTime.Now.ToString(SettingDialog.DateTimeFormat).Length = 0 Then
745                 ' このブロックは絶対に実行されないはず
746                 ' 変換が成功した場合にLengthが0にならない
747                 SettingDialog.DateTimeFormat = "yyyy/MM/dd H:mm:ss"
748             End If
749         Catch ex As FormatException
750             ' FormatExceptionが発生したら初期値を設定 (=yyyy/MM/dd H:mm:ssとみなされる)
751             SettingDialog.DateTimeFormat = "yyyy/MM/dd H:mm:ss"
752         End Try
753
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
759
760         SettingDialog.BlinkNewMentions = _cfgCommon.BlinkNewMentions
761
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
770         'End If
771         SettingDialog.UserstreamStartup = _cfgCommon.UserstreamStartup
772         SettingDialog.UserstreamPeriodInt = _cfgCommon.UserstreamPeriod
773
774         'ハッシュタグ関連
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
782
783         _initial = True
784
785         Dim saveRequired As Boolean = False
786         'ユーザー名、パスワードが未設定なら設定画面を表示(初回起動時など)
787         If tw.Username = "" Then
788             saveRequired = True
789             '設定せずにキャンセルされた場合はプログラム終了
790             If SettingDialog.ShowDialog() = Windows.Forms.DialogResult.Cancel Then
791                 Application.Exit()  '強制終了
792                 Exit Sub
793             End If
794             '設定されたが、依然ユーザー名とパスワードが未設定ならプログラム終了
795             If tw.Username = "" Then
796                 Application.Exit()  '強制終了
797                 Exit Sub
798             End If
799             '新しい設定を反映
800             'フォント&文字色&背景色保持
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)
846
847             If SettingDialog.IsMonospace Then
848                 detailHtmlFormatHeader = detailHtmlFormatMono1
849                 detailHtmlFormatFooter = detailHtmlFormatMono7
850             Else
851                 detailHtmlFormatHeader = detailHtmlFormat1
852                 detailHtmlFormatFooter = detailHtmlFormat7
853             End If
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
857             Else
858                 detailHtmlFormatHeader += detailHtmlFormat6
859             End If
860             '他の設定項目は、随時設定画面で保持している値を読み出して使用
861         End If
862
863         If SettingDialog.HotkeyEnabled Then
864             '''グローバルホットキーの登録
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
870
871             _hookGlobalHotkey.RegisterOriginalHotkey(SettingDialog.HotkeyKey, SettingDialog.HotkeyValue, modKey)
872         End If
873
874         'Twitter用通信クラス初期化
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
895
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
903         End Select
904
905         '画像投稿サービス
906         SetImageServiceCombo()
907         ImageSelectionPanel.Enabled = False
908
909         'ウィンドウ設定
910         Me.ClientSize = _cfgLocal.FormSize
911         _mySize = _cfgLocal.FormSize                     'サイズ保持(最小化・最大化されたまま終了した場合の対応用)
912         _myLoc = _cfgLocal.FormLocation
913         'タイトルバー領域
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
921                         outOfScreen = False
922                         Exit For
923                     End If
924                 Next
925                 If outOfScreen Then
926                     Me.DesktopLocation = New Point(0, 0)
927                     _myLoc = Me.DesktopLocation
928                 End If
929             End If
930         End If
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
939         End If
940         MultiLineMenuItem.Checked = _cfgLocal.StatusMultiline
941         'Me.Tween_ClientSizeChanged(Me, Nothing)
942         PlaySoundMenuItem.Checked = SettingDialog.PlaySound
943         Me.PlaySoundFileMenuItem.Checked = SettingDialog.PlaySound
944         '入力欄
945         StatusText.Font = _fntInputFont
946         StatusText.ForeColor = _clInputFont
947
948         '全新着通知のチェック状態により、Reply&DMの新着通知有効無効切り替え(タブ別設定にするため削除予定)
949         If SettingDialog.UnreadManage = False Then
950             ReadedStripMenuItem.Enabled = False
951             UnreadStripMenuItem.Enabled = False
952         End If
953
954         'タイマー設定
955         TimerTimeline.AutoReset = True
956         TimerTimeline.SynchronizingObject = Me
957         'Recent取得間隔
958         TimerTimeline.Interval = 1000
959         TimerTimeline.Enabled = True
960
961         '更新中アイコンアニメーション間隔
962         TimerRefreshIcon.Interval = 200
963         TimerRefreshIcon.Enabled = True
964
965         '状態表示部の初期化(画面右下)
966         StatusLabel.Text = ""
967         StatusLabel.AutoToolTip = False
968         StatusLabel.ToolTipText = ""
969         '文字カウンタ初期化
970         lblLen.Text = GetRestStatusCount(True, False).ToString()
971
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:プロテクト・フィルターマーク
977                 'ソートしない
978                 mode = IdComparerClass.ComparerMode.Id  'Idソートに読み替え
979             Case 1  'ニックネーム
980                 mode = IdComparerClass.ComparerMode.Nickname
981             Case 2  '本文
982                 mode = IdComparerClass.ComparerMode.Data
983             Case 3  '時刻=発言Id
984                 mode = IdComparerClass.ComparerMode.Id
985             Case 4  '名前
986                 mode = IdComparerClass.ComparerMode.Name
987             Case 7  'Source
988                 mode = IdComparerClass.ComparerMode.Source
989         End Select
990         _statuses.SortMode = mode
991         ''''''''''''''''''''''''''''''''''''''''
992
993         Select Case SettingDialog.IconSz
994             Case IconSizes.IconNone
995                 _iconSz = 0
996             Case IconSizes.Icon16
997                 _iconSz = 16
998             Case IconSizes.Icon24
999                 _iconSz = 26
1000             Case IconSizes.Icon48
1001                 _iconSz = 48
1002             Case IconSizes.Icon48_2
1003                 _iconSz = 48
1004                 _iconCol = True
1005         End Select
1006         If _iconSz = 0 Then
1007             tw.GetIcon = False
1008         Else
1009             tw.GetIcon = True
1010             tw.IconSize = _iconSz
1011         End If
1012         tw.TinyUrlResolve = SettingDialog.TinyUrlResolve
1013
1014         '発言詳細部アイコンをリストアイコンにサイズ変更
1015         Dim sz As Integer = _iconSz
1016         If _iconSz = 0 Then
1017             sz = 16
1018         End If
1019
1020         'アイコンリスト作成
1021         TIconDic = New ImageDictionary(5000)
1022
1023         tw.DetailIcon = TIconDic
1024
1025         StatusLabel.Text = My.Resources.Form1_LoadText1       '画面右下の状態表示を変更
1026         StatusLabelUrl.Text = ""            '画面左下のリンク先URL表示部を初期化
1027         NameLabel.Text = ""                 '発言詳細部名前ラベル初期化
1028         DateTimeLabel.Text = ""             '発言詳細部日時ラベル初期化
1029         SourceLinkLabel.Text = ""           'Source部分初期化
1030
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)
1036             Else
1037                 _statuses.Tabs(DEFAULTTAB.RECENT).TabType = TabUsageType.Home
1038             End If
1039         End If
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)
1043             Else
1044                 _statuses.Tabs(DEFAULTTAB.REPLY).TabType = TabUsageType.Mentions
1045             End If
1046         End If
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)
1050             Else
1051                 _statuses.Tabs(DEFAULTTAB.DM).TabType = TabUsageType.DirectMessage
1052             End If
1053         End If
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)
1057             Else
1058                 _statuses.Tabs(DEFAULTTAB.FAV).TabType = TabUsageType.Favorites
1059             End If
1060         End If
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
1064             End If
1065             If Not AddNewTab(tn, True, _statuses.Tabs(tn).TabType) Then Throw New Exception("タブ作成エラー")
1066         Next
1067
1068         Me.JumpReadOpMenuItem.ShortcutKeyDisplayString = "Space"
1069         CopySTOTMenuItem.ShortcutKeyDisplayString = "Ctrl+C"
1070         CopyURLMenuItem.ShortcutKeyDisplayString = "Ctrl+Shift+C"
1071         CopyUserIdStripMenuItem.ShortcutKeyDisplayString = "Shift+Alt+C"
1072
1073         If SettingDialog.MinimizeToTray = False OrElse Me.WindowState <> FormWindowState.Minimized Then
1074             Me.Visible = True
1075         End If
1076         _curTab = ListTab.SelectedTab
1077         _curItemIndex = -1
1078         _curList = DirectCast(_curTab.Tag, DetailsListView)
1079         SetMainWindowTitle()
1080         SetNotifyIconText()
1081
1082         If SettingDialog.TabIconDisp Then
1083             ListTab.DrawMode = TabDrawMode.Normal
1084         Else
1085             ListTab.DrawMode = TabDrawMode.OwnerDrawFixed
1086             AddHandler ListTab.DrawItem, AddressOf ListTab_DrawItem
1087             ListTab.ImageList = Nothing
1088         End If
1089
1090         _ignoreConfigSave = False
1091         Me.TweenMain_Resize(Nothing, Nothing)
1092         If saveRequired Then SaveConfigsAll(False)
1093     End Sub
1094
1095     Private Sub spaceKeyCanceler_SpaceCancel(ByVal sender As Object, ByVal e As EventArgs)
1096         JumpUnreadMenuItem_Click(Nothing, Nothing)
1097     End Sub
1098
1099     Private Sub ListTab_DrawItem( _
1100             ByVal sender As Object, ByVal e As DrawItemEventArgs)
1101         Dim txt As String
1102         Try
1103             txt = ListTab.TabPages(e.Index).Text
1104         Catch ex As Exception
1105             Exit Sub
1106         End Try
1107
1108         e.Graphics.FillRectangle(System.Drawing.SystemBrushes.Control, e.Bounds)
1109         If e.State = DrawItemState.Selected Then
1110             e.DrawFocusRectangle()
1111         End If
1112         Dim fore As Brush
1113         Try
1114             If _statuses.Tabs(txt).UnreadCount > 0 Then
1115                 fore = Brushes.Red
1116             Else
1117                 fore = System.Drawing.SystemBrushes.ControlText
1118             End If
1119         Catch ex As Exception
1120             fore = System.Drawing.SystemBrushes.ControlText
1121         End Try
1122         e.Graphics.DrawString(txt, e.Font, fore, e.Bounds, sfTab)
1123     End Sub
1124
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
1139     '                tabSetting.Save()
1140     '                needToSave = True
1141     '            End If
1142     '        Next
1143     '    Else
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)
1148     '    End If
1149     '    If needToSave Then
1150     '        _cfgCommon.TabList.Clear()
1151     '        For Each tabName As String In _statuses.Tabs.Keys
1152     '            _cfgCommon.TabList.Add(tabName)
1153     '        Next
1154     '        _cfgCommon.Save()
1155     '    End If
1156
1157     '    If System.IO.File.Exists(SettingCommon.GetSettingFilePath("")) Then
1158     '        Return True
1159     '    Else
1160     '        Return False
1161     '    End If
1162     'End Function
1163
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)
1171         Next
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)
1177         End If
1178     End Sub
1179
1180     'Private Sub ConvertConfig()
1181     '    '新タブ設定ファイル存在チェック
1182     '    If System.IO.File.Exists(SettingTabs.GetSettingFilePath("")) Then
1183     '        LoadConfig()
1184     '        Exit Sub
1185     '    End If
1186     '    'LoadOldConfig()
1187     'End Sub
1188
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
1196
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)
1203
1204         ''タイマー初期化
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, "")
1213         End If
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, "")
1217         End If
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, "")
1221         End If
1222         If pubSearchCounter <= 0 AndAlso SettingDialog.PubSearchPeriodInt > 0 Then
1223             Interlocked.Exchange(pubSearchCounter, SettingDialog.PubSearchPeriodInt)
1224             GetTimeline(WORKERTYPE.PublicSearch, 1, 0, "")
1225         End If
1226         If listsCounter <= 0 AndAlso SettingDialog.ListsPeriodInt > 0 Then
1227             Interlocked.Exchange(listsCounter, SettingDialog.ListsPeriodInt)
1228             GetTimeline(WORKERTYPE.List, 1, 0, "")
1229         End If
1230         If usCounter <= 0 AndAlso SettingDialog.UserstreamPeriodInt > 0 Then
1231             Interlocked.Exchange(usCounter, SettingDialog.UserstreamPeriodInt)
1232             If Me._isActiveUserstream Then RefreshTimeline(True)
1233         End If
1234
1235     End Sub
1236
1237     Private Sub RefreshTimeline(ByVal isUserStream As Boolean)
1238         'スクロール制御準備
1239         Dim smode As Integer = -1    '-1:制御しない,-2:最新へ,その他:topitem使用
1240         Dim topId As Long = GetScrollPos(smode)
1241         Dim befCnt As Integer = _curList.VirtualListSize
1242
1243         '現在の選択状態を退避
1244         Dim selId As New Dictionary(Of String, Long())
1245         Dim focusedId As New Dictionary(Of String, Long)
1246         SaveSelectedStatus(selId, focusedId)
1247
1248         'mentionsの更新前件数を保持
1249         Dim dmCount As Integer = _statuses.GetTabByType(TabUsageType.DirectMessage).AllCount
1250
1251         '更新確定
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)
1257
1258         If _endingFlag Then Exit Sub
1259
1260         'リストに反映&選択状態復元
1261         Try
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)
1265                 lst.BeginUpdate()
1266                 If lst.VirtualListSize <> tabInfo.AllCount Then
1267                     If lst.Equals(_curList) Then
1268                         _itemCache = Nothing
1269                         _postCache = Nothing
1270                     End If
1271                     Try
1272                         lst.VirtualListSize = tabInfo.AllCount 'リスト件数更新
1273                     Catch ex As Exception
1274                         'アイコン描画不具合あり?
1275                     End Try
1276                     Me.SelectListItem(lst, _
1277                                       _statuses.IndexOf(tab.Text, selId(tab.Text)), _
1278                                       _statuses.IndexOf(tab.Text, focusedId(tab.Text)))
1279                 End If
1280                 lst.EndUpdate()
1281                 If tabInfo.UnreadCount > 0 Then
1282                     If SettingDialog.TabIconDisp Then
1283                         If tab.ImageIndex = -1 Then tab.ImageIndex = 0 'タブアイコン
1284                     End If
1285                 End If
1286             Next
1287             If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
1288         Catch ex As Exception
1289             'ex.Data("Msg") = "Ref1, UseAPI=" + SettingDialog.UseAPI.ToString
1290             'Throw
1291         End Try
1292
1293         'スクロール制御後処理
1294         Try
1295             If befCnt <> _curList.VirtualListSize Then
1296                 Select Case smode
1297                     Case -3
1298                         '最上行
1299                         _curList.EnsureVisible(0)
1300                     Case -2
1301                         '最下行へ
1302                         If _curList.VirtualListSize > 0 Then _curList.EnsureVisible(_curList.VirtualListSize - 1)
1303                     Case -1
1304                         '制御しない
1305                     Case Else
1306                         '表示位置キープ
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))
1310                         End If
1311                 End Select
1312             End If
1313         Catch ex As Exception
1314             ex.Data("Msg") = "Ref2"
1315             Throw
1316         End Try
1317
1318         '新着通知
1319         NotifyNewPosts(notifyPosts,
1320                        soundFile,
1321                        addCount,
1322                        isMention OrElse dmCount <> _statuses.GetTabByType(TabUsageType.DirectMessage).AllCount)
1323
1324         SetMainWindowTitle()
1325         If Not StatusLabelUrl.Text.StartsWith("http") Then SetStatusLabelUrl()
1326
1327         HashSupl.AddRangeItem(tw.GetHashList)
1328
1329     End Sub
1330
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
1336                     'Id昇順
1337                     If ListLockMenuItem.Checked Then
1338                         '制御しない
1339                         'smode = -1
1340                         '現在表示位置へ強制スクロール
1341                         If _curList.TopItem IsNot Nothing Then topId = _statuses.GetId(_curTab.Text, _curList.TopItem.Index)
1342                         smode = 0
1343                     Else
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
1349                             smode = -2
1350                         Else
1351                             'smode = -1
1352                             If _curList.TopItem IsNot Nothing Then topId = _statuses.GetId(_curTab.Text, _curList.TopItem.Index)
1353                             smode = 0
1354                         End If
1355                     End If
1356                 Else
1357                     'Id降順
1358                     If ListLockMenuItem.Checked Then
1359                         '現在表示位置へ強制スクロール
1360                         If _curList.TopItem IsNot Nothing Then topId = _statuses.GetId(_curTab.Text, _curList.TopItem.Index)
1361                         smode = 0
1362                     Else
1363                         '最上行が表示されていたら、制御しない。最上行が表示されていなかったら、現在表示位置へ強制スクロール
1364                         Dim _item As ListViewItem
1365
1366                         _item = _curList.GetItemAt(0, 10)     '一番上
1367                         If _item Is Nothing Then _item = _curList.Items(0)
1368                         If _item.Index = 0 Then
1369                             smode = -3  '最上行
1370                         Else
1371                             If _curList.TopItem IsNot Nothing Then topId = _statuses.GetId(_curTab.Text, _curList.TopItem.Index)
1372                             smode = 0
1373                         End If
1374                     End If
1375                 End If
1376             Else
1377                 '現在表示位置へ強制スクロール
1378                 If _curList.TopItem IsNot Nothing Then topId = _statuses.GetId(_curTab.Text, _curList.TopItem.Index)
1379                 smode = 0
1380             End If
1381         Else
1382             smode = -1
1383         End If
1384         Return topId
1385     End Function
1386
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))
1393             Else
1394                 selId.Add(tab.Text, New Long(0) {-1})
1395             End If
1396             If lst.FocusedItem IsNot Nothing Then
1397                 focusedId.Add(tab.Text, _statuses.GetId(tab.Text, lst.FocusedItem.Index))
1398             Else
1399                 focusedId.Add(tab.Text, -1)
1400             End If
1401         Next
1402
1403     End Sub
1404
1405     Private Sub NotifyNewPosts(ByVal notifyPosts() As PostClass, ByVal soundFile As String, ByVal addCount As Integer, ByVal newMentions As Boolean)
1406         '新着通知
1407         If ( _
1408                 NewPostPopMenuItem.Checked AndAlso _
1409                 notifyPosts IsNot Nothing AndAlso _
1410                 notifyPosts.Length > 0 AndAlso _
1411                 Not _initial AndAlso _
1412                 ( _
1413                     ( _
1414                         SettingDialog.LimitBalloon AndAlso _
1415                         ( _
1416                             Me.WindowState = FormWindowState.Minimized OrElse _
1417                             Not Me.Visible OrElse _
1418                             Form.ActiveForm Is Nothing _
1419                         ) _
1420                     ) OrElse _
1421                     Not SettingDialog.LimitBalloon _
1422                 ) _
1423             ) AndAlso _
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(" : ")
1437                 End Select
1438                 sb.Append(post.Data)
1439             Next
1440             If SettingDialog.DispUsername Then NotifyIcon1.BalloonTipTitle = tw.Username + " - " Else NotifyIcon1.BalloonTipTitle = ""
1441             If dm Then
1442                 NotifyIcon1.BalloonTipIcon = ToolTipIcon.Warning
1443                 NotifyIcon1.BalloonTipTitle += "Tween [DM] " + My.Resources.RefreshDirectMessageText1 + " " + addCount.ToString() + My.Resources.RefreshDirectMessageText2
1444             ElseIf reply Then
1445                 NotifyIcon1.BalloonTipIcon = ToolTipIcon.Warning
1446                 NotifyIcon1.BalloonTipTitle += "Tween [Reply!] " + My.Resources.RefreshTimelineText1 + " " + addCount.ToString() + My.Resources.RefreshTimelineText2
1447             Else
1448                 NotifyIcon1.BalloonTipIcon = ToolTipIcon.Info
1449                 NotifyIcon1.BalloonTipTitle += "Tween " + My.Resources.RefreshTimelineText1 + " " + addCount.ToString() + My.Resources.RefreshTimelineText2
1450             End If
1451             Dim bText As String = sb.ToString
1452             If String.IsNullOrEmpty(bText) Then Exit Sub
1453             NotifyIcon1.BalloonTipText = sb.ToString()
1454             NotifyIcon1.ShowBalloonTip(500)
1455         End If
1456
1457         'サウンド再生
1458         If Not _initial AndAlso SettingDialog.PlaySound AndAlso soundFile <> "" Then
1459             Try
1460                 Dim dir As String = My.Application.Info.DirectoryPath
1461                 If Directory.Exists(Path.Combine(dir, "Sounds")) Then
1462                     dir = Path.Combine(dir, "Sounds")
1463                 End If
1464                 My.Computer.Audio.Play(Path.Combine(dir, soundFile), AudioPlayMode.Background)
1465             Catch ex As Exception
1466
1467             End Try
1468         End If
1469
1470         'mentions新着時に画面ブリンク
1471         If Not _initial AndAlso SettingDialog.BlinkNewMentions AndAlso newMentions AndAlso Form.ActiveForm Is Nothing Then
1472             FlashMyWindow(Me.Handle, FlashSpecification.FlashTray, 3)
1473         End If
1474     End Sub
1475
1476
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
1480
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が発生することを期待
1486         'キャッシュの書き換え
1487         ChangeCacheStyleRead(True, _curItemIndex, _curTab)   '既読へ(フォント、文字色)
1488
1489         'ColorizeList(-1)    '全キャッシュ更新(背景色)
1490         'DispSelectedPost()
1491         ColorizeList()
1492         _colorize = True
1493     End Sub
1494
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
1500
1501         '対象の特定
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)
1507         Else
1508             itm = DirectCast(Tab.Tag, DetailsListView).Items(Index)
1509             post = _statuses.Item(Tab.Text, Index)
1510         End If
1511
1512         ChangeItemStyleRead(Read, itm, post, DirectCast(Tab.Tag, DetailsListView))
1513     End Sub
1514
1515     Private Sub ChangeItemStyleRead(ByVal Read As Boolean, ByVal Item As ListViewItem, ByVal Post As PostClass, ByVal DList As DetailsListView)
1516         Dim fnt As Font
1517         'フォント
1518         If Read Then
1519             fnt = _fntReaded
1520             Item.SubItems(5).Text = ""
1521         Else
1522             fnt = _fntUnread
1523             Item.SubItems(5).Text = "★"
1524         End If
1525         '文字色
1526         Dim cl As Color
1527         If Post.IsFav Then
1528             cl = _clFav
1529         ElseIf Post.RetweetedId > 0 Then
1530             cl = _clRetweet
1531         ElseIf Post.IsOwl AndAlso (Post.IsDm OrElse SettingDialog.OneWayLove) Then
1532             cl = _clOWL
1533         ElseIf Read OrElse Not SettingDialog.UseUnreadStyle Then
1534             cl = _clReaded
1535         Else
1536             cl = _clUnread
1537         End If
1538         If DList Is Nothing OrElse Item.Index = -1 Then
1539             Item.ForeColor = cl
1540             If SettingDialog.UseUnreadStyle Then
1541                 Item.Font = fnt
1542             End If
1543         Else
1544             DList.Update()
1545             If SettingDialog.UseUnreadStyle Then
1546                 DList.ChangeItemFontAndColor(Item.Index, cl, fnt)
1547             Else
1548                 DList.ChangeItemForeColor(Item.Index, cl)
1549             End If
1550             'If _itemCache IsNot Nothing Then DList.RedrawItems(_itemCacheIndex, _itemCacheIndex + _itemCache.Length - 1, False)
1551         End If
1552     End Sub
1553
1554     Private Sub ColorizeList()
1555         'Index:更新対象のListviewItem.Index。Colorを返す。
1556         '-1は全キャッシュ。Colorは返さない(ダミーを戻す)
1557         Dim _post As PostClass
1558         If _anchorFlag Then
1559             _post = _anchorPost
1560         Else
1561             _post = _curPost
1562         End If
1563
1564         If _itemCache Is Nothing Then Exit Sub
1565
1566         If _post Is Nothing Then Exit Sub
1567
1568         Try
1569             For cnt As Integer = 0 To _itemCache.Length - 1
1570                 _curList.ChangeItemBackColor(_itemCacheIndex + cnt, JudgeColor(_post, _postCache(cnt)))
1571             Next
1572         Catch ex As Exception
1573         End Try
1574     End Sub
1575
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
1580         If _anchorFlag Then
1581             _post = _anchorPost
1582         Else
1583             _post = _curPost
1584         End If
1585
1586         Dim tPost As PostClass = GetCurTabPost(Index)
1587
1588         If _post Is Nothing Then Exit Sub
1589
1590         If Item.Index = -1 Then
1591             Item.BackColor = JudgeColor(_post, tPost)
1592         Else
1593             _curList.ChangeItemBackColor(Item.Index, JudgeColor(_post, tPost))
1594         End If
1595     End Sub
1596
1597     Private Function JudgeColor(ByVal BasePost As PostClass, ByVal TargetPost As PostClass) As Color
1598         Dim cl As Color
1599         If TargetPost.Id = BasePost.InReplyToId Then
1600             '@先
1601             cl = _clAtTo
1602         ElseIf TargetPost.IsMe Then
1603             '自分=発言者
1604             cl = _clSelf
1605         ElseIf TargetPost.IsReply Then
1606             '自分宛返信
1607             cl = _clAtSelf
1608         ElseIf BasePost.ReplyToList.Contains(TargetPost.Name.ToLower()) Then
1609             '返信先
1610             cl = _clAtFromTarget
1611         ElseIf TargetPost.ReplyToList.Contains(BasePost.Name.ToLower()) Then
1612             'その人への返信
1613             cl = _clAtTarget
1614         ElseIf TargetPost.Name.Equals(BasePost.Name, StringComparison.OrdinalIgnoreCase) Then
1615             '発言者
1616             cl = _clTarget
1617         Else
1618             'その他
1619             cl = _clListBackcolor
1620         End If
1621         Return cl
1622     End Function
1623
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
1627                 DoRefresh()
1628                 Exit Sub
1629             End If
1630         End If
1631
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),
1634                                                            "Retweet",
1635                                                            MessageBoxButtons.YesNoCancel,
1636                                                            MessageBoxIcon.Question)
1637             Select Case rtResult
1638                 Case Windows.Forms.DialogResult.Yes
1639                     doReTweetOfficial(False)
1640                     StatusText.Text = ""
1641                     Exit Sub
1642                 Case Windows.Forms.DialogResult.Cancel
1643                     Exit Sub
1644             End Select
1645         End If
1646
1647         _history(_history.Count - 1) = New PostingStatus(StatusText.Text.Trim, _reply_to_id, _reply_to_name)
1648
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)
1655         End If
1656         StatusText.SelectionStart = StatusText.Text.Length
1657         Dim args As New GetWorkerArg()
1658         args.page = 0
1659         args.endPage = 0
1660         args.type = WORKERTYPE.PostMessage
1661         CheckReplyTo(StatusText.Text)
1662
1663         '整形によって増加する文字数を取得
1664         Dim adjustCount As Integer = 0
1665         Dim tmpStatus As String = StatusText.Text.Trim
1666         If ToolStripMenuItemApiCommandEvasion.Checked Then
1667             ' APIコマンド回避
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
1672         End If
1673
1674         If ToolStripMenuItemUrlMultibyteSplit.Checked Then
1675             ' URLと全角文字の切り離し
1676             adjustCount += Regex.Matches(tmpStatus, "https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#^]+").Count
1677         End If
1678
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
1684         End If
1685         If SettingDialog.PostShiftEnter Then
1686             isRemoveFooter = My.Computer.Keyboard.CtrlKeyDown
1687         End If
1688         If Not isRemoveFooter AndAlso (StatusText.Text.Contains("RT @") OrElse StatusText.Text.Contains("QT @")) Then
1689             isRemoveFooter = True
1690         End If
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
1693                 isCutOff = True
1694                 If Not SettingDialog.UrlConvertAuto Then UrlConvertAutoToolStripMenuItem_Click(Nothing, Nothing)
1695                 If GetRestStatusCount(False, Not isRemoveFooter) - adjustCount < 0 Then
1696                     isRemoveFooter = True
1697                 End If
1698             Else
1699                 Exit Sub
1700             End If
1701         End If
1702
1703         Dim footer As String = ""
1704         Dim header As String = ""
1705         If StatusText.Text.StartsWith("D ") OrElse StatusText.Text.StartsWith("d ") Then
1706             'DM時は何もつけない
1707             footer = ""
1708         Else
1709             'ハッシュタグ
1710             If HashMgr.UseHash <> "" Then
1711                 If HashMgr.IsHead Then
1712                     header = HashMgr.UseHash + " "
1713                 Else
1714                     footer = " " + HashMgr.UseHash
1715                 End If
1716             End If
1717             If Not isRemoveFooter Then
1718                 If SettingDialog.UseRecommendStatus Then
1719                     ' 推奨ステータスを使用する
1720                     footer += SettingDialog.RecommendStatusText
1721                 Else
1722                     ' テキストボックスに入力されている文字列を使用する
1723                     footer += " " + SettingDialog.Status.Trim
1724                 End If
1725             End If
1726         End If
1727         args.status.status = header + StatusText.Text.Trim + footer
1728
1729         If ToolStripMenuItemApiCommandEvasion.Checked Then
1730             ' APIコマンド回避
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 += " ."
1735         End If
1736
1737         If ToolStripMenuItemUrlMultibyteSplit.Checked Then
1738             ' URLと全角文字の切り離し
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;\/?:\@&=+\$,%#^]+", "$& ")
1741         End If
1742
1743         If IdeographicSpaceToSpaceToolStripMenuItem.Checked Then
1744             ' 文中の全角スペースを半角スペース1個にする
1745             args.status.status = args.status.status.Replace(" ", " ")
1746         End If
1747
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)
1755             If mc.Success Then
1756                 'さらに@ID、ハッシュタグ、URLと推測される文字列をカットする
1757                 args.status.status = args.status.status.Substring(0, 140 - mc.Value.Length)
1758             End If
1759             If MessageBox.Show(args.status.status, "Post or Cancel?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then Exit Sub
1760         End If
1761
1762         args.status.inReplyToId = _reply_to_id
1763         args.status.inReplyToName = _reply_to_name
1764         If ImageSelectionPanel.Visible Then
1765             '画像投稿
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
1780                         _curList.Focus()
1781                     End If
1782                     Exit Sub
1783                 End If
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
1793                     _curList.Focus()
1794                 End If
1795             Else
1796                 MessageBox.Show(My.Resources.PostPictureWarn1, My.Resources.PostPictureWarn2)
1797                 Exit Sub
1798             End If
1799         End If
1800
1801         RunAsync(args)
1802
1803         'Google検索(試験実装)
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)))
1806             OpenUriAsync(tmp)
1807         End If
1808
1809         _reply_to_id = 0
1810         _reply_to_name = ""
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()
1816         End If
1817         urlUndoBuffer = Nothing
1818         UrlUndoToolStripMenuItem.Enabled = False  'Undoをできないように設定
1819     End Sub
1820
1821     Private Sub EndToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EndToolStripMenuItem.Click, EndFileMenuItem.Click
1822         _endingFlag = True
1823         Me.Close()
1824     End Sub
1825
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:フォームの×ボタン
1829             e.Cancel = True
1830             Me.Visible = False
1831         Else
1832             _hookGlobalHotkey.UnregisterAllOriginalHotkey()
1833             _ignoreConfigSave = True
1834             _endingFlag = True
1835             TimerTimeline.Enabled = False
1836             TimerRefreshIcon.Enabled = False
1837         End If
1838     End Sub
1839
1840     Private Sub NotifyIcon1_BalloonTipClicked(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NotifyIcon1.BalloonTipClicked
1841         Me.Visible = True
1842         If Me.WindowState = FormWindowState.Minimized Then
1843             Me.WindowState = FormWindowState.Normal
1844         End If
1845         Me.Activate()
1846     End Sub
1847
1848     Private Shared Function CheckAccountValid() As Boolean
1849         Static errorCount As Integer = 0
1850         If Twitter.AccountState <> ACCOUNT_STATE.Valid Then
1851             errorCount += 1
1852             If errorCount > 5 Then
1853                 errorCount = 0
1854                 Twitter.AccountState = ACCOUNT_STATE.Valid
1855                 Return True
1856             End If
1857             Return False
1858         End If
1859         errorCount = 0
1860         Return True
1861     End Function
1862
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
1866             e.Cancel = True
1867             Exit Sub
1868         End If
1869
1870         Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.BelowNormal
1871
1872         My.Application.InitCulture()
1873
1874         Dim ret As String = ""
1875         Dim rslt As New GetWorkerResult()
1876
1877         Dim read As Boolean = Not SettingDialog.UnreadManage
1878         If _initial AndAlso SettingDialog.UnreadManage Then read = SettingDialog.Readed
1879
1880         Dim args As GetWorkerArg = DirectCast(e.Argument, GetWorkerArg)
1881
1882         If Not CheckAccountValid() Then
1883             rslt.retMsg = "Auth error. Check your account"
1884             rslt.type = WORKERTYPE.ErrorState  'エラー表示のみ行ない、後処理キャンセル
1885             rslt.tName = args.tName
1886             e.Result = rslt
1887             Exit Sub
1888         End If
1889
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)
1895                 '新着時未読クリア
1896                 If ret = "" AndAlso args.type = WORKERTYPE.Timeline AndAlso SettingDialog.ReadOldPosts Then
1897                     _statuses.SetRead()
1898                 End If
1899                 '振り分け
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
1907                 'スレッド処理はしない
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))
1914                         Else
1915                             post = _statuses.Item(args.ids(i))
1916                         End If
1917                         args.page = i + 1
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)
1922                             Else
1923                                 ret = tw.PostFavAdd(post.RetweetedId)
1924                             End If
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)
1932                                 Else
1933                                     '検索・リストタブからのfavで、TLでも取得済みならfav反映
1934                                     If _statuses.ContainsKey(post.Id) Then
1935                                         Dim postTl As PostClass = _statuses.Item(post.Id)
1936                                         postTl.IsFav = True
1937                                         _statuses.GetTabByType(TabUsageType.Favorites).Add(postTl.Id, postTl.IsRead, False)
1938                                     End If
1939                                 End If
1940                                 '検索、リストタブに反映
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
1943                                 Next
1944                             End If
1945                         End If
1946                     Next
1947                 End If
1948                 rslt.sIds = args.sIds
1949             Case WORKERTYPE.FavRemove
1950                 'スレッド処理はしない
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))
1957                         Else
1958                             post = _statuses.Item(args.ids(i))
1959                         End If
1960                         args.page = i + 1
1961                         bw.ReportProgress(50, MakeStatusMessage(args, False))
1962                         If post.IsFav Then
1963                             If post.RetweetedId = 0 Then
1964                                 ret = tw.PostFavRemove(post.Id)
1965                             Else
1966                                 ret = tw.PostFavRemove(post.RetweetedId)
1967                             End If
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
1972                                 '検索,リストタブに反映
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
1975                                 Next
1976                             End If
1977                         End If
1978                     Next
1979                 End If
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
1994                             Exit For
1995                         End If
1996                     Next
1997                 Else
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)
2001                 End If
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)
2008                 Next
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)
2015
2016                 Try
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)
2024                             End If
2025                             myPath = arg + " " + myPath
2026                             System.Diagnostics.Process.Start(browserPath, myPath)
2027                         Else
2028                             System.Diagnostics.Process.Start(SettingDialog.BrowserPath, myPath)
2029                         End If
2030                     Else
2031                         System.Diagnostics.Process.Start(myPath)
2032                     End If
2033                 Catch ex As Exception
2034                     '                MessageBox.Show("ブラウザの起動に失敗、またはタイムアウトしました。" + ex.ToString())
2035                 End Try
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)
2045                     Next
2046                 Else
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)
2052                         End If
2053                     End If
2054                 End If
2055                 '振り分け
2056                 rslt.addCount = _statuses.DistributePosts()
2057             Case WORKERTYPE.List
2058                 bw.ReportProgress(50, MakeStatusMessage(args, False))
2059                 If args.tName = "" Then
2060                     '定期更新
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)
2063                     Next
2064                 Else
2065                     '手動更新(特定タブのみ更新)
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)
2069                     End If
2070                 End If
2071                 '振り分け
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()
2078         End Select
2079         'キャンセル要求
2080         If bw.CancellationPending Then
2081             e.Cancel = True
2082             Exit Sub
2083         End If
2084
2085         '時速表示用
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)
2091                 End If
2092             Next
2093         End If
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
2099                 Else
2100                     _tlTimestamps.Add(Now, rslt.addCount)
2101                 End If
2102                 Dim oneHour As Date = Now.Subtract(New TimeSpan(1, 0, 0))
2103                 Dim keys As New List(Of Date)
2104                 _tlCount = 0
2105                 For Each key As Date In _tlTimestamps.Keys
2106                     If key.CompareTo(oneHour) < 0 Then
2107                         keys.Add(key)
2108                     Else
2109                         _tlCount += _tlTimestamps(key)
2110                     End If
2111                 Next
2112                 For Each key As Date In keys
2113                     _tlTimestamps.Remove(key)
2114                 Next
2115                 keys.Clear()
2116             End SyncLock
2117         End If
2118
2119         '終了ステータス
2120         If args.type <> WORKERTYPE.OpenUri Then bw.ReportProgress(100, MakeStatusMessage(args, True)) 'ステータス書き換え、Notifyアイコンアニメーション開始
2121
2122         rslt.retMsg = ret
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ページ毎の継続確認
2131         End If
2132
2133         e.Result = rslt
2134     End Sub
2135
2136     Private Function MakeStatusMessage(ByVal AsyncArg As GetWorkerArg, ByVal Finish As Boolean) As String
2137         Dim smsg As String = ""
2138         If Not Finish Then
2139             '継続中メッセージ
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..."
2161             End Select
2162         Else
2163             '完了メッセージ
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
2174                     '進捗メッセージ残す
2175                 Case WORKERTYPE.FavRemove
2176                     '進捗メッセージ残す
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"
2187             End Select
2188         End If
2189         Return smsg
2190     End Function
2191
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
2195             '発言投稿
2196             If e.ProgressPercentage = 200 Then    '開始
2197                 StatusLabel.Text = "Posting..."
2198             End If
2199             If e.ProgressPercentage = 300 Then  '終了
2200                 StatusLabel.Text = My.Resources.PostWorker_RunWorkerCompletedText4
2201             End If
2202         Else
2203             Dim smsg As String = DirectCast(e.UserState, String)
2204             If smsg.Length > 0 Then StatusLabel.Text = smsg
2205         End If
2206     End Sub
2207
2208     Private Sub GetTimelineWorker_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
2209
2210         If _endingFlag OrElse e.Cancelled Then Exit Sub 'キャンセル
2211
2212         If e.Error IsNot Nothing Then
2213             _myStatusError = True
2214             _waitTimeline = False
2215             _waitReply = False
2216             _waitDm = False
2217             _waitFav = False
2218             _waitPubSearch = False
2219             _waitLists = False
2220             Throw New Exception("BackgroundWorker Exception", e.Error)
2221             Exit Sub
2222         End If
2223
2224         Dim rslt As GetWorkerResult = DirectCast(e.Result, GetWorkerResult)
2225
2226         If rslt.type = WORKERTYPE.OpenUri Then Exit Sub
2227
2228         'エラー
2229         If rslt.retMsg.Length > 0 Then
2230             _myStatusError = True
2231             StatusLabel.Text = rslt.retMsg
2232         End If
2233
2234         If rslt.type = WORKERTYPE.ErrorState Then Exit Sub
2235
2236         If rslt.type = WORKERTYPE.FavRemove Then
2237             DispSelectedPost()          ' 詳細画面書き直し
2238             Dim favTabName As String = _statuses.GetTabByType(TabUsageType.Favorites).TabName
2239             Dim fidx As Integer
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
2245                 Else
2246                     fidx = 0
2247                 End If
2248             End If
2249
2250             For Each i As Long In rslt.sIds
2251                 _statuses.RemoveFavPost(i)
2252             Next
2253             If _curTab IsNot Nothing AndAlso _curTab.Text.Equals(favTabName) Then
2254                 _itemCache = Nothing    'キャッシュ破棄
2255                 _postCache = Nothing
2256                 _curPost = Nothing
2257                 '_curItemIndex = -1
2258             End If
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
2262                     Exit For
2263                 End If
2264             Next
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)
2270                     Else
2271                         _curList.SelectedIndices.Add(_statuses.Tabs(favTabName).AllCount - 1)
2272                     End If
2273                     If _curList.SelectedIndices.Count > 0 Then
2274                         _curList.EnsureVisible(_curList.SelectedIndices(0))
2275                         _curList.FocusedItem = _curList.Items(_curList.SelectedIndices(0))
2276                     End If
2277                 End If
2278             End If
2279         End If
2280
2281         'リストに反映
2282         'Dim busy As Boolean = False
2283         'For Each bw As BackgroundWorker In _bw
2284         '    If bw IsNot Nothing AndAlso bw.IsBusy Then
2285         '        busy = True
2286         '        Exit For
2287         '    End If
2288         'Next
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) 'リスト反映
2302         End If
2303
2304         Select Case rslt.type
2305             Case WORKERTYPE.Timeline
2306                 _waitTimeline = False
2307                 If Not _initial Then
2308                     '    'API使用時の取得調整は別途考える(カウント調整?)
2309                 End If
2310             Case WORKERTYPE.Reply
2311                 _waitReply = False
2312                 If rslt.newDM AndAlso Not _initial Then
2313                     GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
2314                 End If
2315             Case WORKERTYPE.Favorites
2316                 _waitFav = False
2317             Case WORKERTYPE.DirectMessegeRcv
2318                 _waitDm = False
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
2323                         '色変えは不要
2324                     Else
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))
2328                                 If idx > -1 Then
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))
2334                                         Else
2335                                             post = _statuses.Item(rslt.sIds(i))
2336                                         End If
2337                                         ChangeCacheStyleRead(post.IsRead, idx, _curTab)
2338                                     End If
2339                                     If idx = _curItemIndex Then DispSelectedPost() '選択アイテム再表示
2340                                 End If
2341                             End If
2342                         Next
2343                     End If
2344                     _curList.EndUpdate()
2345                 End If
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)
2356                         End If
2357                     Next
2358
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
2364                     End If
2365                     SetMainWindowTitle()
2366                     rslt.retMsg = ""
2367                 Else
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()
2370                         args.page = 0
2371                         args.endPage = 0
2372                         args.type = WORKERTYPE.PostMessage
2373                         args.status = rslt.status
2374                         RunAsync(args)
2375                     Else
2376                         If ToolStripFocusLockMenuItem.Checked Then
2377                             '連投モードのときだけEnterイベントが起きないので強制的に背景色を戻す
2378                             StatusText_Enter(StatusText, New EventArgs)
2379                         End If
2380                     End If
2381                 End If
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)
2390                         End If
2391                     Next
2392                     If SettingDialog.PostAndGet Then GetTimeline(WORKERTYPE.Timeline, 1, 0, "")
2393                 End If
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
2402                 _waitLists = False
2403         End Select
2404
2405     End Sub
2406
2407     Private Sub GetTimeline(ByVal WkType As WORKERTYPE, ByVal fromPage As Integer, ByVal toPage As Integer, ByVal tabName As String)
2408
2409         If Not IsNetworkAvailable() Then Exit Sub
2410
2411         '非同期実行引数設定
2412         Dim args As New GetWorkerArg
2413         args.page = fromPage
2414         args.endPage = toPage
2415         args.type = WkType
2416         args.tName = tabName
2417
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
2423             RunAsync(args)
2424         End If
2425
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
2437         '    RunAsync(_args)
2438         'End If
2439     End Sub
2440
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
2443             Me.Visible = True
2444             If Me.WindowState = FormWindowState.Minimized Then
2445                 Me.WindowState = FormWindowState.Normal
2446             End If
2447             Me.Activate()
2448         End If
2449     End Sub
2450
2451     Private Sub MyList_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
2452         MakeReplyOrDirectStatus()
2453     End Sub
2454
2455     Private Sub FavAddToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FavAddToolStripMenuItem.Click, FavOpMenuItem.Click
2456         FavoriteChange(True)
2457     End Sub
2458
2459     Private Sub FavRemoveToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FavRemoveToolStripMenuItem.Click, UnFavOpMenuItem.Click
2460         FavoriteChange(False)
2461     End Sub
2462
2463
2464     Private Sub FavoriteRetweetMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FavoriteRetweetMenuItem.Click, FavoriteRetweetContextMenu.Click
2465         FavoritesRetweetOriginal()
2466     End Sub
2467
2468     Private Sub FavoriteRetweetUnofficialMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FavoriteRetweetUnofficialMenuItem.Click, FavoriteRetweetUnofficialContextMenu.Click
2469         FavoritesRetweetUnofficial()
2470     End Sub
2471
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
2475
2476         '複数fav確認msg
2477         If _curList.SelectedIndices.Count > 250 AndAlso FavAdd Then
2478             MessageBox.Show(My.Resources.FavoriteLimitCountText)
2479             _DoFavRetweetFlags = False
2480             Exit Sub
2481         ElseIf multiFavoriteChangeDialogEnable AndAlso _curList.SelectedIndices.Count > 1 Then
2482             If FavAdd 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
2488                     Exit Sub
2489                 End If
2490             Else
2491                 If MessageBox.Show(My.Resources.FavRemoveToolStripMenuItem_ClickText1, My.Resources.FavRemoveToolStripMenuItem_ClickText2, _
2492                                 MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then
2493                     Exit Sub
2494                 End If
2495             End If
2496         End If
2497
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
2502         If FavAdd Then
2503             args.type = WORKERTYPE.FavAdd
2504         Else
2505             args.type = WORKERTYPE.FavRemove
2506         End If
2507         For Each idx As Integer In _curList.SelectedIndices
2508             Dim post As PostClass = GetCurTabPost(idx)
2509             If FavAdd Then
2510                 If Not post.IsFav Then args.ids.Add(post.Id)
2511             Else
2512                 If post.IsFav Then args.ids.Add(post.Id)
2513             End If
2514         Next
2515         If args.ids.Count = 0 Then
2516             If FavAdd Then
2517                 StatusLabel.Text = My.Resources.FavAddToolStripMenuItem_ClickText4
2518             Else
2519                 StatusLabel.Text = My.Resources.FavRemoveToolStripMenuItem_ClickText4
2520             End If
2521             Exit Sub
2522         End If
2523
2524         RunAsync(args)
2525     End Sub
2526
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)
2530         Else
2531             Return _statuses.Item(_curTab.Text, Index)
2532         End If
2533     End Function
2534
2535
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/")
2541         End If
2542     End Sub
2543
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")
2547         End If
2548     End Sub
2549
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
2559                 End If
2560             End If
2561         End If
2562     End Sub
2563
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
2567         If _iconCol Then
2568             mode = IdComparerClass.ComparerMode.Id
2569         Else
2570             Select Case e.Column
2571                 Case 0, 5, 6    '0:アイコン,5:未読マーク,6:プロテクト・フィルターマーク
2572                     'ソートしない
2573                     Exit Sub
2574                 Case 1  'ニックネーム
2575                     mode = IdComparerClass.ComparerMode.Nickname
2576                 Case 2  '本文
2577                     mode = IdComparerClass.ComparerMode.Data
2578                 Case 3  '時刻=発言Id
2579                     mode = IdComparerClass.ComparerMode.Id
2580                 Case 4  '名前
2581                     mode = IdComparerClass.ComparerMode.Name
2582                 Case 7  'Source
2583                     mode = IdComparerClass.ComparerMode.Source
2584             End Select
2585         End If
2586         _statuses.ToggleSortOrder(mode)
2587         InitColumnText()
2588
2589         If _iconCol Then
2590             DirectCast(sender, DetailsListView).Columns.Item(0).Text = ColumnOrgText(0)
2591             DirectCast(sender, DetailsListView).Columns.Item(1).Text = ColumnText(2)
2592         Else
2593             For i As Integer = 0 To 7
2594                 DirectCast(sender, DetailsListView).Columns.Item(i).Text = ColumnOrgText(i)
2595             Next
2596             DirectCast(sender, DetailsListView).Columns.Item(e.Column).Text = ColumnText(e.Column)
2597         End If
2598
2599         _itemCache = Nothing
2600         _postCache = Nothing
2601
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)
2606         End If
2607         _curList.Refresh()
2608         _modifySettingCommon = True
2609     End Sub
2610
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
2615         End If
2616     End Sub
2617
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
2632         Else
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
2643         End If
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
2650
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
2657         Else
2658             FavAddToolStripMenuItem.Enabled = True
2659             FavRemoveToolStripMenuItem.Enabled = True
2660             StatusOpenMenuItem.Enabled = True
2661             FavorareMenuItem.Enabled = True
2662             ShowRelatedStatusesMenuItem.Enabled = True  'PublicSearchの時問題出るかも
2663
2664             If _curPost.IsMe Then
2665                 ReTweetOriginalStripMenuItem.Enabled = False
2666                 FavoriteRetweetContextMenu.Enabled = False
2667                 DeleteStripMenuItem.Enabled = True
2668             Else
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
2676                 Else
2677                     ReTweetOriginalStripMenuItem.Enabled = True
2678                     ReTweetStripMenuItem.Enabled = True
2679                     QuoteStripMenuItem.Enabled = True
2680                     FavoriteRetweetContextMenu.Enabled = True
2681                     FavoriteRetweetUnofficialContextMenu.Enabled = True
2682                 End If
2683             End If
2684         End If
2685         If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.Favorites Then
2686             RefreshMoreStripMenuItem.Enabled = True
2687         Else
2688             RefreshMoreStripMenuItem.Enabled = False
2689         End If
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
2694         Else
2695             RepliedStatusOpenMenuItem.Enabled = True
2696         End If
2697         If _curPost Is Nothing OrElse _curPost.RetweetedBy = "" Then
2698             MoveToRTHomeMenuItem.Enabled = False
2699         Else
2700             MoveToRTHomeMenuItem.Enabled = True
2701         End If
2702     End Sub
2703
2704     Private Sub ReplyStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReplyStripMenuItem.Click, ReplyOpMenuItem.Click
2705         MakeReplyOrDirectStatus(False, True)
2706     End Sub
2707
2708     Private Sub DMStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DMStripMenuItem.Click, DmOpMenuItem.Click
2709         MakeReplyOrDirectStatus(False, False)
2710     End Sub
2711
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
2719                     myPost = True
2720                     Exit For
2721                 End If
2722             Next
2723             If Not myPost Then Exit Sub
2724         Else
2725             If _curList.SelectedIndices.Count = 0 Then
2726                 Exit Sub
2727             End If
2728         End If
2729
2730         Dim tmp As String = String.Format(My.Resources.DeleteStripMenuItem_ClickText1, Environment.NewLine)
2731
2732         If MessageBox.Show(tmp, My.Resources.DeleteStripMenuItem_ClickText2, _
2733               MessageBoxButtons.OKCancel, _
2734               MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then Exit Sub
2735
2736         Dim fidx As Integer
2737         If _curList.FocusedItem IsNot Nothing Then
2738             fidx = _curList.FocusedItem.Index
2739         ElseIf _curList.TopItem IsNot Nothing Then
2740             fidx = _curList.TopItem.Index
2741         Else
2742             fidx = 0
2743         End If
2744
2745         Try
2746             Me.Cursor = Cursors.WaitCursor
2747
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))
2753                 Else
2754                     If _statuses.Item(Id).IsMe OrElse _statuses.Item(Id).RetweetedBy.ToLower = tw.Username.ToLower Then
2755                         rtn = tw.RemoveStatus(Id)
2756                     Else
2757                         Continue For
2758                     End If
2759                 End If
2760                 If rtn.Length > 0 Then
2761                     'エラー
2762                     rslt = False
2763                 Else
2764                     _statuses.RemovePost(Id)
2765                 End If
2766             Next
2767
2768             If Not rslt Then
2769                 StatusLabel.Text = My.Resources.DeleteStripMenuItem_ClickText3  '失敗
2770             Else
2771                 StatusLabel.Text = My.Resources.DeleteStripMenuItem_ClickText4  '成功
2772             End If
2773
2774             _itemCache = Nothing    'キャッシュ破棄
2775             _postCache = Nothing
2776             _curPost = Nothing
2777             _curItemIndex = -1
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)
2785                         Else
2786                             _curList.SelectedIndices.Add(_statuses.Tabs(tb.Text).AllCount - 1)
2787                         End If
2788                         If _curList.SelectedIndices.Count > 0 Then
2789                             _curList.EnsureVisible(_curList.SelectedIndices(0))
2790                             _curList.FocusedItem = _curList.Items(_curList.SelectedIndices(0))
2791                         End If
2792                     End If
2793                 End If
2794                 If _statuses.Tabs(tb.Text).UnreadCount = 0 Then
2795                     If SettingDialog.TabIconDisp Then
2796                         If tb.ImageIndex = 0 Then tb.ImageIndex = -1 'タブアイコン
2797                     End If
2798                 End If
2799             Next
2800             If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
2801         Finally
2802             Me.Cursor = Cursors.Default
2803         End Try
2804     End Sub
2805
2806     Private Sub DeleteStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DeleteStripMenuItem.Click, DelOpMenuItem.Click
2807         doStatusDelete()
2808     End Sub
2809
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)
2815             Next
2816         End If
2817         For Each idx As Integer In _curList.SelectedIndices
2818             ChangeCacheStyleRead(True, idx, _curTab)
2819         Next
2820         ColorizeList()
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 'タブアイコン
2826                 End If
2827             End If
2828         Next
2829         If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
2830     End Sub
2831
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)
2837             Next
2838         End If
2839         For Each idx As Integer In _curList.SelectedIndices
2840             ChangeCacheStyleRead(False, idx, _curTab)
2841         Next
2842         ColorizeList()
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 'タブアイコン
2848                 End If
2849             End If
2850         Next
2851         If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
2852     End Sub
2853
2854     Private Sub RefreshStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RefreshStripMenuItem.Click, RefreshOpMenuItem.Click
2855         DoRefresh()
2856     End Sub
2857
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
2868                     '' TODO
2869                 Case TabUsageType.PublicSearch
2870                     '' TODO
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
2875                     '' TODO
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)
2879                 Case Else
2880                     GetTimeline(WORKERTYPE.Timeline, 1, 0, "")
2881             End Select
2882         Else
2883             GetTimeline(WORKERTYPE.Timeline, 1, 0, "")
2884         End If
2885     End Sub
2886
2887     Private Sub DoRefreshMore()
2888         'ページ指定をマイナス1に
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
2898                     '' TODO
2899                 Case TabUsageType.PublicSearch
2900                     ' TODO
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
2905                     '' TODO
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)
2909                 Case Else
2910                     GetTimeline(WORKERTYPE.Timeline, -1, 0, "")
2911             End Select
2912         Else
2913             GetTimeline(WORKERTYPE.Timeline, -1, 0, "")
2914         End If
2915     End Sub
2916
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
2920
2921         Try
2922             result = SettingDialog.ShowDialog()
2923         Catch ex As Exception
2924             Exit Sub
2925         End Try
2926
2927         If result = Windows.Forms.DialogResult.OK Then
2928             SyncLock _syncObject
2929                 'Try
2930                 '    If SettingDialog.TimelinePeriodInt > 0 Then
2931                 '        _homeCounterAdjuster = 0
2932                 '    End If
2933                 'Catch ex As Exception
2934                 '    ex.Data("Instance") = "Set Timers"
2935                 '    ex.Data("IsTerminatePermission") = False
2936                 '    Throw
2937                 'End Try
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
2949
2950                 HttpConnection.InitializeConnection(SettingDialog.DefaultTimeOut, _
2951                                                     SettingDialog.SelectedProxyType, _
2952                                                     SettingDialog.ProxyAddress, _
2953                                                     SettingDialog.ProxyPort, _
2954                                                     SettingDialog.ProxyUser, _
2955                                                     SettingDialog.ProxyPassword)
2956                 Try
2957                     If SettingDialog.TabIconDisp Then
2958                         RemoveHandler ListTab.DrawItem, AddressOf ListTab_DrawItem
2959                         ListTab.DrawMode = TabDrawMode.Normal
2960                         ListTab.ImageList = Me.TabImage
2961                     Else
2962                         RemoveHandler ListTab.DrawItem, AddressOf ListTab_DrawItem
2963                         AddHandler ListTab.DrawItem, AddressOf ListTab_DrawItem
2964                         ListTab.DrawMode = TabDrawMode.OwnerDrawFixed
2965                         ListTab.ImageList = Nothing
2966                     End If
2967                 Catch ex As Exception
2968                     ex.Data("Instance") = "ListTab(TabIconDisp)"
2969                     ex.Data("IsTerminatePermission") = False
2970                     Throw
2971                 End Try
2972
2973                 Try
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
2980                             Next
2981                         End If
2982                     Else
2983                         ReadedStripMenuItem.Enabled = True
2984                         UnreadStripMenuItem.Enabled = True
2985                     End If
2986                 Catch ex As Exception
2987                     ex.Data("Instance") = "ListTab(UnreadManage)"
2988                     ex.Data("IsTerminatePermission") = False
2989                     Throw
2990                 End Try
2991
2992                 Try
2993                     For Each mytab As TabPage In ListTab.TabPages
2994                         Dim lst As DetailsListView = DirectCast(mytab.Tag, DetailsListView)
2995                         lst.GridLines = SettingDialog.ShowGrid
2996                     Next
2997                 Catch ex As Exception
2998                     ex.Data("Instance") = "ListTab(ShowGrid)"
2999                     ex.Data("IsTerminatePermission") = False
3000                     Throw
3001                 End Try
3002
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
3026                 Try
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)
3032                 End Try
3033
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)
3058                 Try
3059                     If SettingDialog.IsMonospace Then
3060                         detailHtmlFormatHeader = detailHtmlFormatMono1
3061                         detailHtmlFormatFooter = detailHtmlFormatMono7
3062                     Else
3063                         detailHtmlFormatHeader = detailHtmlFormat1
3064                         detailHtmlFormatFooter = detailHtmlFormat7
3065                     End If
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
3069                     Else
3070                         detailHtmlFormatHeader += detailHtmlFormat6
3071                     End If
3072                 Catch ex As Exception
3073                     ex.Data("Instance") = "Font"
3074                     ex.Data("IsTerminatePermission") = False
3075                     Throw
3076                 End Try
3077                 Try
3078                     _statuses.SetUnreadManage(SettingDialog.UnreadManage)
3079                 Catch ex As Exception
3080                     ex.Data("Instance") = "_statuses"
3081                     ex.Data("IsTerminatePermission") = False
3082                     Throw
3083                 End Try
3084
3085                 Try
3086                     For Each tb As TabPage In ListTab.TabPages
3087                         If SettingDialog.TabIconDisp Then
3088                             If _statuses.Tabs(tb.Text).UnreadCount = 0 Then
3089                                 tb.ImageIndex = -1
3090                             Else
3091                                 tb.ImageIndex = 0
3092                             End If
3093                         End If
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
3097                         End If
3098                     Next
3099                 Catch ex As Exception
3100                     ex.Data("Instance") = "ListTab(TabIconDisp no2)"
3101                     ex.Data("IsTerminatePermission") = False
3102                     Throw
3103                 End Try
3104                 SetMainWindowTitle()
3105                 SetNotifyIconText()
3106
3107                 _itemCache = Nothing
3108                 _postCache = Nothing
3109                 If _curList IsNot Nothing Then _curList.Refresh()
3110                 ListTab.Refresh()
3111
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
3119                 End Select
3120
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
3129
3130                     _hookGlobalHotkey.RegisterOriginalHotkey(SettingDialog.HotkeyKey, SettingDialog.HotkeyValue, modKey)
3131                 End If
3132
3133                 If uid <> tw.Username Then Me.doGetFollowersMenu()
3134
3135                 SetImageServiceCombo()
3136
3137                 Try
3138                     StatusText_TextChanged(Nothing, Nothing)
3139                 Catch ex As Exception
3140
3141                 End Try
3142             End SyncLock
3143         End If
3144
3145         Twitter.AccountState = ACCOUNT_STATE.Valid
3146
3147         Me.TopMost = SettingDialog.AlwaysTop
3148         SaveConfigsAll(False)
3149     End Sub
3150
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
3153             DispSelectedPost()
3154             OpenUriAsync(e.Url.OriginalString)
3155         End If
3156     End Sub
3157
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
3162             e.Cancel = True
3163
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
3166                 'ハッシュタグの場合は、タブで開く
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)
3172                 Exit Sub
3173             Else
3174                 OpenUriAsync(e.Url.OriginalString)
3175             End If
3176         End If
3177     End Sub
3178
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
3186                         Exit Sub
3187                     End If
3188                 Next
3189             End If
3190         Next
3191         'ユニークなタブ名生成
3192         Dim tabName As String = searchWord
3193         For i As Integer = 0 To 100
3194             If _statuses.ContainsTab(tabName) Then
3195                 tabName += "_"
3196             Else
3197                 Exit For
3198             End If
3199         Next
3200         'タブ追加
3201         AddNewTab(tabName, False, TabUsageType.PublicSearch)
3202         _statuses.AddTab(tabName, TabUsageType.PublicSearch, Nothing)
3203         '追加したタブをアクティブに
3204         ListTab.SelectedIndex = ListTab.TabPages.Count - 1
3205         '検索条件の設定
3206         Dim cmb As ComboBox = DirectCast(ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch"), ComboBox)
3207         cmb.Items.Add(searchWord)
3208         cmb.Text = searchWord
3209         SaveConfigsTabs()
3210         '検索実行
3211         Me.SearchButton_Click(ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch"), Nothing)
3212     End Sub
3213
3214     Public Function AddNewTab(ByVal tabName As String, ByVal startup As Boolean, ByVal tabType As TabUsageType) As Boolean
3215         '重複チェック
3216         For Each tb As TabPage In ListTab.TabPages
3217             If tb.Text = tabName Then Return False
3218         Next
3219
3220         '新規タブ名チェック
3221         If tabName = My.Resources.AddNewTabText1 Then Return False
3222
3223         'タブタイプ重複チェック
3224         If Not startup Then
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
3231             End If
3232         End If
3233
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()   'ソース
3244
3245         Dim cnt As Integer = ListTab.TabPages.Count
3246
3247         '''ToDo:Create and set controls follow tabtypes
3248
3249         Me.SplitContainer1.Panel1.SuspendLayout()
3250         Me.SplitContainer1.Panel2.SuspendLayout()
3251         Me.SplitContainer1.SuspendLayout()
3252         Me.ListTab.SuspendLayout()
3253         Me.SuspendLayout()
3254
3255         _tabPage.SuspendLayout()
3256
3257
3258
3259         ''' 検索関連の準備
3260         Dim pnl As Panel = Nothing
3261         If tabType = TabUsageType.PublicSearch Then
3262             pnl = New Panel
3263
3264             Dim lbl As New Label
3265             Dim cmb As New ComboBox
3266             Dim btn As New Button
3267             Dim cmbLang As New ComboBox
3268
3269             pnl.SuspendLayout()
3270
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
3280
3281             cmb.Text = ""
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
3287             cmb.TabStop = False
3288             cmb.AutoCompleteMode = AutoCompleteMode.None
3289
3290             If _statuses.ContainsTab(tabName) Then
3291                 cmb.Items.Add(_statuses.Tabs(tabName).SearchWords)
3292                 cmb.Text = _statuses.Tabs(tabName).SearchWords
3293             End If
3294
3295             cmbLang.Text = ""
3296             cmbLang.Anchor = AnchorStyles.Left Or AnchorStyles.Right
3297             cmbLang.Dock = DockStyle.Right
3298             cmbLang.Width = 50
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
3323
3324             lbl.Text = "Search(C-S-f)"
3325             lbl.Name = "label1"
3326             lbl.Dock = DockStyle.Left
3327             lbl.Width = 90
3328             lbl.Height = cmb.Height
3329             lbl.TextAlign = ContentAlignment.MiddleLeft
3330
3331             btn.Text = "Search"
3332             btn.Name = "buttonSearch"
3333             btn.UseVisualStyleBackColor = True
3334             btn.Dock = DockStyle.Right
3335             btn.TabStop = False
3336             AddHandler btn.Click, AddressOf SearchButton_Click
3337
3338         End If
3339
3340         Me.ListTab.Controls.Add(_tabPage)
3341         _tabPage.Controls.Add(_listCustom)
3342
3343         If tabType = TabUsageType.PublicSearch Then _tabPage.Controls.Add(pnl)
3344
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
3351
3352         _listCustom.AllowColumnReorder = True
3353         If Not _iconCol Then
3354             _listCustom.Columns.AddRange(New ColumnHeader() {_colHd1, _colHd2, _colHd3, _colHd4, _colHd5, _colHd6, _colHd7, _colHd8})
3355         Else
3356             _listCustom.Columns.AddRange(New ColumnHeader() {_colHd1, _colHd3})
3357         End If
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
3373
3374         _listCustom.GridLines = SettingDialog.ShowGrid
3375         _listCustom.AllowDrop = True
3376
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
3391
3392         InitColumnText()
3393         _colHd1.Text = ColumnText(0)
3394         _colHd1.Width = 48
3395         _colHd2.Text = ColumnText(1)
3396         _colHd2.Width = 80
3397         _colHd3.Text = ColumnText(2)
3398         _colHd3.Width = 300
3399         _colHd4.Text = ColumnText(3)
3400         _colHd4.Width = 50
3401         _colHd5.Text = ColumnText(4)
3402         _colHd5.Width = 50
3403         _colHd6.Text = ColumnText(5)
3404         _colHd6.Width = 16
3405         _colHd7.Text = ColumnText(6)
3406         _colHd7.Width = 16
3407         _colHd8.Text = ColumnText(7)
3408         _colHd8.Width = 50
3409
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)
3413         End If
3414
3415         _listCustom.SmallImageList = New ImageList()
3416         If _iconSz > 0 Then
3417             _listCustom.SmallImageList.ImageSize = New Size(_iconSz, _iconSz)
3418         End If
3419
3420         Dim dispOrder(7) As Integer
3421         If Not startup Then
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
3425                         dispOrder(i) = j
3426                         Exit For
3427                     End If
3428                 Next
3429             Next
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
3433             Next
3434         Else
3435             If _iconCol Then
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
3440             Else
3441                 For i As Integer = 0 To 7
3442                     If _cfgLocal.DisplayIndex1 = i Then
3443                         dispOrder(i) = 0
3444                     ElseIf _cfgLocal.DisplayIndex2 = i Then
3445                         dispOrder(i) = 1
3446                     ElseIf _cfgLocal.DisplayIndex3 = i Then
3447                         dispOrder(i) = 2
3448                     ElseIf _cfgLocal.DisplayIndex4 = i Then
3449                         dispOrder(i) = 3
3450                     ElseIf _cfgLocal.DisplayIndex5 = i Then
3451                         dispOrder(i) = 4
3452                     ElseIf _cfgLocal.DisplayIndex6 = i Then
3453                         dispOrder(i) = 5
3454                     ElseIf _cfgLocal.DisplayIndex7 = i Then
3455                         dispOrder(i) = 6
3456                     ElseIf _cfgLocal.DisplayIndex8 = i Then
3457                         dispOrder(i) = 7
3458                     End If
3459                 Next
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
3470                 Next
3471             End If
3472         End If
3473
3474         If tabType = TabUsageType.PublicSearch Then pnl.ResumeLayout(False)
3475
3476         _tabPage.ResumeLayout(False)
3477
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)
3483         Me.PerformLayout()
3484         _tabPage.Tag = _listCustom
3485         Return True
3486     End Function
3487
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
3492         Next
3493
3494         If _statuses.IsDefaultTab(TabName) Then Return False
3495
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
3499             Return False
3500         End If
3501
3502         SetListProperty()   '他のタブに列幅等を反映
3503
3504         Dim tabType As TabUsageType = _statuses.Tabs(TabName).TabType
3505
3506         'オブジェクトインスタンスの削除
3507         Me.SplitContainer1.Panel1.SuspendLayout()
3508         Me.SplitContainer1.Panel2.SuspendLayout()
3509         Me.SplitContainer1.SuspendLayout()
3510         Me.ListTab.SuspendLayout()
3511         Me.SuspendLayout()
3512
3513         Dim _tabPage As TabPage = ListTab.TabPages(idx)
3514         Dim _listCustom As DetailsListView = DirectCast(_tabPage.Tag, DetailsListView)
3515         _tabPage.Tag = Nothing
3516
3517         _tabPage.SuspendLayout()
3518
3519         Me.ListTab.Controls.Remove(_tabPage)
3520
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
3527                 End If
3528                 RemoveHandler ctrl.Enter, AddressOf SearchControls_Enter
3529                 RemoveHandler ctrl.Leave, AddressOf SearchControls_Leave
3530                 pnl.Controls.Remove(ctrl)
3531                 ctrl.Dispose()
3532             Next
3533             _tabPage.Controls.Remove(pnl)
3534         End If
3535
3536         _tabPage.Controls.Remove(_listCustom)
3537         _listCustom.Columns.Clear()
3538         _listCustom.ContextMenuStrip = Nothing
3539
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
3554
3555         TabDialog.RemoveTab(TabName)
3556
3557         _listCustom.SmallImageList = Nothing
3558         _listCustom.ListViewItemSorter = Nothing
3559
3560         'キャッシュのクリア
3561         If _curTab.Equals(_tabPage) Then
3562             _curTab = Nothing
3563             _curItemIndex = -1
3564             _curList = Nothing
3565             _curPost = Nothing
3566         End If
3567         _itemCache = Nothing
3568         _itemCacheIndex = -1
3569         _postCache = Nothing
3570
3571         _tabPage.ResumeLayout(False)
3572
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)
3578         Me.PerformLayout()
3579
3580         _tabPage.Dispose()
3581         _listCustom.Dispose()
3582         _statuses.RemoveTab(TabName)
3583
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
3588             End If
3589         Next
3590         Return True
3591     End Function
3592
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
3597     End Sub
3598
3599     Private Sub ListTab_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListTab.MouseMove
3600         'タブのD&D
3601         Dim cpos As New Point(e.X, e.Y)
3602
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
3610                     Exit For
3611                 End If
3612             Next
3613
3614             If tn = "" Then Exit Sub
3615
3616             For Each tb As TabPage In ListTab.TabPages
3617                 If tb.Text = tn Then
3618                     ListTab.DoDragDrop(tb, DragDropEffects.All)
3619                     Exit For
3620                 End If
3621             Next
3622         Else
3623             _tabDrag = False
3624         End If
3625
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
3631                 Exit For
3632             End If
3633         Next
3634     End Sub
3635
3636     Private Sub ListTab_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListTab.SelectedIndexChanged
3637         '_curList.Refresh()
3638         DispSelectedPost()
3639         SetMainWindowTitle()
3640         SetStatusLabelUrl()
3641         If ListTab.Focused OrElse DirectCast(ListTab.SelectedTab.Tag, Control).Focused Then Me.Tag = ListTab.Tag
3642         TabMenuControl(ListTab.SelectedTab.Text)
3643     End Sub
3644
3645     Private Sub SetListProperty()
3646         '削除などで見つからない場合は処理せず
3647         If _curList Is Nothing Then Exit Sub
3648         If Not _isColumnChanged Then Exit Sub
3649
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
3654                     dispOrder(i) = j
3655                     Exit For
3656                 End If
3657             Next
3658         Next
3659
3660         '列幅、列並びを他のタブに設定
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
3668                     Next
3669                 End If
3670             End If
3671         Next
3672
3673         _isColumnChanged = False
3674     End Sub
3675
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("&", "&&")
3680         End If
3681         If PostBrowser.StatusText = "" Then
3682             SetStatusLabelUrl()
3683         End If
3684     End Sub
3685
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
3689             '@マーク
3690             ShowSuplDialog(StatusText, AtIdSupl)
3691             e.Handled = True
3692         ElseIf e.KeyChar = "#" Then
3693             If Not SettingDialog.UseHashSupplement Then Exit Sub
3694             ShowSuplDialog(StatusText, HashSupl)
3695             e.Handled = True
3696         End If
3697     End Sub
3698
3699     Public Overloads Sub ShowSuplDialog(ByVal owner As TextBox, ByVal dialog As AtIdSupplement)
3700         ShowSuplDialog(owner, dialog, 0, "")
3701     End Sub
3702
3703     Public Overloads Sub ShowSuplDialog(ByVal owner As TextBox, ByVal dialog As AtIdSupplement, ByVal offset As Integer)
3704         ShowSuplDialog(owner, dialog, offset, "")
3705     End Sub
3706
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
3710             dialog.Focus()
3711         Else
3712             dialog.ShowDialog()
3713         End If
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)
3722                 End If
3723                 If selStart < owner.Text.Length Then
3724                     eHalf = owner.Text.Substring(selStart)
3725                 End If
3726                 owner.Text = fHalf + dialog.inputText + eHalf
3727                 owner.SelectionStart = selStart + dialog.inputText.Length
3728             End If
3729         Else
3730             If selStart > 0 Then
3731                 fHalf = owner.Text.Substring(0, selStart)
3732             End If
3733             If selStart < owner.Text.Length Then
3734                 eHalf = owner.Text.Substring(selStart)
3735             End If
3736             owner.Text = fHalf + eHalf
3737             If selStart > 0 Then
3738                 owner.SelectionStart = selStart
3739             End If
3740         End If
3741         owner.Focus()
3742     End Sub
3743
3744     Private Sub StatusText_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles StatusText.KeyUp
3745         'スペースキーで未読ジャンプ
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
3751                         isSpace = True
3752                     Else
3753                         isSpace = False
3754                         Exit For
3755                     End If
3756                 Next
3757                 If isSpace Then
3758                     e.Handled = True
3759                     StatusText.Text = ""
3760                     JumpUnreadMenuItem_Click(Nothing, Nothing)
3761                 End If
3762             End If
3763         End If
3764         Me.StatusText_TextChanged(Nothing, Nothing)
3765     End Sub
3766
3767     Private Sub StatusText_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StatusText.TextChanged
3768         '文字数カウント
3769         Dim pLen As Integer = GetRestStatusCount(True, False)
3770         lblLen.Text = pLen.ToString()
3771         If pLen < 0 Then
3772             StatusText.ForeColor = Color.Red
3773         Else
3774             StatusText.ForeColor = _clInputFont
3775         End If
3776         If StatusText.Text = "" Then
3777             _reply_to_id = 0
3778             _reply_to_name = ""
3779         End If
3780     End Sub
3781
3782     Private Function GetRestStatusCount(ByVal isAuto As Boolean, ByVal isAddFooter As Boolean) As Integer
3783         '文字数カウント
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
3792             End If
3793         End If
3794         If HashMgr.UseHash <> "" Then
3795             pLen -= HashMgr.UseHash.Length + 1
3796         End If
3797         Return pLen
3798     End Function
3799
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.
3807             Return
3808         End If
3809
3810         'Now we need to rebuild the cache.
3811         If _curList.Equals(sender) Then CreateCache(e.StartIndex, e.EndIndex)
3812     End Sub
3813
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)
3818         Else
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)
3821             Try
3822                 e.Item = CreateItem(tb, _
3823                                     _statuses.Item(tb.Text, e.ItemIndex), _
3824                                     e.ItemIndex)
3825             Catch ex As Exception
3826                 '不正な要求に対する間に合わせの応答
3827                 Dim sitem() As String = {"", "", "", "", "", "", "", ""}
3828                 e.Item = New ImageListViewItem(sitem, "")
3829             End Try
3830         End If
3831     End Sub
3832
3833     Private Sub CreateCache(ByVal StartIndex As Integer, ByVal EndIndex As Integer)
3834         Try
3835             'キャッシュ要求(要求範囲±30を作成)
3836             StartIndex -= 30
3837             If StartIndex < 0 Then StartIndex = 0
3838             EndIndex += 30
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
3842
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)
3846             Next i
3847         Catch ex As Exception
3848             'キャッシュ要求が実データとずれるため(イベントの遅延?)
3849             _postCache = Nothing
3850             _itemCache = Nothing
3851         End Try
3852     End Sub
3853
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 = {"",
3862                                      Post.Nickname,
3863                                      Post.Data,
3864                                      Post.PDate.ToString(SettingDialog.DateTimeFormat),
3865                                      Post.Name,
3866                                      "",
3867                                      mk,
3868                                      Post.Source}
3869             itm = New ImageListViewItem(sitem, DirectCast(Me.TIconDic, ImageDictionary), Post.ImageUrl)
3870         Else
3871             Dim sitem() As String = {"",
3872                                      Post.Nickname,
3873                                      Post.Data,
3874                                      Post.PDate.ToString(SettingDialog.DateTimeFormat),
3875                                      Post.Name + Environment.NewLine + "(RT:" + Post.RetweetedBy + ")",
3876                                      "",
3877                                      mk,
3878                                      Post.Source}
3879             itm = New ImageListViewItem(sitem, DirectCast(Me.TIconDic, ImageDictionary), Post.ImageUrl)
3880         End If
3881
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)
3888         Return itm
3889     End Function
3890
3891     Private Sub MyList_DrawColumnHeader(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs)
3892         e.DrawDefault = True
3893     End Sub
3894
3895     Private Sub MyList_HScrolled(ByVal sender As Object, ByVal e As EventArgs)
3896         Dim listView As DetailsListView = DirectCast(sender, DetailsListView)
3897         listView.Refresh()
3898     End Sub
3899
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
3906                 Case _clSelf
3907                     brs2 = _brsBackColorMine
3908                 Case _clAtSelf
3909                     brs2 = _brsBackColorAt
3910                 Case _clTarget
3911                     brs2 = _brsBackColorYou
3912                 Case _clAtTarget
3913                     brs2 = _brsBackColorAtYou
3914                 Case _clAtFromTarget
3915                     brs2 = _brsBackColorAtFromTarget
3916                 Case _clAtTo
3917                     brs2 = _brsBackColorAtTo
3918                 Case Else
3919                     brs2 = _brsBackColorNone
3920             End Select
3921             e.Graphics.FillRectangle(brs2, e.Bounds)
3922         Else
3923             '選択中の行
3924             If DirectCast(sender, Windows.Forms.Control).Focused Then
3925                 e.Graphics.FillRectangle(_brsHighLight, e.Bounds)
3926             Else
3927                 e.Graphics.FillRectangle(_brsDeactiveSelection, e.Bounds)
3928             End If
3929         End If
3930         If (e.State And ListViewItemStates.Focused) = ListViewItemStates.Focused Then e.DrawFocusRectangle()
3931     End Sub
3932
3933     Private Sub MyList_DrawSubItem(ByVal sender As Object, ByVal e As DrawListViewSubItemEventArgs)
3934         If e.ItemState = 0 Then Exit Sub
3935
3936         If e.ColumnIndex = 0 Then
3937             Me.DrawListViewItemIcon(e)
3938         Else
3939             'アイコン以外の列
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
3944             If _iconCol Then
3945                 rct.Y += e.Item.Font.Height
3946                 rct.Height -= e.Item.Font.Height
3947                 rctB.Height = e.Item.Font.Height
3948             End If
3949
3950
3951             Dim heightDiff As Integer
3952             Dim drawLineCount As Integer = Math.Max(1, Math.DivRem(CType(rct.Height, Integer), e.Item.Font.Height, heightDiff))
3953
3954             'If heightDiff > e.Item.Font.Height * 0.7 Then
3955             '    rct.Height += e.Item.Font.Height
3956             '    drawLineCount += 1
3957             'End If
3958
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
3967             Else
3968                 drawLineCount += 1
3969             End If
3970
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)
3974             'End If
3975             If Not e.Item.Selected Then     'e.ItemStateでうまく判定できない???
3976                 '選択されていない行
3977                 '文字色
3978                 Dim brs As SolidBrush = Nothing
3979                 Dim flg As Boolean = False
3980                 Select Case e.Item.ForeColor
3981                     Case _clUnread
3982                         brs = _brsForeColorUnread
3983                     Case _clReaded
3984                         brs = _brsForeColorReaded
3985                     Case _clFav
3986                         brs = _brsForeColorFav
3987                     Case _clOWL
3988                         brs = _brsForeColorOWL
3989                     Case _clRetweet
3990                         brs = _brsForeColorRetweet
3991                     Case Else
3992                         brs = New SolidBrush(e.Item.ForeColor)
3993                         flg = True
3994                 End Select
3995                 If rct.Width > 0 Then
3996                     If _iconCol 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,
4002                                               e.Item.Font,
4003                                               Rectangle.Round(rct),
4004                                               brs.Color,
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 + "]",
4011                                               fnt,
4012                                               Rectangle.Round(rctB),
4013                                               brs.Color,
4014                                               TextFormatFlags.SingleLine Or
4015                                               TextFormatFlags.EndEllipsis Or
4016                                               TextFormatFlags.GlyphOverhangPadding Or
4017                                               TextFormatFlags.NoPrefix)
4018                         fnt.Dispose()
4019                     ElseIf drawLineCount = 1 Then
4020                         TextRenderer.DrawText(e.Graphics,
4021                                               e.SubItem.Text,
4022                                               e.Item.Font,
4023                                               Rectangle.Round(rct),
4024                                               brs.Color,
4025                                               TextFormatFlags.SingleLine Or
4026                                               TextFormatFlags.EndEllipsis Or
4027                                               TextFormatFlags.GlyphOverhangPadding Or
4028                                               TextFormatFlags.NoPrefix Or
4029                                               TextFormatFlags.VerticalCenter)
4030                     Else
4031                         'e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, brs, rct, sf)
4032                         TextRenderer.DrawText(e.Graphics,
4033                                               e.SubItem.Text,
4034                                               e.Item.Font,
4035                                               Rectangle.Round(rct),
4036                                               brs.Color,
4037                                               TextFormatFlags.WordBreak Or
4038                                               TextFormatFlags.EndEllipsis Or
4039                                               TextFormatFlags.GlyphOverhangPadding Or
4040                                               TextFormatFlags.NoPrefix)
4041                     End If
4042                 End If
4043                 If flg Then brs.Dispose()
4044             Else
4045                 If rct.Width > 0 Then
4046                     '選択中の行
4047                     Dim fnt As New Font(e.Item.Font, FontStyle.Bold)
4048                     If DirectCast(sender, Windows.Forms.Control).Focused Then
4049                         If _iconCol 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,
4054                                                   e.Item.Font,
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 + "]",
4063                                                   fnt,
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,
4072                                                   e.SubItem.Text,
4073                                                   e.Item.Font,
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)
4081                         Else
4082                             'e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, _brsHighLightText, rct, sf)
4083                             TextRenderer.DrawText(e.Graphics,
4084                                                   e.SubItem.Text,
4085                                                   e.Item.Font,
4086                                                   Rectangle.Round(rct),
4087                                                   _brsHighLightText.Color,
4088                                                   TextFormatFlags.WordBreak Or
4089                                                   TextFormatFlags.EndEllipsis Or
4090                                                   TextFormatFlags.GlyphOverhangPadding Or
4091                                                   TextFormatFlags.NoPrefix)
4092                         End If
4093                     Else
4094                         If _iconCol Then
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,
4099                                                   e.Item.Font,
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 + "]",
4108                                                   fnt,
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,
4117                                                   e.SubItem.Text,
4118                                                   e.Item.Font,
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)
4126                         Else
4127                             'e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, _brsForeColorUnread, rct, sf)
4128                             TextRenderer.DrawText(e.Graphics,
4129                                                   e.SubItem.Text,
4130                                                   e.Item.Font,
4131                                                   Rectangle.Round(rct),
4132                                                   _brsForeColorUnread.Color,
4133                                                   TextFormatFlags.WordBreak Or
4134                                                   TextFormatFlags.EndEllipsis Or
4135                                                   TextFormatFlags.GlyphOverhangPadding Or
4136                                                   TextFormatFlags.NoPrefix)
4137                         End If
4138                     End If
4139                     fnt.Dispose()
4140                 End If
4141             End If
4142         End If
4143     End Sub
4144
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
4151
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
4155                 End If
4156             Next
4157
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))
4160
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)
4165             End If
4166         End If
4167     End Sub
4168
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
4177
4178         If _curList.VirtualListSize = 0 Then
4179             MessageBox.Show(My.Resources.DoTabSearchText2, My.Resources.DoTabSearchText3, MessageBoxButtons.OK, MessageBoxIcon.Information)
4180         End If
4181
4182         If _curList.SelectedIndices.Count > 0 Then
4183             cidx = _curList.SelectedIndices(0)
4184         End If
4185         toIdx = _curList.VirtualListSize - 1
4186
4187         Select Case SType
4188             Case SEARCHTYPE.DialogSearch    'ダイアログからの検索
4189                 If _curList.SelectedIndices.Count > 0 Then
4190                     cidx = _curList.SelectedIndices(0)
4191                 Else
4192                     cidx = 0
4193                 End If
4194             Case SEARCHTYPE.NextSearch      '次を検索
4195                 If _curList.SelectedIndices.Count > 0 Then
4196                     cidx = _curList.SelectedIndices(0) + 1
4197                     If cidx > toIdx Then cidx = toIdx
4198                 Else
4199                     cidx = 0
4200                 End If
4201             Case SEARCHTYPE.PrevSearch      '前を検索
4202                 If _curList.SelectedIndices.Count > 0 Then
4203                     cidx = _curList.SelectedIndices(0) - 1
4204                     If cidx < 0 Then cidx = 0
4205                 Else
4206                     cidx = toIdx
4207                 End If
4208                 toIdx = 0
4209                 stp = -1
4210         End Select
4211
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
4217         End If
4218         Try
4219 RETRY:
4220             If UseRegex Then
4221                 ' 正規表現検索
4222                 Dim _search As Regex
4223                 Try
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) _
4230                         Then
4231                             SelectListItem(_curList, idx)
4232                             _curList.EnsureVisible(idx)
4233                             Exit Sub
4234                         End If
4235                     Next
4236                 Catch ex As ArgumentException
4237                     MsgBox(My.Resources.DoTabSearchText1, MsgBoxStyle.Critical)
4238                     Exit Sub
4239                 End Try
4240             Else
4241                 ' 通常検索
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 _
4247                     Then
4248                         SelectListItem(_curList, idx)
4249                         _curList.EnsureVisible(idx)
4250                         Exit Sub
4251                     End If
4252                 Next
4253             End If
4254
4255             If Not fnd Then
4256                 Select Case SType
4257                     Case SEARCHTYPE.DialogSearch, SEARCHTYPE.NextSearch
4258                         toIdx = cidx
4259                         cidx = 0
4260                     Case SEARCHTYPE.PrevSearch
4261                         toIdx = cidx
4262                         cidx = _curList.Items.Count - 1
4263                 End Select
4264                 fnd = True
4265                 GoTo RETRY
4266             End If
4267         Catch ex As ArgumentOutOfRangeException
4268
4269         End Try
4270         MessageBox.Show(My.Resources.DoTabSearchText2, My.Resources.DoTabSearchText3, MessageBoxButtons.OK, MessageBoxIcon.Information)
4271     End Sub
4272
4273     Private Sub MenuItemSubSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemSubSearch.Click
4274         '検索メニュー
4275         SearchDialog.Owner = Me
4276         If SearchDialog.ShowDialog() = Windows.Forms.DialogResult.Cancel Then
4277             Me.TopMost = SettingDialog.AlwaysTop
4278             Exit Sub
4279         End If
4280         Me.TopMost = SettingDialog.AlwaysTop
4281
4282         If SearchDialog.SWord <> "" Then
4283             DoTabSearch(SearchDialog.SWord, _
4284                         SearchDialog.CheckCaseSensitive, _
4285                         SearchDialog.CheckRegex, _
4286                         SEARCHTYPE.DialogSearch)
4287         End If
4288     End Sub
4289
4290     Private Sub MenuItemSearchNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemSearchNext.Click
4291         '次を検索
4292         If SearchDialog.SWord = "" Then
4293             If SearchDialog.ShowDialog() = Windows.Forms.DialogResult.Cancel Then
4294                 Me.TopMost = SettingDialog.AlwaysTop
4295                 Exit Sub
4296             End If
4297             Me.TopMost = SettingDialog.AlwaysTop
4298             If SearchDialog.SWord = "" Then Exit Sub
4299
4300             DoTabSearch(SearchDialog.SWord, _
4301                         SearchDialog.CheckCaseSensitive, _
4302                         SearchDialog.CheckRegex, _
4303                         SEARCHTYPE.DialogSearch)
4304         Else
4305             DoTabSearch(SearchDialog.SWord, _
4306                         SearchDialog.CheckCaseSensitive, _
4307                         SearchDialog.CheckRegex, _
4308                         SEARCHTYPE.NextSearch)
4309         End If
4310     End Sub
4311
4312     Private Sub MenuItemSearchPrev_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemSearchPrev.Click
4313         '前を検索
4314         If SearchDialog.SWord = "" Then
4315             If SearchDialog.ShowDialog() = Windows.Forms.DialogResult.Cancel Then
4316                 Me.TopMost = SettingDialog.AlwaysTop
4317                 Exit Sub
4318             End If
4319             Me.TopMost = SettingDialog.AlwaysTop
4320             If SearchDialog.SWord = "" Then Exit Sub
4321         End If
4322
4323         DoTabSearch(SearchDialog.SWord, _
4324                     SearchDialog.CheckCaseSensitive, _
4325                     SearchDialog.CheckRegex, _
4326                     SEARCHTYPE.PrevSearch)
4327     End Sub
4328
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
4332     End Sub
4333
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
4338
4339         If ImageSelectionPanel.Enabled Then
4340             Exit Sub
4341         End If
4342
4343         '現在タブから最終タブまで探索
4344         For i As Integer = bgnIdx To ListTab.TabPages.Count - 1
4345             '未読Index取得
4346             idx = _statuses.GetOldestUnreadId(ListTab.TabPages(i).Text)
4347             If idx > -1 Then
4348                 ListTab.SelectedIndex = i
4349                 lst = DirectCast(ListTab.TabPages(i).Tag, DetailsListView)
4350                 '_curTab = ListTab.TabPages(i)
4351                 Exit For
4352             End If
4353         Next
4354
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)
4359                 If idx > -1 Then
4360                     ListTab.SelectedIndex = i
4361                     lst = DirectCast(ListTab.TabPages(i).Tag, DetailsListView)
4362                     '_curTab = ListTab.TabPages(i)
4363                     Exit For
4364                 End If
4365             Next
4366         End If
4367
4368         '全部調べたが未読見つからず→先頭タブの最新発言へ
4369         If idx = -1 Then
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
4375             Else
4376                 idx = 0
4377             End If
4378         End If
4379
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
4385                     MoveTop()
4386                 Else
4387                     lst.EnsureVisible(idx)
4388                 End If
4389             Else
4390                 lst.EnsureVisible(idx)
4391             End If
4392         End If
4393         lst.Focus()
4394     End Sub
4395
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)
4401             Else
4402                 OpenUriAsync("http://twitter.com/" + post.Name + "/status/" + post.RetweetedId.ToString)
4403             End If
4404         End If
4405     End Sub
4406
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")
4411         End If
4412     End Sub
4413
4414     Private Sub VerUpMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VerUpMenuItem.Click
4415         CheckNewVersion()
4416     End Sub
4417
4418     Private Sub RunTweenUp()
4419
4420         Dim pinfo As New ProcessStartInfo
4421         pinfo.UseShellExecute = True
4422         pinfo.WorkingDirectory = Application.StartupPath
4423         pinfo.FileName = Path.Combine(Application.StartupPath(), "TweenUp.exe")
4424         Try
4425             Process.Start(pinfo)
4426         Catch ex As Exception
4427             MessageBox.Show("Failed to execute TweenUp.exe.")
4428         End Try
4429     End Sub
4430
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
4436
4437         Try
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)
4442             Exit Sub
4443         End Try
4444         If retMsg.Length > 0 Then
4445             strVer = retMsg.Substring(0, 4)
4446             If retMsg.Length > 4 Then
4447                 strDetail = retMsg.Substring(5).Trim
4448             End If
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
4455                             RunTweenUp()
4456                             _endingFlag = True
4457                             dialogAsShieldicon.Dispose()
4458                             Me.Close()
4459                             Exit Sub
4460                         Else
4461                             If Not startup Then MessageBox.Show(My.Resources.CheckNewVersionText5 + System.Environment.NewLine + retMsg, My.Resources.CheckNewVersionText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
4462                         End If
4463                     End If
4464                     dialogAsShieldicon.Dispose()
4465                 End Using
4466             Else
4467                 If forceUpdate Then
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
4473                                 RunTweenUp()
4474                                 _endingFlag = True
4475                                 dialogAsShieldicon.Dispose()
4476                                 Me.Close()
4477                                 Exit Sub
4478                             Else
4479                                 If Not startup Then MessageBox.Show(My.Resources.CheckNewVersionText5 + System.Environment.NewLine + retMsg, My.Resources.CheckNewVersionText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
4480                             End If
4481                         End If
4482                         dialogAsShieldicon.Dispose()
4483                     End Using
4484                 ElseIf Not startup Then
4485                     MessageBox.Show(My.Resources.CheckNewVersionText7 + fileVersion.Replace(".", "") + My.Resources.CheckNewVersionText8 + strVer, My.Resources.CheckNewVersionText2, MessageBoxButtons.OK, MessageBoxIcon.Information)
4486                 End If
4487             End If
4488         Else
4489             StatusLabel.Text = My.Resources.CheckNewVersionText9
4490             If Not startup Then MessageBox.Show(My.Resources.CheckNewVersionText10, My.Resources.CheckNewVersionText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
4491         End If
4492     End Sub
4493
4494     Private Sub Colorize()
4495         _colorize = False
4496         DispSelectedPost()
4497         '件数関連の場合、タイトル即時書き換え
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()
4503         End If
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
4509                 End If
4510             End If
4511         Next
4512         If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
4513     End Sub
4514
4515     Public Function createDetailHtml(ByVal orgdata As String) As String
4516         Return detailHtmlFormatHeader + orgdata + detailHtmlFormatFooter
4517     End Function
4518
4519     Private Sub DispSelectedPost()
4520
4521         If _curList.SelectedIndices.Count = 0 OrElse _curPost Is Nothing Then Exit Sub
4522
4523         Dim dTxt As String = createDetailHtml(_curPost.OriginalData)
4524         If _curPost.IsDm Then
4525             SourceLinkLabel.Tag = Nothing
4526             SourceLinkLabel.Text = ""
4527             'SourceLinkLabel.Visible = False
4528         Else
4529             Dim mc As Match = Regex.Match(_curPost.SourceHtml, "<a href=""(?<sourceurl>.+?)""")
4530             If mc.Success Then
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")
4536                 End If
4537                 SourceLinkLabel.Tag = src
4538             Else
4539                 SourceLinkLabel.Tag = Nothing
4540             End If
4541             If String.IsNullOrEmpty(_curPost.Source) Then
4542                 SourceLinkLabel.Text = ""
4543                 'SourceLinkLabel.Visible = False
4544             Else
4545                 SourceLinkLabel.Text = "via " + _curPost.Source
4546                 'SourceLinkLabel.Visible = True
4547             End If
4548         End If
4549         SourceLinkLabel.TabStop = False
4550
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 <- "
4555         Else
4556             NameLabel.Text = ""
4557         End If
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 + ")"
4562         End If
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)
4566
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)
4571             '                                                                                  Me.Invoke(Sub()
4572             '                                                                                                Me.UserPicture.Image = img
4573             '                                                                                            End Sub)
4574             '                                                                              End Sub)
4575         Else
4576             UserPicture.Image = Nothing
4577         End If
4578
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
4584
4585         If DumpPostClassToolStripMenuItem.Checked Then
4586             Dim sb As New StringBuilder(512)
4587
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)
4604
4605             For Each nm As String In _curPost.ReplyToList
4606                 sb.AppendFormat("ReplyToList    : {0}<br>", nm)
4607             Next
4608
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>")
4621
4622             PostBrowser.Visible = False
4623             PostBrowser.DocumentText = detailHtmlFormatHeader + sb.ToString + detailHtmlFormatFooter
4624             PostBrowser.Visible = True
4625         Else
4626             Try
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}"))
4633                     Next
4634                     Thumbnail.thumbnail(_curPost.Id, lnks)
4635                 End If
4636             Catch ex As System.Runtime.InteropServices.COMException
4637                 '原因不明
4638             Finally
4639                 PostBrowser.Visible = True
4640             End Try
4641         End If
4642     End Sub
4643
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")
4646     End Sub
4647
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")
4650     End Sub
4651
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
4659             End If
4660         End If
4661
4662         If e.Modifiers = Keys.None Then
4663             ' ModifierKeyが押されていない場合
4664             If e.KeyCode = Keys.N OrElse e.KeyCode = Keys.Right Then
4665                 e.Handled = True
4666                 e.SuppressKeyPress = True
4667                 GoRelPost(True)
4668                 Exit Sub
4669             ElseIf e.KeyCode = Keys.P OrElse e.KeyCode = Keys.Left Then
4670                 e.Handled = True
4671                 e.SuppressKeyPress = True
4672                 GoRelPost(False)
4673                 Exit Sub
4674             ElseIf e.KeyCode = Keys.OemPeriod Then
4675                 e.Handled = True
4676                 e.SuppressKeyPress = True
4677                 GoAnchor()
4678                 Exit Sub
4679             End If
4680             _anchorFlag = False
4681             If e.KeyCode = Keys.Space OrElse e.KeyCode = Keys.ProcessKey Then
4682                 e.Handled = True
4683                 e.SuppressKeyPress = True
4684                 JumpUnreadMenuItem_Click(Nothing, Nothing)
4685             ElseIf e.KeyCode = Keys.Enter OrElse e.KeyCode = Keys.Return Then
4686                 e.Handled = True
4687                 e.SuppressKeyPress = True
4688                 MakeReplyOrDirectStatus()
4689             ElseIf e.KeyCode = Keys.L Then
4690                 e.Handled = True
4691                 e.SuppressKeyPress = True
4692                 GoPost(True)
4693             ElseIf e.KeyCode = Keys.H Then
4694                 e.Handled = True
4695                 e.SuppressKeyPress = True
4696                 GoPost(False)
4697             ElseIf e.KeyCode = Keys.J AndAlso Not e.Alt Then
4698                 e.Handled = True
4699                 e.SuppressKeyPress = True
4700                 SendKeys.Send("{DOWN}")
4701             ElseIf e.KeyCode = Keys.K AndAlso Not e.Alt Then
4702                 e.Handled = True
4703                 e.SuppressKeyPress = True
4704                 SendKeys.Send("{UP}")
4705             End If
4706             If e.KeyCode = Keys.Z Or e.KeyCode = Keys.Oemcomma Then
4707                 e.Handled = True
4708                 e.SuppressKeyPress = True
4709                 MoveTop()
4710             ElseIf e.KeyCode = Keys.R OrElse e.KeyCode = Keys.F5 Then
4711                 e.Handled = True
4712                 e.SuppressKeyPress = True
4713                 DoRefresh()
4714             ElseIf e.KeyCode = Keys.S Then
4715                 e.Handled = True
4716                 e.SuppressKeyPress = True
4717                 GoNextTab(True)
4718             ElseIf e.KeyCode = Keys.A Then
4719                 e.Handled = True
4720                 e.SuppressKeyPress = True
4721                 GoNextTab(False)
4722             End If
4723             'If e.KeyCode = Keys.OemQuestion Then
4724             '    e.Handled = True
4725             '    e.SuppressKeyPress = True
4726             '    MenuItemSubSearch_Click(Nothing, Nothing)   '/検索
4727             'End If
4728             If e.KeyCode = Keys.F Then
4729                 e.Handled = True
4730                 e.SuppressKeyPress = True
4731                 SendKeys.Send("{PGDN}")
4732             End If
4733             If e.KeyCode = Keys.B Then
4734                 e.Handled = True
4735                 e.SuppressKeyPress = True
4736                 SendKeys.Send("{PGUP}")
4737             End If
4738             If e.KeyCode = Keys.I Then
4739                 e.Handled = True
4740                 e.SuppressKeyPress = True
4741                 SendKeys.Send("{TAB}")
4742             End If
4743             If e.KeyCode = Keys.G Then
4744                 e.Handled = True
4745                 e.SuppressKeyPress = True
4746                 ShowRelatedStatusesMenuItem_Click(Nothing, Nothing)
4747             End If
4748             ' ] in_reply_to参照元へ戻る
4749             If e.KeyCode = Keys.Oem4 Then
4750                 e.Handled = True
4751                 e.SuppressKeyPress = True
4752                 GoInReplyToPost()
4753             End If
4754             ' [ in_reply_toへジャンプ
4755             If e.KeyCode = Keys.Oem6 Then
4756                 e.Handled = True
4757                 e.SuppressKeyPress = True
4758                 GoBackInReplyToPost()
4759             End If
4760             If e.KeyCode = Keys.F1 Then
4761                 e.Handled = True
4762                 e.SuppressKeyPress = True
4763                 OpenUriAsync("http://sourceforge.jp/projects/tween/wiki/FrontPage")
4764             ElseIf e.KeyCode = Keys.F3 Then
4765                 e.Handled = True
4766                 e.SuppressKeyPress = True
4767                 MenuItemSearchNext_Click(Nothing, Nothing)
4768             ElseIf e.KeyCode = Keys.F6 Then
4769                 e.Handled = True
4770                 e.SuppressKeyPress = True
4771                 GetTimeline(WORKERTYPE.Reply, 1, 0, "")
4772             ElseIf e.KeyCode = Keys.F7 Then
4773                 e.Handled = True
4774                 e.SuppressKeyPress = True
4775                 GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
4776             End If
4777         End If
4778
4779         _anchorFlag = False
4780
4781         If e.Control AndAlso Not e.Alt AndAlso Not e.Shift Then
4782             ' CTRLキーが押されている場合
4783             If e.KeyCode = Keys.Home OrElse e.KeyCode = Keys.End Then
4784                 _colorize = True
4785             End If
4786             If e.KeyCode = Keys.N Then
4787                 e.Handled = True
4788                 e.SuppressKeyPress = True
4789                 GoNextTab(True)
4790             ElseIf e.KeyCode = Keys.P Then
4791                 e.Handled = True
4792                 e.SuppressKeyPress = True
4793                 GoNextTab(False)
4794             ElseIf e.KeyCode = Keys.R Then
4795                 e.Handled = True
4796                 e.SuppressKeyPress = True
4797                 MakeReplyOrDirectStatus(False, True)
4798             ElseIf e.KeyCode = Keys.M Then
4799                 e.Handled = True
4800                 e.SuppressKeyPress = True
4801                 MakeReplyOrDirectStatus(False, False)
4802             ElseIf e.KeyCode = Keys.S Then
4803                 e.Handled = True
4804                 e.SuppressKeyPress = True
4805                 FavoriteChange(True)
4806             ElseIf e.KeyCode = Keys.I Then
4807                 e.Handled = True
4808                 e.SuppressKeyPress = True
4809                 doRepliedStatusOpen()
4810             ElseIf e.KeyCode = Keys.D Then
4811                 e.Handled = True
4812                 e.SuppressKeyPress = True
4813                 doStatusDelete()
4814             ElseIf e.KeyCode = Keys.Q Then
4815                 e.Handled = True
4816                 e.SuppressKeyPress = True
4817                 doQuote()
4818             ElseIf e.KeyCode = Keys.B Then
4819                 e.Handled = True
4820                 e.SuppressKeyPress = True
4821                 ReadedStripMenuItem_Click(Nothing, Nothing)
4822             ElseIf e.KeyCode = Keys.T Then
4823                 e.Handled = True
4824                 e.SuppressKeyPress = True
4825                 HashManageMenuItem_Click(Nothing, Nothing)
4826             ElseIf e.KeyCode = Keys.L Then
4827                 e.Handled = True
4828                 e.SuppressKeyPress = True
4829                 UrlConvertAutoToolStripMenuItem_Click(Nothing, Nothing)
4830             ElseIf e.KeyCode = Keys.Y Then
4831                 e.Handled = True
4832                 e.SuppressKeyPress = True
4833                 MultiLineMenuItem_Click(Nothing, Nothing)
4834             ElseIf e.KeyCode = Keys.F Then
4835                 e.Handled = True
4836                 e.SuppressKeyPress = True
4837                 MenuItemSubSearch_Click(Nothing, Nothing)
4838             ElseIf e.KeyCode = Keys.C Then
4839                 Dim clstr As String = ""
4840                 e.Handled = True
4841                 e.SuppressKeyPress = True
4842                 CopyStot()
4843             ElseIf e.KeyCode = Keys.J AndAlso Not e.Alt Then
4844                 e.Handled = True
4845                 e.SuppressKeyPress = True
4846                 SendKeys.Send("{DOWN}")
4847             ElseIf e.KeyCode = Keys.K AndAlso Not e.Alt Then
4848                 e.Handled = True
4849                 e.SuppressKeyPress = True
4850                 SendKeys.Send("{UP}")
4851             End If
4852
4853             ' Webページを開く動作
4854
4855             Select Case e.KeyCode
4856                 Case Keys.H
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/")
4861                     End If
4862                 Case Keys.G
4863                     If _curList.SelectedIndices.Count > 0 Then
4864                         OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name + "/favorites")
4865                     End If
4866                 Case Keys.O
4867                     StatusOpenMenuItem_Click(Nothing, Nothing)
4868                 Case Keys.E
4869                     OpenURLMenuItem_Click(Nothing, Nothing)
4870             End Select
4871
4872             ' タブダイレクト選択(Ctrl+1~8,Ctrl+9)
4873
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
4878                         Exit Sub
4879                     End If
4880                     ListTab.SelectedIndex = tabNo
4881                     ListTabSelect(ListTab.TabPages(tabNo))
4882                 Case Keys.D9
4883                     ListTab.SelectedIndex = ListTab.TabPages.Count - 1
4884                     ListTabSelect(ListTab.TabPages(ListTab.TabPages.Count - 1))
4885                 Case Else
4886             End Select
4887
4888         End If
4889
4890         If Not e.Control AndAlso e.Alt AndAlso Not e.Shift Then
4891             ' ALTキーが押されている場合
4892             ' 別タブの同じ書き込みへ(ALT+←/→)
4893             If e.KeyCode = Keys.Right Then
4894                 e.Handled = True
4895                 e.SuppressKeyPress = True
4896                 GoSamePostToAnotherTab(False)
4897             ElseIf e.KeyCode = Keys.Left Then
4898                 e.Handled = True
4899                 e.SuppressKeyPress = True
4900                 GoSamePostToAnotherTab(True)
4901             ElseIf e.KeyCode = Keys.R Then
4902                 e.Handled = True
4903                 e.SuppressKeyPress = True
4904                 doReTweetOfficial(True)
4905             ElseIf e.KeyCode = Keys.P AndAlso _curPost IsNot Nothing Then
4906                 e.Handled = True
4907                 e.SuppressKeyPress = True
4908                 doShowUserStatus(_curPost.Name, False)
4909             End If
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)
4918             End If
4919         End If
4920
4921         If e.Shift AndAlso Not e.Control AndAlso Not e.Alt Then
4922             ' SHIFTキーが押されている場合
4923             If e.KeyCode = Keys.H Then
4924                 e.Handled = True
4925                 e.SuppressKeyPress = True
4926                 GoTopEnd(True)
4927             ElseIf e.KeyCode = Keys.L Then
4928                 e.Handled = True
4929                 e.SuppressKeyPress = True
4930                 GoTopEnd(False)
4931             ElseIf e.KeyCode = Keys.M Then
4932                 e.Handled = True
4933                 e.SuppressKeyPress = True
4934                 GoMiddle()
4935             ElseIf e.KeyCode = Keys.G Then
4936                 e.Handled = True
4937                 e.SuppressKeyPress = True
4938                 GoLast()
4939             ElseIf e.KeyCode = Keys.Z Then
4940                 e.Handled = True
4941                 e.SuppressKeyPress = True
4942                 MoveMiddle()
4943             ElseIf e.KeyCode = Keys.J AndAlso Not e.Alt Then
4944                 e.Handled = True
4945                 e.SuppressKeyPress = True
4946                 SendKeys.Send("{DOWN}")
4947             ElseIf e.KeyCode = Keys.K AndAlso Not e.Alt Then
4948                 e.Handled = True
4949                 e.SuppressKeyPress = True
4950                 SendKeys.Send("{UP}")
4951             End If
4952
4953             ' お気に入り前後ジャンプ(SHIFT+N←/P→)
4954             If e.KeyCode = Keys.N OrElse e.KeyCode = Keys.Right Then
4955                 e.Handled = True
4956                 e.SuppressKeyPress = True
4957                 GoFav(True)
4958             ElseIf e.KeyCode = Keys.P OrElse e.KeyCode = Keys.Left Then
4959                 e.Handled = True
4960                 e.SuppressKeyPress = True
4961                 GoFav(False)
4962             ElseIf e.KeyCode = Keys.R OrElse e.KeyCode = Keys.F5 Then
4963                 e.Handled = True
4964                 e.SuppressKeyPress = True
4965                 DoRefreshMore()
4966             End If
4967             If e.KeyCode = Keys.F3 Then
4968                 e.Handled = True
4969                 e.SuppressKeyPress = True
4970                 MenuItemSearchPrev_Click(Nothing, Nothing)
4971             ElseIf e.KeyCode = Keys.F6 Then
4972                 e.Handled = True
4973                 e.SuppressKeyPress = True
4974                 GetTimeline(WORKERTYPE.Reply, -1, 0, "")
4975             ElseIf e.KeyCode = Keys.F7 Then
4976                 e.Handled = True
4977                 e.SuppressKeyPress = True
4978                 GetTimeline(WORKERTYPE.DirectMessegeRcv, -1, 0, "")
4979             End If
4980         End If
4981
4982         If e.Control AndAlso Not e.Alt AndAlso e.Shift Then
4983             ' CTRL+SHIFTキーが押されている場合
4984             If e.KeyCode = Keys.R Then
4985                 e.Handled = True
4986                 e.SuppressKeyPress = True
4987                 MakeReplyOrDirectStatus(False, True, True)
4988             ElseIf e.KeyCode = Keys.C Then
4989                 Dim clstr As String = ""
4990                 e.Handled = True
4991                 e.SuppressKeyPress = True
4992                 CopyIdUri()
4993             ElseIf e.KeyCode = Keys.F Then
4994                 e.Handled = True
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()
4999                 End If
5000             ElseIf e.KeyCode = Keys.S Then
5001                 e.Handled = True
5002                 e.SuppressKeyPress = True
5003                 FavoriteChange(False)
5004             ElseIf e.KeyCode = Keys.B Then
5005                 e.Handled = True
5006                 e.SuppressKeyPress = True
5007                 UnreadStripMenuItem_Click(Nothing, Nothing)
5008             End If
5009             If e.KeyCode = Keys.T Then
5010                 e.Handled = True
5011                 e.SuppressKeyPress = True
5012                 HashToggleMenuItem_Click(Nothing, Nothing)
5013             ElseIf e.KeyCode = Keys.P Then
5014                 e.Handled = True
5015                 e.SuppressKeyPress = True
5016                 ImageSelectMenuItem_Click(Nothing, Nothing)
5017             ElseIf e.KeyCode = Keys.H Then
5018                 e.Handled = True
5019                 e.SuppressKeyPress = True
5020                 doMoveToRTHome()
5021             ElseIf e.KeyCode = Keys.O Then
5022                 e.Handled = True
5023                 e.SuppressKeyPress = True
5024                 FavorareMenuItem_Click(Nothing, Nothing)
5025             End If
5026         End If
5027
5028         If Not e.Control AndAlso e.Alt AndAlso e.Shift Then
5029             ' ALT+SHIFTキーが押されている場合
5030             If e.KeyCode = Keys.R Then
5031                 e.Handled = True
5032                 e.SuppressKeyPress = True
5033                 doReTweetUnofficial()
5034             ElseIf e.KeyCode = Keys.C Then
5035                 e.Handled = True
5036                 e.SuppressKeyPress = True
5037                 CopyUserId()
5038             ElseIf e.KeyCode = Keys.Up Then
5039                 Thumbnail.ScrollThumbnail(False)
5040             ElseIf e.KeyCode = Keys.Down Then
5041                 Thumbnail.ScrollThumbnail(True)
5042             End If
5043             If e.KeyCode = Keys.Enter Then
5044                 If Not Me.SplitContainer3.Panel2Collapsed Then
5045                     Thumbnail.OpenPicture()
5046                 End If
5047                 e.Handled = True
5048                 e.SuppressKeyPress = True
5049             End If
5050         End If
5051
5052         If e.Alt AndAlso e.Control Then
5053             ' CTRL+ALTキーが押されている場合
5054             If e.KeyCode = Keys.S Then
5055                 e.Handled = True
5056                 e.SuppressKeyPress = True
5057                 FavoritesRetweetOriginal()
5058             ElseIf e.KeyCode = Keys.R Then
5059                 e.Handled = True
5060                 e.SuppressKeyPress = True
5061                 FavoritesRetweetUnofficial()
5062             End If
5063         End If
5064
5065     End Sub
5066
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
5071
5072         If forward Then
5073             doc.Body.ScrollTop += SettingDialog.FontDetail.Height
5074         Else
5075             doc.Body.ScrollTop -= SettingDialog.FontDetail.Height
5076         End If
5077     End Sub
5078
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
5083
5084         If forward Then
5085             doc.Body.ScrollTop += PostBrowser.ClientRectangle.Height - SettingDialog.FontDetail.Height
5086         Else
5087             doc.Body.ScrollTop -= PostBrowser.ClientRectangle.Height - SettingDialog.FontDetail.Height
5088         End If
5089     End Sub
5090
5091     Private Sub GoNextTab(ByVal forward As Boolean)
5092         Dim idx As Integer = ListTab.SelectedIndex
5093         If forward Then
5094             idx += 1
5095             If idx > ListTab.TabPages.Count - 1 Then idx = 0
5096         Else
5097             idx -= 1
5098             If idx < 0 Then idx = ListTab.TabPages.Count - 1
5099         End If
5100         ListTab.SelectedIndex = idx
5101         ListTabSelect(ListTab.TabPages(idx))
5102     End Sub
5103
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
5111                 IsProtected = True
5112                 Continue For
5113             End If
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)
5116             Else
5117                 sb.AppendFormat("{0}:{1} [http://twitter.com/{0}/status/{2}]{3}", post.Name, post.Data, post.Id, Environment.NewLine)
5118             End If
5119         Next
5120         If IsProtected Then
5121             MessageBox.Show(My.Resources.CopyStotText1)
5122         End If
5123         If sb.Length > 0 Then
5124             clstr = sb.ToString()
5125             Try
5126                 Clipboard.SetDataObject(clstr, False, 5, 100)
5127             Catch ex As Exception
5128                 MessageBox.Show(ex.Message)
5129             End Try
5130             'Try
5131             '    Dim proc As New Action(Of String)(Sub(text)
5132             '                                          Me.Invoke(New Action(Of String)(AddressOf Clipboard.SetText), text)
5133             '                                      End Sub)
5134             '    proc.BeginInvoke(clstr, Nothing, Nothing)
5135             'Catch ex As Exception
5136             '    MessageBox.Show(ex.Message)
5137             'End Try
5138         End If
5139     End Sub
5140
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)
5148             Else
5149                 sb.AppendFormat("http://twitter.com/{0}/status/{1}{2}", post.Name, post.Id, Environment.NewLine)
5150             End If
5151         Next
5152         If sb.Length > 0 Then
5153             clstr = sb.ToString()
5154             Try
5155                 Clipboard.SetDataObject(clstr, False, 5, 100)
5156             Catch ex As Exception
5157                 MessageBox.Show(ex.Message)
5158             End Try
5159         End If
5160     End Sub
5161
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
5167
5168         If forward Then
5169             If _curList.SelectedIndices.Count = 0 Then
5170                 fIdx = 0
5171             Else
5172                 fIdx = _curList.SelectedIndices(0) + 1
5173                 If fIdx > _curList.VirtualListSize - 1 Then Exit Sub
5174             End If
5175             toIdx = _curList.VirtualListSize - 1
5176             stp = 1
5177         Else
5178             If _curList.SelectedIndices.Count = 0 Then
5179                 fIdx = _curList.VirtualListSize - 1
5180             Else
5181                 fIdx = _curList.SelectedIndices(0) - 1
5182                 If fIdx < 0 Then Exit Sub
5183             End If
5184             toIdx = 0
5185             stp = -1
5186         End If
5187
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)
5192                 Exit For
5193             End If
5194         Next
5195     End Sub
5196
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
5203
5204         If _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage Then Exit Sub ' Directタブは対象外(見つかるはずがない)
5205         If _curList.SelectedIndices.Count = 0 Then Exit Sub '未選択も処理しない
5206
5207         targetId = GetCurTabPost(_curList.SelectedIndices(0)).Id
5208
5209         If left Then
5210             ' 左のタブへ
5211             If ListTab.SelectedIndex = 0 Then
5212                 Exit Sub
5213             Else
5214                 fIdx = ListTab.SelectedIndex - 1
5215             End If
5216             toIdx = 0
5217             stp = -1
5218         Else
5219             ' 右のタブへ
5220             If ListTab.SelectedIndex = ListTab.TabCount - 1 Then
5221                 Exit Sub
5222             Else
5223                 fIdx = ListTab.SelectedIndex + 1
5224             End If
5225             toIdx = ListTab.TabCount - 1
5226             stp = 1
5227         End If
5228
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)
5238                     found = True
5239                     Exit For
5240                 End If
5241             Next
5242             If found Then Exit For
5243         Next
5244     End Sub
5245
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
5251
5252         If forward Then
5253             fIdx = _curList.SelectedIndices(0) + 1
5254             If fIdx > _curList.VirtualListSize - 1 Then Exit Sub
5255             toIdx = _curList.VirtualListSize - 1
5256             stp = 1
5257         Else
5258             fIdx = _curList.SelectedIndices(0) - 1
5259             If fIdx < 0 Then Exit Sub
5260             toIdx = 0
5261             stp = -1
5262         End If
5263
5264         Dim name As String = ""
5265         If _curPost.RetweetedId = 0 Then
5266             name = _curPost.Name
5267         Else
5268             name = _curPost.RetweetedBy
5269         End If
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)
5275                     Exit For
5276                 End If
5277             Else
5278                 If _statuses.Item(_curTab.Text, idx).RetweetedBy = name Then
5279                     SelectListItem(_curList, idx)
5280                     _curList.EnsureVisible(idx)
5281                     Exit For
5282                 End If
5283             End If
5284         Next
5285     End Sub
5286
5287     Private Sub GoRelPost(ByVal forward As Boolean)
5288         If _curList.SelectedIndices.Count = 0 Then Exit Sub
5289
5290         Dim fIdx As Integer = 0
5291         Dim toIdx As Integer = 0
5292         Dim stp As Integer = 1
5293         If forward Then
5294             fIdx = _curList.SelectedIndices(0) + 1
5295             If fIdx > _curList.VirtualListSize - 1 Then Exit Sub
5296             toIdx = _curList.VirtualListSize - 1
5297             stp = 1
5298         Else
5299             fIdx = _curList.SelectedIndices(0) - 1
5300             If fIdx < 0 Then Exit Sub
5301             toIdx = 0
5302             stp = -1
5303         End If
5304
5305         If Not _anchorFlag Then
5306             If _curPost Is Nothing Then Exit Sub
5307             _anchorPost = _curPost
5308             _anchorFlag = True
5309         Else
5310             If _anchorPost Is Nothing Then Exit Sub
5311         End If
5312
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)
5325                 Exit For
5326             End If
5327         Next
5328     End Sub
5329
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
5334
5335         SelectListItem(_curList, idx)
5336         _curList.EnsureVisible(idx)
5337     End Sub
5338
5339     Private Sub GoTopEnd(ByVal GoTop As Boolean)
5340         Dim _item As ListViewItem
5341         Dim idx As Integer
5342
5343         If GoTop Then
5344             _item = _curList.GetItemAt(0, 25)
5345             If _item Is Nothing Then
5346                 idx = 0
5347             Else
5348                 idx = _item.Index
5349             End If
5350         Else
5351             _item = _curList.GetItemAt(0, _curList.ClientSize.Height - 1)
5352             If _item Is Nothing Then
5353                 idx = _curList.VirtualListSize - 1
5354             Else
5355                 idx = _item.Index
5356             End If
5357         End If
5358         SelectListItem(_curList, idx)
5359     End Sub
5360
5361     Private Sub GoMiddle()
5362         Dim _item As ListViewItem
5363         Dim idx1 As Integer
5364         Dim idx2 As Integer
5365         Dim idx3 As Integer
5366
5367         _item = _curList.GetItemAt(0, 0)
5368         If _item Is Nothing Then
5369             idx1 = 0
5370         Else
5371             idx1 = _item.Index
5372         End If
5373         _item = _curList.GetItemAt(0, _curList.ClientSize.Height - 1)
5374         If _item Is Nothing Then
5375             idx2 = _curList.VirtualListSize - 1
5376         Else
5377             idx2 = _item.Index
5378         End If
5379         idx3 = (idx1 + idx2) \ 2
5380
5381         SelectListItem(_curList, idx3)
5382     End Sub
5383
5384     Private Sub GoLast()
5385         If _curList.VirtualListSize = 0 Then Exit Sub
5386
5387         If _statuses.SortOrder = SortOrder.Ascending Then
5388             SelectListItem(_curList, _curList.VirtualListSize - 1)
5389             _curList.EnsureVisible(_curList.VirtualListSize - 1)
5390         Else
5391             SelectListItem(_curList, 0)
5392             _curList.EnsureVisible(0)
5393         End If
5394     End Sub
5395
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)
5401         Else
5402             _curList.EnsureVisible(0)
5403         End If
5404         _curList.EnsureVisible(idx)
5405     End Sub
5406
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)
5412                     If idx = -1 Then
5413                         Dim repPost As PostClass = _statuses.Item(_curPost.InReplyToId)
5414                         MessageBox.Show(repPost.Name + " / " + repPost.Nickname + "   (" + repPost.PDate.ToString() + ")" + Environment.NewLine + repPost.Data)
5415                     Else
5416                         If replyChains Is Nothing OrElse (replyChains.Count > 0 AndAlso replyChains.Peek().InReplyToId <> _curPost.Id) Then
5417                             replyChains = New Stack(Of ReplyChain)
5418                         End If
5419                         replyChains.Push(New ReplyChain(_curPost.Id, _curPost.InReplyToId, _curTab))
5420                         SelectListItem(_curList, idx)
5421                         _curList.EnsureVisible(idx)
5422                     End If
5423                 Else
5424                     OpenUriAsync("http://twitter.com/" + _curPost.InReplyToUser + "/statuses/" + _curPost.InReplyToId.ToString())
5425                 End If
5426             Else
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)
5430                     If idx = -1 Then
5431                         For Each tab In ListTab.TabPages
5432                             idx = _statuses.Tabs(tab.Text).IndexOf(_curPost.InReplyToId)
5433                             If idx <> -1 Then
5434                                 Exit For
5435                             End If
5436                         Next
5437                     End If
5438                     If idx = -1 Then
5439                         Dim repPost As PostClass = _statuses.Item(_curPost.InReplyToId)
5440                         MessageBox.Show(repPost.Name + " / " + repPost.Nickname + "   (" + repPost.PDate.ToString() + ")" + Environment.NewLine + repPost.Data)
5441                     Else
5442                         If replyChains Is Nothing OrElse (replyChains.Count > 0 AndAlso replyChains.Peek().InReplyToId <> _curPost.Id) Then
5443                             replyChains = New Stack(Of ReplyChain)
5444                         End If
5445                         replyChains.Push(New ReplyChain(_curPost.Id, _curPost.InReplyToId, _curTab))
5446
5447                         If tab IsNot _curTab Then
5448                             ListTab.SelectTab(tab)
5449                         End If
5450                         SelectListItem(_curList, idx)
5451                         _curList.EnsureVisible(idx)
5452                     End If
5453                 Else
5454                     OpenUriAsync("http://twitter.com/" + _curPost.InReplyToUser + "/statuses/" + _curPost.InReplyToId.ToString())
5455                 End If
5456             End If
5457         End If
5458     End Sub
5459
5460     Private Sub GoBackInReplyToPost()
5461         If replyChains Is Nothing OrElse replyChains.Count < 1 Then
5462             Exit Sub
5463         End If
5464
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)
5468             If idx = -1 Then
5469                 replyChains = Nothing
5470             Else
5471                 Try
5472                     ListTab.SelectTab(chainHead.OriginalTab)
5473                 Catch ex As Exception
5474                     replyChains = Nothing
5475                 End Try
5476                 SelectListItem(_curList, idx)
5477                 _curList.EnsureVisible(idx)
5478             End If
5479         Else
5480             replyChains = Nothing
5481         End If
5482     End Sub
5483
5484     Private Sub MyList_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
5485         _anchorFlag = False
5486     End Sub
5487
5488     Private Sub StatusText_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StatusText.Enter
5489         ' フォーカスの戻り先を StatusText に設定
5490         Me.Tag = StatusText
5491         StatusText.BackColor = _clInputBackcolor
5492     End Sub
5493
5494     Public Property InputBackColor() As System.Drawing.Color
5495         Get
5496             Return _clInputBackcolor
5497         End Get
5498         Set(ByVal value As System.Drawing.Color)
5499             _clInputBackcolor = value
5500         End Set
5501     End Property
5502
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)
5507     End Sub
5508
5509     Private Sub StatusText_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles StatusText.KeyDown
5510         'Modifierキーなし
5511         If e.Modifiers = Keys.None Then
5512             If e.KeyCode = Keys.F1 Then
5513                 e.Handled = True
5514                 e.SuppressKeyPress = True
5515                 OpenUriAsync("http://sourceforge.jp/projects/tween/wiki/FrontPage")
5516             ElseIf e.KeyCode = Keys.F3 Then
5517                 e.Handled = True
5518                 e.SuppressKeyPress = True
5519                 MenuItemSearchNext_Click(Nothing, Nothing)
5520             ElseIf e.KeyCode = Keys.F5 Then
5521                 e.Handled = True
5522                 e.SuppressKeyPress = True
5523                 DoRefresh()
5524             ElseIf e.KeyCode = Keys.F6 Then
5525                 e.Handled = True
5526                 e.SuppressKeyPress = True
5527                 GetTimeline(WORKERTYPE.Reply, 1, 0, "")
5528             ElseIf e.KeyCode = Keys.F7 Then
5529                 e.Handled = True
5530                 e.SuppressKeyPress = True
5531                 GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
5532             End If
5533         End If
5534
5535         'Controlキー
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)
5542                 End If
5543                 If e.KeyCode = Keys.Up Then
5544                     _hisIdx -= 1
5545                     If _hisIdx < 0 Then _hisIdx = 0
5546                 Else
5547                     _hisIdx += 1
5548                     If _hisIdx > _history.Count - 1 Then _hisIdx = _history.Count - 1
5549                 End If
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
5554                 e.Handled = True
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
5559                 Else
5560                     ListTab.SelectedIndex -= 1
5561                 End If
5562                 e.Handled = True
5563                 e.SuppressKeyPress = True
5564                 StatusText.Focus()
5565             ElseIf e.KeyCode = Keys.PageDown OrElse e.KeyCode = Keys.N Then
5566                 If ListTab.SelectedIndex = ListTab.TabCount - 1 Then
5567                     ListTab.SelectedIndex = 0
5568                 Else
5569                     ListTab.SelectedIndex += 1
5570                 End If
5571                 e.Handled = True
5572                 e.SuppressKeyPress = True
5573                 StatusText.Focus()
5574             ElseIf e.KeyCode = Keys.R Then
5575                 e.Handled = True
5576                 e.SuppressKeyPress = True
5577                 MakeReplyOrDirectStatus(False, True)
5578             ElseIf e.KeyCode = Keys.M Then
5579                 e.Handled = True
5580                 e.SuppressKeyPress = True
5581                 MakeReplyOrDirectStatus(False, False)
5582             ElseIf e.KeyCode = Keys.S Then
5583                 e.Handled = True
5584                 e.SuppressKeyPress = True
5585                 FavoriteChange(True)
5586             ElseIf e.KeyCode = Keys.I Then
5587                 e.Handled = True
5588                 e.SuppressKeyPress = True
5589                 doRepliedStatusOpen()
5590             ElseIf e.KeyCode = Keys.Q Then
5591                 e.Handled = True
5592                 e.SuppressKeyPress = True
5593                 doQuote()
5594             ElseIf e.KeyCode = Keys.B Then
5595                 e.Handled = True
5596                 e.SuppressKeyPress = True
5597                 ReadedStripMenuItem_Click(Nothing, Nothing)
5598             ElseIf e.KeyCode = Keys.T Then
5599                 e.Handled = True
5600                 e.SuppressKeyPress = True
5601                 HashManageMenuItem_Click(Nothing, Nothing)
5602             ElseIf e.KeyCode = Keys.L Then
5603                 e.Handled = True
5604                 e.SuppressKeyPress = True
5605                 UrlConvertAutoToolStripMenuItem_Click(Nothing, Nothing)
5606             ElseIf e.KeyCode = Keys.Y Then
5607                 e.Handled = True
5608                 e.SuppressKeyPress = True
5609                 MultiLineMenuItem_Click(Nothing, Nothing)
5610             ElseIf e.KeyCode = Keys.F Then
5611                 e.Handled = True
5612                 e.SuppressKeyPress = True
5613                 MenuItemSubSearch_Click(Nothing, Nothing)
5614             End If
5615
5616             Select Case e.KeyCode
5617                 Case Keys.H
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/")
5622                     End If
5623                 Case Keys.G
5624                     If _curList.SelectedIndices.Count > 0 Then
5625                         OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name + "/favorites")
5626                     End If
5627                 Case Keys.E
5628                     OpenURLMenuItem_Click(Nothing, Nothing)
5629                 Case Keys.O
5630                     StatusOpenMenuItem_Click(Nothing, Nothing)
5631             End Select
5632         End If
5633
5634         'Shiftキー
5635         If e.Shift Then
5636             If e.KeyCode = Keys.F3 Then
5637                 e.Handled = True
5638                 e.SuppressKeyPress = True
5639                 MenuItemSearchPrev_Click(Nothing, Nothing)
5640             ElseIf e.KeyCode = Keys.F5 Then
5641                 e.Handled = True
5642                 e.SuppressKeyPress = True
5643                 DoRefreshMore()
5644             ElseIf e.KeyCode = Keys.F6 Then
5645                 e.Handled = True
5646                 e.SuppressKeyPress = True
5647                 GetTimeline(WORKERTYPE.Reply, -1, 0, "")
5648             ElseIf e.KeyCode = Keys.F7 Then
5649                 e.Handled = True
5650                 e.SuppressKeyPress = True
5651                 GetTimeline(WORKERTYPE.DirectMessegeRcv, -1, 0, "")
5652             End If
5653         End If
5654
5655         'Altキー
5656         If e.Alt AndAlso Not e.Control AndAlso e.Shift Then
5657             If e.KeyCode = Keys.R Then
5658                 e.Handled = True
5659                 e.SuppressKeyPress = True
5660                 doReTweetOfficial(True)
5661             ElseIf e.KeyCode = Keys.P AndAlso _curPost IsNot Nothing Then
5662                 e.Handled = True
5663                 e.SuppressKeyPress = True
5664                 doShowUserStatus(_curPost.Name, False)
5665             End If
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)
5674             End If
5675         End If
5676
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
5684                         Continue For
5685                     End If
5686                     If c = "@" Then
5687                         startstr = StatusText.Text.Substring(i + 1, endidx - i)
5688                         ShowSuplDialog(StatusText, AtIdSupl, startstr.Length + 1, startstr)
5689                     ElseIf c = "#" Then
5690                         startstr = StatusText.Text.Substring(i + 1, endidx - i)
5691                         ShowSuplDialog(StatusText, HashSupl, startstr.Length + 1, startstr)
5692                     Else
5693                         Exit For
5694                     End If
5695                 Next
5696                 e.Handled = True
5697             End If
5698         End If
5699
5700         'Shift+Controlキー
5701         If e.Shift AndAlso e.Control Then
5702             If e.KeyCode = Keys.Up Then
5703                 e.Handled = True
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)
5711                 End If
5712             ElseIf e.KeyCode = Keys.Down Then
5713                 e.Handled = True
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)
5721                 End If
5722             End If
5723             If e.KeyCode = Keys.R Then
5724                 e.Handled = True
5725                 e.SuppressKeyPress = True
5726                 MakeReplyOrDirectStatus(False, True, True)
5727             ElseIf e.KeyCode = Keys.H Then
5728                 e.Handled = True
5729                 e.SuppressKeyPress = True
5730                 doMoveToRTHome()
5731             ElseIf e.KeyCode = Keys.T Then
5732                 e.Handled = True
5733                 e.SuppressKeyPress = True
5734                 HashToggleMenuItem_Click(Nothing, Nothing)
5735             ElseIf e.KeyCode = Keys.S Then
5736                 e.Handled = True
5737                 e.SuppressKeyPress = True
5738                 FavoriteChange(False)
5739             ElseIf e.KeyCode = Keys.B Then
5740                 e.Handled = True
5741                 e.SuppressKeyPress = True
5742                 UnreadStripMenuItem_Click(Nothing, Nothing)
5743             ElseIf e.KeyCode = Keys.G Then
5744                 e.Handled = True
5745                 e.SuppressKeyPress = True
5746                 FavorareMenuItem_Click(Nothing, Nothing)
5747             ElseIf e.KeyCode = Keys.C Then
5748                 Dim clstr As String = ""
5749                 e.Handled = True
5750                 e.SuppressKeyPress = True
5751                 CopyIdUri()
5752             ElseIf e.KeyCode = Keys.O Then
5753                 e.Handled = True
5754                 e.SuppressKeyPress = True
5755                 FavorareMenuItem_Click(Nothing, Nothing)
5756             ElseIf e.KeyCode = Keys.P Then
5757                 e.Handled = True
5758                 e.SuppressKeyPress = True
5759                 ImageSelectMenuItem_Click(Nothing, Nothing)
5760             ElseIf e.KeyCode = Keys.F Then
5761                 e.Handled = True
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()
5766                 End If
5767             End If
5768         End If
5769
5770         'Alt+Shiftキー
5771         If e.Alt AndAlso e.Shift Then
5772             If e.KeyCode = Keys.R Then
5773                 e.Handled = True
5774                 e.SuppressKeyPress = True
5775                 doReTweetUnofficial()
5776             ElseIf e.KeyCode = Keys.C Then
5777                 e.Handled = True
5778                 e.SuppressKeyPress = True
5779                 CopyUserId()
5780             ElseIf e.KeyCode = Keys.Up Then
5781                 Thumbnail.ScrollThumbnail(False)
5782             ElseIf e.KeyCode = Keys.Down Then
5783                 Thumbnail.ScrollThumbnail(True)
5784             End If
5785         End If
5786
5787         ' Alt + Control キー
5788         If e.Alt AndAlso e.Control Then
5789             If e.KeyCode = Keys.S Then
5790                 e.Handled = True
5791                 e.SuppressKeyPress = True
5792                 FavoritesRetweetOriginal()
5793             ElseIf e.KeyCode = Keys.R Then
5794                 e.Handled = True
5795                 e.SuppressKeyPress = True
5796                 FavoritesRetweetUnofficial()
5797             End If
5798         End If
5799
5800         Me.StatusText_TextChanged(Nothing, Nothing)
5801     End Sub
5802
5803     Private Sub SaveConfigsAll(ByVal ifModified As Boolean)
5804         If Not ifModified Then
5805             SaveConfigsCommon()
5806             SaveConfigsLocal()
5807             'SaveConfigsTab(True)    'True:事前に設定ファイル削除
5808             SaveConfigsTabs()
5809         Else
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)
5815                 cfgAtId.Save()
5816             End If
5817         End If
5818     End Sub
5819
5820     Private Sub SaveConfigsCommon()
5821         If _ignoreConfigSave Then Exit Sub
5822
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
5842
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
5880             End If
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
5890
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
5903             End Select
5904
5905             _cfgCommon.Nicoms = SettingDialog.Nicoms
5906             _cfgCommon.HashTags = HashMgr.HashHistories
5907             If HashMgr.IsPermanent Then
5908                 _cfgCommon.HashSelected = HashMgr.UseHash
5909             Else
5910                 _cfgCommon.HashSelected = ""
5911             End If
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
5924             End If
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
5932
5933             _cfgCommon.Save()
5934         End SyncLock
5935     End Sub
5936
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
5948
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
5970
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
5979             _cfgLocal.Save()
5980         End SyncLock
5981     End Sub
5982
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))
5987         Next
5988         tabSetting.Save()
5989     End Sub
5990
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
5996
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
6003
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
6008                     'All
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 & _
6020                                  protect)
6021                     Next
6022                 Else
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 & _
6034                                  protect)
6035                     Next
6036                 End If
6037                 sw.Close()
6038                 sw.Dispose()
6039             End Using
6040         End If
6041         Me.TopMost = SettingDialog.AlwaysTop
6042     End Sub
6043
6044     Private Sub PostBrowser_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles PostBrowser.PreviewKeyDown
6045         ' ModifiersKeyなし
6046         If e.Modifiers = Keys.None Then
6047             Select Case e.KeyCode
6048                 Case Keys.Space, _
6049                      Keys.ProcessKey
6050                     e.IsInputKey = True
6051                     JumpUnreadMenuItem_Click(Nothing, Nothing)
6052                 Case Keys.G
6053                     e.IsInputKey = True
6054                     ShowRelatedStatusesMenuItem_Click(Nothing, Nothing)
6055                 Case Keys.F1
6056                     e.IsInputKey = True
6057                     OpenUriAsync("http://sourceforge.jp/projects/tween/wiki/FrontPage")
6058                 Case Keys.F3
6059                     e.IsInputKey = True
6060                     MenuItemSearchNext_Click(Nothing, Nothing)
6061                 Case Keys.F5, _
6062                      Keys.R
6063                     e.IsInputKey = True
6064                     DoRefresh()
6065                 Case Keys.F6
6066                     e.IsInputKey = True
6067                     GetTimeline(WORKERTYPE.Reply, 1, 0, "")
6068                 Case Keys.F7
6069                     e.IsInputKey = True
6070                     GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
6071                 Case Else
6072
6073             End Select
6074         End If
6075
6076         ' ShiftKey + 何か
6077         If e.Modifiers = Keys.Shift Then
6078             Select Case e.KeyCode
6079                 Case Keys.F3
6080                     e.IsInputKey = True
6081                     MenuItemSearchPrev_Click(Nothing, Nothing)
6082                 Case Keys.F5, _
6083                      Keys.R
6084                     e.IsInputKey = True
6085                     DoRefreshMore()
6086                 Case Keys.F6
6087                     e.IsInputKey = True
6088                     GetTimeline(WORKERTYPE.Reply, -1, 0, "")
6089                 Case Keys.F7
6090                     e.IsInputKey = True
6091                     GetTimeline(WORKERTYPE.DirectMessegeRcv, -1, 0, "")
6092                 Case Else
6093
6094             End Select
6095         End If
6096         ' ControlKey + 何か
6097         If e.Modifiers = Keys.Control Then
6098             Select Case e.KeyCode
6099                 Case Keys.A
6100                     e.IsInputKey = True
6101                     PostBrowser.Document.ExecCommand("SelectAll", False, Nothing)
6102                 Case Keys.C, Keys.Insert
6103                     e.IsInputKey = True
6104                     Dim _selText As String = WebBrowser_GetSelectionText(PostBrowser)
6105                     If Not String.IsNullOrEmpty(_selText) Then
6106                         Try
6107                             Clipboard.SetDataObject(_selText, False, 5, 100)
6108                         Catch ex As Exception
6109                             MessageBox.Show(ex.Message)
6110                         End Try
6111                     End If
6112                 Case Keys.R
6113                     e.IsInputKey = True
6114                     MakeReplyOrDirectStatus(False, True)
6115                 Case Keys.M
6116                     e.IsInputKey = True
6117                     MakeReplyOrDirectStatus(False, False)
6118                 Case Keys.R
6119                     e.IsInputKey = True
6120                     doReTweetOfficial(True)
6121                 Case Keys.Q
6122                     e.IsInputKey = True
6123                     doQuote()
6124                 Case Keys.S
6125                     e.IsInputKey = True
6126                     FavoriteChange(True)
6127                 Case Keys.B
6128                     e.IsInputKey = True
6129                     ReadedStripMenuItem_Click(Nothing, Nothing)
6130                 Case Keys.Y
6131                     e.IsInputKey = True
6132                     MultiLineMenuItem.Checked = Not MultiLineMenuItem.Checked
6133                     MultiLineMenuItem_Click(Nothing, Nothing)
6134                 Case Keys.C
6135                     e.IsInputKey = True
6136                     CopyStot()
6137                 Case Keys.F
6138                     e.IsInputKey = True
6139                     MenuItemSubSearch_Click(Nothing, Nothing)
6140                 Case Keys.H
6141                     e.IsInputKey = True
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/")
6146                     End If
6147                 Case Keys.G
6148                     e.IsInputKey = True
6149                     If _curList.SelectedIndices.Count > 0 Then
6150                         OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name + "/favorites")
6151                     End If
6152                 Case Keys.O
6153                     e.IsInputKey = True
6154                     MoveToFavToolStripMenuItem_Click(Nothing, Nothing)
6155                 Case Keys.E
6156                     e.IsInputKey = True
6157                     OpenURLMenuItem_Click(Nothing, Nothing)
6158             End Select
6159         End If
6160
6161         'AltKey + 何か
6162         If e.Modifiers = Keys.Alt Then
6163             If e.KeyCode = Keys.R Then
6164                 e.IsInputKey = True
6165                 doReTweetOfficial(True)
6166             ElseIf e.KeyCode = Keys.P AndAlso _curPost IsNot Nothing Then
6167                 e.IsInputKey = True
6168                 doShowUserStatus(_curPost.Name, False)
6169             End If
6170         End If
6171
6172         ' ControlKey + ShiftKey + 何か
6173         If e.Modifiers = (Keys.Control Or Keys.Shift) Then
6174             Select Case e.KeyCode
6175                 Case Keys.R
6176                     e.IsInputKey = True
6177                     MakeReplyOrDirectStatus(False, True, True)
6178                 Case Keys.F
6179                     e.IsInputKey = 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()
6183                     End If
6184                 Case Keys.S
6185                     e.IsInputKey = True
6186                     FavoriteChange(False)
6187                 Case Keys.B
6188                     e.IsInputKey = True
6189                     UnreadStripMenuItem_Click(Nothing, Nothing)
6190                 Case Keys.T
6191                     e.IsInputKey = True
6192                     HashToggleMenuItem_Click(Nothing, Nothing)
6193                 Case Keys.P
6194                     e.IsInputKey = True
6195                     ImageSelectMenuItem_Click(Nothing, Nothing)
6196                 Case Keys.O
6197                     e.IsInputKey = True
6198                     FavorareMenuItem_Click(Nothing, Nothing)
6199                 Case Keys.H
6200                     e.IsInputKey = True
6201                     doMoveToRTHome()
6202                 Case Else
6203
6204             End Select
6205         End If
6206
6207         'AltKey + ShiftKey + 何か
6208         If e.Modifiers = (Keys.Alt Or Keys.Shift) Then
6209             Select Case e.KeyCode
6210                 Case Keys.R
6211                     e.IsInputKey = False
6212                     doReTweetUnofficial()
6213                 Case Keys.C
6214                     e.IsInputKey = False
6215                     CopyUserId()
6216             End Select
6217
6218         End If
6219
6220         'CtrlKey + AltKey + 何か
6221         If e.Modifiers = (Keys.Control Or Keys.Alt) Then
6222             Select Case e.KeyCode
6223                 Case Keys.R
6224                     e.IsInputKey = True
6225                     FavoritesRetweetUnofficial()
6226                 Case Keys.S
6227                     e.IsInputKey = True
6228                     FavoritesRetweetOriginal()
6229             End Select
6230         End If
6231
6232     End Sub
6233     Public Function TabRename(ByRef tabName As String) As Boolean
6234         'タブ名変更
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
6241             inputName.Dispose()
6242         End Using
6243         Me.TopMost = SettingDialog.AlwaysTop
6244         If Not String.IsNullOrEmpty(newTabText) Then
6245             '新タブ名存在チェック
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)
6250                     Return False
6251                 End If
6252             Next
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)
6258                 End If
6259                 If ListTab.TabPages(i).Text = tabName Then
6260                     ListTab.TabPages(i).Text = newTabText
6261                 End If
6262             Next
6263             _statuses.RenameTab(tabName, newTabText)
6264
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
6270                     End If
6271                     TabDialog.AddTab(ListTab.TabPages(i).Text)
6272                 End If
6273             Next
6274             SaveConfigsCommon()
6275             SaveConfigsTabs()
6276             _rclickTabName = newTabText
6277             tabName = newTabText
6278             Return True
6279         Else
6280             Return False
6281         End If
6282     End Function
6283
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
6286         TabRename(tn)
6287     End Sub
6288
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
6296                     _tabDrag = True
6297                     Exit For
6298                 End If
6299             Next
6300         Else
6301             _tabDrag = False
6302         End If
6303     End Sub
6304
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
6308         Else
6309             e.Effect = DragDropEffects.None
6310         End If
6311     End Sub
6312
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
6315
6316         _tabDrag = False
6317         Dim tn As String = ""
6318         Dim bef As Boolean
6319         Dim cpos As New Point(e.X, e.Y)
6320         Dim spos As Point = ListTab.PointToClient(cpos)
6321         Dim i As Integer
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
6328                     bef = True
6329                 Else
6330                     bef = False
6331                 End If
6332                 Exit For
6333             End If
6334         Next
6335
6336         'タブのないところにドロップ->最後尾へ移動
6337         If String.IsNullOrEmpty(tn) Then
6338             tn = ListTab.TabPages(ListTab.TabPages.Count - 1).Text
6339             bef = False
6340             i = ListTab.TabPages.Count - 1
6341         End If
6342
6343         Dim tp As TabPage = DirectCast(e.Data.GetData(GetType(TabPage)), TabPage)
6344         If tp.Text = tn Then Exit Sub
6345
6346         ReOrderTab(tp.Text, tn, bef)
6347     End Sub
6348
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
6353         Next
6354
6355         ListTab.SuspendLayout()
6356
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
6363                 Exit For
6364             End If
6365         Next
6366         If isBeforeBaseTab Then
6367             ListTab.TabPages.Insert(baseIndex, mTp)
6368         Else
6369             ListTab.TabPages.Insert(baseIndex + 1, mTp)
6370         End If
6371
6372         ListTab.ResumeLayout()
6373
6374         SaveConfigsTabs()
6375     End Sub
6376
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
6384
6385         ' 複数あてリプライはReplyではなく通常ポスト
6386         '↑仕様変更で全部リプライ扱いでOK(先頭ドット付加しない)
6387         '090403暫定でドットを付加しないようにだけ修正。単独と複数の処理は統合できると思われる。
6388         '090513 all @ replies 廃止の仕様変更によりドット付加に戻し(syo68k)
6389
6390         If _curList.SelectedIndices.Count > 0 Then
6391             ' アイテムが1件以上選択されている
6392             If _curList.SelectedIndices.Count = 1 AndAlso Not isAll AndAlso _curPost IsNot Nothing Then
6393                 ' 単独ユーザー宛リプライまたはDM
6394                 If (_statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.DirectMessage AndAlso isAuto) OrElse (Not isAuto AndAlso Not isReply) Then
6395                     ' ダイレクトメッセージ
6396                     StatusText.Text = "D " + _curPost.Name + " " + StatusText.Text
6397                     StatusText.SelectionStart = StatusText.Text.Length
6398                     StatusText.Focus()
6399                     _reply_to_id = 0
6400                     _reply_to_name = ""
6401                     Exit Sub
6402                 End If
6403                 If String.IsNullOrEmpty(StatusText.Text) Then
6404                     '空の場合
6405
6406                     ' ステータステキストが入力されていない場合先頭に@ユーザー名を追加する
6407                     StatusText.Text = "@" + _curPost.Name + " "
6408                     If _curPost.RetweetedId > 0 Then
6409                         _reply_to_id = _curPost.RetweetedId
6410                     Else
6411                         _reply_to_id = _curPost.Id
6412                     End If
6413                     _reply_to_name = _curPost.Name
6414                 Else
6415                     '何か入力済の場合
6416
6417                     If isAuto Then
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
6421                                 '返信先書き換え
6422                                 If _curPost.RetweetedId > 0 Then
6423                                     _reply_to_id = _curPost.RetweetedId
6424                                 Else
6425                                     _reply_to_id = _curPost.Id
6426                                 End If
6427                                 _reply_to_name = _curPost.Name
6428                             End If
6429                             Exit Sub
6430                         End If
6431                         If Not StatusText.Text.StartsWith("@") Then
6432                             '文頭@以外
6433                             If StatusText.Text.StartsWith(". ") Then
6434                                 ' 複数リプライ
6435                                 StatusText.Text = StatusText.Text.Insert(2, "@" + _curPost.Name + " ")
6436                                 _reply_to_id = 0
6437                                 _reply_to_name = ""
6438                             Else
6439                                 ' 単独リプライ
6440                                 StatusText.Text = "@" + _curPost.Name + " " + StatusText.Text
6441                                 If _curPost.RetweetedId > 0 Then
6442                                     _reply_to_id = _curPost.RetweetedId
6443                                 Else
6444                                     _reply_to_id = _curPost.Id
6445                                 End If
6446                                 _reply_to_name = _curPost.Name
6447                             End If
6448                         Else
6449                             '文頭@
6450                             ' 複数リプライ
6451                             StatusText.Text = ". @" + _curPost.Name + " " + StatusText.Text
6452                             'StatusText.Text = "@" + _curPost.Name + " " + StatusText.Text
6453                             _reply_to_id = 0
6454                             _reply_to_name = ""
6455                         End If
6456                     Else
6457                         '1件選んでCtrl-Rの場合(返信先操作せず)
6458                         Dim sidx As Integer = StatusText.SelectionStart
6459                         Dim id As String = "@" + _curPost.Name + " "
6460                         If sidx > 0 Then
6461                             If StatusText.Text.Substring(sidx - 1, 1) <> " " Then
6462                                 id = " " + id
6463                             End If
6464                         End If
6465                         StatusText.Text = StatusText.Text.Insert(sidx, id)
6466                         sidx += id.Length
6467                         'If StatusText.Text.StartsWith("@") Then
6468                         '    '複数リプライ
6469                         '    StatusText.Text = ". " + StatusText.Text.Insert(sidx, " @" + _curPost.Name + " ")
6470                         '    sidx += 5 + _curPost.Name.Length
6471                         'Else
6472                         '    ' 複数リプライ
6473                         '    StatusText.Text = StatusText.Text.Insert(sidx, " @" + _curPost.Name + " ")
6474                         '    sidx += 3 + _curPost.Name.Length
6475                         'End If
6476                         StatusText.SelectionStart = sidx
6477                         StatusText.Focus()
6478                         '_reply_to_id = 0
6479                         '_reply_to_name = Nothing
6480                         Exit Sub
6481                     End If
6482                 End If
6483             Else
6484                 ' 複数リプライ
6485                 If Not isAuto AndAlso Not isReply Then Exit Sub
6486
6487                 'C-S-rか、複数の宛先を選択中にEnter/DoubleClick/C-r/C-S-r
6488
6489                 If isAuto Then
6490                     'Enter or DoubleClick
6491
6492                     Dim sTxt As String = StatusText.Text
6493                     If Not sTxt.StartsWith(". ") Then
6494                         sTxt = ". " + sTxt
6495                         _reply_to_id = 0
6496                         _reply_to_name = ""
6497                     End If
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
6503                         End If
6504                     Next
6505                     StatusText.Text = sTxt
6506                 Else
6507                     'C-S-r or C-r
6508                     If _curList.SelectedIndices.Count > 1 Then
6509                         '複数ポスト選択
6510
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 + " "
6518                             End If
6519                             If isAll Then
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)
6524                                         If m.Success Then
6525                                             ids += "@" + m.Result("${id}") + " "
6526                                         Else
6527                                             ids += "@" + nm + " "
6528                                         End If
6529                                     End If
6530                                 Next
6531                             End If
6532                         Next
6533                         If ids.Length = 0 Then Exit Sub
6534                         If Not StatusText.Text.StartsWith(". ") Then
6535                             StatusText.Text = ". " + StatusText.Text
6536                             sidx += 2
6537                             _reply_to_id = 0
6538                             _reply_to_name = ""
6539                         End If
6540                         If sidx > 0 Then
6541                             If StatusText.Text.Substring(sidx - 1, 1) <> " " Then
6542                                 ids = " " + ids
6543                             End If
6544                         End If
6545                         StatusText.Text = StatusText.Text.Insert(sidx, ids)
6546                         sidx += ids.Length
6547                         'If StatusText.Text.StartsWith("@") Then
6548                         '    StatusText.Text = ". " + StatusText.Text.Insert(sidx, ids)
6549                         '    sidx += 2 + ids.Length
6550                         'Else
6551                         '    StatusText.Text = StatusText.Text.Insert(sidx, ids)
6552                         '    sidx += 1 + ids.Length
6553                         'End If
6554                         StatusText.SelectionStart = sidx
6555                         StatusText.Focus()
6556                         Exit Sub
6557                     Else
6558                         '1件のみ選択のC-S-r(返信元付加する可能性あり)
6559
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 + " "
6566                         End If
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)
6571                                 If m.Success Then
6572                                     ids += "@" + m.Result("${id}") + " "
6573                                 Else
6574                                     ids += "@" + nm + " "
6575                                 End If
6576                             End If
6577                         Next
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 + " "
6582                             End If
6583                         End If
6584                         If ids.Length = 0 Then Exit Sub
6585                         If String.IsNullOrEmpty(StatusText.Text) Then
6586                             '未入力の場合のみ返信先付加
6587                             StatusText.Text = ids
6588                             StatusText.SelectionStart = ids.Length
6589                             StatusText.Focus()
6590                             If post.RetweetedId > 0 Then
6591                                 _reply_to_id = post.RetweetedId
6592                             Else
6593                                 _reply_to_id = post.Id
6594                             End If
6595                             _reply_to_name = post.Name
6596                             Exit Sub
6597                         End If
6598
6599                         If sidx > 0 Then
6600                             If StatusText.Text.Substring(sidx - 1, 1) <> " " Then
6601                                 ids = " " + ids
6602                             End If
6603                         End If
6604                         StatusText.Text = StatusText.Text.Insert(sidx, ids)
6605                         sidx += ids.Length
6606                         StatusText.SelectionStart = sidx
6607                         StatusText.Focus()
6608                         Exit Sub
6609                     End If
6610                 End If
6611             End If
6612             StatusText.SelectionStart = StatusText.Text.Length
6613             StatusText.Focus()
6614         End If
6615     End Sub
6616
6617     Private Sub ListTab_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListTab.MouseUp
6618         _tabDrag = False
6619     End Sub
6620
6621     Private Sub TimerRefreshIcon_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerRefreshIcon.Tick
6622         '200ms
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
6630
6631         Static iconDlListTopItem As ListViewItem = Nothing
6632         If DirectCast(ListTab.SelectedTab.Tag, ListView).TopItem Is iconDlListTopItem Then
6633             DirectCast(Me.TIconDic, ImageDictionary).PauseGetImage = False
6634         Else
6635             DirectCast(Me.TIconDic, ImageDictionary).PauseGetImage = True
6636         End If
6637         iconDlListTopItem = DirectCast(ListTab.SelectedTab.Tag, ListView).TopItem
6638
6639         iconCnt += 1
6640         blinkCnt += 1
6641         'usCheckCnt += 1
6642
6643         'If usCheckCnt > 300 Then    '1min
6644         '    usCheckCnt = 0
6645         '    If Not Me.IsReceivedUserStream Then
6646         '        TraceOut("ReconnectUserStream")
6647         '        tw.ReconnectUserStream()
6648         '    End If
6649         'End If
6650
6651         Dim busy As Boolean = False
6652         For Each bw As BackgroundWorker In Me._bw
6653             If bw IsNot Nothing AndAlso bw.IsBusy Then
6654                 busy = True
6655                 Exit For
6656             End If
6657         Next
6658
6659         If iconCnt > 3 Then
6660             iconCnt = 0
6661         End If
6662         If blinkCnt > 10 Then
6663             blinkCnt = 0
6664             '未保存の変更を保存
6665             SaveConfigsAll(True)
6666         End If
6667
6668         If busy Then
6669             NotifyIcon1.Icon = NIconRefresh(iconCnt)
6670             idle = False
6671             _myStatusError = False
6672             Exit Sub
6673         End If
6674
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
6678             blink = Not blink
6679             If blink OrElse SettingDialog.ReplyIconState = REPLY_ICONSTATE.StaticIcon Then
6680                 NotifyIcon1.Icon = ReplyIcon
6681             Else
6682                 NotifyIcon1.Icon = ReplyIconBlink
6683             End If
6684             idle = False
6685             Exit Sub
6686         End If
6687
6688         If idle Then Exit Sub
6689         idle = True
6690         '優先度:エラー→オフライン→アイドル
6691         'エラーは更新アイコンでクリアされる
6692         If _myStatusError Then
6693             NotifyIcon1.Icon = NIconAtRed
6694             Exit Sub
6695         End If
6696         If _myStatusOnline Then
6697             NotifyIcon1.Icon = NIconAt
6698         Else
6699             NotifyIcon1.Icon = NIconAtSmoke
6700         End If
6701     End Sub
6702
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
6708             Else
6709                 Exit Sub
6710             End If
6711         End If
6712
6713         If _statuses Is Nothing Then Exit Sub
6714         If _statuses.Tabs Is Nothing Then Exit Sub
6715
6716         Dim tb As TabClass = _statuses.Tabs(_rclickTabName)
6717         If tb Is Nothing Then Exit Sub
6718
6719         NotifyDispMenuItem.Checked = tb.Notify
6720         Me.NotifyTbMenuItem.Checked = tb.Notify
6721
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)
6730         End If
6731         For Each oFile As IO.FileInfo In oDir.GetFiles("*.wav")
6732             SoundFileComboBox.Items.Add(oFile.Name)
6733             Me.SoundFileTbComboBox.Items.Add(oFile.Name)
6734         Next
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
6742
6743         TabMenuControl(_rclickTabName)
6744     End Sub
6745
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
6757         Else
6758             FilterEditMenuItem.Enabled = True
6759             Me.EditRuleTbMenuItem.Enabled = True
6760             DeleteTabMenuItem.Enabled = True
6761             Me.DeleteTbMenuItem.Enabled = True
6762         End If
6763     End Sub
6764
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
6768
6769         If String.IsNullOrEmpty(_rclickTabName) Then Exit Sub
6770         ChangeTabUnreadManage(_rclickTabName, UreadManageMenuItem.Checked)
6771
6772         SaveConfigsTabs()
6773     End Sub
6774
6775     Public Sub ChangeTabUnreadManage(ByVal tabName As String, ByVal isManage As Boolean)
6776
6777         Dim idx As Integer
6778         For idx = 0 To ListTab.TabCount
6779             If ListTab.TabPages(idx).Text = tabName Then Exit For
6780         Next
6781
6782         _statuses.SetTabUnreadManage(tabName, isManage)
6783         If SettingDialog.TabIconDisp Then
6784             If _statuses.Tabs(tabName).UnreadCount > 0 Then
6785                 ListTab.TabPages(idx).ImageIndex = 0
6786             Else
6787                 ListTab.TabPages(idx).ImageIndex = -1
6788             End If
6789         End If
6790
6791         If _curTab.Text = tabName Then
6792             _itemCache = Nothing
6793             _postCache = Nothing
6794             _curList.Refresh()
6795         End If
6796
6797         SetMainWindowTitle()
6798         SetStatusLabelUrl()
6799         If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
6800     End Sub
6801
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
6805
6806         If String.IsNullOrEmpty(_rclickTabName) Then Exit Sub
6807
6808         _statuses.Tabs(_rclickTabName).Notify = NotifyDispMenuItem.Checked
6809
6810         SaveConfigsTabs()
6811     End Sub
6812
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
6815
6816         _statuses.Tabs(_rclickTabName).SoundFile = DirectCast(DirectCast(sender, ToolStripComboBox).SelectedItem, String)
6817
6818         SaveConfigsTabs()
6819     End Sub
6820
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
6823
6824         RemoveSpecifiedTab(_rclickTabName)
6825         SaveConfigsTabs()
6826     End Sub
6827
6828     Private Sub FilterEditMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FilterEditMenuItem.Click, EditRuleTbMenuItem.Click
6829
6830         If String.IsNullOrEmpty(_rclickTabName) Then _rclickTabName = _statuses.GetTabByType(TabUsageType.Home).TabName
6831         fDialog.SetCurrent(_rclickTabName)
6832         fDialog.ShowDialog()
6833         Me.TopMost = SettingDialog.AlwaysTop
6834
6835         Try
6836             Me.Cursor = Cursors.WaitCursor
6837             _itemCache = Nothing
6838             _postCache = Nothing
6839             _curPost = Nothing
6840             _curItemIndex = -1
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
6846                         tb.ImageIndex = 0
6847                     End If
6848                 Else
6849                     If SettingDialog.TabIconDisp Then
6850                         tb.ImageIndex = -1
6851                     End If
6852                 End If
6853             Next
6854             If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
6855         Finally
6856             Me.Cursor = Cursors.Default
6857         End Try
6858         SaveConfigsTabs()
6859     End Sub
6860
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
6871             inputName.Dispose()
6872         End Using
6873         Me.TopMost = SettingDialog.AlwaysTop
6874         If Not String.IsNullOrEmpty(tabName) Then
6875             'List対応
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
6882                 End Using
6883             End If
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)
6887             Else
6888                 '成功
6889                 _statuses.AddTab(tabName, tabUsage, list)
6890                 SaveConfigsTabs()
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()
6895                 End If
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)
6900                 End If
6901             End If
6902         End If
6903     End Sub
6904
6905     Private Sub TabMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabMenuItem.Click, CreateTabRuleOpMenuItem.Click
6906         '選択発言を元にフィルタ追加
6907         For Each idx As Integer In _curList.SelectedIndices
6908             Dim tabName As String = ""
6909             'タブ選択(or追加)
6910             If Not SelectTab(tabName) Then Exit Sub
6911
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)
6915             Else
6916                 fDialog.AddNewFilter(_statuses.Item(_curTab.Text, idx).RetweetedBy, _statuses.Item(_curTab.Text, idx).Data)
6917             End If
6918             fDialog.ShowDialog()
6919             Me.TopMost = SettingDialog.AlwaysTop
6920         Next
6921
6922         Try
6923             Me.Cursor = Cursors.WaitCursor
6924             _itemCache = Nothing
6925             _postCache = Nothing
6926             _curPost = Nothing
6927             _curItemIndex = -1
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
6933                         tb.ImageIndex = 0
6934                     End If
6935                 Else
6936                     If SettingDialog.TabIconDisp Then
6937                         tb.ImageIndex = -1
6938                     End If
6939                 End If
6940             Next
6941             If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
6942         Finally
6943             Me.Cursor = Cursors.Default
6944         End Try
6945         SaveConfigsTabs()
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))
6949         End If
6950     End Sub
6951
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
6957                 '改行
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)  '選択状態文字列削除
6966                     End If
6967                     StatusText.Text = StatusText.Text.Insert(pos1, Environment.NewLine)  '改行挿入
6968                     StatusText.SelectionStart = pos1 + Environment.NewLine.Length    'カーソルを改行の次の文字へ移動
6969                     Return True
6970                 End If
6971                 '投稿
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)
6984                     Return True
6985                 End If
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)
6990                 Return True
6991             End If
6992         End If
6993
6994         Return MyBase.ProcessDialogKey(keyData)
6995     End Function
6996
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)
6999     End Sub
7000
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 = ""
7003
7004         '未選択なら処理終了
7005         If _curList.SelectedIndices.Count = 0 Then Exit Sub
7006
7007         'タブ選択(or追加)
7008         If Not SelectTab(tabName) Then Exit Sub
7009
7010         Dim mv As Boolean = False
7011         Dim mk As Boolean = False
7012         MoveOrCopy(mv, mk)
7013
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
7019                 ids.Add(post.Name)
7020                 If post.RetweetedId = 0 Then
7021                     fc.NameFilter = post.Name
7022                 Else
7023                     fc.NameFilter = post.RetweetedBy
7024                 End If
7025                 fc.SearchBoth = True
7026                 fc.MoveFrom = mv
7027                 fc.SetMark = mk
7028                 fc.UseRegex = False
7029                 fc.SearchUrl = False
7030                 _statuses.Tabs(tabName).AddFilter(fc)
7031             End If
7032         Next
7033         If ids.Count <> 0 Then
7034             Dim atids As New List(Of String)
7035             For Each id As String In ids
7036                 atids.Add("@" + id)
7037             Next
7038             Dim cnt As Integer = AtIdSupl.ItemCount
7039             AtIdSupl.AddRangeItem(atids.ToArray)
7040             If AtIdSupl.ItemCount <> cnt Then _modifySettingAtId = True
7041         End If
7042
7043         Try
7044             Me.Cursor = Cursors.WaitCursor
7045             _itemCache = Nothing
7046             _postCache = Nothing
7047             _curPost = Nothing
7048             _curItemIndex = -1
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
7055                             tb.ImageIndex = 0
7056                         End If
7057                     Else
7058                         If SettingDialog.TabIconDisp Then
7059                             tb.ImageIndex = -1
7060                         End If
7061                     End If
7062                 End If
7063             Next
7064             If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
7065         Finally
7066             Me.Cursor = Cursors.Default
7067         End Try
7068         SaveConfigsTabs()
7069     End Sub
7070
7071     Private Function SelectTab(ByRef tabName As String) As Boolean
7072         Do
7073             '振り分け先タブ選択
7074             If TabDialog.ShowDialog = Windows.Forms.DialogResult.Cancel Then
7075                 Me.TopMost = SettingDialog.AlwaysTop
7076                 Return False
7077             End If
7078             Me.TopMost = SettingDialog.AlwaysTop
7079             tabName = TabDialog.SelectedTabName
7080
7081             ListTab.SelectedTab.Focus()
7082             '新規タブを選択→タブ作成
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
7089                     inputName.Dispose()
7090                 End Using
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)
7096                         'もう一度タブ名入力
7097                     Else
7098                         _statuses.AddTab(tabName, TabUsageType.UserDefined, Nothing)
7099                         Return True
7100                     End If
7101                 End If
7102             Else
7103                 '既存タブを選択
7104                 Return True
7105             End If
7106         Loop While True
7107
7108     End Function
7109
7110     Private Sub MoveOrCopy(ByRef move As Boolean, ByRef mark As Boolean)
7111         With Block
7112             '移動するか?
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
7115                 move = False
7116             Else
7117                 move = True
7118             End If
7119         End With
7120         If Not move Then
7121             'マークするか?
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
7124                 mark = True
7125             Else
7126                 mark = False
7127             End If
7128         End If
7129     End Sub
7130     Private Sub CopySTOTMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CopySTOTMenuItem.Click
7131         Me.CopyStot()
7132     End Sub
7133
7134     Private Sub CopyURLMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CopyURLMenuItem.Click
7135         Me.CopyIdUri()
7136     End Sub
7137
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
7140             ' 発言欄でのCtrl+A
7141             StatusText.SelectAll()
7142         Else
7143             ' ListView上でのCtrl+A
7144             For i As Integer = 0 To _curList.VirtualListSize - 1
7145                 _curList.SelectedIndices.Add(i)
7146             Next
7147         End If
7148     End Sub
7149
7150     Private Sub MoveMiddle()
7151         Dim _item As ListViewItem
7152         Dim idx1 As Integer
7153         Dim idx2 As Integer
7154
7155         If _curList.SelectedIndices.Count = 0 Then Exit Sub
7156
7157         Dim idx As Integer = _curList.SelectedIndices(0)
7158
7159         _item = _curList.GetItemAt(0, 25)
7160         If _item Is Nothing Then
7161             idx1 = 0
7162         Else
7163             idx1 = _item.Index
7164         End If
7165         _item = _curList.GetItemAt(0, _curList.ClientSize.Height - 1)
7166         If _item Is Nothing Then
7167             idx2 = _curList.VirtualListSize - 1
7168         Else
7169             idx2 = _item.Index
7170         End If
7171
7172         idx -= Math.Abs(idx1 - idx2) \ 2
7173         If idx < 0 Then idx = 0
7174
7175         _curList.EnsureVisible(_curList.VirtualListSize - 1)
7176         _curList.EnsureVisible(idx)
7177     End Sub
7178
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()
7182
7183             Dim openUrlStr As String = ""
7184
7185             If PostBrowser.Document.Links.Count = 1 Then
7186                 Dim urlStr As String = ""
7187                 Try
7188                     urlStr = IDNDecode(PostBrowser.Document.Links(0).GetAttribute("href"))
7189                 Catch ex As ArgumentException
7190                     '変なHTML?
7191                     Exit Sub
7192                 End Try
7193                 If String.IsNullOrEmpty(urlStr) Then Exit Sub
7194                 openUrlStr = urlEncodeMultibyteChar(urlStr)
7195             Else
7196                 For Each linkElm As HtmlElement In PostBrowser.Document.Links
7197                     Dim urlStr As String = ""
7198                     Dim linkText As String = ""
7199                     Try
7200                         urlStr = IDNDecode(linkElm.GetAttribute("href"))
7201                         linkText = linkElm.InnerText
7202                         If Not linkText.StartsWith("http") AndAlso Not linkText.StartsWith("#") Then
7203                             linkText = "@" + linkText
7204                         End If
7205                     Catch ex As ArgumentException
7206                         '変なHTML?
7207                         Exit Sub
7208                     End Try
7209                     If String.IsNullOrEmpty(urlStr) Then Continue For
7210                     UrlDialog.AddUrl(New OpenUrlItem(linkText, urlEncodeMultibyteChar(urlStr)))
7211                 Next
7212                 Try
7213                     If UrlDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
7214                         openUrlStr = UrlDialog.SelectedUrl
7215                     End If
7216                 Catch ex As Exception
7217                     Exit Sub
7218                 End Try
7219                 Me.TopMost = SettingDialog.AlwaysTop
7220             End If
7221             If String.IsNullOrEmpty(openUrlStr) Then Exit Sub
7222
7223             If openUrlStr.StartsWith("http://twitter.com/search?q=%23") OrElse _
7224                openUrlStr.StartsWith("https://twitter.com/search?q=%23") Then
7225                 'ハッシュタグの場合は、タブで開く
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)
7231                 Exit Sub
7232             End If
7233
7234             openUrlStr = openUrlStr.Replace("://twitter.com/search?q=#", "://twitter.com/search?q=%23")
7235             OpenUriAsync(openUrlStr)
7236         End If
7237     End Sub
7238
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)
7242     End Sub
7243
7244     Private Sub ClearTab(ByVal tabName As String, ByVal showWarning As Boolean)
7245         If showWarning Then
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
7248                 Exit Sub
7249             End If
7250         End If
7251
7252         _statuses.ClearTabIds(tabName)
7253         If ListTab.SelectedTab.Text = tabName Then
7254             _anchorPost = Nothing
7255             _anchorFlag = False
7256             _itemCache = Nothing
7257             _postCache = Nothing
7258             _itemCacheIndex = -1
7259             _curItemIndex = -1
7260             _curPost = Nothing
7261         End If
7262         For Each tb As TabPage In ListTab.TabPages
7263             If tb.Text = tabName Then
7264                 tb.ImageIndex = -1
7265                 DirectCast(tb.Tag, DetailsListView).VirtualListSize = 0
7266                 Exit For
7267             End If
7268         Next
7269         If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
7270
7271         SetMainWindowTitle()
7272         SetStatusLabelUrl()
7273     End Sub
7274
7275     Private Sub SetMainWindowTitle()
7276         'メインウインドウタイトルの書き換え
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
7289             Next
7290         End If
7291
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, ""))
7300                 End If
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)
7312         End Select
7313
7314         Try
7315             Me.Text = ttl.ToString()
7316         Catch ex As AccessViolationException
7317             '原因不明。ポスト内容に依存か?たまーに発生するが再現せず。
7318         End Try
7319     End Sub
7320
7321     Private Function GetStatusLabelText() As String
7322         'ステータス欄にカウント表示
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)
7334         Try
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
7341                 End If
7342             Next
7343         Catch ex As Exception
7344             Return ""
7345         End Try
7346
7347         UnreadCounter = ur
7348         UnreadAtCounter = urat
7349
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)
7353         Else
7354             slbl.Append(SettingDialog.TimelinePeriodInt.ToString() + My.Resources.SetStatusLabelText3)
7355         End If
7356         Return slbl.ToString()
7357     End Function
7358
7359     Delegate Sub SetStatusLabelApiDelegate()
7360
7361     Private Sub SetStatusLabelApiHandler(ByVal sender As Object, ByVal e As ApiInformationChangedEventArgs)
7362         If InvokeRequired Then
7363             Invoke(New SetStatusLabelApiDelegate(AddressOf SetStatusLabelApi))
7364         Else
7365             SetStatusLabelApi()
7366         End If
7367     End Sub
7368
7369     Private Sub SetStatusLabelApi()
7370         Me._apiGauge.RemainCount = TwitterApiInfo.RemainCount
7371         Me._apiGauge.MaxCount = TwitterApiInfo.MaxCount
7372         Me._apiGauge.ResetTime = TwitterApiInfo.ResetTime
7373     End Sub
7374
7375     Private Sub SetStatusLabelUrl()
7376         StatusLabelUrl.Text = GetStatusLabelText()
7377     End Sub
7378
7379     Public Sub SetStatusLabel(ByVal text As String)
7380         StatusLabel.Text = text
7381     End Sub
7382
7383     Private Sub SetNotifyIconText()
7384         ' タスクトレイアイコンのツールチップテキスト書き換え
7385         ' Tween [未読/@]
7386         Static ur As New StringBuilder(64)
7387         ur.Remove(0, ur.Length)
7388         If SettingDialog.DispUsername Then
7389             ur.Append(tw.Username)
7390             ur.Append(" - ")
7391         End If
7392         ur.Append("Tween")
7393 #If DEBUG Then
7394         ur.Append("(Debug Build)")
7395 #End If
7396         If UnreadCounter <> -1 AndAlso UnreadAtCounter <> -1 Then
7397             ur.Append(" [")
7398             ur.Append(UnreadCounter)
7399             ur.Append("/@")
7400             ur.Append(UnreadAtCounter)
7401             ur.Append("]")
7402         End If
7403         NotifyIcon1.Text = ur.ToString()
7404     End Sub
7405
7406     Friend Sub CheckReplyTo(ByVal StatusText As String)
7407         Dim m As MatchCollection
7408         'ハッシュタグの保存
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}"))
7416                 End If
7417             End If
7418         Next
7419         If Not String.IsNullOrEmpty(HashMgr.UseHash) AndAlso Not hstr.Contains(HashMgr.UseHash + " ") Then
7420             hstr += HashMgr.UseHash
7421         End If
7422         If Not String.IsNullOrEmpty(hstr) Then HashMgr.AddHashToHistory(hstr.Trim, False)
7423
7424         ' 本当にリプライ先指定すべきかどうかの判定
7425         m = Regex.Matches(StatusText, "(^|[ -/:-@[-^`{-~])(?<id>@[a-zA-Z0-9_]+)")
7426
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}"))
7431             Next
7432             If bCnt <> AtIdSupl.ItemCount Then _modifySettingAtId = True
7433         End If
7434
7435         ' リプライ先ステータスIDの指定がない場合は指定しない
7436         If _reply_to_id = 0 Then Exit Sub
7437
7438         ' リプライ先ユーザー名がない場合も指定しない
7439         If String.IsNullOrEmpty(_reply_to_name) Then
7440             _reply_to_id = 0
7441             Exit Sub
7442         End If
7443
7444         ' 通常Reply
7445         ' 次の条件を満たす場合に in_reply_to_status_id 指定
7446         ' 1. Twitterによりリンクと判定される @idが文中に1つ含まれる (2009/5/28 リンク化される@IDのみカウントするように修正)
7447         ' 2. リプライ先ステータスIDが設定されている(リストをダブルクリックで返信している)
7448         ' 3. 文中に含まれた@idがリプライ先のポスト者のIDと一致する
7449
7450         If m IsNot Nothing Then
7451             If StatusText.StartsWith("@") Then
7452                 If StatusText.StartsWith("@" + _reply_to_name) Then Exit Sub
7453             Else
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
7456                 Next
7457             End If
7458         End If
7459
7460         _reply_to_id = 0
7461         _reply_to_name = ""
7462
7463     End Sub
7464
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
7467             Me.Visible = False
7468         End If
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の位置設定
7476             End If
7477             '発言欄複数行
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
7483                 End If
7484                 StatusText.Height = _cfgLocal.StatusTextHeight
7485             Else
7486                 If SplitContainer2.Height - SplitContainer2.Panel2MinSize - SplitContainer2.SplitterWidth > 0 Then
7487                     SplitContainer2.SplitterDistance = SplitContainer2.Height - SplitContainer2.Panel2MinSize - SplitContainer2.SplitterWidth
7488                 End If
7489             End If
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
7492             End If
7493             _initialLayout = False
7494         End If
7495     End Sub
7496
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
7502         Else
7503             SettingDialog.PlaySound = False
7504         End If
7505         _modifySettingCommon = True
7506     End Sub
7507
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
7513         End If
7514     End Sub
7515
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())
7520                 Exit Sub
7521             End If
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)
7525             Else
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)
7530                     Exit Sub
7531                 Next
7532                 OpenUriAsync("http://twitter.com/" + _curPost.InReplyToUser + "/status/" + _curPost.InReplyToId.ToString())
7533             End If
7534         End If
7535     End Sub
7536
7537     Private Sub RepliedStatusOpenMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RepliedStatusOpenMenuItem.Click, OpenRepSourceOpMenuItem.Click
7538         doRepliedStatusOpen()
7539     End Sub
7540
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)
7547                 If idx <> -1 Then
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
7553                     Else
7554                         Me.IconNameToolStripMenuItem.Enabled = False
7555                         Me.IconNameToolStripMenuItem.Text = My.Resources.ContextMenuStrip3_OpeningText1
7556                     End If
7557                 Else
7558                     Me.IconNameToolStripMenuItem.Enabled = False
7559                     Me.IconNameToolStripMenuItem.Text = My.Resources.ContextMenuStrip3_OpeningText1
7560                 End If
7561                 If Me.TIconDic.ContainsKey(_curPost.ImageUrl) AndAlso Me.TIconDic(_curPost.ImageUrl) IsNot Nothing Then
7562                     Me.SaveIconPictureToolStripMenuItem.Enabled = True
7563                 Else
7564                     Me.SaveIconPictureToolStripMenuItem.Enabled = False
7565                 End If
7566             Else
7567                 Me.IconNameToolStripMenuItem.Enabled = False
7568                 Me.SaveIconPictureToolStripMenuItem.Enabled = False
7569                 Me.IconNameToolStripMenuItem.Text = My.Resources.ContextMenuStrip3_OpeningText1
7570             End If
7571         Else
7572             Me.IconNameToolStripMenuItem.Enabled = False
7573             Me.SaveIconPictureToolStripMenuItem.Enabled = False
7574             Me.IconNameToolStripMenuItem.Text = My.Resources.ContextMenuStrip3_OpeningText2
7575         End If
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
7586             Else
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
7594             End If
7595         Else
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
7603         End If
7604     End Sub
7605
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
7610     End Sub
7611
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)))
7616
7617         Me.SaveFileDialog1.FileName = name.Substring(0, name.Length - 8) ' "_normal".Length + 1
7618
7619         If Me.SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
7620             ' STUB
7621         End If
7622     End Sub
7623
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
7627
7628         Me.SaveFileDialog1.FileName = name.Substring(name.LastIndexOf("/"c) + 1)
7629
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)
7635                     g.Dispose()
7636                 End Using
7637                 bmp2.Save(Me.SaveFileDialog1.FileName)
7638                 bmp2.Dispose()
7639             End Using
7640         End If
7641     End Sub
7642
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
7647     End Sub
7648
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
7652         Else
7653             Me.StatusText.ScrollBars = ScrollBars.None
7654         End If
7655         _modifySettingLocal = True
7656     End Sub
7657
7658     Private Sub MultiLineMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MultiLineMenuItem.Click
7659         '発言欄複数行
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
7665             Else
7666                 SplitContainer2.SplitterDistance = SplitContainer2.Height - _mySpDis2 - SplitContainer2.SplitterWidth
7667             End If
7668         Else
7669             SplitContainer2.SplitterDistance = SplitContainer2.Height - SplitContainer2.Panel2MinSize - SplitContainer2.SplitterWidth
7670         End If
7671         _modifySettingLocal = True
7672     End Sub
7673
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
7679
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_&=#/])?)"
7686
7687         Const nico As String = "^https?://[a-z]+\.(nicovideo|niconicommons|nicolive)\.jp/[a-z]+/[a-z0-9]+$"
7688
7689         If StatusText.SelectionLength > 0 Then
7690             Dim tmp As String = StatusText.SelectedText
7691             ' httpから始まらない場合、ExcludeStringで指定された文字列で始まる場合は対象としない
7692             If tmp.StartsWith("http") Then
7693                 ' 文字列が選択されている場合はその文字列について処理
7694
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() + ":")
7703                         Return False
7704                     End If
7705                 Else
7706                     Return True
7707                 End If
7708
7709                 If Not String.IsNullOrEmpty(result) Then
7710                     Dim undotmp As New urlUndo
7711
7712                     StatusText.Select(StatusText.Text.IndexOf(tmp, StringComparison.Ordinal), tmp.Length)
7713                     StatusText.SelectedText = result
7714
7715                     'undoバッファにセット
7716                     undotmp.Before = tmp
7717                     undotmp.After = result
7718
7719                     If urlUndoBuffer Is Nothing Then
7720                         urlUndoBuffer = New List(Of urlUndo)
7721                         UrlUndoToolStripMenuItem.Enabled = True
7722                     End If
7723
7724                     urlUndoBuffer.Add(undotmp)
7725                 End If
7726             End If
7727         Else
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
7734
7735                 '選んだURLを選択(?)
7736                 StatusText.Select(StatusText.Text.IndexOf(mt.Result("${url}"), StringComparison.Ordinal), mt.Result("${url}").Length)
7737
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() + ":")
7746                         Continue For
7747                     End If
7748                 Else
7749                     Continue For
7750                 End If
7751
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
7755                     'undoバッファにセット
7756                     undotmp.Before = mt.Result("${url}")
7757                     undotmp.After = result
7758
7759                     If urlUndoBuffer Is Nothing Then
7760                         urlUndoBuffer = New List(Of urlUndo)
7761                         UrlUndoToolStripMenuItem.Enabled = True
7762                     End If
7763
7764                     urlUndoBuffer.Add(undotmp)
7765                 End If
7766             Next
7767         End If
7768
7769         Return True
7770
7771     End Function
7772
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)
7778             Next
7779             StatusText.Text = tmp
7780             urlUndoBuffer = Nothing
7781             UrlUndoToolStripMenuItem.Enabled = False
7782         End If
7783     End Sub
7784
7785     Private Sub TinyURLToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TinyURLToolStripMenuItem.Click
7786         UrlConvert(UrlConverter.TinyUrl)
7787     End Sub
7788
7789     Private Sub IsgdToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IsgdToolStripMenuItem.Click
7790         UrlConvert(UrlConverter.Isgd)
7791     End Sub
7792
7793     Private Sub TwurlnlToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TwurlnlToolStripMenuItem.Click
7794         UrlConvert(UrlConverter.Twurl)
7795     End Sub
7796
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サービス以外を選択する
7802             Do
7803                 svc = CType(rnd.Next(System.Enum.GetNames(GetType(UrlConverter)).Length), UrlConverter)
7804             Loop Until svc <> SettingDialog.AutoShortUrlFirst
7805             UrlConvert(svc)
7806         End If
7807     End Sub
7808
7809     Private Sub UrlUndoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UrlUndoToolStripMenuItem.Click
7810         doUrlUndo()
7811     End Sub
7812
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
7818     End Sub
7819
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
7825     End Sub
7826
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 が発生
7831     End Sub
7832
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()
7837             Else
7838                 DirectCast(Me.Tag, Control).Select()
7839             End If
7840         Else ' 戻り先が指定されていない (初期状態) 場合はタブに遷移
7841             If ListTab.SelectedIndex > -1 AndAlso ListTab.SelectedTab.HasChildren Then
7842                 Me.Tag = ListTab.SelectedTab.Tag
7843                 DirectCast(Me.Tag, Control).Select()
7844             End If
7845         End If
7846         ' フォーカスがメニューに遷移したかどうかを表すフラグを降ろす
7847         MenuStrip1.Tag = Nothing
7848     End Sub
7849
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
7853
7854         If _iconCol Then
7855             _cfgLocal.Width1 = lst.Columns(0).Width
7856             _cfgLocal.Width3 = lst.Columns(1).Width
7857         Else
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
7861             Next
7862             MoveArrayItem(darr, e.OldDisplayIndex, e.NewDisplayIndex)
7863
7864             For i As Integer = 0 To lst.Columns.Count - 1
7865                 Select Case darr(i)
7866                     Case 0
7867                         _cfgLocal.DisplayIndex1 = i
7868                     Case 1
7869                         _cfgLocal.DisplayIndex2 = i
7870                     Case 2
7871                         _cfgLocal.DisplayIndex3 = i
7872                     Case 3
7873                         _cfgLocal.DisplayIndex4 = i
7874                     Case 4
7875                         _cfgLocal.DisplayIndex5 = i
7876                     Case 5
7877                         _cfgLocal.DisplayIndex6 = i
7878                     Case 6
7879                         _cfgLocal.DisplayIndex7 = i
7880                     Case 7
7881                         _cfgLocal.DisplayIndex8 = i
7882                 End Select
7883             Next
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
7892         End If
7893         _modifySettingLocal = True
7894         _isColumnChanged = True
7895     End Sub
7896
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
7900         If _iconCol Then
7901             If _cfgLocal.Width1 <> lst.Columns(0).Width Then
7902                 _cfgLocal.Width1 = lst.Columns(0).Width
7903                 _modifySettingLocal = True
7904                 _isColumnChanged = True
7905             End If
7906             If _cfgLocal.Width3 <> lst.Columns(1).Width Then
7907                 _cfgLocal.Width3 = lst.Columns(1).Width
7908                 _modifySettingLocal = True
7909                 _isColumnChanged = True
7910             End If
7911         Else
7912             If _cfgLocal.Width1 <> lst.Columns(0).Width Then
7913                 _cfgLocal.Width1 = lst.Columns(0).Width
7914                 _modifySettingLocal = True
7915                 _isColumnChanged = True
7916             End If
7917             If _cfgLocal.Width2 <> lst.Columns(1).Width Then
7918                 _cfgLocal.Width2 = lst.Columns(1).Width
7919                 _modifySettingLocal = True
7920                 _isColumnChanged = True
7921             End If
7922             If _cfgLocal.Width3 <> lst.Columns(2).Width Then
7923                 _cfgLocal.Width3 = lst.Columns(2).Width
7924                 _modifySettingLocal = True
7925                 _isColumnChanged = True
7926             End If
7927             If _cfgLocal.Width4 <> lst.Columns(3).Width Then
7928                 _cfgLocal.Width4 = lst.Columns(3).Width
7929                 _modifySettingLocal = True
7930                 _isColumnChanged = True
7931             End If
7932             If _cfgLocal.Width5 <> lst.Columns(4).Width Then
7933                 _cfgLocal.Width5 = lst.Columns(4).Width
7934                 _modifySettingLocal = True
7935                 _isColumnChanged = True
7936             End If
7937             If _cfgLocal.Width6 <> lst.Columns(5).Width Then
7938                 _cfgLocal.Width6 = lst.Columns(5).Width
7939                 _modifySettingLocal = True
7940                 _isColumnChanged = True
7941             End If
7942             If _cfgLocal.Width7 <> lst.Columns(6).Width Then
7943                 _cfgLocal.Width7 = lst.Columns(6).Width
7944                 _modifySettingLocal = True
7945                 _isColumnChanged = True
7946             End If
7947             If _cfgLocal.Width8 <> lst.Columns(7).Width Then
7948                 _cfgLocal.Width8 = lst.Columns(7).Width
7949                 _modifySettingLocal = True
7950                 _isColumnChanged = True
7951             End If
7952         End If
7953         ' 非表示の時にColumnChangedが呼ばれた場合はForm初期化処理中なので保存しない
7954         'If changed Then
7955         '    SaveConfigsLocal()
7956         'End If
7957     End Sub
7958
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)
7966     End Function
7967
7968     Private Sub SelectionCopyContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SelectionCopyContextMenuItem.Click
7969         '発言詳細で「選択文字列をコピー」
7970         Dim _selText As String = WebBrowser_GetSelectionText(PostBrowser)
7971         Try
7972             Clipboard.SetDataObject(_selText, False, 5, 100)
7973         Catch ex As Exception
7974             MessageBox.Show(ex.Message)
7975         End Try
7976     End Sub
7977
7978     Private Sub doSearchToolStrip(ByVal url As String)
7979         '発言詳細で「選択文字列で検索」(選択文字列取得)
7980         Dim _selText As String = WebBrowser_GetSelectionText(PostBrowser)
7981
7982         If _selText IsNot Nothing Then
7983             If url = My.Resources.SearchItem4Url Then
7984                 '公式検索
7985                 AddNewTabForSearch(_selText)
7986                 Exit Sub
7987             End If
7988
7989             Dim tmp As String = String.Format(url, HttpUtility.UrlEncode(_selText))
7990             OpenUriAsync(tmp)
7991         End If
7992     End Sub
7993
7994     Private Sub SelectionAllContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SelectionAllContextMenuItem.Click
7995         '発言詳細ですべて選択
7996         PostBrowser.Document.ExecCommand("SelectAll", False, Nothing)
7997     End Sub
7998
7999     Private Sub SearchWikipediaContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchWikipediaContextMenuItem.Click
8000         doSearchToolStrip(My.Resources.SearchItem1Url)
8001     End Sub
8002
8003     Private Sub SearchGoogleContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchGoogleContextMenuItem.Click
8004         doSearchToolStrip(My.Resources.SearchItem2Url)
8005     End Sub
8006
8007     Private Sub SearchYatsContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchYatsContextMenuItem.Click
8008         doSearchToolStrip(My.Resources.SearchItem3Url)
8009     End Sub
8010
8011     Private Sub SearchPublicSearchContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchPublicSearchContextMenuItem.Click
8012         doSearchToolStrip(My.Resources.SearchItem4Url)
8013     End Sub
8014
8015     Private Sub UrlCopyContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UrlCopyContextMenuItem.Click
8016         Try
8017             Clipboard.SetDataObject(Me._postBrowserStatusText, False, 5, 100)
8018         Catch ex As Exception
8019             MessageBox.Show(ex.Message)
8020         End Try
8021     End Sub
8022
8023     Private Sub ContextMenuPostBrowser_Opening(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ContextMenuPostBrowser.Opening
8024         ' URLコピーの項目の表示/非表示
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
8038             Else
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
8047             End If
8048
8049             If Regex.IsMatch(Me._postBrowserStatusText, "^https?://twitter.com/search\?q=%23") Then
8050                 UseHashtagMenuItem.Enabled = True
8051             Else
8052                 UseHashtagMenuItem.Enabled = False
8053             End If
8054         Else
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
8066         End If
8067         ' 文字列選択されていないときは選択文字列関係の項目を非表示に
8068         Dim _selText As String = WebBrowser_GetSelectionText(PostBrowser)
8069         If _selText Is Nothing Then
8070             SelectionSearchContextMenuItem.Enabled = False
8071             SelectionCopyContextMenuItem.Enabled = False
8072         Else
8073             SelectionSearchContextMenuItem.Enabled = True
8074             SelectionCopyContextMenuItem.Enabled = True
8075         End If
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
8081                 fAllFlag = True
8082                 Exit For
8083             End If
8084         Next
8085         Me.FriendshipAllMenuItem.Enabled = fAllFlag
8086
8087         e.Cancel = False
8088     End Sub
8089
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)
8093
8094         If _selText IsNot Nothing Then
8095             SearchDialog.SWord = _selText
8096             SearchDialog.CheckCaseSensitive = False
8097             SearchDialog.CheckRegex = False
8098
8099             DoTabSearch(SearchDialog.SWord, _
8100                         SearchDialog.CheckCaseSensitive, _
8101                         SearchDialog.CheckRegex, _
8102                         SEARCHTYPE.NextSearch)
8103         End If
8104     End Sub
8105
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
8109     End Sub
8110
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()
8119             Me.Activate()
8120             StatusText.Focus()
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
8124         End If
8125     End Sub
8126
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)
8133
8134             If picsvc.IsValidExtension(ext, ImageService) AndAlso _
8135                     picsvc.GetMaxFileSize(ext, ImageService) >= fl.Length Then
8136                 e.Effect = DragDropEffects.Copy
8137                 Exit Sub
8138             End If
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
8144                     Exit Sub
8145                 Else
8146                     Continue For
8147                 End If
8148             Next
8149             e.Effect = DragDropEffects.None
8150         ElseIf e.Data.GetDataPresent(DataFormats.StringFormat) Then
8151             e.Effect = DragDropEffects.Copy
8152         Else
8153             e.Effect = DragDropEffects.None
8154         End If
8155     End Sub
8156
8157     Public Function IsNetworkAvailable() As Boolean
8158         Dim nw As Boolean = True
8159         Try
8160             nw = My.Computer.Network.IsAvailable
8161         Catch ex As Exception
8162             nw = False
8163         End Try
8164         _myStatusOnline = nw
8165         Return nw
8166     End Function
8167
8168     Public Sub OpenUriAsync(ByVal UriString As String)
8169         Dim args As New GetWorkerArg
8170         args.type = WORKERTYPE.OpenUri
8171         args.url = UriString
8172
8173         RunAsync(args)
8174     End Sub
8175
8176     Private Sub ListTabSelect(ByVal _tab As TabPage)
8177         SetListProperty()
8178
8179         _itemCache = Nothing
8180         _itemCacheIndex = -1
8181         _postCache = Nothing
8182
8183         _curTab = _tab
8184         _curList = DirectCast(_tab.Tag, DetailsListView)
8185         If _curList.SelectedIndices.Count > 0 Then
8186             _curItemIndex = _curList.SelectedIndices(0)
8187             _curPost = GetCurTabPost(_curItemIndex)
8188         Else
8189             _curItemIndex = -1
8190             _curPost = Nothing
8191         End If
8192
8193         _anchorPost = Nothing
8194         _anchorFlag = False
8195
8196         If _iconCol Then
8197             DirectCast(_tab.Tag, DetailsListView).Columns.Item(1).Text = ColumnText(2)
8198         Else
8199             For i As Integer = 0 To _curList.Columns.Count - 1
8200                 DirectCast(_tab.Tag, DetailsListView).Columns.Item(i).Text = ColumnText(i)
8201             Next
8202         End If
8203     End Sub
8204
8205     Private Sub ListTab_Selecting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TabControlCancelEventArgs) Handles ListTab.Selecting
8206         ListTabSelect(e.TabPage)
8207     End Sub
8208
8209     Private Sub SelectListItem(ByVal LView As DetailsListView, ByVal Index As Integer)
8210         '単一
8211         Dim bnd As Rectangle
8212         Dim flg As Boolean = False
8213         If LView.FocusedItem IsNot Nothing Then
8214             bnd = LView.FocusedItem.Bounds
8215             flg = True
8216         End If
8217
8218         LView.SelectedIndices.Clear()
8219         LView.Items(Index).Selected = True
8220         LView.Items(Index).Focused = True
8221
8222         If flg Then LView.Invalidate(bnd)
8223     End Sub
8224
8225     Private Sub SelectListItem(ByVal LView As DetailsListView, ByVal Index() As Integer, ByVal FocusedIndex As Integer)
8226         '複数
8227         Dim bnd As Rectangle
8228         Dim flg As Boolean = False
8229         If LView.FocusedItem IsNot Nothing Then
8230             bnd = LView.FocusedItem.Bounds
8231             flg = True
8232         End If
8233
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)
8238             Next
8239         End If
8240         If FocusedIndex > -1 Then
8241             LView.Items(FocusedIndex).Focused = True
8242         End If
8243         If flg Then LView.Invalidate(bnd)
8244     End Sub
8245
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
8251                     bw = _bw(i)
8252                     Exit For
8253                 End If
8254             Next
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
8259                         bw = _bw(i)
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
8265                         Exit For
8266                     End If
8267                 Next
8268             End If
8269         Else
8270             If _bwFollower Is Nothing Then
8271                 _bwFollower = New BackgroundWorker
8272                 bw = _bwFollower
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
8278             Else
8279                 If _bwFollower.IsBusy = False Then
8280                     bw = _bwFollower
8281                 End If
8282             End If
8283         End If
8284         If bw Is Nothing Then Exit Sub
8285
8286         bw.RunWorkerAsync(args)
8287     End Sub
8288
8289     Private Sub TweenMain_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
8290         Try
8291             PostBrowser.Url = New Uri("about:blank")
8292             PostBrowser.DocumentText = ""       '発言詳細部初期化
8293         Catch ex As Exception
8294
8295         End Try
8296
8297         NotifyIcon1.Visible = True
8298
8299         If IsNetworkAvailable() Then
8300             If SettingDialog.StartupFollowers Then
8301                 GetTimeline(WORKERTYPE.Follower, 0, 0, "")
8302             End If
8303             _waitTimeline = True
8304             GetTimeline(WORKERTYPE.Timeline, 1, 1, "")
8305             _waitReply = True
8306             GetTimeline(WORKERTYPE.Reply, 1, 1, "")
8307             _waitDm = True
8308             GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 1, "")
8309             If SettingDialog.GetFav Then
8310                 _waitFav = True
8311                 GetTimeline(WORKERTYPE.Favorites, 1, 1, "")
8312             End If
8313             _waitPubSearch = True
8314             GetTimeline(WORKERTYPE.PublicSearch, 1, 0, "")  'tabname="":全タブ
8315             _waitLists = True
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()
8322                 i += 1
8323                 j += 1
8324                 If j > 1200 Then Exit Do ' 120秒間初期処理が終了しなかったら強制的に打ち切る
8325                 If i > 50 Then
8326                     If _endingFlag Then
8327                         Exit Sub
8328                     End If
8329                     i = 0
8330                 End If
8331             Loop
8332
8333             If _endingFlag Then Exit Sub
8334
8335             'バージョンチェック(引数:起動時チェックの場合はTrue・・・チェック結果のメッセージを表示しない)
8336             If SettingDialog.StartupVersion Then
8337                 CheckNewVersion(True)
8338             End If
8339
8340             ' 取得失敗の場合は再試行する
8341             If Not tw.GetFollowersSuccess AndAlso SettingDialog.StartupFollowers Then
8342                 GetTimeline(WORKERTYPE.Follower, 0, 0, "")
8343             End If
8344         End If
8345         _initial = False
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
8351
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
8358     End Sub
8359
8360     Private Sub doGetFollowersMenu()
8361         GetTimeline(WORKERTYPE.Follower, 1, 0, "")
8362         DispSelectedPost()
8363     End Sub
8364
8365     Private Sub GetFollowersAllToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UpdateFollowersMenuItem1.Click
8366         doGetFollowersMenu()
8367     End Sub
8368
8369     Private Sub doReTweetUnofficial()
8370         'RT @id:内容
8371         If _curPost IsNot Nothing Then
8372             If _curPost.IsDm OrElse _
8373                Not StatusText.Enabled Then Exit Sub
8374
8375             If _curPost.IsProtect Then
8376                 MessageBox.Show("Protected.")
8377                 Exit Sub
8378             End If
8379             Dim rtdata As String = _curPost.OriginalData
8380             rtdata = CreateRetweetUnofficial(rtdata)
8381
8382             StatusText.Text = "RT @" + _curPost.Name + ": " + HttpUtility.HtmlDecode(rtdata)
8383
8384             StatusText.SelectionStart = 0
8385             StatusText.Focus()
8386         End If
8387     End Sub
8388
8389     Private Sub ReTweetStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReTweetStripMenuItem.Click, RtUnOpMenuItem.Click
8390         doReTweetUnofficial()
8391     End Sub
8392
8393     Private Sub doReTweetOfficial(ByVal isConfirm As Boolean)
8394         '公式RT
8395         If _curPost IsNot Nothing Then
8396             If _curPost.IsProtect Then
8397                 MessageBox.Show("Protected.")
8398                 _DoFavRetweetFlags = False
8399                 Exit Sub
8400             End If
8401             If _curList.SelectedIndices.Count > 15 Then
8402                 MessageBox.Show(My.Resources.RetweetLimitText)
8403                 _DoFavRetweetFlags = False
8404                 Exit Sub
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
8411                         Exit Sub
8412                 End Select
8413             Else
8414                 If _curPost.IsDm OrElse _curPost.IsMe Then
8415                     _DoFavRetweetFlags = False
8416                     Exit Sub
8417                 End If
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
8423                         Exit Sub
8424                     End If
8425                 End If
8426             End If
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)
8435             Next
8436             RunAsync(args)
8437         End If
8438     End Sub
8439
8440     Private Sub ReTweetOriginalStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReTweetOriginalStripMenuItem.Click, RtOpMenuItem.Click
8441         doReTweetOfficial(True)
8442     End Sub
8443
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)
8451         End If
8452     End Sub
8453
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()
8461             End If
8462         End If
8463     End Sub
8464
8465     Private Function CreateRetweetUnofficial(ByVal status As String) As String
8466
8467         ' Twitterにより省略されているURLを含むaタグをキャプチャしてリンク先URLへ置き換える
8468         '展開しないように変更
8469         '展開するか判定
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
8474                 isUrl = True
8475                 Exit For
8476             End If
8477         Next
8478         If isUrl Then
8479             status = Regex.Replace(status, "<a target=""_self"" href=""(?<url>[^""]+)""[^>]*>(?<link>(https?|shttp|ftps?)://[^<]+)</a>", "${url}")
8480         Else
8481             status = Regex.Replace(status, "<a target=""_self"" href=""(?<url>[^""]+)""[^>]*>(?<link>(https?|shttp|ftps?)://[^<]+)</a>", "${link}")
8482         End If
8483
8484         'その他のリンク(@IDなど)を置き換える
8485         status = Regex.Replace(status, "@<a target=""_self"" href=""https?://twitter.com/(#!/)?(?<url>[^""]+)""[^>]*>(?<link>[^<]+)</a>", "@${url}")
8486         'ハッシュタグ
8487         status = Regex.Replace(status, "<a target=""_self"" href=""(?<url>[^""]+)""[^>]*>(?<link>[^<]+)</a>", "${link}")
8488         '<br>タグ除去
8489         If StatusText.Multiline Then
8490             status = Regex.Replace(status, "(\r\n|\n|\r)?<br>", vbCrLf, RegexOptions.IgnoreCase Or RegexOptions.Multiline)
8491         Else
8492             status = Regex.Replace(status, "(\r\n|\n|\r)?<br>", "", RegexOptions.IgnoreCase Or RegexOptions.Multiline)
8493         End If
8494
8495         _reply_to_id = 0
8496         _reply_to_name = ""
8497         status = status.Replace("&nbsp;", " ")
8498
8499         Return status
8500     End Function
8501
8502     Private Sub DumpPostClassToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DumpPostClassToolStripMenuItem.Click
8503         If _curPost IsNot Nothing Then
8504             DispSelectedPost()
8505         End If
8506     End Sub
8507
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
8511         Else
8512             DebugModeToolStripMenuItem.Visible = False
8513         End If
8514     End Sub
8515
8516     Private Sub ToolStripMenuItemUrlAutoShorten_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItemUrlAutoShorten.CheckedChanged
8517         SettingDialog.UrlConvertAuto = ToolStripMenuItemUrlAutoShorten.Checked
8518     End Sub
8519
8520     Private Sub ContextMenuPostMode_Opening(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ContextMenuPostMode.Opening
8521         ToolStripMenuItemUrlAutoShorten.Checked = SettingDialog.UrlConvertAuto
8522     End Sub
8523
8524     Private Sub TraceOutToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TraceOutToolStripMenuItem.Click
8525         If TraceOutToolStripMenuItem.Checked Then
8526             TraceFlag = True
8527         Else
8528             TraceFlag = False
8529         End If
8530     End Sub
8531
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)
8535     End Sub
8536
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)
8540     End Sub
8541
8542     Private Sub BitlyToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BitlyToolStripMenuItem.Click
8543         UrlConvert(UrlConverter.Bitly)
8544     End Sub
8545
8546     Private Sub JmpToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles JmpStripMenuItem.Click
8547         UrlConvert(UrlConverter.Jmp)
8548     End Sub
8549
8550
8551     Private Class GetApiInfoArgs
8552         Public tw As Twitter
8553         Public info As ApiInfo
8554     End Class
8555
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)
8559     End Sub
8560
8561     Private Sub ApiInfoMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ApiInfoMenuItem.Click
8562         Dim info As New ApiInfo
8563         Dim tmp As String
8564         Dim args As New GetApiInfoArgs With {.tw = tw, .info = info}
8565
8566         Using dlg As New FormInfo(Me, My.Resources.ApiInfo6, AddressOf GetApiInfo_Dowork, Nothing, args)
8567             dlg.ShowDialog()
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()
8572                 SetStatusLabelUrl()
8573             Else
8574                 tmp = My.Resources.ApiInfo5
8575             End If
8576         End Using
8577
8578         MessageBox.Show(tmp, My.Resources.ApiInfo4, MessageBoxButtons.OK, MessageBoxIcon.Information)
8579     End Sub
8580
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
8584         FollowCommand(id)
8585     End Sub
8586
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)
8590     End Sub
8591
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
8600                 arg.tw = tw
8601                 arg.id = inputName.TabName.Trim()
8602                 Using _info As New FormInfo(Me, My.Resources.FollowCommandText1, _
8603                                             AddressOf FollowCommand_DoWork, _
8604                                             Nothing, _
8605                                             arg)
8606                     _info.ShowDialog()
8607                     Dim ret As String = DirectCast(_info.Result, String)
8608                     If Not String.IsNullOrEmpty(ret) Then
8609                         MessageBox.Show(My.Resources.FRMessage2 + ret)
8610                     Else
8611                         MessageBox.Show(My.Resources.FRMessage3)
8612                     End If
8613                 End Using
8614             End If
8615         End Using
8616     End Sub
8617
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)
8622     End Sub
8623
8624     Private Class FollowRemoveCommandArgs
8625         Public tw As Tween.Twitter
8626         Public id As String
8627     End Class
8628
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)
8632     End Sub
8633
8634     Private Sub RemoveCommand(ByVal id As String, ByVal skipInput As Boolean)
8635         Dim arg As New FollowRemoveCommandArgs
8636         arg.tw = tw
8637         arg.id = id
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
8645                     arg.tw = tw
8646                     arg.id = inputName.TabName.Trim()
8647                 Else
8648                     Exit Sub
8649                 End If
8650             End Using
8651         End If
8652
8653         Using _info As New FormInfo(Me, My.Resources.RemoveCommandText1, _
8654                                     AddressOf RemoveCommand_DoWork, _
8655                                     Nothing, _
8656                                     arg)
8657             _info.ShowDialog()
8658             Dim ret As String = DirectCast(_info.Result, String)
8659             If Not String.IsNullOrEmpty(ret) Then
8660                 MessageBox.Show(My.Resources.FRMessage2 + ret)
8661             Else
8662                 MessageBox.Show(My.Resources.FRMessage3)
8663             End If
8664         End Using
8665     End Sub
8666
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
8670             id = _curPost.Name
8671         End If
8672         ShowFriendship(id)
8673     End Sub
8674
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)
8683                 Me.id = id
8684             End Sub
8685         End Class
8686         Public ids As New List(Of FriendshipInfo)
8687     End Class
8688
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
8697             End If
8698         Next
8699         e.Result = result
8700     End Sub
8701
8702     Private Sub ShowFriendship(ByVal id As String)
8703         Dim args As New ShowFriendshipArgs
8704         args.tw = tw
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, _
8715                                             Nothing, _
8716                                             args)
8717                     _info.ShowDialog()
8718                     ret = DirectCast(_info.Result, String)
8719                 End Using
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
8724                     Else
8725                         result = My.Resources.GetFriendshipInfo2 + System.Environment.NewLine
8726                     End If
8727                     If args.ids(0).isFollowed Then
8728                         result += My.Resources.GetFriendshipInfo3
8729                     Else
8730                         result += My.Resources.GetFriendshipInfo4
8731                     End If
8732                     result = args.ids(0).id + My.Resources.GetFriendshipInfo5 + System.Environment.NewLine + result
8733                 Else
8734                     result = ret
8735                 End If
8736                 MessageBox.Show(result)
8737             End If
8738         End Using
8739     End Sub
8740
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
8745             args.tw = tw
8746             args.ids.Add(New ShowFriendshipArgs.FriendshipInfo(id.Trim))
8747             Using _info As New FormInfo(Me, My.Resources.ShowFriendshipText1, _
8748                                         AddressOf ShowFriendship_DoWork, _
8749                                         Nothing, _
8750                                         args)
8751                 _info.ShowDialog()
8752                 ret = DirectCast(_info.Result, String)
8753             End Using
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
8758                 ff = "  "
8759                 If fInfo.isFollowing Then
8760                     ff += My.Resources.GetFriendshipInfo1
8761                 Else
8762                     ff += My.Resources.GetFriendshipInfo2
8763                 End If
8764                 ff += System.Environment.NewLine + "  "
8765                 If fInfo.isFollowed Then
8766                     ff += My.Resources.GetFriendshipInfo3
8767                 Else
8768                     ff += My.Resources.GetFriendshipInfo4
8769                 End If
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)
8778                     End If
8779                 Else
8780                     MessageBox.Show(result)
8781                 End If
8782             Else
8783                 MessageBox.Show(ret)
8784             End If
8785         Next
8786     End Sub
8787
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)
8792         'Else
8793         '    MessageBox.Show(My.Resources.ShowYourProfileText1, "Your status", MessageBoxButtons.OK, MessageBoxIcon.Information)
8794         '    Exit Sub
8795         'End If
8796     End Sub
8797
8798     ' TwitterIDでない固定文字列を調べる(文字列検証のみ 実際に取得はしない)
8799     ' URLから切り出した文字列を渡す
8800
8801     Private Function IsTwitterId(ByVal name As String) As Boolean
8802         Return Not Regex.Match(name, "^(about|jobs|tos|privacy)$").Success
8803     End Function
8804
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}")
8809         Else
8810             Return Nothing
8811         End If
8812     End Function
8813
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)
8817     End Sub
8818
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)
8822     End Sub
8823
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)
8827     End Sub
8828
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}"))
8835             End If
8836         Next
8837         ShowFriendship(ids.ToArray)
8838     End Sub
8839
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)
8843     End Sub
8844
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)
8848     End Sub
8849
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)
8853     End Sub
8854
8855     Private Sub IdeographicSpaceToSpaceToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IdeographicSpaceToSpaceToolStripMenuItem.Click
8856         _modifySettingCommon = True
8857     End Sub
8858
8859     Private Sub ToolStripFocusLockMenuItem_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripFocusLockMenuItem.Click
8860         _modifySettingCommon = True
8861     End Sub
8862
8863     Private Sub doQuote()
8864         'QT @id:内容
8865         '返信先情報付加
8866         If _curPost IsNot Nothing Then
8867             If _curPost.IsDm OrElse _
8868                Not StatusText.Enabled Then Exit Sub
8869
8870             If _curPost.IsProtect Then
8871                 MessageBox.Show("Protected.")
8872                 Exit Sub
8873             End If
8874             Dim rtdata As String = _curPost.OriginalData
8875             rtdata = CreateRetweetUnofficial(rtdata)
8876
8877             StatusText.Text = " QT @" + _curPost.Name + ": " + HttpUtility.HtmlDecode(rtdata)
8878             If _curPost.RetweetedId = 0 Then
8879                 _reply_to_id = _curPost.Id
8880             Else
8881                 _reply_to_id = _curPost.RetweetedId
8882             End If
8883             _reply_to_name = _curPost.Name
8884
8885             StatusText.SelectionStart = 0
8886             StatusText.Focus()
8887         End If
8888     End Sub
8889
8890     Private Sub QuoteStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles QuoteStripMenuItem.Click, QtOpMenuItem.Click
8891         doQuote()
8892     End Sub
8893
8894     Private Sub SearchButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
8895         '公式検索
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))
8910                 Exit For
8911             End If
8912             If c(cnt) = CChar("""") Then
8913                 Quote = Not Quote
8914             Else
8915                 If Not Quote AndAlso cmb.Text.Substring(cnt, 4).Equals(" or ", StringComparison.OrdinalIgnoreCase) Then
8916                     buf.Append(" OR ")
8917                     cnt += 3
8918                     Continue For
8919                 End If
8920             End If
8921             buf.Append(c(cnt))
8922         Next
8923         cmb.Text = buf.ToString()
8924
8925         tb.SearchWords = cmb.Text
8926         tb.SearchLang = cmbLang.Text
8927         If cmb.Text = "" Then
8928             DirectCast(ListTab.SelectedTab.Tag, DetailsListView).Focus()
8929             SaveConfigsTabs()
8930             Exit Sub
8931         End If
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
8937             cmb.SelectAll()
8938             Dim lst As DetailsListView = DirectCast(pnl.Parent.Tag, DetailsListView)
8939             lst.VirtualListSize = 0
8940             lst.Items.Clear()
8941             _statuses.ClearTabIds(tbName)
8942             SaveConfigsTabs()   '検索条件の保存
8943         End If
8944
8945         GetTimeline(WORKERTYPE.PublicSearch, 1, 0, tbName)
8946         DirectCast(ListTab.SelectedTab.Tag, DetailsListView).Focus()
8947     End Sub
8948
8949     Private Sub RefreshMoreStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RefreshMoreStripMenuItem.Click, RefreshPrevOpMenuItem.Click
8950         'もっと前を取得
8951         DoRefreshMore()
8952     End Sub
8953
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)
8957             Exit Sub
8958         Else
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 + ")"
8965             Next
8966             tb.TabName = renamed
8967             _statuses.Tabs.Add(renamed, tb)
8968             AddNewTab(renamed, False, tb.TabType)
8969             ListTab.SelectedIndex = ListTab.TabPages.Count - 1
8970             SaveConfigsTabs()
8971         End If
8972     End Sub
8973
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)
8979             End If
8980         End If
8981     End Sub
8982
8983     Private Sub MoveToRTHomeMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MoveToRTHomeMenuItem.Click, OpenRterHomeMenuItem.Click
8984         doMoveToRTHome()
8985     End Sub
8986
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 = ""
8991
8992             '未選択なら処理終了
8993             If _curList.SelectedIndices.Count = 0 Then Exit Sub
8994
8995             'タブ選択(or追加)
8996             If Not SelectTab(tabName) Then Exit Sub
8997
8998             Dim mv As Boolean = False
8999             Dim mk As Boolean = False
9000             MoveOrCopy(mv, mk)
9001
9002             Dim fc As New FiltersClass
9003             fc.NameFilter = name
9004             fc.SearchBoth = True
9005             fc.MoveFrom = mv
9006             fc.SetMark = mk
9007             fc.UseRegex = False
9008             fc.SearchUrl = False
9009             _statuses.Tabs(tabName).AddFilter(fc)
9010
9011             Try
9012                 Me.Cursor = Cursors.WaitCursor
9013                 _itemCache = Nothing
9014                 _postCache = Nothing
9015                 _curPost = Nothing
9016                 _curItemIndex = -1
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
9022                             tb.ImageIndex = 0
9023                         End If
9024                     Else
9025                         If SettingDialog.TabIconDisp Then
9026                             tb.ImageIndex = -1
9027                         End If
9028                     End If
9029                 Next
9030                 If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
9031             Finally
9032                 Me.Cursor = Cursors.Default
9033             End Try
9034             SaveConfigsTabs()
9035         End If
9036     End Sub
9037
9038     Private Sub ListManageUserContextToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListManageUserContextToolStripMenuItem.Click, ListManageMenuItem.Click, ListManageUserContextToolStripMenuItem2.Click, ListManageUserContextToolStripMenuItem3.Click
9039         Dim user As String
9040
9041         Dim menuItem As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
9042
9043         If menuItem.Owner Is Me.ContextMenuPostBrowser Then
9044             user = GetUserId()
9045             If user Is Nothing Then Return
9046         ElseIf Me._curPost IsNot Nothing Then
9047             user = Me._curPost.Name
9048         Else
9049             Return
9050         End If
9051
9052         Dim list As ListElement = Nothing
9053
9054         If TabInformations.GetInstance().SubscribableLists.Count = 0 Then
9055             Dim res As String = Me.tw.GetListsApi()
9056
9057             If res <> "" Then
9058                 MessageBox.Show("Failed to get lists. (" + res + ")")
9059                 Return
9060             End If
9061         End If
9062
9063         Using listSelectForm As New MyLists(user, Me.tw)
9064             listSelectForm.ShowDialog()
9065         End Using
9066     End Sub
9067
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
9071             ctl.TabStop = True
9072         Next
9073     End Sub
9074
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
9078             ctl.TabStop = False
9079         Next
9080     End Sub
9081
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()
9086         End If
9087     End Sub
9088
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_]+)$")
9091         If m.Success Then
9092             HashMgr.SetPermanentHash("#" + m.Result("${hash}"))
9093             HashStripSplitButton.Text = HashMgr.UseHash
9094             HashToggleMenuItem.Checked = True
9095             HashToggleToolStripMenuItem.Checked = True
9096             '使用ハッシュタグとして設定
9097             _modifySettingCommon = True
9098         End If
9099     End Sub
9100
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)
9103     End Sub
9104
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
9107         Try
9108             rslt = HashMgr.ShowDialog()
9109         Catch ex As Exception
9110             Exit Sub
9111         End Try
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
9118         Else
9119             HashStripSplitButton.Text = "#[-]"
9120             HashToggleMenuItem.Checked = False
9121             HashToggleToolStripMenuItem.Checked = False
9122         End If
9123         'If HashMgr.IsInsert AndAlso HashMgr.UseHash <> "" Then
9124         '    Dim sidx As Integer = StatusText.SelectionStart
9125         '    Dim hash As String = HashMgr.UseHash + " "
9126         '    If sidx > 0 Then
9127         '        If StatusText.Text.Substring(sidx - 1, 1) <> " " Then
9128         '            hash = " " + hash
9129         '        End If
9130         '    End If
9131         '    StatusText.Text = StatusText.Text.Insert(sidx, hash)
9132         '    sidx += hash.Length
9133         '    StatusText.SelectionStart = sidx
9134         '    StatusText.Focus()
9135         'End If
9136         _modifySettingCommon = True
9137         Me.StatusText_TextChanged(Nothing, Nothing)
9138     End Sub
9139
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
9146         Else
9147             HashStripSplitButton.Text = "#[-]"
9148             HashToggleMenuItem.Checked = False
9149             HashToggleToolStripMenuItem.Checked = False
9150         End If
9151         _modifySettingCommon = True
9152         Me.StatusText_TextChanged(Nothing, Nothing)
9153     End Sub
9154
9155     Private Sub HashStripSplitButton_ButtonClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles HashStripSplitButton.ButtonClick
9156         HashToggleMenuItem_Click(Nothing, Nothing)
9157     End Sub
9158
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
9173         Else
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
9184         End If
9185
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
9198         Else
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の時問題出るかも
9204
9205             If _curPost.IsMe Then
9206                 Me.RtOpMenuItem.Enabled = False
9207                 Me.FavoriteRetweetMenuItem.Enabled = False
9208                 Me.DelOpMenuItem.Enabled = True
9209             Else
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
9217                 Else
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
9223                 End If
9224             End If
9225         End If
9226
9227         If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.Favorites Then
9228             Me.RefreshPrevOpMenuItem.Enabled = True
9229         Else
9230             Me.RefreshPrevOpMenuItem.Enabled = False
9231         End If
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
9236         Else
9237             OpenRepSourceOpMenuItem.Enabled = True
9238         End If
9239         If _curPost Is Nothing OrElse _curPost.RetweetedBy = "" Then
9240             OpenRterHomeMenuItem.Enabled = False
9241         Else
9242             OpenRterHomeMenuItem.Enabled = True
9243         End If
9244     End Sub
9245
9246     Private Sub MenuItemTab_DropDownOpening(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemTab.DropDownOpening
9247         ContextMenuTabProperty_Opening(sender, Nothing)
9248     End Sub
9249
9250     Public ReadOnly Property TwitterInstance() As Twitter
9251         Get
9252             Return tw
9253         End Get
9254     End Property
9255
9256
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
9261         End If
9262     End Sub
9263
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
9267         Else
9268             UndoRemoveTabMenuItem.Enabled = True
9269         End If
9270         If ListTab.SelectedTab IsNot Nothing Then
9271             If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.PublicSearch Then
9272                 PublicSearchQueryMenuItem.Enabled = True
9273             Else
9274                 PublicSearchQueryMenuItem.Enabled = False
9275             End If
9276         Else
9277             PublicSearchQueryMenuItem.Enabled = False
9278         End If
9279         If _curPost Is Nothing Then
9280             Me.CopySTOTMenuItem.Enabled = False
9281             Me.CopyURLMenuItem.Enabled = False
9282             Me.CopyUserIdStripMenuItem.Enabled = False
9283         Else
9284             Me.CopySTOTMenuItem.Enabled = True
9285             Me.CopyURLMenuItem.Enabled = True
9286             Me.CopyUserIdStripMenuItem.Enabled = True
9287             If _curPost.IsProtect Then Me.CopySTOTMenuItem.Enabled = False
9288         End If
9289     End Sub
9290
9291     Private Sub NotifyIcon1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseMove
9292         SetNotifyIconText()
9293     End Sub
9294
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
9298             id = _curPost.Name
9299         End If
9300         ShowUserStatus(id)
9301     End Sub
9302
9303     Private Class GetUserInfoArgs
9304         Public tw As Tween.Twitter
9305         Public id As String
9306         Public user As TwitterDataModel.User
9307     End Class
9308
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)
9312     End Sub
9313
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
9326                     args.tw = tw
9327                     args.id = id
9328                     args.user = user
9329                     Using _info As New FormInfo(Me, My.Resources.doShowUserStatusText1, _
9330                                                 AddressOf GetUserInfo_DoWork, _
9331                                                 Nothing, _
9332                                                 args)
9333                         _info.ShowDialog()
9334                         Dim ret As String = DirectCast(_info.Result, String)
9335                         If String.IsNullOrEmpty(ret) Then
9336                             doShowUserStatus(args.user)
9337                         Else
9338                             MessageBox.Show(ret)
9339                         End If
9340                     End Using
9341                 End If
9342             End Using
9343         Else
9344             args.tw = tw
9345             args.id = id
9346             args.user = user
9347             Using _info As New FormInfo(Me, My.Resources.doShowUserStatusText1, _
9348                                         AddressOf GetUserInfo_DoWork, _
9349                                         Nothing, _
9350                                         args)
9351                 _info.ShowDialog()
9352                 Dim ret As String = DirectCast(_info.Result, String)
9353                 If String.IsNullOrEmpty(ret) Then
9354                     doShowUserStatus(args.user)
9355                 Else
9356                     MessageBox.Show(ret)
9357                 End If
9358             End Using
9359         End If
9360     End Sub
9361
9362     Private Overloads Sub doShowUserStatus(ByVal user As TwitterDataModel.User)
9363         Using userinfo As New ShowUserInfo()
9364             userinfo.User = user
9365             userinfo.ShowDialog(Me)
9366         End Using
9367     End Sub
9368
9369     Private Overloads Sub ShowUserStatus(ByVal id As String, ByVal ShowInputDialog As Boolean)
9370         doShowUserStatus(id, ShowInputDialog)
9371     End Sub
9372
9373     Private Overloads Sub ShowUserStatus(ByVal id As String)
9374         doShowUserStatus(id, True)
9375     End Sub
9376
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
9381                 FollowCommand(id)
9382             End If
9383         End If
9384     End Sub
9385
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)
9391             End If
9392         End If
9393     End Sub
9394
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
9399                 ShowFriendship(id)
9400             End If
9401         End If
9402     End Sub
9403
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)
9408         End If
9409     End Sub
9410
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)
9415         End If
9416     End Sub
9417
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)
9422         End If
9423     End Sub
9424
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)
9428         End If
9429     End Sub
9430
9431     Private Sub GetRetweet_DoWork(ByVal sender As Object, ByVal e As ComponentModel.DoWorkEventArgs)
9432         Dim counter As Integer = 0
9433
9434         Dim statusid As Long
9435         If _curPost.RetweetedId > 0 Then
9436             statusid = _curPost.RetweetedId
9437         Else
9438             statusid = _curPost.Id
9439         End If
9440         tw.GetStatus_Retweeted_Count(statusid, counter)
9441
9442         e.Result = counter
9443     End Sub
9444
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
9450
9451                 ' ダイアログ表示
9452                 _info.ShowDialog()
9453                 retweet_count = CType(_info.Result, Integer)
9454                 If retweet_count < 0 Then
9455                     MessageBox.Show(My.Resources.RtCountText2)
9456                 Else
9457                     MessageBox.Show(retweet_count.ToString + My.Resources.RtCountText1)
9458                 End If
9459             End Using
9460         End If
9461     End Sub
9462
9463     Private WithEvents _hookGlobalHotkey As HookGlobalHotkey
9464     Public Sub New()
9465
9466         _hookGlobalHotkey = New HookGlobalHotkey(Me)
9467         ' この呼び出しは、Windows フォーム デザイナで必要です。
9468         InitializeComponent()
9469
9470         ' InitializeComponent() 呼び出しの後で初期化を追加します。
9471
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)
9477     End Sub
9478
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
9481             'アイコン化
9482             Me.Visible = False
9483         ElseIf Form.ActiveForm Is Nothing Then
9484             Me.Visible = True
9485             If Me.WindowState = FormWindowState.Minimized Then Me.WindowState = FormWindowState.Normal
9486             Me.Activate()
9487             Me.StatusText.Focus()
9488         End If
9489     End Sub
9490
9491     Private Sub UserPicture_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UserPicture.MouseEnter
9492         Me.UserPicture.Cursor = Cursors.Hand
9493     End Sub
9494
9495     Private Sub UserPicture_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UserPicture.MouseLeave
9496         Me.UserPicture.Cursor = Cursors.Default
9497     End Sub
9498
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)
9502         End If
9503     End Sub
9504
9505     Private Sub SplitContainer2_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles SplitContainer2.MouseDoubleClick
9506         Me.MultiLineMenuItem.PerformClick()
9507     End Sub
9508
9509     Public ReadOnly Property CurPost As PostClass
9510         Get
9511             Return _curPost
9512         End Get
9513     End Property
9514
9515     Public ReadOnly Property IsPreviewEnable As Boolean
9516         Get
9517             Return SettingDialog.PreviewEnable
9518         End Get
9519     End Property
9520
9521 #Region "画像投稿"
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
9531         Else
9532             ImageSelectionPanel.Visible = True
9533             ImageSelectionPanel.Enabled = True
9534             TimelinePanel.Visible = False
9535             TimelinePanel.Enabled = False
9536             ImagefilePathText.Focus()
9537         End If
9538     End Sub
9539
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 = ""
9544
9545         Try
9546             Me.AllowDrop = False
9547             If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.Cancel Then Exit Sub
9548         Finally
9549             Me.AllowDrop = True
9550         End Try
9551
9552         ImagefilePathText.Text = OpenFileDialog1.FileName
9553         ImageFromSelectedFile()
9554     End Sub
9555
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
9559             Exit Sub
9560         End If
9561         ImagefilePathText.Text = Trim(ImagefilePathText.Text)
9562         If ImagefilePathText.Text = "" Then
9563             ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9564             ImageSelectedPicture.Tag = UploadFileType.Invalid
9565         Else
9566             ImageFromSelectedFile()
9567         End If
9568     End Sub
9569
9570     Private Sub ImageFromSelectedFile()
9571         Try
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 = ""
9577                 Exit Sub
9578             End If
9579
9580             Dim fl As New FileInfo(Trim(ImagefilePathText.Text))
9581             If Not svc.IsValidExtension(fl.Extension.ToLower, ImageService) Then
9582                 '画像以外の形式
9583                 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9584                 ImageSelectedPicture.Tag = UploadFileType.Invalid
9585                 ImagefilePathText.Text = ""
9586                 Exit Sub
9587             End If
9588
9589             If svc.GetMaxFileSize(fl.Extension, ImageService) < fl.Length Then
9590                 ' ファイルサイズが大きすぎる
9591                 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9592                 ImageSelectedPicture.Tag = UploadFileType.Invalid
9593                 ImagefilePathText.Text = ""
9594                 MessageBox.Show("File is too large.")
9595                 Exit Sub
9596             End If
9597
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)
9607                         fs.Close()
9608                     End Using
9609                     ImageSelectedPicture.Image = (New HttpVarious).CheckValidImage( _
9610                                 img, _
9611                                 img.Width, _
9612                                 img.Height)
9613                     ImageSelectedPicture.Tag = UploadFileType.Picture
9614                 Case UploadFileType.MultiMedia
9615                     ImageSelectedPicture.Image = My.Resources.MultiMediaImage
9616                     ImageSelectedPicture.Tag = UploadFileType.MultiMedia
9617                 Case Else
9618                     ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9619                     ImageSelectedPicture.Tag = UploadFileType.Invalid
9620                     ImagefilePathText.Text = ""
9621             End Select
9622
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.")
9633         End Try
9634     End Sub
9635
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
9649         End If
9650     End Sub
9651
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
9658             e.Handled = True
9659         End If
9660     End Sub
9661
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
9668         End If
9669     End Sub
9670
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")
9679         End If
9680         'ImageServiceCombo.Items.Add("TwitVideo")
9681         If svc = "" Then
9682             ImageServiceCombo.SelectedIndex = 0
9683         Else
9684             Dim idx As Integer = ImageServiceCombo.Items.IndexOf(svc)
9685             If idx = -1 Then
9686                 ImageServiceCombo.SelectedIndex = 0
9687             Else
9688                 ImageServiceCombo.SelectedIndex = idx
9689             End If
9690         End If
9691     End Sub
9692
9693     Private ReadOnly Property ImageService() As String
9694         Get
9695             Return CStr(ImageServiceCombo.SelectedItem)
9696         End Get
9697     End Property
9698
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
9707     End Sub
9708
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)
9712             Try
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
9719                 End If
9720             Catch ex As Exception
9721
9722             End Try
9723         End If
9724     End Sub
9725 #End Region
9726
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)
9729             form.ShowDialog(Me)
9730         End Using
9731     End Sub
9732
9733     Public WriteOnly Property ModifySettingCommon() As Boolean
9734         Set(ByVal value As Boolean)
9735             _modifySettingCommon = value
9736         End Set
9737     End Property
9738
9739     Public WriteOnly Property ModifySettingLocal() As Boolean
9740         Set(ByVal value As Boolean)
9741             _modifySettingLocal = value
9742         End Set
9743     End Property
9744
9745     Public WriteOnly Property ModifySettingAtId() As Boolean
9746         Set(ByVal value As Boolean)
9747             _modifySettingAtId = value
9748         End Set
9749     End Property
9750
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
9754             OpenUriAsync(link)
9755         End If
9756     End Sub
9757
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
9762         End If
9763     End Sub
9764
9765     Private Sub SourceLinkLabel_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SourceLinkLabel.MouseLeave
9766         SetStatusLabelUrl()
9767     End Sub
9768
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
9772         Else
9773             RtCountMenuItem.Enabled = False
9774         End If
9775     End Sub
9776
9777     Private Sub CopyUserIdStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CopyUserIdStripMenuItem.Click
9778         CopyUserId()
9779     End Sub
9780     Private Sub CopyUserId()
9781         If _curPost Is Nothing Then Exit Sub
9782         Dim clstr As String = _curPost.Name
9783         Try
9784             Clipboard.SetDataObject(clstr, False, 5, 100)
9785         Catch ex As Exception
9786             MessageBox.Show(ex.Message)
9787         End Try
9788     End Sub
9789
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)
9801                             Exit For
9802                         End If
9803                     Next
9804                 Else
9805                     _statuses.AddTab(tName, TabUsageType.Related, Nothing)
9806                 End If
9807                 _statuses.GetTabByName(tName).UnreadManage = False
9808             End If
9809
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))
9817                     Exit For
9818                 End If
9819             Next
9820
9821             GetTimeline(WORKERTYPE.Related, 1, 1, tb.TabName)
9822         End If
9823     End Sub
9824
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, "アイコンキャッシュ使用状況")
9832     End Sub
9833
9834 #Region "Userstream"
9835     Private _isActiveUserstream As Boolean = False
9836
9837     Private Sub tw_PostDeleted(ByVal id As Long, ByRef post As PostClass)
9838         _statuses.RemovePostReserve(id, post)
9839     End Sub
9840
9841     Private Sub tw_NewPostFromStream()
9842         If SettingDialog.ReadOldPosts Then
9843             _statuses.SetRead() '新着時未読クリア
9844         End If
9845
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
9851             Else
9852                 _tlTimestamps.Add(Now, rsltAddCount)
9853             End If
9854             Dim oneHour As Date = Now.Subtract(New TimeSpan(1, 0, 0))
9855             Dim keys As New List(Of Date)
9856             _tlCount = 0
9857             For Each key As Date In _tlTimestamps.Keys
9858                 If key.CompareTo(oneHour) < 0 Then
9859                     keys.Add(key)
9860                 Else
9861                     _tlCount += _tlTimestamps(key)
9862                 End If
9863             Next
9864             For Each key As Date In keys
9865                 _tlTimestamps.Remove(key)
9866             Next
9867             keys.Clear()
9868
9869             'Static before As DateTime = Now
9870             'If before.Subtract(Now).Seconds > -5 Then Exit Sub
9871             'before = Now
9872         End SyncLock
9873
9874         If SettingDialog.UserstreamPeriodInt > 0 Then Exit Sub
9875
9876         Try
9877             If InvokeRequired AndAlso Not IsDisposed Then
9878                 Invoke(New Action(Of Boolean)(AddressOf RefreshTimeline), True)
9879                 Exit Sub
9880             End If
9881         Catch ex As ObjectDisposedException
9882             Exit Sub
9883         End Try
9884     End Sub
9885
9886     Private Sub tw_UserStreamStarted()
9887         Me._isActiveUserstream = True
9888         If InvokeRequired Then
9889             Invoke(New MethodInvoker(AddressOf tw_UserStreamStarted))
9890             Exit Sub
9891         End If
9892
9893         MenuItemUserStream.Text = "&UserStream ▶"
9894         MenuItemUserStream.Enabled = True
9895         StopToolStripMenuItem.Text = "&Stop"
9896         StopToolStripMenuItem.Enabled = True
9897
9898         StatusLabel.Text = "UserStream Started."
9899     End Sub
9900
9901     Private Sub tw_UserStreamStopped()
9902         Me._isActiveUserstream = False
9903         If InvokeRequired Then
9904             Invoke(New MethodInvoker(AddressOf tw_UserStreamStopped))
9905             Exit Sub
9906         End If
9907
9908         MenuItemUserStream.Text = "&UserStream ■"
9909         MenuItemUserStream.Enabled = True
9910         StopToolStripMenuItem.Text = "&Start"
9911         StopToolStripMenuItem.Enabled = True
9912
9913         StatusLabel.Text = "UserStream Stopped."
9914     End Sub
9915
9916     Private Sub tw_UserStreamEventArrived(ByVal eventType As String)
9917         If InvokeRequired Then
9918             Invoke(New Action(Of String)(AddressOf tw_UserStreamEventArrived), eventType)
9919             Exit Sub
9920         End If
9921         StatusLabel.Text = "Event: " + eventType
9922     End Sub
9923
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
9927             tw.StopUserStream()
9928         Else
9929             tw.StartUserStream()
9930         End If
9931     End Sub
9932
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
9942                     Exit Sub
9943                 End If
9944                 inputTrack = inputForm.TabName.Trim()
9945             End Using
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()
9951             End If
9952         Else
9953             tw.TrackWord = ""
9954             tw.ReconnectUserStream()
9955         End If
9956     End Sub
9957
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()
9962     End Sub
9963
9964     Private Sub TweenRestartMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles TweenRestartMenuItem.Click
9965         _endingFlag = True
9966         Application.Restart()
9967     End Sub
9968
9969     Private Sub EventViewerMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EventViewerMenuItem.Click
9970         Using dlg As New EventViewerDialog
9971             dlg.Owner = Me
9972             dlg.EventSource = tw.StoredEvent
9973             dlg.ShowDialog()
9974             Me.TopMost = SettingDialog.AlwaysTop
9975         End Using
9976     End Sub
9977 #End Region
9978
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")
9981     End Sub
9982
9983     Private Sub OpenOwnHomeMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles OpenOwnHomeMenuItem.Click
9984         OpenUriAsync("http://twitter.com/" + tw.Username)
9985     End Sub
9986
9987 End Class