OSDN Git Service

c2e82eb5d009108b6b5926ffb758b2c5050d4226
[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
541         '新着バルーン通知のチェック状態設定
542         NewPostPopMenuItem.Checked = _cfgCommon.NewAllPop
543         Me.NotifyFileMenuItem.Checked = NewPostPopMenuItem.Checked
544
545         'フォント&文字色&背景色保持
546         _fntUnread = _cfgLocal.FontUnread
547         _clUnread = _cfgLocal.ColorUnread
548         _fntReaded = _cfgLocal.FontRead
549         _clReaded = _cfgLocal.ColorRead
550         _clFav = _cfgLocal.ColorFav
551         _clOWL = _cfgLocal.ColorOWL
552         _clRetweet = _cfgLocal.ColorRetweet
553         _fntDetail = _cfgLocal.FontDetail
554         _clDetail = _cfgLocal.ColorDetail
555         _clDetailLink = _cfgLocal.ColorDetailLink
556         _clDetailBackcolor = _cfgLocal.ColorDetailBackcolor
557         _clSelf = _cfgLocal.ColorSelf
558         _clAtSelf = _cfgLocal.ColorAtSelf
559         _clTarget = _cfgLocal.ColorTarget
560         _clAtTarget = _cfgLocal.ColorAtTarget
561         _clAtFromTarget = _cfgLocal.ColorAtFromTarget
562         _clAtTo = _cfgLocal.ColorAtTo
563         _clListBackcolor = _cfgLocal.ColorListBackcolor
564         _clInputBackcolor = _cfgLocal.ColorInputBackcolor
565         _clInputFont = _cfgLocal.ColorInputFont
566         _fntInputFont = _cfgLocal.FontInputFont
567
568         _brsForeColorUnread = New SolidBrush(_clUnread)
569         _brsForeColorReaded = New SolidBrush(_clReaded)
570         _brsForeColorFav = New SolidBrush(_clFav)
571         _brsForeColorOWL = New SolidBrush(_clOWL)
572         _brsForeColorRetweet = New SolidBrush(_clRetweet)
573         _brsBackColorMine = New SolidBrush(_clSelf)
574         _brsBackColorAt = New SolidBrush(_clAtSelf)
575         _brsBackColorYou = New SolidBrush(_clTarget)
576         _brsBackColorAtYou = New SolidBrush(_clAtTarget)
577         _brsBackColorAtFromTarget = New SolidBrush(_clAtFromTarget)
578         _brsBackColorAtTo = New SolidBrush(_clAtTo)
579         '_brsBackColorNone = New SolidBrush(Color.FromKnownColor(KnownColor.Window))
580         _brsBackColorNone = New SolidBrush(_clListBackcolor)
581
582         ' StringFormatオブジェクトへの事前設定
583         'sf.Alignment = StringAlignment.Near             ' Textを近くへ配置(左から右の場合は左寄せ)
584         'sf.LineAlignment = StringAlignment.Near         ' Textを近くへ配置(上寄せ)
585         'sf.FormatFlags = StringFormatFlags.LineLimit    ' 
586         sfTab.Alignment = StringAlignment.Center
587         sfTab.LineAlignment = StringAlignment.Center
588
589         '設定画面への反映
590         SettingDialog.IsOAuth = _cfgCommon.IsOAuth
591         HttpTwitter.TwitterUrl = _cfgCommon.TwitterUrl
592         HttpTwitter.TwitterSearchUrl = _cfgCommon.TwitterSearchUrl
593         SettingDialog.TwitterApiUrl = _cfgCommon.TwitterUrl
594         SettingDialog.TwitterSearchApiUrl = _cfgCommon.TwitterSearchUrl
595         '認証関連
596         If _cfgCommon.IsOAuth Then
597             If _cfgCommon.Token = "" Then _cfgCommon.UserName = ""
598             tw.Initialize(_cfgCommon.Token, _cfgCommon.TokenSecret, _cfgCommon.UserName)
599         Else
600             tw.Initialize(_cfgCommon.UserName, _cfgCommon.Password)
601         End If
602
603         SettingDialog.TimelinePeriodInt = _cfgCommon.TimelinePeriod
604         SettingDialog.ReplyPeriodInt = _cfgCommon.ReplyPeriod
605         SettingDialog.DMPeriodInt = _cfgCommon.DMPeriod
606         SettingDialog.PubSearchPeriodInt = _cfgCommon.PubSearchPeriod
607         SettingDialog.ListsPeriodInt = _cfgCommon.ListsPeriod
608         '不正値チェック
609         If Not My.Application.CommandLineArgs.Contains("nolimit") Then
610             If SettingDialog.TimelinePeriodInt < 15 AndAlso SettingDialog.TimelinePeriodInt > 0 Then SettingDialog.TimelinePeriodInt = 15
611             If SettingDialog.ReplyPeriodInt < 15 AndAlso SettingDialog.ReplyPeriodInt > 0 Then SettingDialog.ReplyPeriodInt = 15
612             If SettingDialog.DMPeriodInt < 15 AndAlso SettingDialog.DMPeriodInt > 0 Then SettingDialog.DMPeriodInt = 15
613             If SettingDialog.PubSearchPeriodInt < 30 AndAlso SettingDialog.PubSearchPeriodInt > 0 Then SettingDialog.PubSearchPeriodInt = 30
614             If SettingDialog.ListsPeriodInt < 15 AndAlso SettingDialog.ListsPeriodInt > 0 Then SettingDialog.ListsPeriodInt = 15
615         End If
616
617         '起動時読み込み分を既読にするか。Trueなら既読として処理
618         SettingDialog.Readed = _cfgCommon.Read
619         '新着取得時のリストスクロールをするか。Trueならスクロールしない
620         ListLockMenuItem.Checked = _cfgCommon.ListLock
621         Me.LockListFileMenuItem.Checked = _cfgCommon.ListLock
622         SettingDialog.IconSz = _cfgCommon.IconSize
623         '文末ステータス
624         SettingDialog.Status = _cfgLocal.StatusText
625         '未読管理。Trueなら未読管理する
626         SettingDialog.UnreadManage = _cfgCommon.UnreadManage
627         'サウンド再生(タブ別設定より優先)
628         SettingDialog.PlaySound = _cfgCommon.PlaySound
629         PlaySoundMenuItem.Checked = SettingDialog.PlaySound
630         Me.PlaySoundFileMenuItem.Checked = SettingDialog.PlaySound
631         '片思い表示。Trueなら片思い表示する
632         SettingDialog.OneWayLove = _cfgCommon.OneWayLove
633         'フォント&文字色&背景色
634         SettingDialog.FontUnread = _fntUnread
635         SettingDialog.ColorUnread = _clUnread
636         SettingDialog.FontReaded = _fntReaded
637         SettingDialog.ColorReaded = _clReaded
638         SettingDialog.ColorFav = _clFav
639         SettingDialog.ColorOWL = _clOWL
640         SettingDialog.ColorRetweet = _clRetweet
641         SettingDialog.FontDetail = _fntDetail
642         SettingDialog.ColorDetail = _clDetail
643         SettingDialog.ColorDetailLink = _clDetailLink
644         SettingDialog.ColorDetailBackcolor = _clDetailBackcolor
645         SettingDialog.ColorSelf = _clSelf
646         SettingDialog.ColorAtSelf = _clAtSelf
647         SettingDialog.ColorTarget = _clTarget
648         SettingDialog.ColorAtTarget = _clAtTarget
649         SettingDialog.ColorAtFromTarget = _clAtFromTarget
650         SettingDialog.ColorAtTo = _clAtTo
651         SettingDialog.ColorListBackcolor = _clListBackcolor
652         SettingDialog.ColorInputBackcolor = _clInputBackcolor
653         SettingDialog.ColorInputFont = _clInputFont
654         SettingDialog.FontInputFont = _fntInputFont
655
656         SettingDialog.NameBalloon = _cfgCommon.NameBalloon
657         SettingDialog.PostCtrlEnter = _cfgCommon.PostCtrlEnter
658         SettingDialog.PostShiftEnter = _cfgCommon.PostShiftEnter
659
660         SettingDialog.CountApi = _cfgCommon.CountApi
661         SettingDialog.CountApiReply = _cfgCommon.CountApiReply
662         If SettingDialog.CountApi < 20 OrElse SettingDialog.CountApi > 200 Then SettingDialog.CountApi = 60
663         If SettingDialog.CountApiReply < 20 OrElse SettingDialog.CountApiReply > 200 Then SettingDialog.CountApiReply = 40
664
665         SettingDialog.BrowserPath = _cfgLocal.BrowserPath
666         SettingDialog.PostAndGet = _cfgCommon.PostAndGet
667         SettingDialog.UseRecommendStatus = _cfgLocal.UseRecommendStatus
668         SettingDialog.DispUsername = _cfgCommon.DispUsername
669         SettingDialog.CloseToExit = _cfgCommon.CloseToExit
670         SettingDialog.MinimizeToTray = _cfgCommon.MinimizeToTray
671         SettingDialog.DispLatestPost = _cfgCommon.DispLatestPost
672         SettingDialog.SortOrderLock = _cfgCommon.SortOrderLock
673         SettingDialog.TinyUrlResolve = _cfgCommon.TinyUrlResolve
674
675         SettingDialog.SelectedProxyType = _cfgLocal.ProxyType
676         SettingDialog.ProxyAddress = _cfgLocal.ProxyAddress
677         SettingDialog.ProxyPort = _cfgLocal.ProxyPort
678         SettingDialog.ProxyUser = _cfgLocal.ProxyUser
679         SettingDialog.ProxyPassword = _cfgLocal.ProxyPassword
680
681         SettingDialog.PeriodAdjust = _cfgCommon.PeriodAdjust
682         SettingDialog.StartupVersion = _cfgCommon.StartupVersion
683         SettingDialog.StartupFollowers = _cfgCommon.StartupFollowers
684         SettingDialog.RestrictFavCheck = _cfgCommon.RestrictFavCheck
685         SettingDialog.AlwaysTop = _cfgCommon.AlwaysTop
686         SettingDialog.UrlConvertAuto = _cfgCommon.UrlConvertAuto
687
688         SettingDialog.OutputzEnabled = _cfgCommon.Outputz
689         SettingDialog.OutputzKey = _cfgCommon.OutputzKey
690         SettingDialog.OutputzUrlmode = _cfgCommon.OutputzUrlMode
691
692         SettingDialog.UseUnreadStyle = _cfgCommon.UseUnreadStyle
693         SettingDialog.DefaultTimeOut = _cfgCommon.DefaultTimeOut
694         'SettingDialog.ProtectNotInclude = _cfgCommon.ProtectNotInclude
695         SettingDialog.RetweetNoConfirm = _cfgCommon.RetweetNoConfirm
696         SettingDialog.PlaySound = _cfgCommon.PlaySound
697         SettingDialog.DateTimeFormat = _cfgCommon.DateTimeFormat
698         SettingDialog.LimitBalloon = _cfgCommon.LimitBalloon
699
700         '廃止サービスが選択されていた場合bit.lyへ読み替え
701         If _cfgCommon.AutoShortUrlFirst < 0 Then
702             _cfgCommon.AutoShortUrlFirst = Tween.UrlConverter.Bitly
703         End If
704
705         SettingDialog.AutoShortUrlFirst = _cfgCommon.AutoShortUrlFirst
706         SettingDialog.TabIconDisp = _cfgCommon.TabIconDisp
707         SettingDialog.ReplyIconState = _cfgCommon.ReplyIconState
708         SettingDialog.ReadOwnPost = _cfgCommon.ReadOwnPost
709         SettingDialog.GetFav = _cfgCommon.GetFav
710         SettingDialog.ReadOldPosts = _cfgCommon.ReadOldPosts
711         SettingDialog.UseSsl = _cfgCommon.UseSsl
712         SettingDialog.BitlyUser = _cfgCommon.BilyUser
713         SettingDialog.BitlyPwd = _cfgCommon.BitlyPwd
714         SettingDialog.ShowGrid = _cfgCommon.ShowGrid
715         SettingDialog.Language = _cfgCommon.Language
716         SettingDialog.UseAtIdSupplement = _cfgCommon.UseAtIdSupplement
717         SettingDialog.UseHashSupplement = _cfgCommon.UseHashSupplement
718         SettingDialog.PreviewEnable = _cfgCommon.PreviewEnable
719         AtIdSupl = New AtIdSupplement(SettingAtIdList.Load().AtIdList, "@")
720
721         SettingDialog.IsMonospace = _cfgCommon.IsMonospace
722         If SettingDialog.IsMonospace Then
723             detailHtmlFormatHeader = detailHtmlFormatMono1
724             detailHtmlFormatFooter = detailHtmlFormatMono7
725         Else
726             detailHtmlFormatHeader = detailHtmlFormat1
727             detailHtmlFormatFooter = detailHtmlFormat7
728         End If
729         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
730         If SettingDialog.IsMonospace Then
731             detailHtmlFormatHeader += detailHtmlFormatMono6
732         Else
733             detailHtmlFormatHeader += detailHtmlFormat6
734         End If
735         Me.IdeographicSpaceToSpaceToolStripMenuItem.Checked = _cfgCommon.WideSpaceConvert
736         Me.ToolStripFocusLockMenuItem.Checked = _cfgCommon.FocusLockToStatusText
737
738         'Dim statregex As New Regex("^0*")
739         SettingDialog.RecommendStatusText = " [TWNv" + Regex.Replace(fileVersion.Replace(".", ""), "^0*", "") + "]"
740
741         '書式指定文字列エラーチェック
742         Try
743             If DateTime.Now.ToString(SettingDialog.DateTimeFormat).Length = 0 Then
744                 ' このブロックは絶対に実行されないはず
745                 ' 変換が成功した場合にLengthが0にならない
746                 SettingDialog.DateTimeFormat = "yyyy/MM/dd H:mm:ss"
747             End If
748         Catch ex As FormatException
749             ' FormatExceptionが発生したら初期値を設定 (=yyyy/MM/dd H:mm:ssとみなされる)
750             SettingDialog.DateTimeFormat = "yyyy/MM/dd H:mm:ss"
751         End Try
752
753         SettingDialog.Nicoms = _cfgCommon.Nicoms
754         SettingDialog.HotkeyEnabled = _cfgCommon.HotkeyEnabled
755         SettingDialog.HotkeyMod = _cfgCommon.HotkeyModifier
756         SettingDialog.HotkeyKey = _cfgCommon.HotkeyKey
757         SettingDialog.HotkeyValue = _cfgCommon.HotkeyValue
758
759         SettingDialog.BlinkNewMentions = _cfgCommon.BlinkNewMentions
760
761         SettingDialog.UseAdditionalCount = _cfgCommon.UseAdditionalCount
762         SettingDialog.MoreCountApi = _cfgCommon.MoreCountApi
763         SettingDialog.FirstCountApi = _cfgCommon.FirstCountApi
764         SettingDialog.SearchCountApi = _cfgCommon.SearchCountApi
765         SettingDialog.FavoritesCountApi = _cfgCommon.FavoritesCountApi
766         'If _cfgCommon.UseAdditionalCount Then
767         '    _FirstRefreshFlags = True
768         '    _FirstListsRefreshFlags = True
769         'End If
770         SettingDialog.UserstreamStartup = _cfgCommon.UserstreamStartup
771         SettingDialog.UserstreamPeriodInt = _cfgCommon.UserstreamPeriod
772
773         'ハッシュタグ関連
774         HashSupl = New AtIdSupplement(_cfgCommon.HashTags, "#")
775         HashMgr = New HashtagManage(HashSupl, _
776                                 _cfgCommon.HashTags.ToArray, _
777                                 _cfgCommon.HashSelected, _
778                                 _cfgCommon.HashIsPermanent, _
779                                 _cfgCommon.HashIsHead)
780         If HashMgr.UseHash <> "" AndAlso HashMgr.IsPermanent Then HashStripSplitButton.Text = HashMgr.UseHash
781
782         _initial = True
783
784         Dim saveRequired As Boolean = False
785         'ユーザー名、パスワードが未設定なら設定画面を表示(初回起動時など)
786         If tw.Username = "" Then
787             saveRequired = True
788             '設定せずにキャンセルされた場合はプログラム終了
789             If SettingDialog.ShowDialog() = Windows.Forms.DialogResult.Cancel Then
790                 Application.Exit()  '強制終了
791                 Exit Sub
792             End If
793             '設定されたが、依然ユーザー名とパスワードが未設定ならプログラム終了
794             If tw.Username = "" Then
795                 Application.Exit()  '強制終了
796                 Exit Sub
797             End If
798             '新しい設定を反映
799             'フォント&文字色&背景色保持
800             _fntUnread = SettingDialog.FontUnread
801             _clUnread = SettingDialog.ColorUnread
802             _fntReaded = SettingDialog.FontReaded
803             _clReaded = SettingDialog.ColorReaded
804             _clFav = SettingDialog.ColorFav
805             _clOWL = SettingDialog.ColorOWL
806             _clRetweet = SettingDialog.ColorRetweet
807             _fntDetail = SettingDialog.FontDetail
808             _clDetail = SettingDialog.ColorDetail
809             _clDetailLink = SettingDialog.ColorDetailLink
810             _clDetailBackcolor = SettingDialog.ColorDetailBackcolor
811             _clSelf = SettingDialog.ColorSelf
812             _clAtSelf = SettingDialog.ColorAtSelf
813             _clTarget = SettingDialog.ColorTarget
814             _clAtTarget = SettingDialog.ColorAtTarget
815             _clAtFromTarget = SettingDialog.ColorAtFromTarget
816             _clAtTo = SettingDialog.ColorAtTo
817             _clListBackcolor = SettingDialog.ColorListBackcolor
818             _clInputBackcolor = SettingDialog.ColorInputBackcolor
819             _clInputFont = SettingDialog.ColorInputFont
820             _fntInputFont = SettingDialog.FontInputFont
821             _brsForeColorUnread.Dispose()
822             _brsForeColorReaded.Dispose()
823             _brsForeColorFav.Dispose()
824             _brsForeColorOWL.Dispose()
825             _brsForeColorRetweet.Dispose()
826             _brsForeColorUnread = New SolidBrush(_clUnread)
827             _brsForeColorReaded = New SolidBrush(_clReaded)
828             _brsForeColorFav = New SolidBrush(_clFav)
829             _brsForeColorOWL = New SolidBrush(_clOWL)
830             _brsForeColorRetweet = New SolidBrush(_clRetweet)
831             _brsBackColorMine.Dispose()
832             _brsBackColorAt.Dispose()
833             _brsBackColorYou.Dispose()
834             _brsBackColorAtYou.Dispose()
835             _brsBackColorAtFromTarget.Dispose()
836             _brsBackColorAtTo.Dispose()
837             _brsBackColorNone.Dispose()
838             _brsBackColorMine = New SolidBrush(_clSelf)
839             _brsBackColorAt = New SolidBrush(_clAtSelf)
840             _brsBackColorYou = New SolidBrush(_clTarget)
841             _brsBackColorAtYou = New SolidBrush(_clAtTarget)
842             _brsBackColorAtFromTarget = New SolidBrush(_clAtFromTarget)
843             _brsBackColorAtTo = New SolidBrush(_clAtTo)
844             _brsBackColorNone = New SolidBrush(_clListBackcolor)
845
846             If SettingDialog.IsMonospace Then
847                 detailHtmlFormatHeader = detailHtmlFormatMono1
848                 detailHtmlFormatFooter = detailHtmlFormatMono7
849             Else
850                 detailHtmlFormatHeader = detailHtmlFormat1
851                 detailHtmlFormatFooter = detailHtmlFormat7
852             End If
853             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
854             If SettingDialog.IsMonospace Then
855                 detailHtmlFormatHeader += detailHtmlFormatMono6
856             Else
857                 detailHtmlFormatHeader += detailHtmlFormat6
858             End If
859             '他の設定項目は、随時設定画面で保持している値を読み出して使用
860         End If
861
862         If SettingDialog.HotkeyEnabled Then
863             '''グローバルホットキーの登録
864             Dim modKey As HookGlobalHotkey.ModKeys = HookGlobalHotkey.ModKeys.None
865             If (SettingDialog.HotkeyMod And Keys.Alt) = Keys.Alt Then modKey = modKey Or HookGlobalHotkey.ModKeys.Alt
866             If (SettingDialog.HotkeyMod And Keys.Control) = Keys.Control Then modKey = modKey Or HookGlobalHotkey.ModKeys.Ctrl
867             If (SettingDialog.HotkeyMod And Keys.Shift) = Keys.Shift Then modKey = modKey Or HookGlobalHotkey.ModKeys.Shift
868             If (SettingDialog.HotkeyMod And Keys.LWin) = Keys.LWin Then modKey = modKey Or HookGlobalHotkey.ModKeys.Win
869
870             _hookGlobalHotkey.RegisterOriginalHotkey(SettingDialog.HotkeyKey, SettingDialog.HotkeyValue, modKey)
871         End If
872
873         'Twitter用通信クラス初期化
874         HttpConnection.InitializeConnection(SettingDialog.DefaultTimeOut, _
875                                             SettingDialog.SelectedProxyType, _
876                                             SettingDialog.ProxyAddress, _
877                                             SettingDialog.ProxyPort, _
878                                             SettingDialog.ProxyUser, _
879                                             SettingDialog.ProxyPassword)
880         'tw.CountApi = SettingDialog.CountApi
881         'tw.CountApiReply = SettingDialog.CountApiReply
882         tw.RestrictFavCheck = SettingDialog.RestrictFavCheck
883         tw.ReadOwnPost = SettingDialog.ReadOwnPost
884         tw.UseSsl = SettingDialog.UseSsl
885         ShortUrl.IsResolve = SettingDialog.TinyUrlResolve
886         ShortUrl.BitlyId = SettingDialog.BitlyUser
887         ShortUrl.BitlyKey = SettingDialog.BitlyPwd
888         HttpTwitter.TwitterUrl = _cfgCommon.TwitterUrl
889         HttpTwitter.TwitterSearchUrl = _cfgCommon.TwitterSearchUrl
890         tw.TrackWord = _cfgCommon.TrackWord
891         TrackToolStripMenuItem.Checked = Not String.IsNullOrEmpty(tw.TrackWord)
892         tw.AllAtReply = _cfgCommon.AllAtReply
893         AllrepliesToolStripMenuItem.Checked = tw.AllAtReply
894
895         Outputz.Key = SettingDialog.OutputzKey
896         Outputz.Enabled = SettingDialog.OutputzEnabled
897         Select Case SettingDialog.OutputzUrlmode
898             Case OutputzUrlmode.twittercom
899                 Outputz.OutUrl = "http://twitter.com/"
900             Case OutputzUrlmode.twittercomWithUsername
901                 Outputz.OutUrl = "http://twitter.com/" + tw.Username
902         End Select
903
904         '画像投稿サービス
905         SetImageServiceCombo()
906         ImageSelectionPanel.Enabled = False
907
908         'ウィンドウ設定
909         Me.ClientSize = _cfgLocal.FormSize
910         _mySize = _cfgLocal.FormSize                     'サイズ保持(最小化・最大化されたまま終了した場合の対応用)
911         _myLoc = _cfgLocal.FormLocation
912         'タイトルバー領域
913         If Me.WindowState <> FormWindowState.Minimized Then
914             Me.DesktopLocation = _cfgLocal.FormLocation
915             Dim tbarRect As New Rectangle(Me.Location, New Size(_mySize.Width, SystemInformation.CaptionHeight))
916             Dim outOfScreen As Boolean = True
917             If Screen.AllScreens.Length = 1 Then    'ハングするとの報告
918                 For Each scr As Screen In Screen.AllScreens
919                     If Not Rectangle.Intersect(tbarRect, scr.Bounds).IsEmpty Then
920                         outOfScreen = False
921                         Exit For
922                     End If
923                 Next
924                 If outOfScreen Then
925                     Me.DesktopLocation = New Point(0, 0)
926                     _myLoc = Me.DesktopLocation
927                 End If
928             End If
929         End If
930         Me.TopMost = SettingDialog.AlwaysTop
931         _mySpDis = _cfgLocal.SplitterDistance
932         _mySpDis2 = _cfgLocal.StatusTextHeight
933         _mySpDis3 = _cfgLocal.PreviewDistance
934         If _mySpDis3 = -1 Then
935             _mySpDis3 = _mySize.Width - 150
936             If _mySpDis3 < 1 Then _mySpDis3 = 50
937             _cfgLocal.PreviewDistance = _mySpDis3
938         End If
939         MultiLineMenuItem.Checked = _cfgLocal.StatusMultiline
940         'Me.Tween_ClientSizeChanged(Me, Nothing)
941         PlaySoundMenuItem.Checked = SettingDialog.PlaySound
942         Me.PlaySoundFileMenuItem.Checked = SettingDialog.PlaySound
943         '入力欄
944         StatusText.Font = _fntInputFont
945         StatusText.ForeColor = _clInputFont
946
947         '全新着通知のチェック状態により、Reply&DMの新着通知有効無効切り替え(タブ別設定にするため削除予定)
948         If SettingDialog.UnreadManage = False Then
949             ReadedStripMenuItem.Enabled = False
950             UnreadStripMenuItem.Enabled = False
951         End If
952
953         'タイマー設定
954         TimerTimeline.AutoReset = True
955         TimerTimeline.SynchronizingObject = Me
956         'Recent取得間隔
957         TimerTimeline.Interval = 1000
958         TimerTimeline.Enabled = True
959
960         '更新中アイコンアニメーション間隔
961         TimerRefreshIcon.Interval = 200
962         TimerRefreshIcon.Enabled = True
963
964         '状態表示部の初期化(画面右下)
965         StatusLabel.Text = ""
966         StatusLabel.AutoToolTip = False
967         StatusLabel.ToolTipText = ""
968         '文字カウンタ初期化
969         lblLen.Text = GetRestStatusCount(True, False).ToString()
970
971         ''''''''''''''''''''''''''''''''''''''''
972         _statuses.SortOrder = DirectCast(_cfgCommon.SortOrder, System.Windows.Forms.SortOrder)
973         Dim mode As IdComparerClass.ComparerMode
974         Select Case _cfgCommon.SortColumn
975             Case 0, 5, 6    '0:アイコン,5:未読マーク,6:プロテクト・フィルターマーク
976                 'ソートしない
977                 mode = IdComparerClass.ComparerMode.Id  'Idソートに読み替え
978             Case 1  'ニックネーム
979                 mode = IdComparerClass.ComparerMode.Nickname
980             Case 2  '本文
981                 mode = IdComparerClass.ComparerMode.Data
982             Case 3  '時刻=発言Id
983                 mode = IdComparerClass.ComparerMode.Id
984             Case 4  '名前
985                 mode = IdComparerClass.ComparerMode.Name
986             Case 7  'Source
987                 mode = IdComparerClass.ComparerMode.Source
988         End Select
989         _statuses.SortMode = mode
990         ''''''''''''''''''''''''''''''''''''''''
991
992         Select Case SettingDialog.IconSz
993             Case IconSizes.IconNone
994                 _iconSz = 0
995             Case IconSizes.Icon16
996                 _iconSz = 16
997             Case IconSizes.Icon24
998                 _iconSz = 26
999             Case IconSizes.Icon48
1000                 _iconSz = 48
1001             Case IconSizes.Icon48_2
1002                 _iconSz = 48
1003                 _iconCol = True
1004         End Select
1005         If _iconSz = 0 Then
1006             tw.GetIcon = False
1007         Else
1008             tw.GetIcon = True
1009             tw.IconSize = _iconSz
1010         End If
1011         tw.TinyUrlResolve = SettingDialog.TinyUrlResolve
1012
1013         '発言詳細部アイコンをリストアイコンにサイズ変更
1014         Dim sz As Integer = _iconSz
1015         If _iconSz = 0 Then
1016             sz = 16
1017         End If
1018
1019         'アイコンリスト作成
1020         TIconDic = New ImageDictionary(5000)
1021
1022         tw.DetailIcon = TIconDic
1023
1024         StatusLabel.Text = My.Resources.Form1_LoadText1       '画面右下の状態表示を変更
1025         StatusLabelUrl.Text = ""            '画面左下のリンク先URL表示部を初期化
1026         NameLabel.Text = ""                 '発言詳細部名前ラベル初期化
1027         DateTimeLabel.Text = ""             '発言詳細部日時ラベル初期化
1028         SourceLinkLabel.Text = ""           'Source部分初期化
1029
1030         '<<<<<<<<タブ関連>>>>>>>
1031         'デフォルトタブの存在チェック、ない場合には追加
1032         If _statuses.GetTabByType(TabUsageType.Home) Is Nothing Then
1033             If Not _statuses.Tabs.ContainsKey(DEFAULTTAB.RECENT) Then
1034                 _statuses.AddTab(DEFAULTTAB.RECENT, TabUsageType.Home, Nothing)
1035             Else
1036                 _statuses.Tabs(DEFAULTTAB.RECENT).TabType = TabUsageType.Home
1037             End If
1038         End If
1039         If _statuses.GetTabByType(TabUsageType.Mentions) Is Nothing Then
1040             If Not _statuses.Tabs.ContainsKey(DEFAULTTAB.REPLY) Then
1041                 _statuses.AddTab(DEFAULTTAB.REPLY, TabUsageType.Mentions, Nothing)
1042             Else
1043                 _statuses.Tabs(DEFAULTTAB.REPLY).TabType = TabUsageType.Mentions
1044             End If
1045         End If
1046         If _statuses.GetTabByType(TabUsageType.DirectMessage) Is Nothing Then
1047             If Not _statuses.Tabs.ContainsKey(DEFAULTTAB.DM) Then
1048                 _statuses.AddTab(DEFAULTTAB.DM, TabUsageType.DirectMessage, Nothing)
1049             Else
1050                 _statuses.Tabs(DEFAULTTAB.DM).TabType = TabUsageType.DirectMessage
1051             End If
1052         End If
1053         If _statuses.GetTabByType(TabUsageType.Favorites) Is Nothing Then
1054             If Not _statuses.Tabs.ContainsKey(DEFAULTTAB.FAV) Then
1055                 _statuses.AddTab(DEFAULTTAB.FAV, TabUsageType.Favorites, Nothing)
1056             Else
1057                 _statuses.Tabs(DEFAULTTAB.FAV).TabType = TabUsageType.Favorites
1058             End If
1059         End If
1060         For Each tn As String In _statuses.Tabs.Keys
1061             If _statuses.Tabs(tn).TabType = TabUsageType.Undefined Then
1062                 _statuses.Tabs(tn).TabType = TabUsageType.UserDefined
1063             End If
1064             If Not AddNewTab(tn, True, _statuses.Tabs(tn).TabType) Then Throw New Exception("タブ作成エラー")
1065         Next
1066
1067         Me.JumpReadOpMenuItem.ShortcutKeyDisplayString = "Space"
1068         CopySTOTMenuItem.ShortcutKeyDisplayString = "Ctrl+C"
1069         CopyURLMenuItem.ShortcutKeyDisplayString = "Ctrl+Shift+C"
1070         CopyUserIdStripMenuItem.ShortcutKeyDisplayString = "Shift+Alt+C"
1071
1072         If SettingDialog.MinimizeToTray = False OrElse Me.WindowState <> FormWindowState.Minimized Then
1073             Me.Visible = True
1074         End If
1075         _curTab = ListTab.SelectedTab
1076         _curItemIndex = -1
1077         _curList = DirectCast(_curTab.Tag, DetailsListView)
1078         SetMainWindowTitle()
1079         SetNotifyIconText()
1080
1081         If SettingDialog.TabIconDisp Then
1082             ListTab.DrawMode = TabDrawMode.Normal
1083         Else
1084             ListTab.DrawMode = TabDrawMode.OwnerDrawFixed
1085             AddHandler ListTab.DrawItem, AddressOf ListTab_DrawItem
1086             ListTab.ImageList = Nothing
1087         End If
1088
1089         _ignoreConfigSave = False
1090         Me.TweenMain_Resize(Nothing, Nothing)
1091         If saveRequired Then SaveConfigsAll(False)
1092     End Sub
1093
1094     Private Sub spaceKeyCanceler_SpaceCancel(ByVal sender As Object, ByVal e As EventArgs)
1095         JumpUnreadMenuItem_Click(Nothing, Nothing)
1096     End Sub
1097
1098     Private Sub ListTab_DrawItem( _
1099             ByVal sender As Object, ByVal e As DrawItemEventArgs)
1100         Dim txt As String
1101         Try
1102             txt = ListTab.TabPages(e.Index).Text
1103         Catch ex As Exception
1104             Exit Sub
1105         End Try
1106
1107         e.Graphics.FillRectangle(System.Drawing.SystemBrushes.Control, e.Bounds)
1108         If e.State = DrawItemState.Selected Then
1109             e.DrawFocusRectangle()
1110         End If
1111         Dim fore As Brush
1112         Try
1113             If _statuses.Tabs(txt).UnreadCount > 0 Then
1114                 fore = Brushes.Red
1115             Else
1116                 fore = System.Drawing.SystemBrushes.ControlText
1117             End If
1118         Catch ex As Exception
1119             fore = System.Drawing.SystemBrushes.ControlText
1120         End Try
1121         e.Graphics.DrawString(txt, e.Font, fore, e.Bounds, sfTab)
1122     End Sub
1123
1124     Private Function LoadOldConfig() As Boolean
1125         Dim needToSave As Boolean = False
1126         _cfgCommon = SettingCommon.Load()
1127         _cfgLocal = SettingLocal.Load()
1128         If _cfgCommon.TabList.Count > 0 Then
1129             For Each tabName As String In _cfgCommon.TabList
1130                 _statuses.Tabs.Add(tabName, SettingTab.Load(tabName).Tab)
1131                 If tabName <> ReplaceInvalidFilename(tabName) Then
1132                     Dim tb As TabClass = _statuses.Tabs(tabName)
1133                     _statuses.RemoveTab(tabName)
1134                     tb.TabName = ReplaceInvalidFilename(tabName)
1135                     _statuses.Tabs.Add(ReplaceInvalidFilename(tabName), tb)
1136                     Dim tabSetting As New SettingTab
1137                     tabSetting.Tab = tb
1138                     tabSetting.Save()
1139                     needToSave = True
1140                 End If
1141             Next
1142         Else
1143             _statuses.AddTab(DEFAULTTAB.RECENT, TabUsageType.Home, Nothing)
1144             _statuses.AddTab(DEFAULTTAB.REPLY, TabUsageType.Mentions, Nothing)
1145             _statuses.AddTab(DEFAULTTAB.DM, TabUsageType.DirectMessage, Nothing)
1146             _statuses.AddTab(DEFAULTTAB.FAV, TabUsageType.Favorites, Nothing)
1147         End If
1148         If needToSave Then
1149             _cfgCommon.TabList.Clear()
1150             For Each tabName As String In _statuses.Tabs.Keys
1151                 _cfgCommon.TabList.Add(tabName)
1152             Next
1153             _cfgCommon.Save()
1154         End If
1155
1156         If System.IO.File.Exists(SettingCommon.GetSettingFilePath("")) Then
1157             Return True
1158         Else
1159             Return False
1160         End If
1161     End Function
1162
1163     Private Sub LoadConfig()
1164         Dim needToSave As Boolean = False
1165         _cfgCommon = SettingCommon.Load()
1166         _cfgLocal = SettingLocal.Load()
1167         Dim tabs As List(Of TabClass) = SettingTabs.Load().Tabs
1168         For Each tb As TabClass In tabs
1169             _statuses.Tabs.Add(tb.TabName, tb)
1170         Next
1171         If _statuses.Tabs.Count = 0 Then
1172             _statuses.AddTab(DEFAULTTAB.RECENT, TabUsageType.Home, Nothing)
1173             _statuses.AddTab(DEFAULTTAB.REPLY, TabUsageType.Mentions, Nothing)
1174             _statuses.AddTab(DEFAULTTAB.DM, TabUsageType.DirectMessage, Nothing)
1175             _statuses.AddTab(DEFAULTTAB.FAV, TabUsageType.Favorites, Nothing)
1176         End If
1177     End Sub
1178
1179     Private Sub ConvertConfig()
1180         '新タブ設定ファイル存在チェック
1181         If System.IO.File.Exists(SettingTabs.GetSettingFilePath("")) Then
1182             LoadConfig()
1183             Exit Sub
1184         End If
1185         LoadOldConfig()
1186     End Sub
1187
1188     Private Sub TimerTimeline_Elapsed(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerTimeline.Elapsed
1189 #If DEBUG Then
1190         Dim sw As Stopwatch = Stopwatch.StartNew()
1191 #End If
1192         Static homeCounter As Integer = 0
1193         Static mentionCounter As Integer = 0
1194         Static dmCounter As Integer = 0
1195         Static pubSearchCounter As Integer = 0
1196         Static listsCounter As Integer = 0
1197         Static usCounter As Integer = 0
1198
1199         If homeCounter > 0 Then Interlocked.Decrement(homeCounter)
1200         If mentionCounter > 0 Then Interlocked.Decrement(mentionCounter)
1201         If dmCounter > 0 Then Interlocked.Decrement(dmCounter)
1202         If pubSearchCounter > 0 Then Interlocked.Decrement(pubSearchCounter)
1203         If listsCounter > 0 Then Interlocked.Decrement(listsCounter)
1204         If usCounter > 0 Then Interlocked.Decrement(usCounter)
1205
1206         ''タイマー初期化
1207         If homeCounter <= 0 AndAlso SettingDialog.TimelinePeriodInt > 0 Then
1208             'Dim period As Integer
1209             'Interlocked.Exchange(period, 0)
1210             'Interlocked.Add(period, SettingDialog.TimelinePeriodInt)
1211             'Interlocked.Add(period, -_homeCounterAdjuster)
1212             'Interlocked.Exchange(_homeCounter, period)
1213             Interlocked.Exchange(homeCounter, SettingDialog.TimelinePeriodInt)
1214             GetTimeline(WORKERTYPE.Timeline, 1, 0, "")
1215         End If
1216         If mentionCounter <= 0 AndAlso SettingDialog.ReplyPeriodInt > 0 Then
1217             Interlocked.Exchange(mentionCounter, SettingDialog.ReplyPeriodInt)
1218             GetTimeline(WORKERTYPE.Reply, 1, 0, "")
1219         End If
1220         If dmCounter <= 0 AndAlso SettingDialog.DMPeriodInt > 0 Then
1221             Interlocked.Exchange(dmCounter, SettingDialog.DMPeriodInt)
1222             GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
1223         End If
1224         If pubSearchCounter <= 0 AndAlso SettingDialog.PubSearchPeriodInt > 0 Then
1225             Interlocked.Exchange(pubSearchCounter, SettingDialog.PubSearchPeriodInt)
1226             GetTimeline(WORKERTYPE.PublicSearch, 1, 0, "")
1227         End If
1228         If listsCounter <= 0 AndAlso SettingDialog.ListsPeriodInt > 0 Then
1229             Interlocked.Exchange(listsCounter, SettingDialog.ListsPeriodInt)
1230             GetTimeline(WORKERTYPE.List, 1, 0, "")
1231         End If
1232         If usCounter <= 0 AndAlso SettingDialog.UserstreamPeriodInt > 0 Then
1233             Interlocked.Exchange(usCounter, SettingDialog.UserstreamPeriodInt)
1234             RefreshTimeline(True)
1235         End If
1236
1237 #If DEBUG Then
1238         sw.Stop()
1239         Console.WriteLine("Counter: Home {0} Reply {1} Dm {2} Search {3} Lists {4}", homeCounter, mentionCounter, dmCounter, pubSearchCounter, listsCounter)
1240         Console.WriteLine(sw.Elapsed)
1241 #End If
1242     End Sub
1243
1244     Private Sub RefreshTimeline(ByVal isUserStream As Boolean)
1245         'スクロール制御準備
1246         Dim smode As Integer = -1    '-1:制御しない,-2:最新へ,その他:topitem使用
1247         Dim topId As Long = GetScrollPos(smode)
1248         Dim befCnt As Integer = _curList.VirtualListSize
1249
1250         '現在の選択状態を退避
1251         Dim selId As New Dictionary(Of String, Long())
1252         Dim focusedId As New Dictionary(Of String, Long)
1253         SaveSelectedStatus(selId, focusedId)
1254
1255         'mentionsの更新前件数を保持
1256         Dim dmCount As Integer = _statuses.GetTabByType(TabUsageType.DirectMessage).AllCount
1257
1258         '更新確定
1259         Dim notifyPosts() As PostClass = Nothing
1260         Dim soundFile As String = ""
1261         Dim addCount As Integer = 0
1262         Dim isMention As Boolean = False
1263         addCount = _statuses.SubmitUpdate(soundFile, notifyPosts, isMention, isUserStream)
1264
1265         If _endingFlag Then Exit Sub
1266
1267         'リストに反映&選択状態復元
1268         Try
1269             For Each tab As TabPage In ListTab.TabPages
1270                 Dim lst As DetailsListView = DirectCast(tab.Tag, DetailsListView)
1271                 Dim tabInfo As TabClass = _statuses.Tabs(tab.Text)
1272                 lst.BeginUpdate()
1273                 If lst.VirtualListSize <> tabInfo.AllCount Then
1274                     If lst.Equals(_curList) Then
1275                         _itemCache = Nothing
1276                         _postCache = Nothing
1277                     End If
1278                     Try
1279                         lst.VirtualListSize = tabInfo.AllCount 'リスト件数更新
1280                     Catch ex As Exception
1281                         'アイコン描画不具合あり?
1282                     End Try
1283                     Me.SelectListItem(lst, _
1284                                       _statuses.IndexOf(tab.Text, selId(tab.Text)), _
1285                                       _statuses.IndexOf(tab.Text, focusedId(tab.Text)))
1286                 End If
1287                 lst.EndUpdate()
1288                 If tabInfo.UnreadCount > 0 Then
1289                     If SettingDialog.TabIconDisp Then
1290                         If tab.ImageIndex = -1 Then tab.ImageIndex = 0 'タブアイコン
1291                     End If
1292                 End If
1293             Next
1294             If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
1295         Catch ex As Exception
1296             'ex.Data("Msg") = "Ref1, UseAPI=" + SettingDialog.UseAPI.ToString
1297             'Throw
1298         End Try
1299
1300         'スクロール制御後処理
1301         Try
1302             If befCnt <> _curList.VirtualListSize Then
1303                 Select Case smode
1304                     Case -3
1305                         '最上行
1306                         _curList.EnsureVisible(0)
1307                     Case -2
1308                         '最下行へ
1309                         If _curList.VirtualListSize > 0 Then _curList.EnsureVisible(_curList.VirtualListSize - 1)
1310                     Case -1
1311                         '制御しない
1312                     Case Else
1313                         '表示位置キープ
1314                         If _curList.VirtualListSize > 0 AndAlso _statuses.IndexOf(_curTab.Text, topId) > -1 Then
1315                             _curList.EnsureVisible(_curList.VirtualListSize - 1)
1316                             _curList.EnsureVisible(_statuses.IndexOf(_curTab.Text, topId))
1317                         End If
1318                 End Select
1319             End If
1320         Catch ex As Exception
1321             ex.Data("Msg") = "Ref2"
1322             Throw
1323         End Try
1324
1325         '新着通知
1326         NotifyNewPosts(notifyPosts,
1327                        soundFile,
1328                        addCount,
1329                        isMention OrElse dmCount <> _statuses.GetTabByType(TabUsageType.DirectMessage).AllCount)
1330
1331         SetMainWindowTitle()
1332         If Not StatusLabelUrl.Text.StartsWith("http") Then SetStatusLabelUrl()
1333
1334         HashSupl.AddRangeItem(tw.GetHashList)
1335
1336     End Sub
1337
1338     Private Function GetScrollPos(ByRef smode As Integer) As Long
1339         Dim topId As Long = -1
1340         If _curList IsNot Nothing AndAlso _curTab IsNot Nothing AndAlso _curList.VirtualListSize > 0 Then
1341             If _statuses.SortMode = IdComparerClass.ComparerMode.Id Then
1342                 If _statuses.SortOrder = SortOrder.Ascending Then
1343                     'Id昇順
1344                     If ListLockMenuItem.Checked Then
1345                         '制御しない
1346                         'smode = -1
1347                         '現在表示位置へ強制スクロール
1348                         If _curList.TopItem IsNot Nothing Then topId = _statuses.GetId(_curTab.Text, _curList.TopItem.Index)
1349                         smode = 0
1350                     Else
1351                         '最下行が表示されていたら、最下行へ強制スクロール。最下行が表示されていなかったら制御しない
1352                         Dim _item As ListViewItem
1353                         _item = _curList.GetItemAt(0, _curList.ClientSize.Height - 1)   '一番下
1354                         If _item Is Nothing Then _item = _curList.Items(_curList.Items.Count - 1)
1355                         If _item.Index = _curList.Items.Count - 1 Then
1356                             smode = -2
1357                         Else
1358                             'smode = -1
1359                             If _curList.TopItem IsNot Nothing Then topId = _statuses.GetId(_curTab.Text, _curList.TopItem.Index)
1360                             smode = 0
1361                         End If
1362                     End If
1363                 Else
1364                     'Id降順
1365                     If ListLockMenuItem.Checked Then
1366                         '現在表示位置へ強制スクロール
1367                         If _curList.TopItem IsNot Nothing Then topId = _statuses.GetId(_curTab.Text, _curList.TopItem.Index)
1368                         smode = 0
1369                     Else
1370                         '最上行が表示されていたら、制御しない。最上行が表示されていなかったら、現在表示位置へ強制スクロール
1371                         Dim _item As ListViewItem
1372
1373                         _item = _curList.GetItemAt(0, 10)     '一番上
1374                         If _item Is Nothing Then _item = _curList.Items(0)
1375                         If _item.Index = 0 Then
1376                             smode = -3  '最上行
1377                         Else
1378                             If _curList.TopItem IsNot Nothing Then topId = _statuses.GetId(_curTab.Text, _curList.TopItem.Index)
1379                             smode = 0
1380                         End If
1381                     End If
1382                 End If
1383             Else
1384                 '現在表示位置へ強制スクロール
1385                 If _curList.TopItem IsNot Nothing Then topId = _statuses.GetId(_curTab.Text, _curList.TopItem.Index)
1386                 smode = 0
1387             End If
1388         Else
1389             smode = -1
1390         End If
1391         Return topId
1392     End Function
1393
1394     Private Sub SaveSelectedStatus(ByVal selId As Dictionary(Of String, Long()), ByVal focusedId As Dictionary(Of String, Long))
1395         If _endingFlag Then Exit Sub
1396         For Each tab As TabPage In ListTab.TabPages
1397             Dim lst As DetailsListView = DirectCast(tab.Tag, DetailsListView)
1398             If lst.SelectedIndices.Count > 0 AndAlso lst.SelectedIndices.Count < 31 Then
1399                 selId.Add(tab.Text, _statuses.GetId(tab.Text, lst.SelectedIndices))
1400             Else
1401                 selId.Add(tab.Text, New Long(0) {-1})
1402             End If
1403             If lst.FocusedItem IsNot Nothing Then
1404                 focusedId.Add(tab.Text, _statuses.GetId(tab.Text, lst.FocusedItem.Index))
1405             Else
1406                 focusedId.Add(tab.Text, -1)
1407             End If
1408         Next
1409
1410     End Sub
1411
1412     Private Sub NotifyNewPosts(ByVal notifyPosts() As PostClass, ByVal soundFile As String, ByVal addCount As Integer, ByVal newMentions As Boolean)
1413         '新着通知
1414         If ( _
1415                 NewPostPopMenuItem.Checked AndAlso _
1416                 notifyPosts IsNot Nothing AndAlso _
1417                 notifyPosts.Length > 0 AndAlso _
1418                 Not _initial AndAlso _
1419                 ( _
1420                     ( _
1421                         SettingDialog.LimitBalloon AndAlso _
1422                         ( _
1423                             Me.WindowState = FormWindowState.Minimized OrElse _
1424                             Not Me.Visible OrElse _
1425                             Form.ActiveForm Is Nothing _
1426                         ) _
1427                     ) OrElse _
1428                     Not SettingDialog.LimitBalloon _
1429                 ) _
1430             ) AndAlso _
1431             Not IsScreenSaverRunning() Then
1432             Dim sb As New StringBuilder
1433             Dim reply As Boolean = False
1434             Dim dm As Boolean = False
1435             For Each post As PostClass In notifyPosts
1436                 If post.IsReply AndAlso Not post.IsExcludeReply Then reply = True
1437                 If post.IsDm Then dm = True
1438                 If sb.Length > 0 Then sb.Append(System.Environment.NewLine)
1439                 Select Case SettingDialog.NameBalloon
1440                     Case NameBalloonEnum.UserID
1441                         sb.Append(post.Name).Append(" : ")
1442                     Case NameBalloonEnum.NickName
1443                         sb.Append(post.Nickname).Append(" : ")
1444                 End Select
1445                 sb.Append(post.Data)
1446             Next
1447             If SettingDialog.DispUsername Then NotifyIcon1.BalloonTipTitle = tw.Username + " - " Else NotifyIcon1.BalloonTipTitle = ""
1448             If dm Then
1449                 NotifyIcon1.BalloonTipIcon = ToolTipIcon.Warning
1450                 NotifyIcon1.BalloonTipTitle += "Tween [DM] " + My.Resources.RefreshDirectMessageText1 + " " + addCount.ToString() + My.Resources.RefreshDirectMessageText2
1451             ElseIf reply Then
1452                 NotifyIcon1.BalloonTipIcon = ToolTipIcon.Warning
1453                 NotifyIcon1.BalloonTipTitle += "Tween [Reply!] " + My.Resources.RefreshTimelineText1 + " " + addCount.ToString() + My.Resources.RefreshTimelineText2
1454             Else
1455                 NotifyIcon1.BalloonTipIcon = ToolTipIcon.Info
1456                 NotifyIcon1.BalloonTipTitle += "Tween " + My.Resources.RefreshTimelineText1 + " " + addCount.ToString() + My.Resources.RefreshTimelineText2
1457             End If
1458             Dim bText As String = sb.ToString
1459             If String.IsNullOrEmpty(bText) Then Exit Sub
1460             NotifyIcon1.BalloonTipText = sb.ToString()
1461             NotifyIcon1.ShowBalloonTip(500)
1462         End If
1463
1464         'サウンド再生
1465         If Not _initial AndAlso SettingDialog.PlaySound AndAlso soundFile <> "" Then
1466             Try
1467                 Dim dir As String = My.Application.Info.DirectoryPath
1468                 If Directory.Exists(Path.Combine(dir, "Sounds")) Then
1469                     dir = Path.Combine(dir, "Sounds")
1470                 End If
1471                 My.Computer.Audio.Play(Path.Combine(dir, soundFile), AudioPlayMode.Background)
1472             Catch ex As Exception
1473
1474             End Try
1475         End If
1476
1477         'mentions新着時に画面ブリンク
1478         If Not _initial AndAlso SettingDialog.BlinkNewMentions AndAlso newMentions AndAlso Form.ActiveForm Is Nothing Then
1479             FlashMyWindow(Me.Handle, FlashSpecification.FlashTray, 3)
1480         End If
1481     End Sub
1482
1483
1484     Private Sub MyList_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
1485         If _curList.SelectedIndices.Count <> 1 Then Exit Sub
1486         'If _curList.SelectedIndices.Count = 0 Then Exit Sub
1487
1488         _curItemIndex = _curList.SelectedIndices(0)
1489         'If _curPost Is GetCurTabPost(_curItemIndex) Then Exit Sub 'refreshで既読化されるのを防ぐため追加
1490         _curPost = GetCurTabPost(_curItemIndex)
1491         If SettingDialog.UnreadManage Then _statuses.SetRead(True, _curTab.Text, _curItemIndex)
1492         'MyList.RedrawItems(MyList.SelectedIndices(0), MyList.SelectedIndices(0), False)   'RetrieveVirtualItemが発生することを期待
1493         'キャッシュの書き換え
1494         ChangeCacheStyleRead(True, _curItemIndex, _curTab)   '既読へ(フォント、文字色)
1495
1496         'ColorizeList(-1)    '全キャッシュ更新(背景色)
1497         'DispSelectedPost()
1498         ColorizeList()
1499         _colorize = True
1500     End Sub
1501
1502     Private Sub ChangeCacheStyleRead(ByVal Read As Boolean, ByVal Index As Integer, ByVal Tab As TabPage)
1503         'Read:True=既読 False=未読
1504         '未読管理していなかったら既読として扱う
1505         If Not _statuses.Tabs(_curTab.Text).UnreadManage OrElse _
1506            Not SettingDialog.UnreadManage Then Read = True
1507
1508         '対象の特定
1509         Dim itm As ListViewItem
1510         Dim post As PostClass
1511         If Tab.Equals(_curTab) AndAlso _itemCache IsNot Nothing AndAlso Index >= _itemCacheIndex AndAlso Index < _itemCacheIndex + _itemCache.Length Then
1512             itm = _itemCache(Index - _itemCacheIndex)
1513             post = _postCache(Index - _itemCacheIndex)
1514         Else
1515             itm = DirectCast(Tab.Tag, DetailsListView).Items(Index)
1516             post = _statuses.Item(Tab.Text, Index)
1517         End If
1518
1519         ChangeItemStyleRead(Read, itm, post, DirectCast(Tab.Tag, DetailsListView))
1520     End Sub
1521
1522     Private Sub ChangeItemStyleRead(ByVal Read As Boolean, ByVal Item As ListViewItem, ByVal Post As PostClass, ByVal DList As DetailsListView)
1523         Dim fnt As Font
1524         'フォント
1525         If Read Then
1526             fnt = _fntReaded
1527             Item.SubItems(5).Text = ""
1528         Else
1529             fnt = _fntUnread
1530             Item.SubItems(5).Text = "★"
1531         End If
1532         '文字色
1533         Dim cl As Color
1534         If Post.IsFav Then
1535             cl = _clFav
1536         ElseIf Post.RetweetedId > 0 Then
1537             cl = _clRetweet
1538         ElseIf Post.IsOwl AndAlso (Post.IsDm OrElse SettingDialog.OneWayLove) Then
1539             cl = _clOWL
1540         ElseIf Read OrElse Not SettingDialog.UseUnreadStyle Then
1541             cl = _clReaded
1542         Else
1543             cl = _clUnread
1544         End If
1545         If DList Is Nothing OrElse Item.Index = -1 Then
1546             Item.ForeColor = cl
1547             If SettingDialog.UseUnreadStyle Then
1548                 Item.Font = fnt
1549             End If
1550         Else
1551             DList.Update()
1552             If SettingDialog.UseUnreadStyle Then
1553                 DList.ChangeItemFontAndColor(Item.Index, cl, fnt)
1554             Else
1555                 DList.ChangeItemForeColor(Item.Index, cl)
1556             End If
1557             'If _itemCache IsNot Nothing Then DList.RedrawItems(_itemCacheIndex, _itemCacheIndex + _itemCache.Length - 1, False)
1558         End If
1559     End Sub
1560
1561     Private Sub ColorizeList()
1562         'Index:更新対象のListviewItem.Index。Colorを返す。
1563         '-1は全キャッシュ。Colorは返さない(ダミーを戻す)
1564         Dim _post As PostClass
1565         If _anchorFlag Then
1566             _post = _anchorPost
1567         Else
1568             _post = _curPost
1569         End If
1570
1571         If _itemCache Is Nothing Then Exit Sub
1572
1573         If _post Is Nothing Then Exit Sub
1574
1575         Try
1576             For cnt As Integer = 0 To _itemCache.Length - 1
1577                 _curList.ChangeItemBackColor(_itemCacheIndex + cnt, JudgeColor(_post, _postCache(cnt)))
1578             Next
1579         Catch ex As Exception
1580         End Try
1581     End Sub
1582
1583     Private Sub ColorizeList(ByVal Item As ListViewItem, ByVal Index As Integer)
1584         'Index:更新対象のListviewItem.Index。Colorを返す。
1585         '-1は全キャッシュ。Colorは返さない(ダミーを戻す)
1586         Dim _post As PostClass
1587         If _anchorFlag Then
1588             _post = _anchorPost
1589         Else
1590             _post = _curPost
1591         End If
1592
1593         Dim tPost As PostClass = GetCurTabPost(Index)
1594
1595         If _post Is Nothing Then Exit Sub
1596
1597         If Item.Index = -1 Then
1598             Item.BackColor = JudgeColor(_post, tPost)
1599         Else
1600             _curList.ChangeItemBackColor(Item.Index, JudgeColor(_post, tPost))
1601         End If
1602     End Sub
1603
1604     Private Function JudgeColor(ByVal BasePost As PostClass, ByVal TargetPost As PostClass) As Color
1605         Dim cl As Color
1606         If TargetPost.Id = BasePost.InReplyToId Then
1607             '@先
1608             cl = _clAtTo
1609         ElseIf TargetPost.IsMe Then
1610             '自分=発言者
1611             cl = _clSelf
1612         ElseIf TargetPost.IsReply Then
1613             '自分宛返信
1614             cl = _clAtSelf
1615         ElseIf BasePost.ReplyToList.Contains(TargetPost.Name.ToLower()) Then
1616             '返信先
1617             cl = _clAtFromTarget
1618         ElseIf TargetPost.ReplyToList.Contains(BasePost.Name.ToLower()) Then
1619             'その人への返信
1620             cl = _clAtTarget
1621         ElseIf TargetPost.Name.Equals(BasePost.Name, StringComparison.OrdinalIgnoreCase) Then
1622             '発言者
1623             cl = _clTarget
1624         Else
1625             'その他
1626             cl = _clListBackcolor
1627         End If
1628         Return cl
1629     End Function
1630
1631     Private Sub PostButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PostButton.Click
1632         If StatusText.Text.Trim.Length = 0 Then
1633             If Not ImageSelectionPanel.Enabled Then
1634                 DoRefresh()
1635                 Exit Sub
1636             End If
1637         End If
1638
1639         If _curPost IsNot Nothing AndAlso StatusText.Text.Trim() = String.Format("RT @{0}: {1}", _curPost.Name, _curPost.Data) Then
1640             Dim rtResult As DialogResult = MessageBox.Show(String.Format(My.Resources.PostButton_Click1, Environment.NewLine),
1641                                                            "Retweet",
1642                                                            MessageBoxButtons.YesNoCancel,
1643                                                            MessageBoxIcon.Question)
1644             Select Case rtResult
1645                 Case Windows.Forms.DialogResult.Yes
1646                     doReTweetOfficial(False)
1647                     StatusText.Text = ""
1648                     Exit Sub
1649                 Case Windows.Forms.DialogResult.Cancel
1650                     Exit Sub
1651             End Select
1652         End If
1653
1654         _history(_history.Count - 1) = New PostingStatus(StatusText.Text.Trim, _reply_to_id, _reply_to_name)
1655
1656         If SettingDialog.UrlConvertAuto Then
1657             StatusText.SelectionStart = StatusText.Text.Length
1658             UrlConvertAutoToolStripMenuItem_Click(Nothing, Nothing)
1659         ElseIf SettingDialog.Nicoms Then
1660             StatusText.SelectionStart = StatusText.Text.Length
1661             UrlConvert(UrlConverter.Nicoms)
1662         End If
1663         StatusText.SelectionStart = StatusText.Text.Length
1664         Dim args As New GetWorkerArg()
1665         args.page = 0
1666         args.endPage = 0
1667         args.type = WORKERTYPE.PostMessage
1668         CheckReplyTo(StatusText.Text)
1669
1670         '整形によって増加する文字数を取得
1671         Dim adjustCount As Integer = 0
1672         Dim tmpStatus As String = StatusText.Text.Trim
1673         If ToolStripMenuItemApiCommandEvasion.Checked Then
1674             ' APIコマンド回避
1675             If Regex.IsMatch(tmpStatus, _
1676                 "^[+\-\[\]\s\\.,*/(){}^~|='&%$#""<>?]*(get|g|fav|follow|f|on|off|stop|quit|leave|l|whois|w|nudge|n|stats|invite|track|untrack|tracks|tracking|\*)([+\-\[\]\s\\.,*/(){}^~|='&%$#""<>?]+|$)", _
1677                 RegexOptions.IgnoreCase) _
1678                AndAlso tmpStatus.EndsWith(" .") = False Then adjustCount += 2
1679         End If
1680
1681         If ToolStripMenuItemUrlMultibyteSplit.Checked Then
1682             ' URLと全角文字の切り離し
1683             adjustCount += Regex.Matches(tmpStatus, "https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#^]+").Count
1684         End If
1685
1686         Dim isCutOff As Boolean = False
1687         Dim isRemoveFooter As Boolean = My.Computer.Keyboard.ShiftKeyDown
1688         If StatusText.Multiline AndAlso Not SettingDialog.PostCtrlEnter Then
1689             '複数行でEnter投稿の場合、Ctrlも押されていたらフッタ付加しない
1690             isRemoveFooter = My.Computer.Keyboard.CtrlKeyDown
1691         End If
1692         If SettingDialog.PostShiftEnter Then
1693             isRemoveFooter = My.Computer.Keyboard.CtrlKeyDown
1694         End If
1695         If Not isRemoveFooter AndAlso (StatusText.Text.Contains("RT @") OrElse StatusText.Text.Contains("QT @")) Then
1696             isRemoveFooter = True
1697         End If
1698         If GetRestStatusCount(False, Not isRemoveFooter) - adjustCount < 0 Then
1699             If MessageBox.Show(My.Resources.PostLengthOverMessage1, My.Resources.PostLengthOverMessage2, MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.OK Then
1700                 isCutOff = True
1701                 If Not SettingDialog.UrlConvertAuto Then UrlConvertAutoToolStripMenuItem_Click(Nothing, Nothing)
1702                 If GetRestStatusCount(False, Not isRemoveFooter) - adjustCount < 0 Then
1703                     isRemoveFooter = True
1704                 End If
1705             Else
1706                 Exit Sub
1707             End If
1708         End If
1709
1710         Dim footer As String = ""
1711         Dim header As String = ""
1712         If StatusText.Text.StartsWith("D ") OrElse StatusText.Text.StartsWith("d ") Then
1713             'DM時は何もつけない
1714             footer = ""
1715         Else
1716             'ハッシュタグ
1717             If HashMgr.UseHash <> "" Then
1718                 If HashMgr.IsHead Then
1719                     header = HashMgr.UseHash + " "
1720                 Else
1721                     footer = " " + HashMgr.UseHash
1722                 End If
1723             End If
1724             If Not isRemoveFooter Then
1725                 If SettingDialog.UseRecommendStatus Then
1726                     ' 推奨ステータスを使用する
1727                     footer += SettingDialog.RecommendStatusText
1728                 Else
1729                     ' テキストボックスに入力されている文字列を使用する
1730                     footer += " " + SettingDialog.Status.Trim
1731                 End If
1732             End If
1733         End If
1734         args.status.status = header + StatusText.Text.Trim + footer
1735
1736         If ToolStripMenuItemApiCommandEvasion.Checked Then
1737             ' APIコマンド回避
1738             If Regex.IsMatch(args.status.status, _
1739                 "^[+\-\[\]\s\\.,*/(){}^~|='&%$#""<>?]*(get|g|fav|follow|f|on|off|stop|quit|leave|l|whois|w|nudge|n|stats|invite|track|untrack|tracks|tracking|\*)([+\-\[\]\s\\.,*/(){}^~|='&%$#""<>?]+|$)", _
1740                 RegexOptions.IgnoreCase) _
1741                AndAlso args.status.status.EndsWith(" .") = False Then args.status.status += " ."
1742         End If
1743
1744         If ToolStripMenuItemUrlMultibyteSplit.Checked Then
1745             ' URLと全角文字の切り離し
1746             Dim mc2 As Match = Regex.Match(args.status.status, "https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#^]+")
1747             If mc2.Success Then args.status.status = Regex.Replace(args.status.status, "https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#^]+", "$& ")
1748         End If
1749
1750         If IdeographicSpaceToSpaceToolStripMenuItem.Checked Then
1751             ' 文中の全角スペースを半角スペース1個にする
1752             args.status.status = args.status.status.Replace(" ", " ")
1753         End If
1754
1755         If isCutOff AndAlso args.status.status.Length > 140 Then
1756             args.status.status = args.status.status.Substring(0, 140)
1757             Dim AtId As String = "(@|@)[a-z0-9_/]+$"
1758             Dim HashTag As String = "(^|[^0-9A-Z&\/\?]+)(#|#)([0-9A-Z_]*[A-Z_]+)$"
1759             Dim Url As String = "https?:\/\/[a-z0-9!\*'\(\);:&=\+\$\/%#\[\]\-_\.,~?]+$" '簡易判定
1760             Dim pattern As String = String.Format("({0})|({1})|({2})", AtId, HashTag, Url)
1761             Dim mc As Match = Regex.Match(args.status.status, pattern, RegexOptions.IgnoreCase)
1762             If mc.Success Then
1763                 'さらに@ID、ハッシュタグ、URLと推測される文字列をカットする
1764                 args.status.status = args.status.status.Substring(0, 140 - mc.Value.Length)
1765             End If
1766             If MessageBox.Show(args.status.status, "Post or Cancel?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then Exit Sub
1767         End If
1768
1769         args.status.inReplyToId = _reply_to_id
1770         args.status.inReplyToName = _reply_to_name
1771         If ImageSelectionPanel.Visible Then
1772             '画像投稿
1773             If ImageSelectedPicture.Image IsNot ImageSelectedPicture.InitialImage AndAlso _
1774                 ImageServiceCombo.SelectedIndex > -1 AndAlso _
1775                 ImagefilePathText.Text <> "" Then
1776                 If MessageBox.Show(My.Resources.PostPictureConfirm1, _
1777                                    My.Resources.PostPictureConfirm2, _
1778                                    MessageBoxButtons.OKCancel, _
1779                                    MessageBoxIcon.Question, _
1780                                    MessageBoxDefaultButton.Button1) _
1781                                = Windows.Forms.DialogResult.Cancel Then
1782                     TimelinePanel.Visible = True
1783                     TimelinePanel.Enabled = True
1784                     ImageSelectionPanel.Visible = False
1785                     ImageSelectionPanel.Enabled = False
1786                     If _curList IsNot Nothing Then
1787                         _curList.Focus()
1788                     End If
1789                     Exit Sub
1790                 End If
1791                 args.status.imageService = ImageServiceCombo.Text
1792                 args.status.imagePath = ImagefilePathText.Text
1793                 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
1794                 ImagefilePathText.Text = ""
1795                 TimelinePanel.Visible = True
1796                 TimelinePanel.Enabled = True
1797                 ImageSelectionPanel.Visible = False
1798                 ImageSelectionPanel.Enabled = False
1799                 If _curList IsNot Nothing Then
1800                     _curList.Focus()
1801                 End If
1802             Else
1803                 MessageBox.Show(My.Resources.PostPictureWarn1, My.Resources.PostPictureWarn2)
1804                 Exit Sub
1805             End If
1806         End If
1807
1808         RunAsync(args)
1809
1810         'Google検索(試験実装)
1811         If StatusText.Text.StartsWith("Google:", StringComparison.OrdinalIgnoreCase) AndAlso StatusText.Text.Trim.Length > 7 Then
1812             Dim tmp As String = String.Format(My.Resources.SearchItem2Url, HttpUtility.UrlEncode(StatusText.Text.Substring(7)))
1813             OpenUriAsync(tmp)
1814         End If
1815
1816         _reply_to_id = 0
1817         _reply_to_name = ""
1818         StatusText.Text = ""
1819         _history.Add(New PostingStatus)
1820         _hisIdx = _history.Count - 1
1821         If Not ToolStripFocusLockMenuItem.Checked Then
1822             DirectCast(ListTab.SelectedTab.Tag, Control).Focus()
1823         End If
1824         urlUndoBuffer = Nothing
1825         UrlUndoToolStripMenuItem.Enabled = False  'Undoをできないように設定
1826     End Sub
1827
1828     Private Sub EndToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EndToolStripMenuItem.Click, EndFileMenuItem.Click
1829         _endingFlag = True
1830         Me.Close()
1831     End Sub
1832
1833     Private Sub Tween_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
1834         If Not SettingDialog.CloseToExit AndAlso e.CloseReason = CloseReason.UserClosing AndAlso _endingFlag = False Then
1835             '_endingFlag=False:フォームの×ボタン
1836             e.Cancel = True
1837             Me.Visible = False
1838         Else
1839             _hookGlobalHotkey.UnregisterAllOriginalHotkey()
1840             _ignoreConfigSave = True
1841             _endingFlag = True
1842             TimerTimeline.Enabled = False
1843             TimerRefreshIcon.Enabled = False
1844         End If
1845     End Sub
1846
1847     Private Sub NotifyIcon1_BalloonTipClicked(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NotifyIcon1.BalloonTipClicked
1848         Me.Visible = True
1849         If Me.WindowState = FormWindowState.Minimized Then
1850             Me.WindowState = FormWindowState.Normal
1851         End If
1852         Me.Activate()
1853     End Sub
1854
1855     Private Shared Function CheckAccountValid() As Boolean
1856         Static errorCount As Integer = 0
1857         If Twitter.AccountState <> ACCOUNT_STATE.Valid Then
1858             errorCount += 1
1859             If errorCount > 5 Then
1860                 errorCount = 0
1861                 Twitter.AccountState = ACCOUNT_STATE.Valid
1862                 Return True
1863             End If
1864             Return False
1865         End If
1866         errorCount = 0
1867         Return True
1868     End Function
1869
1870     Private Sub GetTimelineWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
1871         Dim bw As BackgroundWorker = DirectCast(sender, BackgroundWorker)
1872         If bw.CancellationPending OrElse _endingFlag Then
1873             e.Cancel = True
1874             Exit Sub
1875         End If
1876
1877         Threading.Thread.CurrentThread.Priority = Threading.ThreadPriority.BelowNormal
1878
1879         My.Application.InitCulture()
1880
1881         Dim ret As String = ""
1882         Dim rslt As New GetWorkerResult()
1883
1884         Dim read As Boolean = Not SettingDialog.UnreadManage
1885         If _initial AndAlso SettingDialog.UnreadManage Then read = SettingDialog.Readed
1886
1887         Dim args As GetWorkerArg = DirectCast(e.Argument, GetWorkerArg)
1888
1889         If Not CheckAccountValid() Then
1890             rslt.retMsg = "Auth error. Check your account"
1891             rslt.type = WORKERTYPE.ErrorState  'エラー表示のみ行ない、後処理キャンセル
1892             rslt.tName = args.tName
1893             e.Result = rslt
1894             Exit Sub
1895         End If
1896
1897         If args.type <> WORKERTYPE.OpenUri Then bw.ReportProgress(0, "") 'Notifyアイコンアニメーション開始
1898         Select Case args.type
1899             Case WORKERTYPE.Timeline, WORKERTYPE.Reply
1900                 bw.ReportProgress(50, MakeStatusMessage(args, False))
1901                 ret = tw.GetTimelineApi(read, args.type, args.page = -1, _initial)
1902                 '新着時未読クリア
1903                 If ret = "" AndAlso args.type = WORKERTYPE.Timeline AndAlso SettingDialog.ReadOldPosts Then
1904                     _statuses.SetRead()
1905                 End If
1906                 '振り分け
1907                 rslt.addCount = _statuses.DistributePosts()
1908             Case WORKERTYPE.DirectMessegeRcv    '送信分もまとめて取得
1909                 bw.ReportProgress(50, MakeStatusMessage(args, False))
1910                 ret = tw.GetDirectMessageApi(read, WORKERTYPE.DirectMessegeRcv, args.page = -1)
1911                 If ret = "" Then ret = tw.GetDirectMessageApi(read, WORKERTYPE.DirectMessegeSnt, args.page = -1)
1912                 rslt.addCount = _statuses.DistributePosts()
1913             Case WORKERTYPE.FavAdd
1914                 'スレッド処理はしない
1915                 If _statuses.Tabs.ContainsKey(args.tName) Then
1916                     Dim tbc As TabClass = _statuses.Tabs(args.tName)
1917                     For i As Integer = 0 To args.ids.Count - 1
1918                         Dim post As PostClass = Nothing
1919                         If tbc.TabType = TabUsageType.Lists OrElse tbc.TabType = TabUsageType.PublicSearch Then
1920                             post = tbc.Posts(args.ids(i))
1921                         Else
1922                             post = _statuses.Item(args.ids(i))
1923                         End If
1924                         args.page = i + 1
1925                         bw.ReportProgress(50, MakeStatusMessage(args, False))
1926                         If Not post.IsFav Then
1927                             If post.RetweetedId = 0 Then
1928                                 ret = tw.PostFavAdd(post.Id)
1929                             Else
1930                                 ret = tw.PostFavAdd(post.RetweetedId)
1931                             End If
1932                             If ret.Length = 0 Then
1933                                 args.sIds.Add(post.Id)
1934                                 post.IsFav = True    'リスト再描画必要
1935                                 _favTimestamps.Add(Now)
1936                                 If post.RelTabName = "" Then
1937                                     '検索,リストタブからのfavは、favタブへ追加せず。それ以外は追加
1938                                     _statuses.GetTabByType(TabUsageType.Favorites).Add(post.Id, post.IsRead, False)
1939                                 Else
1940                                     '検索・リストタブからのfavで、TLでも取得済みならfav反映
1941                                     If _statuses.ContainsKey(post.Id) Then
1942                                         Dim postTl As PostClass = _statuses.Item(post.Id)
1943                                         postTl.IsFav = True
1944                                         _statuses.GetTabByType(TabUsageType.Favorites).Add(postTl.Id, postTl.IsRead, False)
1945                                     End If
1946                                 End If
1947                                 '検索、リストタブに反映
1948                                 For Each tb As TabClass In _statuses.GetTabsByType(TabUsageType.PublicSearch Or TabUsageType.Lists)
1949                                     If tb.Contains(post.Id) Then tb.Posts(post.Id).IsFav = True
1950                                 Next
1951                             End If
1952                         End If
1953                     Next
1954                 End If
1955                 rslt.sIds = args.sIds
1956             Case WORKERTYPE.FavRemove
1957                 'スレッド処理はしない
1958                 If _statuses.Tabs.ContainsKey(args.tName) Then
1959                     Dim tbc As TabClass = _statuses.Tabs(args.tName)
1960                     For i As Integer = 0 To args.ids.Count - 1
1961                         Dim post As PostClass = Nothing
1962                         If tbc.TabType = TabUsageType.Lists OrElse tbc.TabType = TabUsageType.PublicSearch Then
1963                             post = tbc.Posts(args.ids(i))
1964                         Else
1965                             post = _statuses.Item(args.ids(i))
1966                         End If
1967                         args.page = i + 1
1968                         bw.ReportProgress(50, MakeStatusMessage(args, False))
1969                         If post.IsFav Then
1970                             If post.RetweetedId = 0 Then
1971                                 ret = tw.PostFavRemove(post.Id)
1972                             Else
1973                                 ret = tw.PostFavRemove(post.RetweetedId)
1974                             End If
1975                             If ret.Length = 0 Then
1976                                 args.sIds.Add(post.Id)
1977                                 post.IsFav = False    'リスト再描画必要
1978                                 If _statuses.ContainsKey(post.Id) Then _statuses.Item(post.Id).IsFav = False
1979                                 '検索,リストタブに反映
1980                                 For Each tb As TabClass In _statuses.GetTabsByType(TabUsageType.PublicSearch Or TabUsageType.Lists)
1981                                     If tb.Contains(post.Id) Then tb.Posts(post.Id).IsFav = False
1982                                 Next
1983                             End If
1984                         End If
1985                     Next
1986                 End If
1987                 rslt.sIds = args.sIds
1988             Case WORKERTYPE.PostMessage
1989                 bw.ReportProgress(200)
1990                 If String.IsNullOrEmpty(args.status.imagePath) Then
1991                     For i As Integer = 0 To 1
1992                         ret = tw.PostStatus(args.status.status, args.status.inReplyToId)
1993                         If ret = "" OrElse _
1994                            ret.StartsWith("OK:") OrElse _
1995                            ret.StartsWith("Outputz:") OrElse _
1996                            ret.StartsWith("Warn:") OrElse _
1997                            ret = "Err:Status is a duplicate." OrElse _
1998                            args.status.status.StartsWith("D", StringComparison.OrdinalIgnoreCase) OrElse _
1999                            args.status.status.StartsWith("DM", StringComparison.OrdinalIgnoreCase) Then
2000                             Exit For
2001                         End If
2002                     Next
2003                 Else
2004                     Dim picSvc As New PictureService(tw)
2005                     If String.IsNullOrEmpty(args.status.status) Then args.status.status = ""
2006                     ret = picSvc.Upload(args.status.imagePath, args.status.status, args.status.imageService)
2007                 End If
2008                 bw.ReportProgress(300)
2009                 rslt.status = args.status
2010             Case WORKERTYPE.Retweet
2011                 bw.ReportProgress(200)
2012                 For i As Integer = 0 To args.ids.Count - 1
2013                     ret = tw.PostRetweet(args.ids(i), read)
2014                 Next
2015                 bw.ReportProgress(300)
2016             Case WORKERTYPE.Follower
2017                 bw.ReportProgress(50, My.Resources.UpdateFollowersMenuItem1_ClickText1)
2018                 ret = tw.GetFollowersApi()
2019             Case WORKERTYPE.OpenUri
2020                 Dim myPath As String = Convert.ToString(args.url)
2021
2022                 Try
2023                     If SettingDialog.BrowserPath <> "" Then
2024                         If SettingDialog.BrowserPath.StartsWith("""") AndAlso SettingDialog.BrowserPath.Length > 2 AndAlso SettingDialog.BrowserPath.IndexOf("""", 2) > -1 Then
2025                             Dim sep As Integer = SettingDialog.BrowserPath.IndexOf("""", 2)
2026                             Dim browserPath As String = SettingDialog.BrowserPath.Substring(1, sep - 1)
2027                             Dim arg As String = ""
2028                             If sep < SettingDialog.BrowserPath.Length - 1 Then
2029                                 arg = SettingDialog.BrowserPath.Substring(sep + 1)
2030                             End If
2031                             myPath = arg + " " + myPath
2032                             System.Diagnostics.Process.Start(browserPath, myPath)
2033                         Else
2034                             System.Diagnostics.Process.Start(SettingDialog.BrowserPath, myPath)
2035                         End If
2036                     Else
2037                         System.Diagnostics.Process.Start(myPath)
2038                     End If
2039                 Catch ex As Exception
2040                     '                MessageBox.Show("ブラウザの起動に失敗、またはタイムアウトしました。" + ex.ToString())
2041                 End Try
2042             Case WORKERTYPE.Favorites
2043                 bw.ReportProgress(50, MakeStatusMessage(args, False))
2044                 ret = tw.GetFavoritesApi(read, args.type)
2045                 rslt.addCount = _statuses.DistributePosts()
2046             Case WORKERTYPE.PublicSearch
2047                 bw.ReportProgress(50, MakeStatusMessage(args, False))
2048                 If args.tName = "" Then
2049                     For Each tb As TabClass In _statuses.GetTabsByType(TabUsageType.PublicSearch)
2050                         If tb.SearchWords <> "" Then ret = tw.GetSearch(read, tb, False)
2051                     Next
2052                 Else
2053                     Dim tb As TabClass = _statuses.GetTabByName(args.tName)
2054                     If tb IsNot Nothing Then
2055                         ret = tw.GetSearch(read, tb, False)
2056                         If ret = "" AndAlso args.page = -1 Then
2057                             ret = tw.GetSearch(read, tb, True)
2058                         End If
2059                     End If
2060                 End If
2061                 '振り分け
2062                 rslt.addCount = _statuses.DistributePosts()
2063             Case WORKERTYPE.List
2064                 bw.ReportProgress(50, MakeStatusMessage(args, False))
2065                 If args.tName = "" Then
2066                     '定期更新
2067                     For Each tb As TabClass In _statuses.GetTabsByType(TabUsageType.Lists)
2068                         If tb.ListInfo IsNot Nothing AndAlso tb.ListInfo.Id <> 0 Then ret = tw.GetListStatus(read, tb, False, _initial)
2069                     Next
2070                 Else
2071                     '手動更新(特定タブのみ更新)
2072                     Dim tb As TabClass = _statuses.GetTabByName(args.tName)
2073                     If tb IsNot Nothing Then
2074                         ret = tw.GetListStatus(read, tb, args.page = -1, _initial)
2075                     End If
2076                 End If
2077                 '振り分け
2078                 rslt.addCount = _statuses.DistributePosts()
2079             Case WORKERTYPE.Related
2080                 bw.ReportProgress(50, MakeStatusMessage(args, False))
2081                 Dim tb As TabClass = _statuses.GetTabByName(args.tName)
2082                 ret = tw.GetRelatedResultsApi(read, tb)
2083                 rslt.addCount = _statuses.DistributePosts()
2084         End Select
2085         'キャンセル要求
2086         If bw.CancellationPending Then
2087             e.Cancel = True
2088             Exit Sub
2089         End If
2090
2091         '時速表示用
2092         If args.type = WORKERTYPE.FavAdd Then
2093             Dim oneHour As Date = Now.Subtract(New TimeSpan(1, 0, 0))
2094             For i As Integer = _favTimestamps.Count - 1 To 0 Step -1
2095                 If _favTimestamps(i).CompareTo(oneHour) < 0 Then
2096                     _favTimestamps.RemoveAt(i)
2097                 End If
2098             Next
2099         End If
2100         If args.type = WORKERTYPE.Timeline AndAlso Not _initial Then
2101             SyncLock _syncObject
2102                 Dim tm As Date = Now
2103                 If _tlTimestamps.ContainsKey(tm) Then
2104                     _tlTimestamps(tm) += rslt.addCount
2105                 Else
2106                     _tlTimestamps.Add(Now, rslt.addCount)
2107                 End If
2108                 Dim oneHour As Date = Now.Subtract(New TimeSpan(1, 0, 0))
2109                 Dim keys As New List(Of Date)
2110                 _tlCount = 0
2111                 For Each key As Date In _tlTimestamps.Keys
2112                     If key.CompareTo(oneHour) < 0 Then
2113                         keys.Add(key)
2114                     Else
2115                         _tlCount += _tlTimestamps(key)
2116                     End If
2117                 Next
2118                 For Each key As Date In keys
2119                     _tlTimestamps.Remove(key)
2120                 Next
2121                 keys.Clear()
2122             End SyncLock
2123         End If
2124
2125         '終了ステータス
2126         If args.type <> WORKERTYPE.OpenUri Then bw.ReportProgress(100, MakeStatusMessage(args, True)) 'ステータス書き換え、Notifyアイコンアニメーション開始
2127
2128         rslt.retMsg = ret
2129         rslt.type = args.type
2130         rslt.tName = args.tName
2131         If args.type = WORKERTYPE.DirectMessegeRcv OrElse _
2132            args.type = WORKERTYPE.DirectMessegeSnt OrElse _
2133            args.type = WORKERTYPE.Reply OrElse _
2134            args.type = WORKERTYPE.Timeline OrElse _
2135            args.type = WORKERTYPE.Favorites Then
2136             rslt.page = args.page - 1   '値が正しいか後でチェック。10ページ毎の継続確認
2137         End If
2138
2139         e.Result = rslt
2140     End Sub
2141
2142     Private Function MakeStatusMessage(ByVal AsyncArg As GetWorkerArg, ByVal Finish As Boolean) As String
2143         Dim smsg As String = ""
2144         If Not Finish Then
2145             '継続中メッセージ
2146             Select Case AsyncArg.type
2147                 Case WORKERTYPE.Timeline
2148                     smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText5 + AsyncArg.page.ToString() + My.Resources.GetTimelineWorker_RunWorkerCompletedText6
2149                 Case WORKERTYPE.Reply
2150                     smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText4 + AsyncArg.page.ToString() + My.Resources.GetTimelineWorker_RunWorkerCompletedText6
2151                 Case WORKERTYPE.DirectMessegeRcv
2152                     smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText8 + AsyncArg.page.ToString() + My.Resources.GetTimelineWorker_RunWorkerCompletedText6
2153                 Case WORKERTYPE.FavAdd
2154                     smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText15 + AsyncArg.page.ToString() + "/" + AsyncArg.ids.Count.ToString() + _
2155                                         My.Resources.GetTimelineWorker_RunWorkerCompletedText16 + (AsyncArg.page - AsyncArg.sIds.Count - 1).ToString()
2156                 Case WORKERTYPE.FavRemove
2157                     smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText17 + AsyncArg.page.ToString() + "/" + AsyncArg.ids.Count.ToString() + _
2158                                         My.Resources.GetTimelineWorker_RunWorkerCompletedText18 + (AsyncArg.page - AsyncArg.sIds.Count - 1).ToString()
2159                 Case WORKERTYPE.Favorites
2160                     smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText19
2161                 Case WORKERTYPE.PublicSearch
2162                     smsg = "Search refreshing..."
2163                 Case WORKERTYPE.List
2164                     smsg = "List refreshing..."
2165                 Case WORKERTYPE.Related
2166                     smsg = "Related refreshing..."
2167             End Select
2168         Else
2169             '完了メッセージ
2170             Select Case AsyncArg.type
2171                 Case WORKERTYPE.Timeline
2172                     smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText1
2173                 Case WORKERTYPE.Reply
2174                     smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText9
2175                 Case WORKERTYPE.DirectMessegeRcv
2176                     smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText11
2177                 Case WORKERTYPE.DirectMessegeSnt
2178                     smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText13
2179                 Case WORKERTYPE.FavAdd
2180                     '進捗メッセージ残す
2181                 Case WORKERTYPE.FavRemove
2182                     '進捗メッセージ残す
2183                 Case WORKERTYPE.Favorites
2184                     smsg = My.Resources.GetTimelineWorker_RunWorkerCompletedText20
2185                 Case WORKERTYPE.Follower
2186                     smsg = My.Resources.UpdateFollowersMenuItem1_ClickText3
2187                 Case WORKERTYPE.PublicSearch
2188                     smsg = "Search refreshed"
2189                 Case WORKERTYPE.List
2190                     smsg = "List refreshed"
2191                 Case WORKERTYPE.Related
2192                     smsg = "Related refreshed"
2193             End Select
2194         End If
2195         Return smsg
2196     End Function
2197
2198     Private Sub GetTimelineWorker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs)
2199         If _endingFlag Then Exit Sub
2200         If e.ProgressPercentage > 100 Then
2201             '発言投稿
2202             If e.ProgressPercentage = 200 Then    '開始
2203                 StatusLabel.Text = "Posting..."
2204             End If
2205             If e.ProgressPercentage = 300 Then  '終了
2206                 StatusLabel.Text = My.Resources.PostWorker_RunWorkerCompletedText4
2207             End If
2208         Else
2209             Dim smsg As String = DirectCast(e.UserState, String)
2210             If smsg.Length > 0 Then StatusLabel.Text = smsg
2211         End If
2212     End Sub
2213
2214     Private Sub GetTimelineWorker_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
2215
2216         If _endingFlag OrElse e.Cancelled Then Exit Sub 'キャンセル
2217
2218         If e.Error IsNot Nothing Then
2219             _myStatusError = True
2220             _waitTimeline = False
2221             _waitReply = False
2222             _waitDm = False
2223             _waitFav = False
2224             _waitPubSearch = False
2225             _waitLists = False
2226             Throw New Exception("BackgroundWorker Exception", e.Error)
2227             Exit Sub
2228         End If
2229
2230         Dim rslt As GetWorkerResult = DirectCast(e.Result, GetWorkerResult)
2231
2232         If rslt.type = WORKERTYPE.OpenUri Then Exit Sub
2233
2234         'エラー
2235         If rslt.retMsg.Length > 0 Then
2236             _myStatusError = True
2237             StatusLabel.Text = rslt.retMsg
2238         End If
2239
2240         If rslt.type = WORKERTYPE.ErrorState Then Exit Sub
2241
2242         If rslt.type = WORKERTYPE.FavRemove Then
2243             DispSelectedPost()          ' 詳細画面書き直し
2244             Dim favTabName As String = _statuses.GetTabByType(TabUsageType.Favorites).TabName
2245             Dim fidx As Integer
2246             If _curTab.Text.Equals(favTabName) Then
2247                 If _curList.FocusedItem IsNot Nothing Then
2248                     fidx = _curList.FocusedItem.Index
2249                 ElseIf _curList.TopItem IsNot Nothing Then
2250                     fidx = _curList.TopItem.Index
2251                 Else
2252                     fidx = 0
2253                 End If
2254             End If
2255
2256             For Each i As Long In rslt.sIds
2257                 _statuses.RemoveFavPost(i)
2258             Next
2259             If _curTab IsNot Nothing AndAlso _curTab.Text.Equals(favTabName) Then
2260                 _itemCache = Nothing    'キャッシュ破棄
2261                 _postCache = Nothing
2262                 _curPost = Nothing
2263                 '_curItemIndex = -1
2264             End If
2265             For Each tp As TabPage In ListTab.TabPages
2266                 If tp.Text = favTabName Then
2267                     DirectCast(tp.Tag, DetailsListView).VirtualListSize = _statuses.Tabs(favTabName).AllCount
2268                     Exit For
2269                 End If
2270             Next
2271             If _curTab.Text.Equals(favTabName) Then
2272                 _curList.SelectedIndices.Clear()
2273                 If _statuses.Tabs(favTabName).AllCount > 0 Then
2274                     If _statuses.Tabs(favTabName).AllCount - 1 > fidx AndAlso fidx > -1 Then
2275                         _curList.SelectedIndices.Add(fidx)
2276                     Else
2277                         _curList.SelectedIndices.Add(_statuses.Tabs(favTabName).AllCount - 1)
2278                     End If
2279                     If _curList.SelectedIndices.Count > 0 Then
2280                         _curList.EnsureVisible(_curList.SelectedIndices(0))
2281                         _curList.FocusedItem = _curList.Items(_curList.SelectedIndices(0))
2282                     End If
2283                 End If
2284             End If
2285         End If
2286
2287         'リストに反映
2288         'Dim busy As Boolean = False
2289         'For Each bw As BackgroundWorker In _bw
2290         '    If bw IsNot Nothing AndAlso bw.IsBusy Then
2291         '        busy = True
2292         '        Exit For
2293         '    End If
2294         'Next
2295         'If Not busy Then RefreshTimeline() 'background処理なければ、リスト反映
2296         If rslt.type = WORKERTYPE.Timeline OrElse _
2297            rslt.type = WORKERTYPE.Reply OrElse _
2298            rslt.type = WORKERTYPE.List OrElse _
2299            rslt.type = WORKERTYPE.PublicSearch OrElse _
2300            rslt.type = WORKERTYPE.DirectMessegeRcv OrElse _
2301            rslt.type = WORKERTYPE.DirectMessegeSnt OrElse _
2302            rslt.type = WORKERTYPE.Favorites OrElse _
2303            rslt.type = WORKERTYPE.Follower OrElse _
2304            rslt.type = WORKERTYPE.FavAdd OrElse _
2305            rslt.type = WORKERTYPE.FavRemove OrElse _
2306            rslt.type = WORKERTYPE.Related Then
2307             RefreshTimeline(False) 'リスト反映
2308         End If
2309
2310         Select Case rslt.type
2311             Case WORKERTYPE.Timeline
2312                 _waitTimeline = False
2313                 If Not _initial Then
2314                     '    'API使用時の取得調整は別途考える(カウント調整?)
2315                 End If
2316             Case WORKERTYPE.Reply
2317                 _waitReply = False
2318                 If rslt.newDM AndAlso Not _initial Then
2319                     GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
2320                 End If
2321             Case WORKERTYPE.Favorites
2322                 _waitFav = False
2323             Case WORKERTYPE.DirectMessegeRcv
2324                 _waitDm = False
2325             Case WORKERTYPE.FavAdd, WORKERTYPE.FavRemove
2326                 If _curList IsNot Nothing AndAlso _curTab IsNot Nothing Then
2327                     _curList.BeginUpdate()
2328                     If rslt.type = WORKERTYPE.FavRemove AndAlso _statuses.Tabs(_curTab.Text).TabType = TabUsageType.Favorites Then
2329                         '色変えは不要
2330                     Else
2331                         For i As Integer = 0 To rslt.sIds.Count - 1
2332                             If _curTab.Text.Equals(rslt.tName) Then
2333                                 Dim idx As Integer = _statuses.Tabs(rslt.tName).IndexOf(rslt.sIds(i))
2334                                 If idx > -1 Then
2335                                     Dim post As PostClass = Nothing
2336                                     Dim tb As TabClass = _statuses.Tabs(rslt.tName)
2337                                     If tb IsNot Nothing Then
2338                                         If tb.TabType = TabUsageType.Lists OrElse tb.TabType = TabUsageType.PublicSearch Then
2339                                             post = tb.Posts(rslt.sIds(i))
2340                                         Else
2341                                             post = _statuses.Item(rslt.sIds(i))
2342                                         End If
2343                                         ChangeCacheStyleRead(post.IsRead, idx, _curTab)
2344                                     End If
2345                                     If idx = _curItemIndex Then DispSelectedPost() '選択アイテム再表示
2346                                 End If
2347                             End If
2348                         Next
2349                     End If
2350                     _curList.EndUpdate()
2351                 End If
2352             Case WORKERTYPE.PostMessage
2353                 If rslt.retMsg = "" OrElse _
2354                     rslt.retMsg.StartsWith("Outputz") OrElse _
2355                     rslt.retMsg.StartsWith("OK:") OrElse _
2356                     rslt.retMsg = "Warn:Status is a duplicate." Then
2357                     _postTimestamps.Add(Now)
2358                     Dim oneHour As Date = Now.Subtract(New TimeSpan(1, 0, 0))
2359                     For i As Integer = _postTimestamps.Count - 1 To 0 Step -1
2360                         If _postTimestamps(i).CompareTo(oneHour) < 0 Then
2361                             _postTimestamps.RemoveAt(i)
2362                         End If
2363                     Next
2364
2365                     If Not HashMgr.IsPermanent AndAlso HashMgr.UseHash <> "" Then
2366                         HashMgr.ClearHashtag()
2367                         Me.HashStripSplitButton.Text = "#[-]"
2368                         Me.HashToggleMenuItem.Checked = False
2369                         Me.HashToggleToolStripMenuItem.Checked = False
2370                     End If
2371                     SetMainWindowTitle()
2372                     rslt.retMsg = ""
2373                 Else
2374                     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
2375                         Dim args As New GetWorkerArg()
2376                         args.page = 0
2377                         args.endPage = 0
2378                         args.type = WORKERTYPE.PostMessage
2379                         args.status = rslt.status
2380                         RunAsync(args)
2381                     Else
2382                         If ToolStripFocusLockMenuItem.Checked Then
2383                             '連投モードのときだけEnterイベントが起きないので強制的に背景色を戻す
2384                             StatusText_Enter(StatusText, New EventArgs)
2385                         End If
2386                     End If
2387                 End If
2388                 If rslt.retMsg.Length = 0 AndAlso SettingDialog.PostAndGet Then GetTimeline(WORKERTYPE.Timeline, 1, 0, "")
2389             Case WORKERTYPE.Retweet
2390                 If rslt.retMsg.Length = 0 Then
2391                     _postTimestamps.Add(Now)
2392                     Dim oneHour As Date = Now.Subtract(New TimeSpan(1, 0, 0))
2393                     For i As Integer = _postTimestamps.Count - 1 To 0 Step -1
2394                         If _postTimestamps(i).CompareTo(oneHour) < 0 Then
2395                             _postTimestamps.RemoveAt(i)
2396                         End If
2397                     Next
2398                     If SettingDialog.PostAndGet Then GetTimeline(WORKERTYPE.Timeline, 1, 0, "")
2399                 End If
2400             Case WORKERTYPE.Follower
2401                 '_waitFollower = False
2402                 _itemCache = Nothing
2403                 _postCache = Nothing
2404                 If _curList IsNot Nothing Then _curList.Refresh()
2405             Case WORKERTYPE.PublicSearch
2406                 _waitPubSearch = False
2407             Case WORKERTYPE.List
2408                 _waitLists = False
2409         End Select
2410
2411     End Sub
2412
2413     Private Sub GetTimeline(ByVal WkType As WORKERTYPE, ByVal fromPage As Integer, ByVal toPage As Integer, ByVal tabName As String)
2414
2415         If Not IsNetworkAvailable() Then Exit Sub
2416
2417         '非同期実行引数設定
2418         Dim args As New GetWorkerArg
2419         args.page = fromPage
2420         args.endPage = toPage
2421         args.type = WkType
2422         args.tName = tabName
2423
2424         Static lastTime As New Dictionary(Of WORKERTYPE, DateTime)
2425         If Not lastTime.ContainsKey(WkType) Then lastTime.Add(WkType, New DateTime)
2426         Dim period As Double = Now.Subtract(lastTime(WkType)).TotalSeconds
2427         If period > 1 OrElse period < -1 Then
2428             lastTime(WkType) = Now
2429             RunAsync(args)
2430         End If
2431
2432         'Timeline取得モードの場合はReplyも同時に取得
2433         'If Not SettingDialog.UseAPI AndAlso _
2434         '   Not _initial AndAlso _
2435         '   WkType = WORKERTYPE.Timeline AndAlso _
2436         '   SettingDialog.CheckReply Then
2437         '    'TimerReply.Enabled = False
2438         '    _mentionCounter = SettingDialog.ReplyPeriodInt
2439         '    Dim _args As New GetWorkerArg
2440         '    _args.page = fromPage
2441         '    _args.endPage = toPage
2442         '    _args.type = WORKERTYPE.Reply
2443         '    RunAsync(_args)
2444         'End If
2445     End Sub
2446
2447     Private Sub NotifyIcon1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseClick
2448         If e.Button = Windows.Forms.MouseButtons.Left Then
2449             Me.Visible = True
2450             If Me.WindowState = FormWindowState.Minimized Then
2451                 Me.WindowState = FormWindowState.Normal
2452             End If
2453             Me.Activate()
2454         End If
2455     End Sub
2456
2457     Private Sub MyList_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
2458         MakeReplyOrDirectStatus()
2459     End Sub
2460
2461     Private Sub FavAddToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FavAddToolStripMenuItem.Click, FavOpMenuItem.Click
2462         FavoriteChange(True)
2463     End Sub
2464
2465     Private Sub FavRemoveToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FavRemoveToolStripMenuItem.Click, UnFavOpMenuItem.Click
2466         FavoriteChange(False)
2467     End Sub
2468
2469
2470     Private Sub FavoriteRetweetMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FavoriteRetweetMenuItem.Click, FavoriteRetweetContextMenu.Click
2471         FavoritesRetweetOriginal()
2472     End Sub
2473
2474     Private Sub FavoriteRetweetUnofficialMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FavoriteRetweetUnofficialMenuItem.Click, FavoriteRetweetUnofficialContextMenu.Click
2475         FavoritesRetweetUnofficial()
2476     End Sub
2477
2478     Private Sub FavoriteChange(ByVal FavAdd As Boolean, Optional ByVal multiFavoriteChangeDialogEnable As Boolean = True)
2479         'TrueでFavAdd,FalseでFavRemove
2480         If _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage OrElse _curList.SelectedIndices.Count = 0 Then Exit Sub
2481
2482         '複数fav確認msg
2483         If _curList.SelectedIndices.Count > 250 AndAlso FavAdd Then
2484             MessageBox.Show(My.Resources.FavoriteLimitCountText)
2485             _DoFavRetweetFlags = False
2486             Exit Sub
2487         ElseIf multiFavoriteChangeDialogEnable AndAlso _curList.SelectedIndices.Count > 1 Then
2488             If FavAdd Then
2489                 Dim QuestionText As String = My.Resources.FavAddToolStripMenuItem_ClickText1
2490                 If _DoFavRetweetFlags Then QuestionText = My.Resources.FavoriteRetweetQuestionText3
2491                 If MessageBox.Show(QuestionText, My.Resources.FavAddToolStripMenuItem_ClickText2, _
2492                                    MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then
2493                     _DoFavRetweetFlags = False
2494                     Exit Sub
2495                 End If
2496             Else
2497                 If MessageBox.Show(My.Resources.FavRemoveToolStripMenuItem_ClickText1, My.Resources.FavRemoveToolStripMenuItem_ClickText2, _
2498                                 MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then
2499                     Exit Sub
2500                 End If
2501             End If
2502         End If
2503
2504         Dim args As New GetWorkerArg
2505         args.ids = New List(Of Long)
2506         args.sIds = New List(Of Long)
2507         args.tName = _curTab.Text
2508         If FavAdd Then
2509             args.type = WORKERTYPE.FavAdd
2510         Else
2511             args.type = WORKERTYPE.FavRemove
2512         End If
2513         For Each idx As Integer In _curList.SelectedIndices
2514             Dim post As PostClass = GetCurTabPost(idx)
2515             If FavAdd Then
2516                 If Not post.IsFav Then args.ids.Add(post.Id)
2517             Else
2518                 If post.IsFav Then args.ids.Add(post.Id)
2519             End If
2520         Next
2521         If args.ids.Count = 0 Then
2522             If FavAdd Then
2523                 StatusLabel.Text = My.Resources.FavAddToolStripMenuItem_ClickText4
2524             Else
2525                 StatusLabel.Text = My.Resources.FavRemoveToolStripMenuItem_ClickText4
2526             End If
2527             Exit Sub
2528         End If
2529
2530         RunAsync(args)
2531     End Sub
2532
2533     Private Function GetCurTabPost(ByVal Index As Integer) As PostClass
2534         If _postCache IsNot Nothing AndAlso Index >= _itemCacheIndex AndAlso Index < _itemCacheIndex + _postCache.Length Then
2535             Return _postCache(Index - _itemCacheIndex)
2536         Else
2537             Return _statuses.Item(_curTab.Text, Index)
2538         End If
2539     End Function
2540
2541
2542     Private Sub MoveToHomeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MoveToHomeToolStripMenuItem.Click, OpenHomeOpMenuItem.Click
2543         If _curList.SelectedIndices.Count > 0 Then
2544             OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name)
2545         ElseIf _curList.SelectedIndices.Count = 0 Then
2546             OpenUriAsync("http://twitter.com/")
2547         End If
2548     End Sub
2549
2550     Private Sub MoveToFavToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MoveToFavToolStripMenuItem.Click, OpenFavOpMenuItem.Click
2551         If _curList.SelectedIndices.Count > 0 Then
2552             OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name + "/favorites")
2553         End If
2554     End Sub
2555
2556     Private Sub Tween_ClientSizeChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.ClientSizeChanged
2557         If Me.WindowState <> FormWindowState.Minimized Then
2558             If Not _initialLayout AndAlso Me.Visible = True Then
2559                 If Me.WindowState = FormWindowState.Normal Then
2560                     _mySize = Me.ClientSize
2561                     _mySpDis = Me.SplitContainer1.SplitterDistance
2562                     _mySpDis3 = Me.SplitContainer3.SplitterDistance
2563                     If StatusText.Multiline Then _mySpDis2 = Me.StatusText.Height
2564                     _modifySettingLocal = True
2565                 End If
2566             End If
2567         End If
2568     End Sub
2569
2570     Private Sub MyList_ColumnClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs)
2571         If SettingDialog.SortOrderLock Then Exit Sub
2572         Dim mode As IdComparerClass.ComparerMode
2573         If _iconCol Then
2574             mode = IdComparerClass.ComparerMode.Id
2575         Else
2576             Select Case e.Column
2577                 Case 0, 5, 6    '0:アイコン,5:未読マーク,6:プロテクト・フィルターマーク
2578                     'ソートしない
2579                     Exit Sub
2580                 Case 1  'ニックネーム
2581                     mode = IdComparerClass.ComparerMode.Nickname
2582                 Case 2  '本文
2583                     mode = IdComparerClass.ComparerMode.Data
2584                 Case 3  '時刻=発言Id
2585                     mode = IdComparerClass.ComparerMode.Id
2586                 Case 4  '名前
2587                     mode = IdComparerClass.ComparerMode.Name
2588                 Case 7  'Source
2589                     mode = IdComparerClass.ComparerMode.Source
2590             End Select
2591         End If
2592         _statuses.ToggleSortOrder(mode)
2593         InitColumnText()
2594
2595         If _iconCol Then
2596             DirectCast(sender, DetailsListView).Columns.Item(0).Text = ColumnOrgText(0)
2597             DirectCast(sender, DetailsListView).Columns.Item(1).Text = ColumnText(2)
2598         Else
2599             For i As Integer = 0 To 7
2600                 DirectCast(sender, DetailsListView).Columns.Item(i).Text = ColumnOrgText(i)
2601             Next
2602             DirectCast(sender, DetailsListView).Columns.Item(e.Column).Text = ColumnText(e.Column)
2603         End If
2604
2605         _itemCache = Nothing
2606         _postCache = Nothing
2607
2608         If _statuses.Tabs(_curTab.Text).AllCount > 0 AndAlso _curPost IsNot Nothing Then
2609             Dim idx As Integer = _statuses.Tabs(_curTab.Text).IndexOf(_curPost.Id)
2610             SelectListItem(_curList, idx)
2611             _curList.EnsureVisible(idx)
2612         End If
2613         _curList.Refresh()
2614         _modifySettingCommon = True
2615     End Sub
2616
2617     Private Sub Tween_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
2618         If Me.WindowState = FormWindowState.Normal AndAlso Not _initialLayout Then
2619             _myLoc = Me.DesktopLocation
2620             _modifySettingLocal = True
2621         End If
2622     End Sub
2623
2624     Private Sub ContextMenuOperate_Opening(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ContextMenuOperate.Opening
2625         If ListTab.SelectedTab Is Nothing Then Exit Sub
2626         If _statuses Is Nothing OrElse _statuses.Tabs Is Nothing OrElse Not _statuses.Tabs.ContainsKey(ListTab.SelectedTab.Text) Then Exit Sub
2627         If _curPost Is Nothing Then
2628             ReplyStripMenuItem.Enabled = False
2629             ReplyAllStripMenuItem.Enabled = False
2630             DMStripMenuItem.Enabled = False
2631             ShowProfileMenuItem.Enabled = False
2632             ListManageUserContextToolStripMenuItem2.Enabled = False
2633             MoveToFavToolStripMenuItem.Enabled = False
2634             TabMenuItem.Enabled = False
2635             IDRuleMenuItem.Enabled = False
2636             ReadedStripMenuItem.Enabled = False
2637             UnreadStripMenuItem.Enabled = False
2638         Else
2639             ShowProfileMenuItem.Enabled = True
2640             ListManageUserContextToolStripMenuItem2.Enabled = True
2641             ReplyStripMenuItem.Enabled = True
2642             ReplyAllStripMenuItem.Enabled = True
2643             DMStripMenuItem.Enabled = True
2644             MoveToFavToolStripMenuItem.Enabled = True
2645             TabMenuItem.Enabled = True
2646             IDRuleMenuItem.Enabled = True
2647             ReadedStripMenuItem.Enabled = True
2648             UnreadStripMenuItem.Enabled = True
2649         End If
2650         If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.DirectMessage OrElse _curPost Is Nothing OrElse _curPost.IsDm Then
2651             FavAddToolStripMenuItem.Enabled = False
2652             FavRemoveToolStripMenuItem.Enabled = False
2653             StatusOpenMenuItem.Enabled = False
2654             FavorareMenuItem.Enabled = False
2655             ShowRelatedStatusesMenuItem.Enabled = False
2656
2657             ReTweetStripMenuItem.Enabled = False
2658             ReTweetOriginalStripMenuItem.Enabled = False
2659             QuoteStripMenuItem.Enabled = False
2660             FavoriteRetweetContextMenu.Enabled = False
2661             FavoriteRetweetUnofficialContextMenu.Enabled = False
2662             If _curPost IsNot Nothing AndAlso _curPost.IsDm Then DeleteStripMenuItem.Enabled = True
2663         Else
2664             FavAddToolStripMenuItem.Enabled = True
2665             FavRemoveToolStripMenuItem.Enabled = True
2666             StatusOpenMenuItem.Enabled = True
2667             FavorareMenuItem.Enabled = True
2668             ShowRelatedStatusesMenuItem.Enabled = True  'PublicSearchの時問題出るかも
2669
2670             If _curPost.IsMe Then
2671                 ReTweetOriginalStripMenuItem.Enabled = False
2672                 FavoriteRetweetContextMenu.Enabled = False
2673                 DeleteStripMenuItem.Enabled = True
2674             Else
2675                 DeleteStripMenuItem.Enabled = False
2676                 If _curPost.IsProtect Then
2677                     ReTweetOriginalStripMenuItem.Enabled = False
2678                     ReTweetStripMenuItem.Enabled = False
2679                     QuoteStripMenuItem.Enabled = False
2680                     FavoriteRetweetContextMenu.Enabled = False
2681                     FavoriteRetweetUnofficialContextMenu.Enabled = False
2682                 Else
2683                     ReTweetOriginalStripMenuItem.Enabled = True
2684                     ReTweetStripMenuItem.Enabled = True
2685                     QuoteStripMenuItem.Enabled = True
2686                     FavoriteRetweetContextMenu.Enabled = True
2687                     FavoriteRetweetUnofficialContextMenu.Enabled = True
2688                 End If
2689             End If
2690         End If
2691         If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.Favorites Then
2692             RefreshMoreStripMenuItem.Enabled = True
2693         Else
2694             RefreshMoreStripMenuItem.Enabled = False
2695         End If
2696         If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.PublicSearch _
2697                             OrElse _curPost Is Nothing _
2698                             OrElse Not _curPost.InReplyToId > 0 Then
2699             RepliedStatusOpenMenuItem.Enabled = False
2700         Else
2701             RepliedStatusOpenMenuItem.Enabled = True
2702         End If
2703         If _curPost Is Nothing OrElse _curPost.RetweetedBy = "" Then
2704             MoveToRTHomeMenuItem.Enabled = False
2705         Else
2706             MoveToRTHomeMenuItem.Enabled = True
2707         End If
2708     End Sub
2709
2710     Private Sub ReplyStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReplyStripMenuItem.Click, ReplyOpMenuItem.Click
2711         MakeReplyOrDirectStatus(False, True)
2712     End Sub
2713
2714     Private Sub DMStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DMStripMenuItem.Click, DmOpMenuItem.Click
2715         MakeReplyOrDirectStatus(False, False)
2716     End Sub
2717
2718     Private Sub doStatusDelete()
2719         If _curTab Is Nothing OrElse _curList Is Nothing Then Exit Sub
2720         If _statuses.Tabs(_curTab.Text).TabType <> TabUsageType.DirectMessage Then
2721             Dim myPost As Boolean = False
2722             For Each idx As Integer In _curList.SelectedIndices
2723                 If GetCurTabPost(idx).IsMe OrElse _
2724                    GetCurTabPost(idx).RetweetedBy.ToLower = tw.Username.ToLower Then
2725                     myPost = True
2726                     Exit For
2727                 End If
2728             Next
2729             If Not myPost Then Exit Sub
2730         Else
2731             If _curList.SelectedIndices.Count = 0 Then
2732                 Exit Sub
2733             End If
2734         End If
2735
2736         Dim tmp As String = String.Format(My.Resources.DeleteStripMenuItem_ClickText1, Environment.NewLine)
2737
2738         If MessageBox.Show(tmp, My.Resources.DeleteStripMenuItem_ClickText2, _
2739               MessageBoxButtons.OKCancel, _
2740               MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then Exit Sub
2741
2742         Dim fidx As Integer
2743         If _curList.FocusedItem IsNot Nothing Then
2744             fidx = _curList.FocusedItem.Index
2745         ElseIf _curList.TopItem IsNot Nothing Then
2746             fidx = _curList.TopItem.Index
2747         Else
2748             fidx = 0
2749         End If
2750
2751         Try
2752             Me.Cursor = Cursors.WaitCursor
2753
2754             Dim rslt As Boolean = True
2755             For Each Id As Long In _statuses.GetId(_curTab.Text, _curList.SelectedIndices)
2756                 Dim rtn As String = ""
2757                 If _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage Then
2758                     rtn = tw.RemoveDirectMessage(Id)
2759                 Else
2760                     If _statuses.Item(Id).IsMe OrElse _statuses.Item(Id).RetweetedBy.ToLower = tw.Username.ToLower Then
2761                         rtn = tw.RemoveStatus(Id)
2762                     Else
2763                         Continue For
2764                     End If
2765                 End If
2766                 If rtn.Length > 0 Then
2767                     'エラー
2768                     rslt = False
2769                 Else
2770                     _statuses.RemovePost(Id)
2771                 End If
2772             Next
2773
2774             If Not rslt Then
2775                 StatusLabel.Text = My.Resources.DeleteStripMenuItem_ClickText3  '失敗
2776             Else
2777                 StatusLabel.Text = My.Resources.DeleteStripMenuItem_ClickText4  '成功
2778             End If
2779
2780             _itemCache = Nothing    'キャッシュ破棄
2781             _postCache = Nothing
2782             _curPost = Nothing
2783             _curItemIndex = -1
2784             For Each tb As TabPage In ListTab.TabPages
2785                 DirectCast(tb.Tag, DetailsListView).VirtualListSize = _statuses.Tabs(tb.Text).AllCount
2786                 If _curTab.Equals(tb) Then
2787                     _curList.SelectedIndices.Clear()
2788                     If _statuses.Tabs(tb.Text).AllCount > 0 Then
2789                         If _statuses.Tabs(tb.Text).AllCount - 1 > fidx AndAlso fidx > -1 Then
2790                             _curList.SelectedIndices.Add(fidx)
2791                         Else
2792                             _curList.SelectedIndices.Add(_statuses.Tabs(tb.Text).AllCount - 1)
2793                         End If
2794                         If _curList.SelectedIndices.Count > 0 Then
2795                             _curList.EnsureVisible(_curList.SelectedIndices(0))
2796                             _curList.FocusedItem = _curList.Items(_curList.SelectedIndices(0))
2797                         End If
2798                     End If
2799                 End If
2800                 If _statuses.Tabs(tb.Text).UnreadCount = 0 Then
2801                     If SettingDialog.TabIconDisp Then
2802                         If tb.ImageIndex = 0 Then tb.ImageIndex = -1 'タブアイコン
2803                     End If
2804                 End If
2805             Next
2806             If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
2807         Finally
2808             Me.Cursor = Cursors.Default
2809         End Try
2810     End Sub
2811
2812     Private Sub DeleteStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DeleteStripMenuItem.Click, DelOpMenuItem.Click
2813         doStatusDelete()
2814     End Sub
2815
2816     Private Sub ReadedStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReadedStripMenuItem.Click, ReadOpMenuItem.Click
2817         _curList.BeginUpdate()
2818         If SettingDialog.UnreadManage Then
2819             For Each idx As Integer In _curList.SelectedIndices
2820                 _statuses.SetRead(True, _curTab.Text, idx)
2821             Next
2822         End If
2823         For Each idx As Integer In _curList.SelectedIndices
2824             ChangeCacheStyleRead(True, idx, _curTab)
2825         Next
2826         ColorizeList()
2827         _curList.EndUpdate()
2828         For Each tb As TabPage In ListTab.TabPages
2829             If _statuses.Tabs(tb.Text).UnreadCount = 0 Then
2830                 If SettingDialog.TabIconDisp Then
2831                     If tb.ImageIndex = 0 Then tb.ImageIndex = -1 'タブアイコン
2832                 End If
2833             End If
2834         Next
2835         If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
2836     End Sub
2837
2838     Private Sub UnreadStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UnreadStripMenuItem.Click, UnreadOpMenuItem.Click
2839         _curList.BeginUpdate()
2840         If SettingDialog.UnreadManage Then
2841             For Each idx As Integer In _curList.SelectedIndices
2842                 _statuses.SetRead(False, _curTab.Text, idx)
2843             Next
2844         End If
2845         For Each idx As Integer In _curList.SelectedIndices
2846             ChangeCacheStyleRead(False, idx, _curTab)
2847         Next
2848         ColorizeList()
2849         _curList.EndUpdate()
2850         For Each tb As TabPage In ListTab.TabPages
2851             If _statuses.Tabs(tb.Text).UnreadCount > 0 Then
2852                 If SettingDialog.TabIconDisp Then
2853                     If tb.ImageIndex = -1 Then tb.ImageIndex = 0 'タブアイコン
2854                 End If
2855             End If
2856         Next
2857         If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
2858     End Sub
2859
2860     Private Sub RefreshStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RefreshStripMenuItem.Click, RefreshOpMenuItem.Click
2861         DoRefresh()
2862     End Sub
2863
2864     Private Sub DoRefresh()
2865         If _curTab IsNot Nothing Then
2866             Select Case _statuses.Tabs(_curTab.Text).TabType
2867                 Case TabUsageType.Mentions
2868                     GetTimeline(WORKERTYPE.Reply, 1, 0, "")
2869                 Case TabUsageType.DirectMessage
2870                     GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
2871                 Case TabUsageType.Favorites
2872                     GetTimeline(WORKERTYPE.Favorites, 1, 0, "")
2873                     'Case TabUsageType.Profile
2874                     '' TODO
2875                 Case TabUsageType.PublicSearch
2876                     '' TODO
2877                     Dim tb As TabClass = _statuses.Tabs(_curTab.Text)
2878                     If tb.SearchWords = "" Then Exit Sub
2879                     GetTimeline(WORKERTYPE.PublicSearch, 1, 0, _curTab.Text)
2880                 Case TabUsageType.Lists
2881                     '' TODO
2882                     Dim tb As TabClass = _statuses.Tabs(_curTab.Text)
2883                     If tb.ListInfo Is Nothing OrElse tb.ListInfo.Id = 0 Then Exit Sub
2884                     GetTimeline(WORKERTYPE.List, 1, 0, _curTab.Text)
2885                 Case Else
2886                     GetTimeline(WORKERTYPE.Timeline, 1, 0, "")
2887             End Select
2888         Else
2889             GetTimeline(WORKERTYPE.Timeline, 1, 0, "")
2890         End If
2891     End Sub
2892
2893     Private Sub DoRefreshMore()
2894         'ページ指定をマイナス1に
2895         If _curTab IsNot Nothing Then
2896             Select Case _statuses.Tabs(_curTab.Text).TabType
2897                 Case TabUsageType.Mentions
2898                     GetTimeline(WORKERTYPE.Reply, -1, 0, "")
2899                 Case TabUsageType.DirectMessage
2900                     GetTimeline(WORKERTYPE.DirectMessegeRcv, -1, 0, "")
2901                 Case TabUsageType.Favorites
2902                     '    GetTimeline(WORKERTYPE.Favorites, -1, 0, "")
2903                 Case TabUsageType.Profile
2904                     '' TODO
2905                 Case TabUsageType.PublicSearch
2906                     ' TODO
2907                     Dim tb As TabClass = _statuses.Tabs(_curTab.Text)
2908                     If tb.SearchWords = "" Then Exit Sub
2909                     GetTimeline(WORKERTYPE.PublicSearch, -1, 0, _curTab.Text)
2910                 Case TabUsageType.Lists
2911                     '' TODO
2912                     Dim tb As TabClass = _statuses.Tabs(_curTab.Text)
2913                     If tb.ListInfo Is Nothing OrElse tb.ListInfo.Id = 0 Then Exit Sub
2914                     GetTimeline(WORKERTYPE.List, -1, 0, _curTab.Text)
2915                 Case Else
2916                     GetTimeline(WORKERTYPE.Timeline, -1, 0, "")
2917             End Select
2918         Else
2919             GetTimeline(WORKERTYPE.Timeline, -1, 0, "")
2920         End If
2921     End Sub
2922
2923     Private Sub SettingStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SettingStripMenuItem.Click, SettingFileMenuItem.Click
2924         Dim result As DialogResult
2925         Dim uid As String = tw.Username.ToLower
2926
2927         Try
2928             result = SettingDialog.ShowDialog()
2929         Catch ex As Exception
2930             Exit Sub
2931         End Try
2932
2933         If result = Windows.Forms.DialogResult.OK Then
2934             SyncLock _syncObject
2935                 'Try
2936                 '    If SettingDialog.TimelinePeriodInt > 0 Then
2937                 '        _homeCounterAdjuster = 0
2938                 '    End If
2939                 'Catch ex As Exception
2940                 '    ex.Data("Instance") = "Set Timers"
2941                 '    ex.Data("IsTerminatePermission") = False
2942                 '    Throw
2943                 'End Try
2944                 'tw.CountApi = SettingDialog.CountApi
2945                 'tw.CountApiReply = SettingDialog.CountApiReply
2946                 tw.TinyUrlResolve = SettingDialog.TinyUrlResolve
2947                 tw.RestrictFavCheck = SettingDialog.RestrictFavCheck
2948                 tw.ReadOwnPost = SettingDialog.ReadOwnPost
2949                 tw.UseSsl = SettingDialog.UseSsl
2950                 ShortUrl.IsResolve = SettingDialog.TinyUrlResolve
2951                 ShortUrl.BitlyId = SettingDialog.BitlyUser
2952                 ShortUrl.BitlyKey = SettingDialog.BitlyPwd
2953                 HttpTwitter.TwitterUrl = _cfgCommon.TwitterUrl
2954                 HttpTwitter.TwitterSearchUrl = _cfgCommon.TwitterSearchUrl
2955
2956                 HttpConnection.InitializeConnection(SettingDialog.DefaultTimeOut, _
2957                                                     SettingDialog.SelectedProxyType, _
2958                                                     SettingDialog.ProxyAddress, _
2959                                                     SettingDialog.ProxyPort, _
2960                                                     SettingDialog.ProxyUser, _
2961                                                     SettingDialog.ProxyPassword)
2962                 Try
2963                     If SettingDialog.TabIconDisp Then
2964                         RemoveHandler ListTab.DrawItem, AddressOf ListTab_DrawItem
2965                         ListTab.DrawMode = TabDrawMode.Normal
2966                         ListTab.ImageList = Me.TabImage
2967                     Else
2968                         RemoveHandler ListTab.DrawItem, AddressOf ListTab_DrawItem
2969                         AddHandler ListTab.DrawItem, AddressOf ListTab_DrawItem
2970                         ListTab.DrawMode = TabDrawMode.OwnerDrawFixed
2971                         ListTab.ImageList = Nothing
2972                     End If
2973                 Catch ex As Exception
2974                     ex.Data("Instance") = "ListTab(TabIconDisp)"
2975                     ex.Data("IsTerminatePermission") = False
2976                     Throw
2977                 End Try
2978
2979                 Try
2980                     If Not SettingDialog.UnreadManage Then
2981                         ReadedStripMenuItem.Enabled = False
2982                         UnreadStripMenuItem.Enabled = False
2983                         If SettingDialog.TabIconDisp Then
2984                             For Each myTab As TabPage In ListTab.TabPages
2985                                 myTab.ImageIndex = -1
2986                             Next
2987                         End If
2988                     Else
2989                         ReadedStripMenuItem.Enabled = True
2990                         UnreadStripMenuItem.Enabled = True
2991                     End If
2992                 Catch ex As Exception
2993                     ex.Data("Instance") = "ListTab(UnreadManage)"
2994                     ex.Data("IsTerminatePermission") = False
2995                     Throw
2996                 End Try
2997
2998                 Try
2999                     For Each mytab As TabPage In ListTab.TabPages
3000                         Dim lst As DetailsListView = DirectCast(mytab.Tag, DetailsListView)
3001                         lst.GridLines = SettingDialog.ShowGrid
3002                     Next
3003                 Catch ex As Exception
3004                     ex.Data("Instance") = "ListTab(ShowGrid)"
3005                     ex.Data("IsTerminatePermission") = False
3006                     Throw
3007                 End Try
3008
3009                 PlaySoundMenuItem.Checked = SettingDialog.PlaySound
3010                 Me.PlaySoundFileMenuItem.Checked = SettingDialog.PlaySound
3011                 _fntUnread = SettingDialog.FontUnread
3012                 _clUnread = SettingDialog.ColorUnread
3013                 _fntReaded = SettingDialog.FontReaded
3014                 _clReaded = SettingDialog.ColorReaded
3015                 _clFav = SettingDialog.ColorFav
3016                 _clOWL = SettingDialog.ColorOWL
3017                 _clRetweet = SettingDialog.ColorRetweet
3018                 _fntDetail = SettingDialog.FontDetail
3019                 _clDetail = SettingDialog.ColorDetail
3020                 _clDetailLink = SettingDialog.ColorDetailLink
3021                 _clDetailBackcolor = SettingDialog.ColorDetailBackcolor
3022                 _clSelf = SettingDialog.ColorSelf
3023                 _clAtSelf = SettingDialog.ColorAtSelf
3024                 _clTarget = SettingDialog.ColorTarget
3025                 _clAtTarget = SettingDialog.ColorAtTarget
3026                 _clAtFromTarget = SettingDialog.ColorAtFromTarget
3027                 _clAtTo = SettingDialog.ColorAtTo
3028                 _clListBackcolor = SettingDialog.ColorListBackcolor
3029                 _clInputBackcolor = SettingDialog.ColorInputBackcolor
3030                 _clInputFont = SettingDialog.ColorInputFont
3031                 _fntInputFont = SettingDialog.FontInputFont
3032                 Try
3033                     If StatusText.Focused Then StatusText.BackColor = _clInputBackcolor
3034                     StatusText.Font = _fntInputFont
3035                     StatusText.ForeColor = _clInputFont
3036                 Catch ex As Exception
3037                     MessageBox.Show(ex.Message)
3038                 End Try
3039
3040                 _brsForeColorUnread.Dispose()
3041                 _brsForeColorReaded.Dispose()
3042                 _brsForeColorFav.Dispose()
3043                 _brsForeColorOWL.Dispose()
3044                 _brsForeColorRetweet.Dispose()
3045                 _brsForeColorUnread = New SolidBrush(_clUnread)
3046                 _brsForeColorReaded = New SolidBrush(_clReaded)
3047                 _brsForeColorFav = New SolidBrush(_clFav)
3048                 _brsForeColorOWL = New SolidBrush(_clOWL)
3049                 _brsForeColorRetweet = New SolidBrush(_clRetweet)
3050                 _brsBackColorMine.Dispose()
3051                 _brsBackColorAt.Dispose()
3052                 _brsBackColorYou.Dispose()
3053                 _brsBackColorAtYou.Dispose()
3054                 _brsBackColorAtFromTarget.Dispose()
3055                 _brsBackColorAtTo.Dispose()
3056                 _brsBackColorNone.Dispose()
3057                 _brsBackColorMine = New SolidBrush(_clSelf)
3058                 _brsBackColorAt = New SolidBrush(_clAtSelf)
3059                 _brsBackColorYou = New SolidBrush(_clTarget)
3060                 _brsBackColorAtYou = New SolidBrush(_clAtTarget)
3061                 _brsBackColorAtFromTarget = New SolidBrush(_clAtFromTarget)
3062                 _brsBackColorAtTo = New SolidBrush(_clAtTo)
3063                 _brsBackColorNone = New SolidBrush(_clListBackcolor)
3064                 Try
3065                     If SettingDialog.IsMonospace Then
3066                         detailHtmlFormatHeader = detailHtmlFormatMono1
3067                         detailHtmlFormatFooter = detailHtmlFormatMono7
3068                     Else
3069                         detailHtmlFormatHeader = detailHtmlFormat1
3070                         detailHtmlFormatFooter = detailHtmlFormat7
3071                     End If
3072                     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
3073                     If SettingDialog.IsMonospace Then
3074                         detailHtmlFormatHeader += detailHtmlFormatMono6
3075                     Else
3076                         detailHtmlFormatHeader += detailHtmlFormat6
3077                     End If
3078                 Catch ex As Exception
3079                     ex.Data("Instance") = "Font"
3080                     ex.Data("IsTerminatePermission") = False
3081                     Throw
3082                 End Try
3083                 Try
3084                     _statuses.SetUnreadManage(SettingDialog.UnreadManage)
3085                 Catch ex As Exception
3086                     ex.Data("Instance") = "_statuses"
3087                     ex.Data("IsTerminatePermission") = False
3088                     Throw
3089                 End Try
3090
3091                 Try
3092                     For Each tb As TabPage In ListTab.TabPages
3093                         If SettingDialog.TabIconDisp Then
3094                             If _statuses.Tabs(tb.Text).UnreadCount = 0 Then
3095                                 tb.ImageIndex = -1
3096                             Else
3097                                 tb.ImageIndex = 0
3098                             End If
3099                         End If
3100                         If tb.Tag IsNot Nothing AndAlso tb.Controls.Count > 0 Then
3101                             DirectCast(tb.Tag, DetailsListView).Font = _fntReaded
3102                             DirectCast(tb.Tag, DetailsListView).BackColor = _clListBackcolor
3103                         End If
3104                     Next
3105                 Catch ex As Exception
3106                     ex.Data("Instance") = "ListTab(TabIconDisp no2)"
3107                     ex.Data("IsTerminatePermission") = False
3108                     Throw
3109                 End Try
3110                 SetMainWindowTitle()
3111                 SetNotifyIconText()
3112
3113                 _itemCache = Nothing
3114                 _postCache = Nothing
3115                 If _curList IsNot Nothing Then _curList.Refresh()
3116                 ListTab.Refresh()
3117
3118                 Outputz.Key = SettingDialog.OutputzKey
3119                 Outputz.Enabled = SettingDialog.OutputzEnabled
3120                 Select Case SettingDialog.OutputzUrlmode
3121                     Case OutputzUrlmode.twittercom
3122                         Outputz.OutUrl = "http://twitter.com/"
3123                     Case OutputzUrlmode.twittercomWithUsername
3124                         Outputz.OutUrl = "http://twitter.com/" + tw.Username
3125                 End Select
3126
3127                 _hookGlobalHotkey.UnregisterAllOriginalHotkey()
3128                 If SettingDialog.HotkeyEnabled Then
3129                     '''グローバルホットキーの登録。設定で変更可能にするかも
3130                     Dim modKey As HookGlobalHotkey.ModKeys = HookGlobalHotkey.ModKeys.None
3131                     If (SettingDialog.HotkeyMod And Keys.Alt) = Keys.Alt Then modKey = modKey Or HookGlobalHotkey.ModKeys.Alt
3132                     If (SettingDialog.HotkeyMod And Keys.Control) = Keys.Control Then modKey = modKey Or HookGlobalHotkey.ModKeys.Ctrl
3133                     If (SettingDialog.HotkeyMod And Keys.Shift) = Keys.Shift Then modKey = modKey Or HookGlobalHotkey.ModKeys.Shift
3134                     If (SettingDialog.HotkeyMod And Keys.LWin) = Keys.LWin Then modKey = modKey Or HookGlobalHotkey.ModKeys.Win
3135
3136                     _hookGlobalHotkey.RegisterOriginalHotkey(SettingDialog.HotkeyKey, SettingDialog.HotkeyValue, modKey)
3137                 End If
3138
3139                 If uid <> tw.Username Then Me.doGetFollowersMenu()
3140
3141                 SetImageServiceCombo()
3142
3143                 Try
3144                     StatusText_TextChanged(Nothing, Nothing)
3145                 Catch ex As Exception
3146
3147                 End Try
3148             End SyncLock
3149         End If
3150
3151         Twitter.AccountState = ACCOUNT_STATE.Valid
3152
3153         Me.TopMost = SettingDialog.AlwaysTop
3154         SaveConfigsAll(False)
3155     End Sub
3156
3157     Private Sub PostBrowser_Navigated(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserNavigatedEventArgs) Handles PostBrowser.Navigated
3158         If e.Url.AbsoluteUri <> "about:blank" Then
3159             DispSelectedPost()
3160             OpenUriAsync(e.Url.OriginalString)
3161         End If
3162     End Sub
3163
3164     Private Sub PostBrowser_Navigating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserNavigatingEventArgs) Handles PostBrowser.Navigating
3165         If e.Url.Scheme = "data" Then
3166             StatusLabelUrl.Text = PostBrowser.StatusText.Replace("&", "&&")
3167         ElseIf e.Url.AbsoluteUri <> "about:blank" Then
3168             e.Cancel = True
3169
3170             If e.Url.AbsoluteUri.StartsWith("http://twitter.com/search?q=%23") OrElse _
3171                e.Url.AbsoluteUri.StartsWith("https://twitter.com/search?q=%23") Then
3172                 'ハッシュタグの場合は、タブで開く
3173                 Dim urlStr As String = HttpUtility.UrlDecode(e.Url.AbsoluteUri)
3174                 Dim hash As String = urlStr.Substring(urlStr.IndexOf("#"))
3175                 HashSupl.AddItem(hash)
3176                 HashMgr.AddHashToHistory(hash.Trim, False)
3177                 AddNewTabForSearch(hash)
3178                 Exit Sub
3179             Else
3180                 OpenUriAsync(e.Url.OriginalString)
3181             End If
3182         End If
3183     End Sub
3184
3185     Public Sub AddNewTabForSearch(ByVal searchWord As String)
3186         '同一検索条件のタブが既に存在すれば、そのタブアクティブにして終了
3187         For Each tb As TabClass In _statuses.GetTabsByType(TabUsageType.PublicSearch)
3188             If tb.SearchWords = searchWord AndAlso tb.SearchLang = "" Then
3189                 For Each tp As TabPage In ListTab.TabPages
3190                     If tb.TabName = tp.Text Then
3191                         ListTab.SelectedTab = tp
3192                         Exit Sub
3193                     End If
3194                 Next
3195             End If
3196         Next
3197         'ユニークなタブ名生成
3198         Dim tabName As String = searchWord
3199         For i As Integer = 0 To 100
3200             If _statuses.ContainsTab(tabName) Then
3201                 tabName += "_"
3202             Else
3203                 Exit For
3204             End If
3205         Next
3206         'タブ追加
3207         AddNewTab(tabName, False, TabUsageType.PublicSearch)
3208         _statuses.AddTab(tabName, TabUsageType.PublicSearch, Nothing)
3209         '追加したタブをアクティブに
3210         ListTab.SelectedIndex = ListTab.TabPages.Count - 1
3211         '検索条件の設定
3212         Dim cmb As ComboBox = DirectCast(ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch"), ComboBox)
3213         cmb.Items.Add(searchWord)
3214         cmb.Text = searchWord
3215         SaveConfigsTabs()
3216         '検索実行
3217         Me.SearchButton_Click(ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch"), Nothing)
3218     End Sub
3219
3220     Public Function AddNewTab(ByVal tabName As String, ByVal startup As Boolean, ByVal tabType As TabUsageType) As Boolean
3221         '重複チェック
3222         For Each tb As TabPage In ListTab.TabPages
3223             If tb.Text = tabName Then Return False
3224         Next
3225
3226         '新規タブ名チェック
3227         If tabName = My.Resources.AddNewTabText1 Then Return False
3228
3229         'タブタイプ重複チェック
3230         If Not startup Then
3231             If tabType = TabUsageType.DirectMessage OrElse _
3232                tabType = TabUsageType.Favorites OrElse _
3233                tabType = TabUsageType.Home OrElse _
3234                tabType = TabUsageType.Mentions OrElse _
3235                tabType = TabUsageType.Related Then
3236                 If _statuses.GetTabByType(tabType) IsNot Nothing Then Return False
3237             End If
3238         End If
3239
3240         Dim _tabPage As TabPage = New TabPage
3241         Dim _listCustom As DetailsListView = New DetailsListView
3242         Dim _colHd1 As ColumnHeader = New ColumnHeader()  'アイコン
3243         Dim _colHd2 As ColumnHeader = New ColumnHeader()   'ニックネーム
3244         Dim _colHd3 As ColumnHeader = New ColumnHeader()   '本文
3245         Dim _colHd4 As ColumnHeader = New ColumnHeader()   '日付
3246         Dim _colHd5 As ColumnHeader = New ColumnHeader()   'ユーザID
3247         Dim _colHd6 As ColumnHeader = New ColumnHeader()   '未読
3248         Dim _colHd7 As ColumnHeader = New ColumnHeader()   'マーク&プロテクト
3249         Dim _colHd8 As ColumnHeader = New ColumnHeader()   'ソース
3250
3251         Dim cnt As Integer = ListTab.TabPages.Count
3252
3253         '''ToDo:Create and set controls follow tabtypes
3254
3255         Me.SplitContainer1.Panel1.SuspendLayout()
3256         Me.SplitContainer1.Panel2.SuspendLayout()
3257         Me.SplitContainer1.SuspendLayout()
3258         Me.ListTab.SuspendLayout()
3259         Me.SuspendLayout()
3260
3261         _tabPage.SuspendLayout()
3262
3263
3264
3265         ''' 検索関連の準備
3266         Dim pnl As Panel = Nothing
3267         If tabType = TabUsageType.PublicSearch Then
3268             pnl = New Panel
3269
3270             Dim lbl As New Label
3271             Dim cmb As New ComboBox
3272             Dim btn As New Button
3273             Dim cmbLang As New ComboBox
3274
3275             pnl.SuspendLayout()
3276
3277             pnl.Controls.Add(cmb)
3278             pnl.Controls.Add(cmbLang)
3279             pnl.Controls.Add(btn)
3280             pnl.Controls.Add(lbl)
3281             pnl.Name = "panelSearch"
3282             pnl.Dock = DockStyle.Top
3283             pnl.Height = cmb.Height
3284             AddHandler pnl.Enter, AddressOf SearchControls_Enter
3285             AddHandler pnl.Leave, AddressOf SearchControls_Leave
3286
3287             cmb.Text = ""
3288             cmb.Anchor = AnchorStyles.Left Or AnchorStyles.Right
3289             cmb.Dock = DockStyle.Fill
3290             cmb.Name = "comboSearch"
3291             cmb.DropDownStyle = ComboBoxStyle.DropDown
3292             cmb.ImeMode = Windows.Forms.ImeMode.NoControl
3293             cmb.TabStop = False
3294             cmb.AutoCompleteMode = AutoCompleteMode.None
3295
3296             If _statuses.ContainsTab(tabName) Then
3297                 cmb.Items.Add(_statuses.Tabs(tabName).SearchWords)
3298                 cmb.Text = _statuses.Tabs(tabName).SearchWords
3299             End If
3300
3301             cmbLang.Text = ""
3302             cmbLang.Anchor = AnchorStyles.Left Or AnchorStyles.Right
3303             cmbLang.Dock = DockStyle.Right
3304             cmbLang.Width = 50
3305             cmbLang.Name = "comboLang"
3306             cmbLang.DropDownStyle = ComboBoxStyle.DropDownList
3307             cmbLang.TabStop = False
3308             cmbLang.Items.Add("")
3309             cmbLang.Items.Add("ja")
3310             cmbLang.Items.Add("en")
3311             cmbLang.Items.Add("ar")
3312             cmbLang.Items.Add("da")
3313             cmbLang.Items.Add("nl")
3314             cmbLang.Items.Add("fa")
3315             cmbLang.Items.Add("fi")
3316             cmbLang.Items.Add("fr")
3317             cmbLang.Items.Add("de")
3318             cmbLang.Items.Add("hu")
3319             cmbLang.Items.Add("is")
3320             cmbLang.Items.Add("it")
3321             cmbLang.Items.Add("no")
3322             cmbLang.Items.Add("pl")
3323             cmbLang.Items.Add("pt")
3324             cmbLang.Items.Add("ru")
3325             cmbLang.Items.Add("es")
3326             cmbLang.Items.Add("sv")
3327             cmbLang.Items.Add("th")
3328             If _statuses.ContainsTab(tabName) Then cmbLang.Text = _statuses.Tabs(tabName).SearchLang
3329
3330             lbl.Text = "Search(C-S-f)"
3331             lbl.Name = "label1"
3332             lbl.Dock = DockStyle.Left
3333             lbl.Width = 90
3334             lbl.Height = cmb.Height
3335             lbl.TextAlign = ContentAlignment.MiddleLeft
3336
3337             btn.Text = "Search"
3338             btn.Name = "buttonSearch"
3339             btn.UseVisualStyleBackColor = True
3340             btn.Dock = DockStyle.Right
3341             btn.TabStop = False
3342             AddHandler btn.Click, AddressOf SearchButton_Click
3343
3344         End If
3345
3346         Me.ListTab.Controls.Add(_tabPage)
3347         _tabPage.Controls.Add(_listCustom)
3348
3349         If tabType = TabUsageType.PublicSearch Then _tabPage.Controls.Add(pnl)
3350
3351         _tabPage.Location = New Point(4, 4)
3352         _tabPage.Name = "CTab" + cnt.ToString()
3353         _tabPage.Size = New Size(380, 260)
3354         _tabPage.TabIndex = 2 + cnt
3355         _tabPage.Text = tabName
3356         _tabPage.UseVisualStyleBackColor = True
3357
3358         _listCustom.AllowColumnReorder = True
3359         If Not _iconCol Then
3360             _listCustom.Columns.AddRange(New ColumnHeader() {_colHd1, _colHd2, _colHd3, _colHd4, _colHd5, _colHd6, _colHd7, _colHd8})
3361         Else
3362             _listCustom.Columns.AddRange(New ColumnHeader() {_colHd1, _colHd3})
3363         End If
3364         _listCustom.ContextMenuStrip = Me.ContextMenuOperate
3365         _listCustom.Dock = DockStyle.Fill
3366         _listCustom.FullRowSelect = True
3367         _listCustom.HideSelection = False
3368         _listCustom.Location = New Point(0, 0)
3369         _listCustom.Margin = New Padding(0)
3370         _listCustom.Name = "CList" + Environment.TickCount.ToString()
3371         _listCustom.ShowItemToolTips = True
3372         _listCustom.Size = New Size(380, 260)
3373         _listCustom.UseCompatibleStateImageBehavior = False
3374         _listCustom.View = View.Details
3375         _listCustom.OwnerDraw = True
3376         _listCustom.VirtualMode = True
3377         _listCustom.Font = _fntReaded
3378         _listCustom.BackColor = _clListBackcolor
3379
3380         _listCustom.GridLines = SettingDialog.ShowGrid
3381         _listCustom.AllowDrop = True
3382
3383         AddHandler _listCustom.SelectedIndexChanged, AddressOf MyList_SelectedIndexChanged
3384         AddHandler _listCustom.MouseDoubleClick, AddressOf MyList_MouseDoubleClick
3385         AddHandler _listCustom.ColumnClick, AddressOf MyList_ColumnClick
3386         AddHandler _listCustom.DrawColumnHeader, AddressOf MyList_DrawColumnHeader
3387         AddHandler _listCustom.DragDrop, AddressOf TweenMain_DragDrop
3388         AddHandler _listCustom.DragOver, AddressOf TweenMain_DragOver
3389         AddHandler _listCustom.DrawItem, AddressOf MyList_DrawItem
3390         AddHandler _listCustom.MouseClick, AddressOf MyList_MouseClick
3391         AddHandler _listCustom.ColumnReordered, AddressOf MyList_ColumnReordered
3392         AddHandler _listCustom.ColumnWidthChanged, AddressOf MyList_ColumnWidthChanged
3393         AddHandler _listCustom.CacheVirtualItems, AddressOf MyList_CacheVirtualItems
3394         AddHandler _listCustom.RetrieveVirtualItem, AddressOf MyList_RetrieveVirtualItem
3395         AddHandler _listCustom.DrawSubItem, AddressOf MyList_DrawSubItem
3396         AddHandler _listCustom.HScrolled, AddressOf MyList_HScrolled
3397
3398         InitColumnText()
3399         _colHd1.Text = ColumnText(0)
3400         _colHd1.Width = 48
3401         _colHd2.Text = ColumnText(1)
3402         _colHd2.Width = 80
3403         _colHd3.Text = ColumnText(2)
3404         _colHd3.Width = 300
3405         _colHd4.Text = ColumnText(3)
3406         _colHd4.Width = 50
3407         _colHd5.Text = ColumnText(4)
3408         _colHd5.Width = 50
3409         _colHd6.Text = ColumnText(5)
3410         _colHd6.Width = 16
3411         _colHd7.Text = ColumnText(6)
3412         _colHd7.Width = 16
3413         _colHd8.Text = ColumnText(7)
3414         _colHd8.Width = 50
3415
3416         If (_statuses.Tabs.ContainsKey(tabName) AndAlso _statuses.Tabs(tabName).TabType = TabUsageType.Mentions) _
3417            OrElse (Not _statuses.IsDefaultTab(tabName) AndAlso tabType <> TabUsageType.PublicSearch AndAlso tabType <> TabUsageType.Lists AndAlso tabType <> TabUsageType.Related) Then
3418             TabDialog.AddTab(tabName)
3419         End If
3420
3421         _listCustom.SmallImageList = New ImageList()
3422         If _iconSz > 0 Then
3423             _listCustom.SmallImageList.ImageSize = New Size(_iconSz, _iconSz)
3424         End If
3425
3426         Dim dispOrder(7) As Integer
3427         If Not startup Then
3428             For i As Integer = 0 To _curList.Columns.Count - 1
3429                 For j As Integer = 0 To _curList.Columns.Count - 1
3430                     If _curList.Columns(j).DisplayIndex = i Then
3431                         dispOrder(i) = j
3432                         Exit For
3433                     End If
3434                 Next
3435             Next
3436             For i As Integer = 0 To _curList.Columns.Count - 1
3437                 _listCustom.Columns(i).Width = _curList.Columns(i).Width
3438                 _listCustom.Columns(dispOrder(i)).DisplayIndex = i
3439             Next
3440         Else
3441             If _iconCol Then
3442                 _listCustom.Columns(0).Width = _cfgLocal.Width1
3443                 _listCustom.Columns(1).Width = _cfgLocal.Width3
3444                 _listCustom.Columns(0).DisplayIndex = 0
3445                 _listCustom.Columns(1).DisplayIndex = 1
3446             Else
3447                 For i As Integer = 0 To 7
3448                     If _cfgLocal.DisplayIndex1 = i Then
3449                         dispOrder(i) = 0
3450                     ElseIf _cfgLocal.DisplayIndex2 = i Then
3451                         dispOrder(i) = 1
3452                     ElseIf _cfgLocal.DisplayIndex3 = i Then
3453                         dispOrder(i) = 2
3454                     ElseIf _cfgLocal.DisplayIndex4 = i Then
3455                         dispOrder(i) = 3
3456                     ElseIf _cfgLocal.DisplayIndex5 = i Then
3457                         dispOrder(i) = 4
3458                     ElseIf _cfgLocal.DisplayIndex6 = i Then
3459                         dispOrder(i) = 5
3460                     ElseIf _cfgLocal.DisplayIndex7 = i Then
3461                         dispOrder(i) = 6
3462                     ElseIf _cfgLocal.DisplayIndex8 = i Then
3463                         dispOrder(i) = 7
3464                     End If
3465                 Next
3466                 _listCustom.Columns(0).Width = _cfgLocal.Width1
3467                 _listCustom.Columns(1).Width = _cfgLocal.Width2
3468                 _listCustom.Columns(2).Width = _cfgLocal.Width3
3469                 _listCustom.Columns(3).Width = _cfgLocal.Width4
3470                 _listCustom.Columns(4).Width = _cfgLocal.Width5
3471                 _listCustom.Columns(5).Width = _cfgLocal.Width6
3472                 _listCustom.Columns(6).Width = _cfgLocal.Width7
3473                 _listCustom.Columns(7).Width = _cfgLocal.Width8
3474                 For i As Integer = 0 To 7
3475                     _listCustom.Columns(dispOrder(i)).DisplayIndex = i
3476                 Next
3477             End If
3478         End If
3479
3480         If tabType = TabUsageType.PublicSearch Then pnl.ResumeLayout(False)
3481
3482         _tabPage.ResumeLayout(False)
3483
3484         Me.SplitContainer1.Panel1.ResumeLayout(False)
3485         Me.SplitContainer1.Panel2.ResumeLayout(False)
3486         Me.SplitContainer1.ResumeLayout(False)
3487         Me.ListTab.ResumeLayout(False)
3488         Me.ResumeLayout(False)
3489         Me.PerformLayout()
3490         _tabPage.Tag = _listCustom
3491         Return True
3492     End Function
3493
3494     Public Function RemoveSpecifiedTab(ByVal TabName As String) As Boolean
3495         Dim idx As Integer = 0
3496         For idx = 0 To ListTab.TabPages.Count - 1
3497             If ListTab.TabPages(idx).Text = TabName Then Exit For
3498         Next
3499
3500         If _statuses.IsDefaultTab(TabName) Then Return False
3501
3502         Dim tmp As String = String.Format(My.Resources.RemoveSpecifiedTabText1, Environment.NewLine)
3503         If MessageBox.Show(tmp, TabName + " " + My.Resources.RemoveSpecifiedTabText2, _
3504                          MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Cancel Then
3505             Return False
3506         End If
3507
3508         SetListProperty()   '他のタブに列幅等を反映
3509
3510         Dim tabType As TabUsageType = _statuses.Tabs(TabName).TabType
3511
3512         'オブジェクトインスタンスの削除
3513         Me.SplitContainer1.Panel1.SuspendLayout()
3514         Me.SplitContainer1.Panel2.SuspendLayout()
3515         Me.SplitContainer1.SuspendLayout()
3516         Me.ListTab.SuspendLayout()
3517         Me.SuspendLayout()
3518
3519         Dim _tabPage As TabPage = ListTab.TabPages(idx)
3520         Dim _listCustom As DetailsListView = DirectCast(_tabPage.Tag, DetailsListView)
3521         _tabPage.Tag = Nothing
3522
3523         _tabPage.SuspendLayout()
3524
3525         Me.ListTab.Controls.Remove(_tabPage)
3526
3527         Dim pnl As Control = Nothing
3528         If tabType = TabUsageType.PublicSearch Then
3529             pnl = _tabPage.Controls("panelSearch")
3530             For Each ctrl As Control In pnl.Controls
3531                 If ctrl.Name = "buttonSearch" Then
3532                     RemoveHandler ctrl.Click, AddressOf SearchButton_Click
3533                 End If
3534                 RemoveHandler ctrl.Enter, AddressOf SearchControls_Enter
3535                 RemoveHandler ctrl.Leave, AddressOf SearchControls_Leave
3536                 pnl.Controls.Remove(ctrl)
3537                 ctrl.Dispose()
3538             Next
3539             _tabPage.Controls.Remove(pnl)
3540         End If
3541
3542         _tabPage.Controls.Remove(_listCustom)
3543         _listCustom.Columns.Clear()
3544         _listCustom.ContextMenuStrip = Nothing
3545
3546         RemoveHandler _listCustom.SelectedIndexChanged, AddressOf MyList_SelectedIndexChanged
3547         RemoveHandler _listCustom.MouseDoubleClick, AddressOf MyList_MouseDoubleClick
3548         RemoveHandler _listCustom.ColumnClick, AddressOf MyList_ColumnClick
3549         RemoveHandler _listCustom.DrawColumnHeader, AddressOf MyList_DrawColumnHeader
3550         RemoveHandler _listCustom.DragDrop, AddressOf TweenMain_DragDrop
3551         RemoveHandler _listCustom.DragOver, AddressOf TweenMain_DragOver
3552         RemoveHandler _listCustom.DrawItem, AddressOf MyList_DrawItem
3553         RemoveHandler _listCustom.MouseClick, AddressOf MyList_MouseClick
3554         RemoveHandler _listCustom.ColumnReordered, AddressOf MyList_ColumnReordered
3555         RemoveHandler _listCustom.ColumnWidthChanged, AddressOf MyList_ColumnWidthChanged
3556         RemoveHandler _listCustom.CacheVirtualItems, AddressOf MyList_CacheVirtualItems
3557         RemoveHandler _listCustom.RetrieveVirtualItem, AddressOf MyList_RetrieveVirtualItem
3558         RemoveHandler _listCustom.DrawSubItem, AddressOf MyList_DrawSubItem
3559         RemoveHandler _listCustom.HScrolled, AddressOf MyList_HScrolled
3560
3561         TabDialog.RemoveTab(TabName)
3562
3563         _listCustom.SmallImageList = Nothing
3564         _listCustom.ListViewItemSorter = Nothing
3565
3566         'キャッシュのクリア
3567         If _curTab.Equals(_tabPage) Then
3568             _curTab = Nothing
3569             _curItemIndex = -1
3570             _curList = Nothing
3571             _curPost = Nothing
3572         End If
3573         _itemCache = Nothing
3574         _itemCacheIndex = -1
3575         _postCache = Nothing
3576
3577         _tabPage.ResumeLayout(False)
3578
3579         Me.SplitContainer1.Panel1.ResumeLayout(False)
3580         Me.SplitContainer1.Panel2.ResumeLayout(False)
3581         Me.SplitContainer1.ResumeLayout(False)
3582         Me.ListTab.ResumeLayout(False)
3583         Me.ResumeLayout(False)
3584         Me.PerformLayout()
3585
3586         _tabPage.Dispose()
3587         _listCustom.Dispose()
3588         _statuses.RemoveTab(TabName)
3589
3590         For Each tp As TabPage In ListTab.TabPages
3591             Dim lst As DetailsListView = DirectCast(tp.Tag, DetailsListView)
3592             If lst.VirtualListSize <> _statuses.Tabs(tp.Text).AllCount Then
3593                 lst.VirtualListSize = _statuses.Tabs(tp.Text).AllCount
3594             End If
3595         Next
3596         Return True
3597     End Function
3598
3599     Private Sub ListTab_Deselected(ByVal sender As Object, ByVal e As System.Windows.Forms.TabControlEventArgs) Handles ListTab.Deselected
3600         _itemCache = Nothing
3601         _itemCacheIndex = -1
3602         _postCache = Nothing
3603     End Sub
3604
3605     Private Sub ListTab_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListTab.MouseMove
3606         'タブのD&D
3607         Dim cpos As New Point(e.X, e.Y)
3608
3609         If e.Button = Windows.Forms.MouseButtons.Left AndAlso _tabDrag Then
3610             Dim tn As String = ""
3611             For i As Integer = 0 To ListTab.TabPages.Count - 1
3612                 Dim rect As Rectangle = ListTab.GetTabRect(i)
3613                 If rect.Left <= cpos.X AndAlso cpos.X <= rect.Right AndAlso _
3614                    rect.Top <= cpos.Y AndAlso cpos.Y <= rect.Bottom Then
3615                     tn = ListTab.TabPages(i).Text
3616                     Exit For
3617                 End If
3618             Next
3619
3620             If tn = "" Then Exit Sub
3621
3622             For Each tb As TabPage In ListTab.TabPages
3623                 If tb.Text = tn Then
3624                     ListTab.DoDragDrop(tb, DragDropEffects.All)
3625                     Exit For
3626                 End If
3627             Next
3628         Else
3629             _tabDrag = False
3630         End If
3631
3632         For i As Integer = 0 To ListTab.TabPages.Count - 1
3633             Dim rect As Rectangle = ListTab.GetTabRect(i)
3634             If rect.Left <= cpos.X And cpos.X <= rect.Right And _
3635                rect.Top <= cpos.Y And cpos.Y <= rect.Bottom Then
3636                 _rclickTabName = ListTab.TabPages(i).Text
3637                 Exit For
3638             End If
3639         Next
3640     End Sub
3641
3642     Private Sub ListTab_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListTab.SelectedIndexChanged
3643         '_curList.Refresh()
3644         DispSelectedPost()
3645         SetMainWindowTitle()
3646         SetStatusLabelUrl()
3647         If ListTab.Focused OrElse DirectCast(ListTab.SelectedTab.Tag, Control).Focused Then Me.Tag = ListTab.Tag
3648         TabMenuControl(ListTab.SelectedTab.Text)
3649     End Sub
3650
3651     Private Sub SetListProperty()
3652         '削除などで見つからない場合は処理せず
3653         If _curList Is Nothing Then Exit Sub
3654         If Not _isColumnChanged Then Exit Sub
3655
3656         Dim dispOrder(_curList.Columns.Count - 1) As Integer
3657         For i As Integer = 0 To _curList.Columns.Count - 1
3658             For j As Integer = 0 To _curList.Columns.Count - 1
3659                 If _curList.Columns(j).DisplayIndex = i Then
3660                     dispOrder(i) = j
3661                     Exit For
3662                 End If
3663             Next
3664         Next
3665
3666         '列幅、列並びを他のタブに設定
3667         For Each tb As TabPage In ListTab.TabPages
3668             If Not tb.Equals(_curTab) Then
3669                 If tb.Tag IsNot Nothing AndAlso tb.Controls.Count > 0 Then
3670                     Dim lst As DetailsListView = DirectCast(tb.Tag, DetailsListView)
3671                     For i As Integer = 0 To lst.Columns.Count - 1
3672                         lst.Columns(dispOrder(i)).DisplayIndex = i
3673                         lst.Columns(i).Width = _curList.Columns(i).Width
3674                     Next
3675                 End If
3676             End If
3677         Next
3678
3679         _isColumnChanged = False
3680     End Sub
3681
3682     Private Sub PostBrowser_StatusTextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles PostBrowser.StatusTextChanged
3683         If PostBrowser.StatusText.StartsWith("http") OrElse PostBrowser.StatusText.StartsWith("ftp") _
3684                 OrElse PostBrowser.StatusText.StartsWith("data") Then
3685             StatusLabelUrl.Text = PostBrowser.StatusText.Replace("&", "&&")
3686         End If
3687         If PostBrowser.StatusText = "" Then
3688             SetStatusLabelUrl()
3689         End If
3690     End Sub
3691
3692     Private Sub StatusText_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles StatusText.KeyPress
3693         If e.KeyChar = "@" Then
3694             If Not SettingDialog.UseAtIdSupplement Then Exit Sub
3695             '@マーク
3696             ShowSuplDialog(StatusText, AtIdSupl)
3697             e.Handled = True
3698         ElseIf e.KeyChar = "#" Then
3699             If Not SettingDialog.UseHashSupplement Then Exit Sub
3700             ShowSuplDialog(StatusText, HashSupl)
3701             e.Handled = True
3702         End If
3703     End Sub
3704
3705     Public Overloads Sub ShowSuplDialog(ByVal owner As TextBox, ByVal dialog As AtIdSupplement)
3706         ShowSuplDialog(owner, dialog, 0, "")
3707     End Sub
3708
3709     Public Overloads Sub ShowSuplDialog(ByVal owner As TextBox, ByVal dialog As AtIdSupplement, ByVal offset As Integer)
3710         ShowSuplDialog(owner, dialog, offset, "")
3711     End Sub
3712
3713     Public Overloads Sub ShowSuplDialog(ByVal owner As TextBox, ByVal dialog As AtIdSupplement, ByVal offset As Integer, ByVal startswith As String)
3714         dialog.StartsWith = startswith
3715         If dialog.Visible Then
3716             dialog.Focus()
3717         Else
3718             dialog.ShowDialog()
3719         End If
3720         Me.TopMost = SettingDialog.AlwaysTop
3721         Dim selStart As Integer = owner.SelectionStart
3722         Dim fHalf As String = ""
3723         Dim eHalf As String = ""
3724         If dialog.DialogResult = Windows.Forms.DialogResult.OK Then
3725             If dialog.inputText <> "" Then
3726                 If selStart > 0 Then
3727                     fHalf = owner.Text.Substring(0, selStart - offset)
3728                 End If
3729                 If selStart < owner.Text.Length Then
3730                     eHalf = owner.Text.Substring(selStart)
3731                 End If
3732                 owner.Text = fHalf + dialog.inputText + eHalf
3733                 owner.SelectionStart = selStart + dialog.inputText.Length
3734             End If
3735         Else
3736             If selStart > 0 Then
3737                 fHalf = owner.Text.Substring(0, selStart)
3738             End If
3739             If selStart < owner.Text.Length Then
3740                 eHalf = owner.Text.Substring(selStart)
3741             End If
3742             owner.Text = fHalf + eHalf
3743             If selStart > 0 Then
3744                 owner.SelectionStart = selStart
3745             End If
3746         End If
3747         owner.Focus()
3748     End Sub
3749
3750     Private Sub StatusText_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles StatusText.KeyUp
3751         'スペースキーで未読ジャンプ
3752         If Not e.Alt AndAlso Not e.Control AndAlso Not e.Shift Then
3753             If e.KeyCode = Keys.Space OrElse e.KeyCode = Keys.ProcessKey Then
3754                 Dim isSpace As Boolean = False
3755                 For Each c As Char In StatusText.Text.ToCharArray
3756                     If c = " " OrElse c = " " Then
3757                         isSpace = True
3758                     Else
3759                         isSpace = False
3760                         Exit For
3761                     End If
3762                 Next
3763                 If isSpace Then
3764                     e.Handled = True
3765                     StatusText.Text = ""
3766                     JumpUnreadMenuItem_Click(Nothing, Nothing)
3767                 End If
3768             End If
3769         End If
3770         Me.StatusText_TextChanged(Nothing, Nothing)
3771     End Sub
3772
3773     Private Sub StatusText_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StatusText.TextChanged
3774         '文字数カウント
3775         Dim pLen As Integer = GetRestStatusCount(True, False)
3776         lblLen.Text = pLen.ToString()
3777         If pLen < 0 Then
3778             StatusText.ForeColor = Color.Red
3779         Else
3780             StatusText.ForeColor = _clInputFont
3781         End If
3782         If StatusText.Text = "" Then
3783             _reply_to_id = 0
3784             _reply_to_name = ""
3785         End If
3786     End Sub
3787
3788     Private Function GetRestStatusCount(ByVal isAuto As Boolean, ByVal isAddFooter As Boolean) As Integer
3789         '文字数カウント
3790         Dim pLen As Integer = 140 - StatusText.Text.Length
3791         If (isAuto AndAlso Not My.Computer.Keyboard.CtrlKeyDown AndAlso SettingDialog.PostShiftEnter) OrElse _
3792            (isAuto AndAlso Not My.Computer.Keyboard.ShiftKeyDown AndAlso Not SettingDialog.PostShiftEnter) OrElse _
3793            (Not isAuto AndAlso isAddFooter) Then
3794             If SettingDialog.UseRecommendStatus Then
3795                 pLen -= SettingDialog.RecommendStatusText.Length
3796             ElseIf SettingDialog.Status.Length > 0 Then
3797                 pLen -= SettingDialog.Status.Length + 1
3798             End If
3799         End If
3800         If HashMgr.UseHash <> "" Then
3801             pLen -= HashMgr.UseHash.Length + 1
3802         End If
3803         Return pLen
3804     End Function
3805
3806     Private Sub MyList_CacheVirtualItems(ByVal sender As System.Object, ByVal e As System.Windows.Forms.CacheVirtualItemsEventArgs)
3807         If _itemCache IsNot Nothing AndAlso _
3808            e.StartIndex >= _itemCacheIndex AndAlso _
3809            e.EndIndex < _itemCacheIndex + _itemCache.Length AndAlso _
3810            _curList.Equals(sender) Then
3811             'If the newly requested cache is a subset of the old cache, 
3812             'no need to rebuild everything, so do nothing.
3813             Return
3814         End If
3815
3816         'Now we need to rebuild the cache.
3817         If _curList.Equals(sender) Then CreateCache(e.StartIndex, e.EndIndex)
3818     End Sub
3819
3820     Private Sub MyList_RetrieveVirtualItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.RetrieveVirtualItemEventArgs)
3821         If _itemCache IsNot Nothing AndAlso e.ItemIndex >= _itemCacheIndex AndAlso e.ItemIndex < _itemCacheIndex + _itemCache.Length AndAlso _curList.Equals(sender) Then
3822             'A cache hit, so get the ListViewItem from the cache instead of making a new one.
3823             e.Item = _itemCache(e.ItemIndex - _itemCacheIndex)
3824         Else
3825             'A cache miss, so create a new ListViewItem and pass it back.
3826             Dim tb As TabPage = DirectCast(DirectCast(sender, Tween.TweenCustomControl.DetailsListView).Parent, TabPage)
3827             Try
3828                 e.Item = CreateItem(tb, _
3829                                     _statuses.Item(tb.Text, e.ItemIndex), _
3830                                     e.ItemIndex)
3831             Catch ex As Exception
3832                 '不正な要求に対する間に合わせの応答
3833                 Dim sitem() As String = {"", "", "", "", "", "", "", ""}
3834                 e.Item = New ImageListViewItem(sitem, "")
3835             End Try
3836         End If
3837     End Sub
3838
3839     Private Sub CreateCache(ByVal StartIndex As Integer, ByVal EndIndex As Integer)
3840         Try
3841             'キャッシュ要求(要求範囲±30を作成)
3842             StartIndex -= 30
3843             If StartIndex < 0 Then StartIndex = 0
3844             EndIndex += 30
3845             If EndIndex >= _statuses.Tabs(_curTab.Text).AllCount Then EndIndex = _statuses.Tabs(_curTab.Text).AllCount - 1
3846             _postCache = _statuses.Item(_curTab.Text, StartIndex, EndIndex) '配列で取得
3847             _itemCacheIndex = StartIndex
3848
3849             _itemCache = New ListViewItem(_postCache.Length - 1) {}
3850             For i As Integer = 0 To _postCache.Length - 1
3851                 _itemCache(i) = CreateItem(_curTab, _postCache(i), StartIndex + i)
3852             Next i
3853         Catch ex As Exception
3854             'キャッシュ要求が実データとずれるため(イベントの遅延?)
3855             _postCache = Nothing
3856             _itemCache = Nothing
3857         End Try
3858     End Sub
3859
3860     Private Function CreateItem(ByVal Tab As TabPage, ByVal Post As PostClass, ByVal Index As Integer) As ListViewItem
3861         Dim mk As String = ""
3862         If Post.IsMark Then mk += "♪"
3863         If Post.IsProtect Then mk += "Ю"
3864         If Post.InReplyToId > 0 Then mk += "⇒"
3865         Dim itm As ImageListViewItem
3866         If Post.RetweetedId = 0 Then
3867             Dim sitem() As String = {"", Post.Nickname, Post.Data, Post.PDate.ToString(SettingDialog.DateTimeFormat), Post.Name, "", mk, Post.Source}
3868             itm = New ImageListViewItem(sitem, DirectCast(Me.TIconDic, ImageDictionary), Post.ImageUrl)
3869         Else
3870             Dim sitem() As String = {"", Post.Nickname, Post.Data, Post.PDate.ToString(SettingDialog.DateTimeFormat), Post.Name + Environment.NewLine + "(RT:" + Post.RetweetedBy + ")", "", mk, Post.Source}
3871             itm = New ImageListViewItem(sitem, DirectCast(Me.TIconDic, ImageDictionary), Post.ImageUrl)
3872         End If
3873
3874         Dim read As Boolean = Post.IsRead
3875         '未読管理していなかったら既読として扱う
3876         If Not _statuses.Tabs(Tab.Text).UnreadManage OrElse _
3877            Not SettingDialog.UnreadManage Then read = True
3878         ChangeItemStyleRead(read, itm, Post, Nothing)
3879         If Tab.Equals(_curTab) Then ColorizeList(itm, Index)
3880         Return itm
3881     End Function
3882
3883     Private Sub MyList_DrawColumnHeader(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs)
3884         e.DrawDefault = True
3885     End Sub
3886
3887     Private Sub MyList_HScrolled(ByVal sender As Object, ByVal e As EventArgs)
3888         Dim listView As DetailsListView = DirectCast(sender, DetailsListView)
3889         listView.Refresh()
3890     End Sub
3891
3892     Private Sub MyList_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawListViewItemEventArgs)
3893         If e.State = 0 Then Exit Sub
3894         e.DrawDefault = False
3895         If Not e.Item.Selected Then     'e.ItemStateでうまく判定できない???
3896             Dim brs2 As SolidBrush = Nothing
3897             Select Case e.Item.BackColor
3898                 Case _clSelf
3899                     brs2 = _brsBackColorMine
3900                 Case _clAtSelf
3901                     brs2 = _brsBackColorAt
3902                 Case _clTarget
3903                     brs2 = _brsBackColorYou
3904                 Case _clAtTarget
3905                     brs2 = _brsBackColorAtYou
3906                 Case _clAtFromTarget
3907                     brs2 = _brsBackColorAtFromTarget
3908                 Case _clAtTo
3909                     brs2 = _brsBackColorAtTo
3910                 Case Else
3911                     brs2 = _brsBackColorNone
3912             End Select
3913             e.Graphics.FillRectangle(brs2, e.Bounds)
3914         Else
3915             '選択中の行
3916             If DirectCast(sender, Windows.Forms.Control).Focused Then
3917                 e.Graphics.FillRectangle(_brsHighLight, e.Bounds)
3918             Else
3919                 e.Graphics.FillRectangle(_brsDeactiveSelection, e.Bounds)
3920             End If
3921         End If
3922         If (e.State And ListViewItemStates.Focused) = ListViewItemStates.Focused Then e.DrawFocusRectangle()
3923     End Sub
3924
3925     Private Sub MyList_DrawSubItem(ByVal sender As Object, ByVal e As DrawListViewSubItemEventArgs)
3926         If e.ItemState = 0 Then Exit Sub
3927
3928         If e.ColumnIndex = 0 Then
3929             Me.DrawListViewItemIcon(e)
3930         Else
3931             'アイコン以外の列
3932             Dim rct As RectangleF = e.Bounds
3933             Dim rctB As RectangleF = e.Bounds
3934             rct.Width = e.Header.Width
3935             rctB.Width = e.Header.Width
3936             If _iconCol Then
3937                 rct.Y += e.Item.Font.Height
3938                 rct.Height -= e.Item.Font.Height
3939                 rctB.Height = e.Item.Font.Height
3940             End If
3941
3942
3943             Dim heightDiff As Integer
3944             Dim drawLineCount As Integer = Math.Max(1, Math.DivRem(CType(rct.Height, Integer), e.Item.Font.Height, heightDiff))
3945
3946             'If heightDiff > e.Item.Font.Height * 0.7 Then
3947             '    rct.Height += e.Item.Font.Height
3948             '    drawLineCount += 1
3949             'End If
3950
3951             'フォントの高さの半分を足してるのは保険。無くてもいいかも。
3952             If Not _iconCol AndAlso drawLineCount <= 1 Then
3953                 'rct.Inflate(0, CType(heightDiff / -2, Integer))
3954                 'rct.Height += CType(e.Item.Font.Height / 2, Integer)
3955             ElseIf heightDiff < e.Item.Font.Height * 0.7 Then
3956                 '最終行が70%以上欠けていたら、最終行は表示しない
3957                 'rct.Height = CType((e.Item.Font.Height * drawLineCount) + (e.Item.Font.Height / 2), Single)
3958                 rct.Height = CType((e.Item.Font.Height * drawLineCount), Single) - 1
3959             Else
3960                 drawLineCount += 1
3961             End If
3962
3963             'If Not _iconCol AndAlso drawLineCount > 1 Then
3964             '    rct.Y += CType(e.Item.Font.Height * 0.2, Single)
3965             '    If heightDiff >= e.Item.Font.Height * 0.8 Then rct.Height -= CType(e.Item.Font.Height * 0.2, Single)
3966             'End If
3967             If Not e.Item.Selected Then     'e.ItemStateでうまく判定できない???
3968                 '選択されていない行
3969                 '文字色
3970                 Dim brs As SolidBrush = Nothing
3971                 Dim flg As Boolean = False
3972                 Select Case e.Item.ForeColor
3973                     Case _clUnread
3974                         brs = _brsForeColorUnread
3975                     Case _clReaded
3976                         brs = _brsForeColorReaded
3977                     Case _clFav
3978                         brs = _brsForeColorFav
3979                     Case _clOWL
3980                         brs = _brsForeColorOWL
3981                     Case _clRetweet
3982                         brs = _brsForeColorRetweet
3983                     Case Else
3984                         brs = New SolidBrush(e.Item.ForeColor)
3985                         flg = True
3986                 End Select
3987                 If rct.Width > 0 Then
3988                     If _iconCol Then
3989                         Dim fnt As New Font(e.Item.Font, FontStyle.Bold)
3990                         'e.Graphics.DrawString(System.Environment.NewLine + e.Item.SubItems(2).Text, e.Item.Font, brs, rct, sf)
3991                         '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)
3992                         TextRenderer.DrawText(e.Graphics,
3993                                               e.Item.SubItems(2).Text,
3994                                               e.Item.Font,
3995                                               Rectangle.Round(rct),
3996                                               brs.Color,
3997                                               TextFormatFlags.WordBreak Or
3998                                               TextFormatFlags.EndEllipsis Or
3999                                               TextFormatFlags.GlyphOverhangPadding Or
4000                                               TextFormatFlags.NoPrefix)
4001                         TextRenderer.DrawText(e.Graphics,
4002                                               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 + "]",
4003                                               fnt,
4004                                               Rectangle.Round(rctB),
4005                                               brs.Color,
4006                                               TextFormatFlags.SingleLine Or
4007                                               TextFormatFlags.EndEllipsis Or
4008                                               TextFormatFlags.GlyphOverhangPadding Or
4009                                               TextFormatFlags.NoPrefix)
4010                         fnt.Dispose()
4011                     ElseIf drawLineCount = 1 Then
4012                         TextRenderer.DrawText(e.Graphics,
4013                                               e.SubItem.Text,
4014                                               e.Item.Font,
4015                                               Rectangle.Round(rct),
4016                                               brs.Color,
4017                                               TextFormatFlags.SingleLine Or
4018                                               TextFormatFlags.EndEllipsis Or
4019                                               TextFormatFlags.GlyphOverhangPadding Or
4020                                               TextFormatFlags.NoPrefix Or
4021                                               TextFormatFlags.VerticalCenter)
4022                     Else
4023                         'e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, brs, rct, sf)
4024                         TextRenderer.DrawText(e.Graphics,
4025                                               e.SubItem.Text,
4026                                               e.Item.Font,
4027                                               Rectangle.Round(rct),
4028                                               brs.Color,
4029                                               TextFormatFlags.WordBreak Or
4030                                               TextFormatFlags.EndEllipsis Or
4031                                               TextFormatFlags.GlyphOverhangPadding Or
4032                                               TextFormatFlags.NoPrefix)
4033                     End If
4034                 End If
4035                 If flg Then brs.Dispose()
4036             Else
4037                 If rct.Width > 0 Then
4038                     '選択中の行
4039                     Dim fnt As New Font(e.Item.Font, FontStyle.Bold)
4040                     If DirectCast(sender, Windows.Forms.Control).Focused Then
4041                         If _iconCol Then
4042                             'e.Graphics.DrawString(System.Environment.NewLine + e.Item.SubItems(2).Text, e.Item.Font, _brsHighLightText, rct, sf)
4043                             '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)
4044                             TextRenderer.DrawText(e.Graphics,
4045                                                   e.Item.SubItems(2).Text,
4046                                                   e.Item.Font,
4047                                                   Rectangle.Round(rct),
4048                                                   _brsHighLightText.Color,
4049                                                   TextFormatFlags.WordBreak Or
4050                                                   TextFormatFlags.EndEllipsis Or
4051                                                   TextFormatFlags.GlyphOverhangPadding Or
4052                                                   TextFormatFlags.NoPrefix)
4053                             TextRenderer.DrawText(e.Graphics,
4054                                                   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 + "]",
4055                                                   fnt,
4056                                                   Rectangle.Round(rctB),
4057                                                   _brsHighLightText.Color,
4058                                                   TextFormatFlags.SingleLine Or
4059                                                   TextFormatFlags.EndEllipsis Or
4060                                                   TextFormatFlags.GlyphOverhangPadding Or
4061                                                   TextFormatFlags.NoPrefix)
4062                         ElseIf drawLineCount = 1 Then
4063                             TextRenderer.DrawText(e.Graphics,
4064                                                   e.SubItem.Text,
4065                                                   e.Item.Font,
4066                                                   Rectangle.Round(rct),
4067                                                   _brsHighLightText.Color,
4068                                                   TextFormatFlags.SingleLine Or
4069                                                   TextFormatFlags.EndEllipsis Or
4070                                                   TextFormatFlags.GlyphOverhangPadding Or
4071                                                   TextFormatFlags.NoPrefix Or
4072                                                   TextFormatFlags.VerticalCenter)
4073                         Else
4074                             'e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, _brsHighLightText, rct, sf)
4075                             TextRenderer.DrawText(e.Graphics,
4076                                                   e.SubItem.Text,
4077                                                   e.Item.Font,
4078                                                   Rectangle.Round(rct),
4079                                                   _brsHighLightText.Color,
4080                                                   TextFormatFlags.WordBreak Or
4081                                                   TextFormatFlags.EndEllipsis Or
4082                                                   TextFormatFlags.GlyphOverhangPadding Or
4083                                                   TextFormatFlags.NoPrefix)
4084                         End If
4085                     Else
4086                         If _iconCol Then
4087                             'e.Graphics.DrawString(System.Environment.NewLine + e.Item.SubItems(2).Text, e.Item.Font, _brsForeColorUnread, rct, sf)
4088                             '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)
4089                             TextRenderer.DrawText(e.Graphics,
4090                                                   e.Item.SubItems(2).Text,
4091                                                   e.Item.Font,
4092                                                   Rectangle.Round(rct),
4093                                                   _brsForeColorUnread.Color,
4094                                                   TextFormatFlags.WordBreak Or
4095                                                   TextFormatFlags.EndEllipsis Or
4096                                                   TextFormatFlags.GlyphOverhangPadding Or
4097                                                   TextFormatFlags.NoPrefix)
4098                             TextRenderer.DrawText(e.Graphics,
4099                                                   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 + "]",
4100                                                   fnt,
4101                                                   Rectangle.Round(rctB),
4102                                                   _brsForeColorUnread.Color,
4103                                                   TextFormatFlags.SingleLine Or
4104                                                   TextFormatFlags.EndEllipsis Or
4105                                                   TextFormatFlags.GlyphOverhangPadding Or
4106                                                   TextFormatFlags.NoPrefix)
4107                         ElseIf drawLineCount = 1 Then
4108                             TextRenderer.DrawText(e.Graphics,
4109                                                   e.SubItem.Text,
4110                                                   e.Item.Font,
4111                                                   Rectangle.Round(rct),
4112                                                   _brsForeColorUnread.Color,
4113                                                   TextFormatFlags.SingleLine Or
4114                                                   TextFormatFlags.EndEllipsis Or
4115                                                   TextFormatFlags.GlyphOverhangPadding Or
4116                                                   TextFormatFlags.NoPrefix Or
4117                                                   TextFormatFlags.VerticalCenter)
4118                         Else
4119                             'e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, _brsForeColorUnread, rct, sf)
4120                             TextRenderer.DrawText(e.Graphics,
4121                                                   e.SubItem.Text,
4122                                                   e.Item.Font,
4123                                                   Rectangle.Round(rct),
4124                                                   _brsForeColorUnread.Color,
4125                                                   TextFormatFlags.WordBreak Or
4126                                                   TextFormatFlags.EndEllipsis Or
4127                                                   TextFormatFlags.GlyphOverhangPadding Or
4128                                                   TextFormatFlags.NoPrefix)
4129                         End If
4130                     End If
4131                     fnt.Dispose()
4132                 End If
4133             End If
4134         End If
4135     End Sub
4136
4137     Private Sub DrawListViewItemIcon(ByVal e As DrawListViewSubItemEventArgs)
4138         Dim item As ImageListViewItem = DirectCast(e.Item, ImageListViewItem)
4139         If item.Image IsNot Nothing Then
4140             'e.Bounds.Leftが常に0を指すから自前で計算
4141             Dim itemRect As Rectangle = item.Bounds
4142             itemRect.Width = e.Item.ListView.Columns(0).Width
4143
4144             For Each clm As ColumnHeader In e.Item.ListView.Columns
4145                 If clm.DisplayIndex < e.Item.ListView.Columns(0).DisplayIndex Then
4146                     itemRect.X += clm.Width
4147                 End If
4148             Next
4149
4150             Dim iconRect As Rectangle = Rectangle.Intersect(New Rectangle(e.Item.GetBounds(ItemBoundsPortion.Icon).Location, New Size(_iconSz, _iconSz)), itemRect)
4151             iconRect.Offset(0, CType(Math.Max(0, (itemRect.Height - _iconSz) / 2), Integer))
4152
4153             If iconRect.Width > 0 Then
4154                 e.Graphics.FillRectangle(Brushes.White, iconRect)
4155                 e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.High
4156                 e.Graphics.DrawImage(item.Image, iconRect)
4157             End If
4158         End If
4159     End Sub
4160
4161     Private Sub DoTabSearch(ByVal _word As String, _
4162                             ByVal CaseSensitive As Boolean, _
4163                             ByVal UseRegex As Boolean, _
4164                             ByVal SType As SEARCHTYPE)
4165         Dim cidx As Integer = 0
4166         Dim fnd As Boolean = False
4167         Dim toIdx As Integer
4168         Dim stp As Integer = 1
4169
4170         If _curList.VirtualListSize = 0 Then
4171             MessageBox.Show(My.Resources.DoTabSearchText2, My.Resources.DoTabSearchText3, MessageBoxButtons.OK, MessageBoxIcon.Information)
4172         End If
4173
4174         If _curList.SelectedIndices.Count > 0 Then
4175             cidx = _curList.SelectedIndices(0)
4176         End If
4177         toIdx = _curList.VirtualListSize - 1
4178
4179         Select Case SType
4180             Case SEARCHTYPE.DialogSearch    'ダイアログからの検索
4181                 If _curList.SelectedIndices.Count > 0 Then
4182                     cidx = _curList.SelectedIndices(0)
4183                 Else
4184                     cidx = 0
4185                 End If
4186             Case SEARCHTYPE.NextSearch      '次を検索
4187                 If _curList.SelectedIndices.Count > 0 Then
4188                     cidx = _curList.SelectedIndices(0) + 1
4189                     If cidx > toIdx Then cidx = toIdx
4190                 Else
4191                     cidx = 0
4192                 End If
4193             Case SEARCHTYPE.PrevSearch      '前を検索
4194                 If _curList.SelectedIndices.Count > 0 Then
4195                     cidx = _curList.SelectedIndices(0) - 1
4196                     If cidx < 0 Then cidx = 0
4197                 Else
4198                     cidx = toIdx
4199                 End If
4200                 toIdx = 0
4201                 stp = -1
4202         End Select
4203
4204         Dim regOpt As RegexOptions = RegexOptions.None
4205         Dim fndOpt As StringComparison = StringComparison.Ordinal
4206         If Not CaseSensitive Then
4207             regOpt = RegexOptions.IgnoreCase
4208             fndOpt = StringComparison.OrdinalIgnoreCase
4209         End If
4210         Try
4211 RETRY:
4212             If UseRegex Then
4213                 ' 正規表現検索
4214                 Dim _search As Regex
4215                 Try
4216                     _search = New Regex(_word)
4217                     For idx As Integer = cidx To toIdx Step stp
4218                         Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
4219                         If _search.IsMatch(post.Nickname, regOpt) _
4220                             OrElse _search.IsMatch(post.Data, regOpt) _
4221                             OrElse _search.IsMatch(post.Name, regOpt) _
4222                         Then
4223                             SelectListItem(_curList, idx)
4224                             _curList.EnsureVisible(idx)
4225                             Exit Sub
4226                         End If
4227                     Next
4228                 Catch ex As ArgumentException
4229                     MsgBox(My.Resources.DoTabSearchText1, MsgBoxStyle.Critical)
4230                     Exit Sub
4231                 End Try
4232             Else
4233                 ' 通常検索
4234                 For idx As Integer = cidx To toIdx Step stp
4235                     Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
4236                     If post.Nickname.IndexOf(_word, fndOpt) > -1 _
4237                         OrElse post.Data.IndexOf(_word, fndOpt) > -1 _
4238                         OrElse post.Name.IndexOf(_word, fndOpt) > -1 _
4239                     Then
4240                         SelectListItem(_curList, idx)
4241                         _curList.EnsureVisible(idx)
4242                         Exit Sub
4243                     End If
4244                 Next
4245             End If
4246
4247             If Not fnd Then
4248                 Select Case SType
4249                     Case SEARCHTYPE.DialogSearch, SEARCHTYPE.NextSearch
4250                         toIdx = cidx
4251                         cidx = 0
4252                     Case SEARCHTYPE.PrevSearch
4253                         toIdx = cidx
4254                         cidx = _curList.Items.Count - 1
4255                 End Select
4256                 fnd = True
4257                 GoTo RETRY
4258             End If
4259         Catch ex As ArgumentOutOfRangeException
4260
4261         End Try
4262         MessageBox.Show(My.Resources.DoTabSearchText2, My.Resources.DoTabSearchText3, MessageBoxButtons.OK, MessageBoxIcon.Information)
4263     End Sub
4264
4265     Private Sub MenuItemSubSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemSubSearch.Click
4266         '検索メニュー
4267         SearchDialog.Owner = Me
4268         If SearchDialog.ShowDialog() = Windows.Forms.DialogResult.Cancel Then
4269             Me.TopMost = SettingDialog.AlwaysTop
4270             Exit Sub
4271         End If
4272         Me.TopMost = SettingDialog.AlwaysTop
4273
4274         If SearchDialog.SWord <> "" Then
4275             DoTabSearch(SearchDialog.SWord, _
4276                         SearchDialog.CheckCaseSensitive, _
4277                         SearchDialog.CheckRegex, _
4278                         SEARCHTYPE.DialogSearch)
4279         End If
4280     End Sub
4281
4282     Private Sub MenuItemSearchNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemSearchNext.Click
4283         '次を検索
4284         If SearchDialog.SWord = "" Then
4285             If SearchDialog.ShowDialog() = Windows.Forms.DialogResult.Cancel Then
4286                 Me.TopMost = SettingDialog.AlwaysTop
4287                 Exit Sub
4288             End If
4289             Me.TopMost = SettingDialog.AlwaysTop
4290             If SearchDialog.SWord = "" Then Exit Sub
4291
4292             DoTabSearch(SearchDialog.SWord, _
4293                         SearchDialog.CheckCaseSensitive, _
4294                         SearchDialog.CheckRegex, _
4295                         SEARCHTYPE.DialogSearch)
4296         Else
4297             DoTabSearch(SearchDialog.SWord, _
4298                         SearchDialog.CheckCaseSensitive, _
4299                         SearchDialog.CheckRegex, _
4300                         SEARCHTYPE.NextSearch)
4301         End If
4302     End Sub
4303
4304     Private Sub MenuItemSearchPrev_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemSearchPrev.Click
4305         '前を検索
4306         If SearchDialog.SWord = "" Then
4307             If SearchDialog.ShowDialog() = Windows.Forms.DialogResult.Cancel Then
4308                 Me.TopMost = SettingDialog.AlwaysTop
4309                 Exit Sub
4310             End If
4311             Me.TopMost = SettingDialog.AlwaysTop
4312             If SearchDialog.SWord = "" Then Exit Sub
4313         End If
4314
4315         DoTabSearch(SearchDialog.SWord, _
4316                     SearchDialog.CheckCaseSensitive, _
4317                     SearchDialog.CheckRegex, _
4318                     SEARCHTYPE.PrevSearch)
4319     End Sub
4320
4321     Private Sub AboutMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AboutMenuItem.Click
4322         TweenAboutBox.ShowDialog()
4323         Me.TopMost = SettingDialog.AlwaysTop
4324     End Sub
4325
4326     Private Sub JumpUnreadMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles JumpUnreadMenuItem.Click, JumpReadOpMenuItem.Click
4327         Dim bgnIdx As Integer = ListTab.TabPages.IndexOf(_curTab)
4328         Dim idx As Integer = -1
4329         Dim lst As DetailsListView = Nothing
4330
4331         If ImageSelectionPanel.Enabled Then
4332             Exit Sub
4333         End If
4334
4335         '現在タブから最終タブまで探索
4336         For i As Integer = bgnIdx To ListTab.TabPages.Count - 1
4337             '未読Index取得
4338             idx = _statuses.GetOldestUnreadId(ListTab.TabPages(i).Text)
4339             If idx > -1 Then
4340                 ListTab.SelectedIndex = i
4341                 lst = DirectCast(ListTab.TabPages(i).Tag, DetailsListView)
4342                 '_curTab = ListTab.TabPages(i)
4343                 Exit For
4344             End If
4345         Next
4346
4347         '未読みつからず&現在タブが先頭ではなかったら、先頭タブから現在タブの手前まで探索
4348         If idx = -1 AndAlso bgnIdx > 0 Then
4349             For i As Integer = 0 To bgnIdx - 1
4350                 idx = _statuses.GetOldestUnreadId(ListTab.TabPages(i).Text)
4351                 If idx > -1 Then
4352                     ListTab.SelectedIndex = i
4353                     lst = DirectCast(ListTab.TabPages(i).Tag, DetailsListView)
4354                     '_curTab = ListTab.TabPages(i)
4355                     Exit For
4356                 End If
4357             Next
4358         End If
4359
4360         '全部調べたが未読見つからず→先頭タブの最新発言へ
4361         If idx = -1 Then
4362             ListTab.SelectedIndex = 0
4363             lst = DirectCast(ListTab.TabPages(0).Tag, DetailsListView)
4364             '_curTab = ListTab.TabPages(0)
4365             If _statuses.SortOrder = SortOrder.Ascending Then
4366                 idx = lst.VirtualListSize - 1
4367             Else
4368                 idx = 0
4369             End If
4370         End If
4371
4372         If lst.VirtualListSize > 0 AndAlso idx > -1 AndAlso lst.VirtualListSize > idx Then
4373             SelectListItem(lst, idx)
4374             If _statuses.SortMode = IdComparerClass.ComparerMode.Id Then
4375                 If _statuses.SortOrder = SortOrder.Ascending AndAlso lst.Items(idx).Position.Y > lst.ClientSize.Height - _iconSz - 10 OrElse _
4376                    _statuses.SortOrder = SortOrder.Descending AndAlso lst.Items(idx).Position.Y < _iconSz + 10 Then
4377                     MoveTop()
4378                 Else
4379                     lst.EnsureVisible(idx)
4380                 End If
4381             Else
4382                 lst.EnsureVisible(idx)
4383             End If
4384         End If
4385         lst.Focus()
4386     End Sub
4387
4388     Private Sub StatusOpenMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StatusOpenMenuItem.Click, OpenStatusOpMenuItem.Click
4389         If _curList.SelectedIndices.Count > 0 AndAlso _statuses.Tabs(_curTab.Text).TabType <> TabUsageType.DirectMessage Then
4390             Dim post As PostClass = _statuses.Item(_curTab.Text, _curList.SelectedIndices(0))
4391             If post.RetweetedId = 0 Then
4392                 OpenUriAsync("http://twitter.com/" + post.Name + "/status/" + post.Id.ToString)
4393             Else
4394                 OpenUriAsync("http://twitter.com/" + post.Name + "/status/" + post.RetweetedId.ToString)
4395             End If
4396         End If
4397     End Sub
4398
4399     Private Sub FavorareMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles FavorareMenuItem.Click, OpenFavotterOpMenuItem.Click
4400         If _curList.SelectedIndices.Count > 0 Then
4401             Dim post As PostClass = _statuses.Item(_curTab.Text, _curList.SelectedIndices(0))
4402             OpenUriAsync(My.Resources.FavstarUrl + "users/" + post.Name + "/recent")
4403         End If
4404     End Sub
4405
4406     Private Sub VerUpMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VerUpMenuItem.Click
4407         CheckNewVersion()
4408     End Sub
4409
4410     Private Sub RunTweenUp()
4411
4412         Dim pinfo As New ProcessStartInfo
4413         pinfo.UseShellExecute = True
4414         pinfo.WorkingDirectory = Application.StartupPath
4415         pinfo.FileName = Path.Combine(Application.StartupPath(), "TweenUp.exe")
4416         Try
4417             Process.Start(pinfo)
4418         Catch ex As Exception
4419             MessageBox.Show("Failed to execute TweenUp.exe.")
4420         End Try
4421     End Sub
4422
4423     Private Sub CheckNewVersion(Optional ByVal startup As Boolean = False)
4424         Dim retMsg As String = ""
4425         Dim strVer As String = ""
4426         Dim strDetail As String = ""
4427         Dim forceUpdate As Boolean = My.Computer.Keyboard.ShiftKeyDown
4428
4429         Try
4430             retMsg = tw.GetVersionInfo()
4431         Catch ex As Exception
4432             StatusLabel.Text = My.Resources.CheckNewVersionText9
4433             If Not startup Then MessageBox.Show(My.Resources.CheckNewVersionText10, My.Resources.CheckNewVersionText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2)
4434             Exit Sub
4435         End Try
4436         If retMsg.Length > 0 Then
4437             strVer = retMsg.Substring(0, 4)
4438             If retMsg.Length > 4 Then
4439                 strDetail = retMsg.Substring(5).Trim
4440             End If
4441             If fileVersion <> "" AndAlso strVer.CompareTo(fileVersion.Replace(".", "")) > 0 Then
4442                 Dim tmp As String = String.Format(My.Resources.CheckNewVersionText3, strVer)
4443                 Using dialogAsShieldicon As New DialogAsShieldIcon
4444                     If dialogAsShieldicon.Show(tmp, strDetail, My.Resources.CheckNewVersionText1, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
4445                         retMsg = tw.GetTweenBinary(strVer)
4446                         If retMsg.Length = 0 Then
4447                             RunTweenUp()
4448                             _endingFlag = True
4449                             dialogAsShieldicon.Dispose()
4450                             Me.Close()
4451                             Exit Sub
4452                         Else
4453                             If Not startup Then MessageBox.Show(My.Resources.CheckNewVersionText5 + System.Environment.NewLine + retMsg, My.Resources.CheckNewVersionText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
4454                         End If
4455                     End If
4456                     dialogAsShieldicon.Dispose()
4457                 End Using
4458             Else
4459                 If forceUpdate Then
4460                     Dim tmp As String = String.Format(My.Resources.CheckNewVersionText6, strVer)
4461                     Using dialogAsShieldicon As New DialogAsShieldIcon
4462                         If dialogAsShieldicon.Show(tmp, strDetail, My.Resources.CheckNewVersionText1, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
4463                             retMsg = tw.GetTweenBinary(strVer)
4464                             If retMsg.Length = 0 Then
4465                                 RunTweenUp()
4466                                 _endingFlag = True
4467                                 dialogAsShieldicon.Dispose()
4468                                 Me.Close()
4469                                 Exit Sub
4470                             Else
4471                                 If Not startup Then MessageBox.Show(My.Resources.CheckNewVersionText5 + System.Environment.NewLine + retMsg, My.Resources.CheckNewVersionText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
4472                             End If
4473                         End If
4474                         dialogAsShieldicon.Dispose()
4475                     End Using
4476                 ElseIf Not startup Then
4477                     MessageBox.Show(My.Resources.CheckNewVersionText7 + fileVersion.Replace(".", "") + My.Resources.CheckNewVersionText8 + strVer, My.Resources.CheckNewVersionText2, MessageBoxButtons.OK, MessageBoxIcon.Information)
4478                 End If
4479             End If
4480         Else
4481             StatusLabel.Text = My.Resources.CheckNewVersionText9
4482             If Not startup Then MessageBox.Show(My.Resources.CheckNewVersionText10, My.Resources.CheckNewVersionText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
4483         End If
4484     End Sub
4485
4486     Private Sub Colorize()
4487         _colorize = False
4488         DispSelectedPost()
4489         '件数関連の場合、タイトル即時書き換え
4490         If SettingDialog.DispLatestPost <> DispTitleEnum.None AndAlso _
4491            SettingDialog.DispLatestPost <> DispTitleEnum.Post AndAlso _
4492            SettingDialog.DispLatestPost <> DispTitleEnum.Ver AndAlso _
4493            SettingDialog.DispLatestPost <> DispTitleEnum.OwnStatus Then
4494             SetMainWindowTitle()
4495         End If
4496         If Not StatusLabelUrl.Text.StartsWith("http") Then SetStatusLabelUrl()
4497         For Each tb As TabPage In ListTab.TabPages
4498             If _statuses.Tabs(tb.Text).UnreadCount = 0 Then
4499                 If SettingDialog.TabIconDisp Then
4500                     If tb.ImageIndex = 0 Then tb.ImageIndex = -1
4501                 End If
4502             End If
4503         Next
4504         If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
4505     End Sub
4506
4507     Public Function createDetailHtml(ByVal orgdata As String) As String
4508         Return detailHtmlFormatHeader + orgdata + detailHtmlFormatFooter
4509     End Function
4510
4511     Private Sub DispSelectedPost()
4512
4513         If _curList.SelectedIndices.Count = 0 OrElse _curPost Is Nothing Then Exit Sub
4514
4515         Dim dTxt As String = createDetailHtml(_curPost.OriginalData)
4516         If _curPost.IsDm Then
4517             SourceLinkLabel.Tag = Nothing
4518             SourceLinkLabel.Text = ""
4519             'SourceLinkLabel.Visible = False
4520         Else
4521             Dim mc As Match = Regex.Match(_curPost.SourceHtml, "<a href=""(?<sourceurl>.+?)""")
4522             If mc.Success Then
4523                 Dim src As String = mc.Groups("sourceurl").Value
4524                 SourceLinkLabel.Tag = mc.Groups("sourceurl").Value
4525                 mc = Regex.Match(src, "^https?://")
4526                 If Not mc.Success Then
4527                     src = src.Insert(0, "http://twitter.com")
4528                 End If
4529                 SourceLinkLabel.Tag = src
4530             Else
4531                 SourceLinkLabel.Tag = Nothing
4532             End If
4533             If String.IsNullOrEmpty(_curPost.Source) Then
4534                 SourceLinkLabel.Text = ""
4535                 'SourceLinkLabel.Visible = False
4536             Else
4537                 SourceLinkLabel.Text = "via " + _curPost.Source
4538                 'SourceLinkLabel.Visible = True
4539             End If
4540         End If
4541
4542         If _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage AndAlso Not _curPost.IsOwl Then
4543             NameLabel.Text = "DM TO -> "
4544         ElseIf _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage Then
4545             NameLabel.Text = "DM FROM <- "
4546         Else
4547             NameLabel.Text = ""
4548         End If
4549         NameLabel.Text += _curPost.Name + "/" + _curPost.Nickname
4550         NameLabel.Tag = _curPost.Name
4551         If Not String.IsNullOrEmpty(_curPost.RetweetedBy) Then
4552             NameLabel.Text += " (RT:" + _curPost.RetweetedBy + ")"
4553         End If
4554         If UserPicture.Image IsNot Nothing Then UserPicture.Image.Dispose()
4555         If Not String.IsNullOrEmpty(_curPost.ImageUrl) AndAlso TIconDic.ContainsKey(_curPost.ImageUrl) Then
4556             UserPicture.Image = TIconDic(_curPost.ImageUrl)
4557
4558             'Dim dummy As Image = DirectCast(TIconDic, ImageDictionary)(_curPost.ImageUrl, Sub(getImg)
4559             '                                                                                  If img IsNot Nothing Then img.Dispose()
4560             '                                                                                  If getImg Is Nothing Then Exit Sub
4561             '                                                                                  img = DirectCast(getImg.Clone(), Image)
4562             '                                                                                  Me.Invoke(Sub()
4563             '                                                                                                Me.UserPicture.Image = img
4564             '                                                                                            End Sub)
4565             '                                                                              End Sub)
4566         Else
4567             UserPicture.Image = Nothing
4568         End If
4569
4570         NameLabel.ForeColor = System.Drawing.SystemColors.ControlText
4571         DateTimeLabel.Text = _curPost.PDate.ToString()
4572         If _curPost.IsOwl AndAlso (SettingDialog.OneWayLove OrElse _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage) Then NameLabel.ForeColor = _clOWL
4573         If _curPost.RetweetedId > 0 Then NameLabel.ForeColor = _clRetweet
4574         If _curPost.IsFav Then NameLabel.ForeColor = _clFav
4575
4576         If DumpPostClassToolStripMenuItem.Checked Then
4577             Dim sb As New StringBuilder(512)
4578
4579             sb.Append("-----Start PostClass Dump<br>")
4580             sb.AppendFormat("Data           : {0}<br>", _curPost.Data)
4581             sb.AppendFormat("(PlainText)    : <xmp>{0}</xmp><br>", _curPost.Data)
4582             sb.AppendFormat("Id             : {0}<br>", _curPost.Id.ToString)
4583             'sb.AppendFormat("ImageIndex     : {0}<br>", _curPost.ImageIndex.ToString)
4584             sb.AppendFormat("ImageUrl       : {0}<br>", _curPost.ImageUrl)
4585             sb.AppendFormat("InReplyToId    : {0}<br>", _curPost.InReplyToId.ToString)
4586             sb.AppendFormat("InReplyToUser  : {0}<br>", _curPost.InReplyToUser)
4587             sb.AppendFormat("IsDM           : {0}<br>", _curPost.IsDm.ToString)
4588             sb.AppendFormat("IsFav          : {0}<br>", _curPost.IsFav.ToString)
4589             sb.AppendFormat("IsMark         : {0}<br>", _curPost.IsMark.ToString)
4590             sb.AppendFormat("IsMe           : {0}<br>", _curPost.IsMe.ToString)
4591             sb.AppendFormat("IsOwl          : {0}<br>", _curPost.IsOwl.ToString)
4592             sb.AppendFormat("IsProtect      : {0}<br>", _curPost.IsProtect.ToString)
4593             sb.AppendFormat("IsRead         : {0}<br>", _curPost.IsRead.ToString)
4594             sb.AppendFormat("IsReply        : {0}<br>", _curPost.IsReply.ToString)
4595
4596             For Each nm As String In _curPost.ReplyToList
4597                 sb.AppendFormat("ReplyToList    : {0}<br>", nm)
4598             Next
4599
4600             sb.AppendFormat("Name           : {0}<br>", _curPost.Name)
4601             sb.AppendFormat("NickName       : {0}<br>", _curPost.Nickname)
4602             sb.AppendFormat("OriginalData   : {0}<br>", _curPost.OriginalData)
4603             sb.AppendFormat("(PlainText)    : <xmp>{0}</xmp><br>", _curPost.OriginalData)
4604             sb.AppendFormat("PDate          : {0}<br>", _curPost.PDate.ToString)
4605             sb.AppendFormat("Source         : {0}<br>", _curPost.Source)
4606             sb.AppendFormat("Uid            : {0}<br>", _curPost.Uid)
4607             sb.AppendFormat("FilterHit      : {0}<br>", _curPost.FilterHit)
4608             sb.AppendFormat("RetweetedBy    : {0}<br>", _curPost.RetweetedBy)
4609             sb.AppendFormat("RetweetedId    : {0}<br>", _curPost.RetweetedId)
4610             sb.AppendFormat("SearchTabName  : {0}<br>", _curPost.RelTabName)
4611             sb.Append("-----End PostClass Dump<br>")
4612
4613             PostBrowser.Visible = False
4614             PostBrowser.DocumentText = detailHtmlFormatHeader + sb.ToString + detailHtmlFormatFooter
4615             PostBrowser.Visible = True
4616         Else
4617             Try
4618                 If PostBrowser.DocumentText <> dTxt Then
4619                     PostBrowser.Visible = False
4620                     PostBrowser.DocumentText = dTxt
4621                     Dim lnks As New List(Of String)
4622                     For Each lnk As Match In Regex.Matches(dTxt, "<a target=""_self"" href=""(?<url>http[^""]+)""", RegexOptions.IgnoreCase)
4623                         lnks.Add(lnk.Result("${url}"))
4624                     Next
4625                     Thumbnail.thumbnail(_curPost.Id, lnks)
4626                 End If
4627             Catch ex As System.Runtime.InteropServices.COMException
4628                 '原因不明
4629             Finally
4630                 PostBrowser.Visible = True
4631             End Try
4632         End If
4633     End Sub
4634
4635     Private Sub MatomeMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MatomeMenuItem.Click
4636         OpenUriAsync("http://sourceforge.jp/projects/tween/wiki/FrontPage")
4637     End Sub
4638
4639     Private Sub ShortcutKeyListMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShortcutKeyListMenuItem.Click
4640         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")
4641     End Sub
4642
4643     Private Sub ListTab_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles ListTab.KeyDown
4644         If ListTab.SelectedTab IsNot Nothing Then
4645             If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.PublicSearch Then
4646                 Dim pnl As Control = ListTab.SelectedTab.Controls("panelSearch")
4647                 If pnl.Controls("comboSearch").Focused OrElse _
4648                    pnl.Controls("comboLang").Focused OrElse _
4649                    pnl.Controls("buttonSearch").Focused Then Exit Sub
4650             End If
4651         End If
4652
4653         If e.Modifiers = Keys.None Then
4654             ' ModifierKeyが押されていない場合
4655             If e.KeyCode = Keys.N OrElse e.KeyCode = Keys.Right Then
4656                 e.Handled = True
4657                 e.SuppressKeyPress = True
4658                 GoRelPost(True)
4659                 Exit Sub
4660             ElseIf e.KeyCode = Keys.P OrElse e.KeyCode = Keys.Left Then
4661                 e.Handled = True
4662                 e.SuppressKeyPress = True
4663                 GoRelPost(False)
4664                 Exit Sub
4665             ElseIf e.KeyCode = Keys.OemPeriod Then
4666                 e.Handled = True
4667                 e.SuppressKeyPress = True
4668                 GoAnchor()
4669                 Exit Sub
4670             End If
4671             _anchorFlag = False
4672             If e.KeyCode = Keys.Space OrElse e.KeyCode = Keys.ProcessKey Then
4673                 e.Handled = True
4674                 e.SuppressKeyPress = True
4675                 JumpUnreadMenuItem_Click(Nothing, Nothing)
4676             ElseIf e.KeyCode = Keys.Enter OrElse e.KeyCode = Keys.Return Then
4677                 e.Handled = True
4678                 e.SuppressKeyPress = True
4679                 MakeReplyOrDirectStatus()
4680             ElseIf e.KeyCode = Keys.L Then
4681                 e.Handled = True
4682                 e.SuppressKeyPress = True
4683                 GoPost(True)
4684             ElseIf e.KeyCode = Keys.H Then
4685                 e.Handled = True
4686                 e.SuppressKeyPress = True
4687                 GoPost(False)
4688             ElseIf e.KeyCode = Keys.J AndAlso Not e.Alt Then
4689                 e.Handled = True
4690                 e.SuppressKeyPress = True
4691                 SendKeys.Send("{DOWN}")
4692             ElseIf e.KeyCode = Keys.K AndAlso Not e.Alt Then
4693                 e.Handled = True
4694                 e.SuppressKeyPress = True
4695                 SendKeys.Send("{UP}")
4696             End If
4697             If e.KeyCode = Keys.Z Or e.KeyCode = Keys.Oemcomma Then
4698                 e.Handled = True
4699                 e.SuppressKeyPress = True
4700                 MoveTop()
4701             ElseIf e.KeyCode = Keys.R OrElse e.KeyCode = Keys.F5 Then
4702                 e.Handled = True
4703                 e.SuppressKeyPress = True
4704                 DoRefresh()
4705             ElseIf e.KeyCode = Keys.S Then
4706                 e.Handled = True
4707                 e.SuppressKeyPress = True
4708                 GoNextTab(True)
4709             ElseIf e.KeyCode = Keys.A Then
4710                 e.Handled = True
4711                 e.SuppressKeyPress = True
4712                 GoNextTab(False)
4713             End If
4714             'If e.KeyCode = Keys.OemQuestion Then
4715             '    e.Handled = True
4716             '    e.SuppressKeyPress = True
4717             '    MenuItemSubSearch_Click(Nothing, Nothing)   '/検索
4718             'End If
4719             If e.KeyCode = Keys.F Then
4720                 e.Handled = True
4721                 e.SuppressKeyPress = True
4722                 SendKeys.Send("{PGDN}")
4723             End If
4724             If e.KeyCode = Keys.B Then
4725                 e.Handled = True
4726                 e.SuppressKeyPress = True
4727                 SendKeys.Send("{PGUP}")
4728             End If
4729             If e.KeyCode = Keys.I Then
4730                 e.Handled = True
4731                 e.SuppressKeyPress = True
4732                 SendKeys.Send("{TAB}")
4733             End If
4734             If e.KeyCode = Keys.G Then
4735                 e.Handled = True
4736                 e.SuppressKeyPress = True
4737                 ShowRelatedStatusesMenuItem_Click(Nothing, Nothing)
4738             End If
4739             ' ] in_reply_to参照元へ戻る
4740             If e.KeyCode = Keys.Oem4 Then
4741                 e.Handled = True
4742                 e.SuppressKeyPress = True
4743                 GoInReplyToPost()
4744             End If
4745             ' [ in_reply_toへジャンプ
4746             If e.KeyCode = Keys.Oem6 Then
4747                 e.Handled = True
4748                 e.SuppressKeyPress = True
4749                 GoBackInReplyToPost()
4750             End If
4751             If e.KeyCode = Keys.F1 Then
4752                 e.Handled = True
4753                 e.SuppressKeyPress = True
4754                 OpenUriAsync("http://sourceforge.jp/projects/tween/wiki/FrontPage")
4755             ElseIf e.KeyCode = Keys.F3 Then
4756                 e.Handled = True
4757                 e.SuppressKeyPress = True
4758                 MenuItemSearchNext_Click(Nothing, Nothing)
4759             ElseIf e.KeyCode = Keys.F6 Then
4760                 e.Handled = True
4761                 e.SuppressKeyPress = True
4762                 GetTimeline(WORKERTYPE.Reply, 1, 0, "")
4763             ElseIf e.KeyCode = Keys.F7 Then
4764                 e.Handled = True
4765                 e.SuppressKeyPress = True
4766                 GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
4767             End If
4768         End If
4769
4770         _anchorFlag = False
4771
4772         If e.Control AndAlso Not e.Alt AndAlso Not e.Shift Then
4773             ' CTRLキーが押されている場合
4774             If e.KeyCode = Keys.Home OrElse e.KeyCode = Keys.End Then
4775                 _colorize = True
4776             End If
4777             If e.KeyCode = Keys.N Then
4778                 e.Handled = True
4779                 e.SuppressKeyPress = True
4780                 GoNextTab(True)
4781             ElseIf e.KeyCode = Keys.P Then
4782                 e.Handled = True
4783                 e.SuppressKeyPress = True
4784                 GoNextTab(False)
4785             ElseIf e.KeyCode = Keys.R Then
4786                 e.Handled = True
4787                 e.SuppressKeyPress = True
4788                 MakeReplyOrDirectStatus(False, True)
4789             ElseIf e.KeyCode = Keys.M Then
4790                 e.Handled = True
4791                 e.SuppressKeyPress = True
4792                 MakeReplyOrDirectStatus(False, False)
4793             ElseIf e.KeyCode = Keys.S Then
4794                 e.Handled = True
4795                 e.SuppressKeyPress = True
4796                 FavoriteChange(True)
4797             ElseIf e.KeyCode = Keys.I Then
4798                 e.Handled = True
4799                 e.SuppressKeyPress = True
4800                 doRepliedStatusOpen()
4801             ElseIf e.KeyCode = Keys.D Then
4802                 e.Handled = True
4803                 e.SuppressKeyPress = True
4804                 doStatusDelete()
4805             ElseIf e.KeyCode = Keys.Q Then
4806                 e.Handled = True
4807                 e.SuppressKeyPress = True
4808                 doQuote()
4809             ElseIf e.KeyCode = Keys.B Then
4810                 e.Handled = True
4811                 e.SuppressKeyPress = True
4812                 ReadedStripMenuItem_Click(Nothing, Nothing)
4813             ElseIf e.KeyCode = Keys.T Then
4814                 e.Handled = True
4815                 e.SuppressKeyPress = True
4816                 HashManageMenuItem_Click(Nothing, Nothing)
4817             ElseIf e.KeyCode = Keys.L Then
4818                 e.Handled = True
4819                 e.SuppressKeyPress = True
4820                 UrlConvertAutoToolStripMenuItem_Click(Nothing, Nothing)
4821             ElseIf e.KeyCode = Keys.Y Then
4822                 e.Handled = True
4823                 e.SuppressKeyPress = True
4824                 MultiLineMenuItem_Click(Nothing, Nothing)
4825             ElseIf e.KeyCode = Keys.F Then
4826                 e.Handled = True
4827                 e.SuppressKeyPress = True
4828                 MenuItemSubSearch_Click(Nothing, Nothing)
4829             ElseIf e.KeyCode = Keys.C Then
4830                 Dim clstr As String = ""
4831                 e.Handled = True
4832                 e.SuppressKeyPress = True
4833                 CopyStot()
4834             ElseIf e.KeyCode = Keys.J AndAlso Not e.Alt Then
4835                 e.Handled = True
4836                 e.SuppressKeyPress = True
4837                 SendKeys.Send("{DOWN}")
4838             ElseIf e.KeyCode = Keys.K AndAlso Not e.Alt Then
4839                 e.Handled = True
4840                 e.SuppressKeyPress = True
4841                 SendKeys.Send("{UP}")
4842             End If
4843
4844             ' Webページを開く動作
4845
4846             Select Case e.KeyCode
4847                 Case Keys.H
4848                     If _curList.SelectedIndices.Count > 0 Then
4849                         OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name)
4850                     ElseIf _curList.SelectedIndices.Count = 0 Then
4851                         OpenUriAsync("http://twitter.com/")
4852                     End If
4853                 Case Keys.G
4854                     If _curList.SelectedIndices.Count > 0 Then
4855                         OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name + "/favorites")
4856                     End If
4857                 Case Keys.O
4858                     StatusOpenMenuItem_Click(Nothing, Nothing)
4859                 Case Keys.E
4860                     OpenURLMenuItem_Click(Nothing, Nothing)
4861             End Select
4862
4863             ' タブダイレクト選択(Ctrl+1~8,Ctrl+9)
4864
4865             Select Case e.KeyCode
4866                 Case Keys.D1, Keys.D2, Keys.D3, Keys.D4, Keys.D5, Keys.D6, Keys.D7, Keys.D8
4867                     Dim tabNo As Integer = e.KeyCode - Keys.D1
4868                     If ListTab.TabPages.Count < tabNo Then
4869                         Exit Sub
4870                     End If
4871                     ListTab.SelectedIndex = tabNo
4872                     ListTabSelect(ListTab.TabPages(tabNo))
4873                 Case Keys.D9
4874                     ListTab.SelectedIndex = ListTab.TabPages.Count - 1
4875                     ListTabSelect(ListTab.TabPages(ListTab.TabPages.Count - 1))
4876                 Case Else
4877             End Select
4878
4879         End If
4880
4881         If Not e.Control AndAlso e.Alt AndAlso Not e.Shift Then
4882             ' ALTキーが押されている場合
4883             ' 別タブの同じ書き込みへ(ALT+←/→)
4884             If e.KeyCode = Keys.Right Then
4885                 e.Handled = True
4886                 e.SuppressKeyPress = True
4887                 GoSamePostToAnotherTab(False)
4888             ElseIf e.KeyCode = Keys.Left Then
4889                 e.Handled = True
4890                 e.SuppressKeyPress = True
4891                 GoSamePostToAnotherTab(True)
4892             ElseIf e.KeyCode = Keys.R Then
4893                 e.Handled = True
4894                 e.SuppressKeyPress = True
4895                 doReTweetOfficial(True)
4896             ElseIf e.KeyCode = Keys.P AndAlso _curPost IsNot Nothing Then
4897                 e.Handled = True
4898                 e.SuppressKeyPress = True
4899                 doShowUserStatus(_curPost.Name, False)
4900             End If
4901             If e.KeyCode = Keys.Up Then
4902                 ScrollDownPostBrowser(False)
4903             ElseIf e.KeyCode = Keys.Down Then
4904                 ScrollDownPostBrowser(True)
4905             ElseIf e.KeyCode = Keys.PageUp Then
4906                 PageDownPostBrowser(False)
4907             ElseIf e.KeyCode = Keys.PageDown Then
4908                 PageDownPostBrowser(True)
4909             End If
4910         End If
4911
4912         If e.Shift AndAlso Not e.Control AndAlso Not e.Alt Then
4913             ' SHIFTキーが押されている場合
4914             If e.KeyCode = Keys.H Then
4915                 e.Handled = True
4916                 e.SuppressKeyPress = True
4917                 GoTopEnd(True)
4918             ElseIf e.KeyCode = Keys.L Then
4919                 e.Handled = True
4920                 e.SuppressKeyPress = True
4921                 GoTopEnd(False)
4922             ElseIf e.KeyCode = Keys.M Then
4923                 e.Handled = True
4924                 e.SuppressKeyPress = True
4925                 GoMiddle()
4926             ElseIf e.KeyCode = Keys.G Then
4927                 e.Handled = True
4928                 e.SuppressKeyPress = True
4929                 GoLast()
4930             ElseIf e.KeyCode = Keys.Z Then
4931                 e.Handled = True
4932                 e.SuppressKeyPress = True
4933                 MoveMiddle()
4934             ElseIf e.KeyCode = Keys.J AndAlso Not e.Alt Then
4935                 e.Handled = True
4936                 e.SuppressKeyPress = True
4937                 SendKeys.Send("{DOWN}")
4938             ElseIf e.KeyCode = Keys.K AndAlso Not e.Alt Then
4939                 e.Handled = True
4940                 e.SuppressKeyPress = True
4941                 SendKeys.Send("{UP}")
4942             End If
4943
4944             ' お気に入り前後ジャンプ(SHIFT+N←/P→)
4945             If e.KeyCode = Keys.N OrElse e.KeyCode = Keys.Right Then
4946                 e.Handled = True
4947                 e.SuppressKeyPress = True
4948                 GoFav(True)
4949             ElseIf e.KeyCode = Keys.P OrElse e.KeyCode = Keys.Left Then
4950                 e.Handled = True
4951                 e.SuppressKeyPress = True
4952                 GoFav(False)
4953             ElseIf e.KeyCode = Keys.R OrElse e.KeyCode = Keys.F5 Then
4954                 e.Handled = True
4955                 e.SuppressKeyPress = True
4956                 DoRefreshMore()
4957             End If
4958             If e.KeyCode = Keys.F3 Then
4959                 e.Handled = True
4960                 e.SuppressKeyPress = True
4961                 MenuItemSearchPrev_Click(Nothing, Nothing)
4962             ElseIf e.KeyCode = Keys.F6 Then
4963                 e.Handled = True
4964                 e.SuppressKeyPress = True
4965                 GetTimeline(WORKERTYPE.Reply, -1, 0, "")
4966             ElseIf e.KeyCode = Keys.F7 Then
4967                 e.Handled = True
4968                 e.SuppressKeyPress = True
4969                 GetTimeline(WORKERTYPE.DirectMessegeRcv, -1, 0, "")
4970             End If
4971         End If
4972
4973         If e.Control AndAlso Not e.Alt AndAlso e.Shift Then
4974             ' CTRL+SHIFTキーが押されている場合
4975             If e.KeyCode = Keys.R Then
4976                 e.Handled = True
4977                 e.SuppressKeyPress = True
4978                 MakeReplyOrDirectStatus(False, True, True)
4979             ElseIf e.KeyCode = Keys.C Then
4980                 Dim clstr As String = ""
4981                 e.Handled = True
4982                 e.SuppressKeyPress = True
4983                 CopyIdUri()
4984             ElseIf e.KeyCode = Keys.F Then
4985                 e.Handled = True
4986                 e.SuppressKeyPress = True
4987                 If ListTab.SelectedTab IsNot Nothing Then
4988                     If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.PublicSearch Then Exit Sub
4989                     ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch").Focus()
4990                 End If
4991             ElseIf e.KeyCode = Keys.S Then
4992                 e.Handled = True
4993                 e.SuppressKeyPress = True
4994                 FavoriteChange(False)
4995             ElseIf e.KeyCode = Keys.B Then
4996                 e.Handled = True
4997                 e.SuppressKeyPress = True
4998                 UnreadStripMenuItem_Click(Nothing, Nothing)
4999             End If
5000             If e.KeyCode = Keys.T Then
5001                 e.Handled = True
5002                 e.SuppressKeyPress = True
5003                 HashToggleMenuItem_Click(Nothing, Nothing)
5004             ElseIf e.KeyCode = Keys.P Then
5005                 e.Handled = True
5006                 e.SuppressKeyPress = True
5007                 ImageSelectMenuItem_Click(Nothing, Nothing)
5008             ElseIf e.KeyCode = Keys.H Then
5009                 e.Handled = True
5010                 e.SuppressKeyPress = True
5011                 doMoveToRTHome()
5012             ElseIf e.KeyCode = Keys.O Then
5013                 e.Handled = True
5014                 e.SuppressKeyPress = True
5015                 FavorareMenuItem_Click(Nothing, Nothing)
5016             End If
5017         End If
5018
5019         If Not e.Control AndAlso e.Alt AndAlso e.Shift Then
5020             ' ALT+SHIFTキーが押されている場合
5021             If e.KeyCode = Keys.R Then
5022                 e.Handled = True
5023                 e.SuppressKeyPress = True
5024                 doReTweetUnofficial()
5025             ElseIf e.KeyCode = Keys.C Then
5026                 e.Handled = True
5027                 e.SuppressKeyPress = True
5028                 CopyUserId()
5029             ElseIf e.KeyCode = Keys.Up Then
5030                 Thumbnail.ScrollThumbnail(False)
5031             ElseIf e.KeyCode = Keys.Down Then
5032                 Thumbnail.ScrollThumbnail(True)
5033             End If
5034             If e.KeyCode = Keys.Enter Then
5035                 If Not Me.SplitContainer3.Panel2Collapsed Then
5036                     Thumbnail.OpenPicture()
5037                 End If
5038                 e.Handled = True
5039                 e.SuppressKeyPress = True
5040             End If
5041         End If
5042
5043         If e.Alt AndAlso e.Control Then
5044             ' CTRL+ALTキーが押されている場合
5045             If e.KeyCode = Keys.S Then
5046                 e.Handled = True
5047                 e.SuppressKeyPress = True
5048                 FavoritesRetweetOriginal()
5049             ElseIf e.KeyCode = Keys.R Then
5050                 e.Handled = True
5051                 e.SuppressKeyPress = True
5052                 FavoritesRetweetUnofficial()
5053             End If
5054         End If
5055
5056     End Sub
5057
5058     Private Sub ScrollDownPostBrowser(ByVal forward As Boolean)
5059         Dim doc As HtmlDocument = PostBrowser.Document
5060         If doc Is Nothing Then Exit Sub
5061         If doc.Body Is Nothing Then Exit Sub
5062
5063         If forward Then
5064             doc.Body.ScrollTop += SettingDialog.FontDetail.Height
5065         Else
5066             doc.Body.ScrollTop -= SettingDialog.FontDetail.Height
5067         End If
5068     End Sub
5069
5070     Private Sub PageDownPostBrowser(ByVal forward As Boolean)
5071         Dim doc As HtmlDocument = PostBrowser.Document
5072         If doc Is Nothing Then Exit Sub
5073         If doc.Body Is Nothing Then Exit Sub
5074
5075         If forward Then
5076             doc.Body.ScrollTop += PostBrowser.ClientRectangle.Height - SettingDialog.FontDetail.Height
5077         Else
5078             doc.Body.ScrollTop -= PostBrowser.ClientRectangle.Height - SettingDialog.FontDetail.Height
5079         End If
5080     End Sub
5081
5082     Private Sub GoNextTab(ByVal forward As Boolean)
5083         Dim idx As Integer = ListTab.SelectedIndex
5084         If forward Then
5085             idx += 1
5086             If idx > ListTab.TabPages.Count - 1 Then idx = 0
5087         Else
5088             idx -= 1
5089             If idx < 0 Then idx = ListTab.TabPages.Count - 1
5090         End If
5091         ListTab.SelectedIndex = idx
5092         ListTabSelect(ListTab.TabPages(idx))
5093     End Sub
5094
5095     Private Sub CopyStot()
5096         Dim clstr As String = ""
5097         Dim sb As New StringBuilder()
5098         Dim IsProtected As Boolean = False
5099         For Each idx As Integer In _curList.SelectedIndices
5100             Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
5101             If post.IsProtect Then
5102                 IsProtected = True
5103                 Continue For
5104             End If
5105             If post.RetweetedId > 0 Then
5106                 sb.AppendFormat("{0}:{1} [http://twitter.com/{0}/status/{2}]{3}", post.Name, post.Data, post.RetweetedId, Environment.NewLine)
5107             Else
5108                 sb.AppendFormat("{0}:{1} [http://twitter.com/{0}/status/{2}]{3}", post.Name, post.Data, post.Id, Environment.NewLine)
5109             End If
5110         Next
5111         If IsProtected Then
5112             MessageBox.Show(My.Resources.CopyStotText1)
5113         End If
5114         If sb.Length > 0 Then
5115             clstr = sb.ToString()
5116             Try
5117                 Clipboard.SetDataObject(clstr, False, 5, 100)
5118             Catch ex As Exception
5119                 MessageBox.Show(ex.Message)
5120             End Try
5121             'Try
5122             '    Dim proc As New Action(Of String)(Sub(text)
5123             '                                          Me.Invoke(New Action(Of String)(AddressOf Clipboard.SetText), text)
5124             '                                      End Sub)
5125             '    proc.BeginInvoke(clstr, Nothing, Nothing)
5126             'Catch ex As Exception
5127             '    MessageBox.Show(ex.Message)
5128             'End Try
5129         End If
5130     End Sub
5131
5132     Private Sub CopyIdUri()
5133         Dim clstr As String = ""
5134         Dim sb As New StringBuilder()
5135         For Each idx As Integer In _curList.SelectedIndices
5136             Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
5137             If post.RetweetedId > 0 Then
5138                 sb.AppendFormat("http://twitter.com/{0}/status/{1}{2}", post.Name, post.RetweetedId, Environment.NewLine)
5139             Else
5140                 sb.AppendFormat("http://twitter.com/{0}/status/{1}{2}", post.Name, post.Id, Environment.NewLine)
5141             End If
5142         Next
5143         If sb.Length > 0 Then
5144             clstr = sb.ToString()
5145             Try
5146                 Clipboard.SetDataObject(clstr, False, 5, 100)
5147             Catch ex As Exception
5148                 MessageBox.Show(ex.Message)
5149             End Try
5150         End If
5151     End Sub
5152
5153     Private Sub GoFav(ByVal forward As Boolean)
5154         If _curList.VirtualListSize = 0 Then Exit Sub
5155         Dim fIdx As Integer = 0
5156         Dim toIdx As Integer = 0
5157         Dim stp As Integer = 1
5158
5159         If forward Then
5160             If _curList.SelectedIndices.Count = 0 Then
5161                 fIdx = 0
5162             Else
5163                 fIdx = _curList.SelectedIndices(0) + 1
5164                 If fIdx > _curList.VirtualListSize - 1 Then Exit Sub
5165             End If
5166             toIdx = _curList.VirtualListSize - 1
5167             stp = 1
5168         Else
5169             If _curList.SelectedIndices.Count = 0 Then
5170                 fIdx = _curList.VirtualListSize - 1
5171             Else
5172                 fIdx = _curList.SelectedIndices(0) - 1
5173                 If fIdx < 0 Then Exit Sub
5174             End If
5175             toIdx = 0
5176             stp = -1
5177         End If
5178
5179         For idx As Integer = fIdx To toIdx Step stp
5180             If _statuses.Item(_curTab.Text, idx).IsFav Then
5181                 SelectListItem(_curList, idx)
5182                 _curList.EnsureVisible(idx)
5183                 Exit For
5184             End If
5185         Next
5186     End Sub
5187
5188     Private Sub GoSamePostToAnotherTab(ByVal left As Boolean)
5189         If _curList.VirtualListSize = 0 Then Exit Sub
5190         Dim fIdx As Integer = 0
5191         Dim toIdx As Integer = 0
5192         Dim stp As Integer = 1
5193         Dim targetId As Long = 0
5194
5195         If _statuses.Tabs(_curTab.Text).TabType = TabUsageType.DirectMessage Then Exit Sub ' Directタブは対象外(見つかるはずがない)
5196         If _curList.SelectedIndices.Count = 0 Then Exit Sub '未選択も処理しない
5197
5198         targetId = GetCurTabPost(_curList.SelectedIndices(0)).Id
5199
5200         If left Then
5201             ' 左のタブへ
5202             If ListTab.SelectedIndex = 0 Then
5203                 Exit Sub
5204             Else
5205                 fIdx = ListTab.SelectedIndex - 1
5206             End If
5207             toIdx = 0
5208             stp = -1
5209         Else
5210             ' 右のタブへ
5211             If ListTab.SelectedIndex = ListTab.TabCount - 1 Then
5212                 Exit Sub
5213             Else
5214                 fIdx = ListTab.SelectedIndex + 1
5215             End If
5216             toIdx = ListTab.TabCount - 1
5217             stp = 1
5218         End If
5219
5220         Dim found As Boolean = False
5221         For tabidx As Integer = fIdx To toIdx Step stp
5222             If _statuses.Tabs(ListTab.TabPages(tabidx).Text).TabType = TabUsageType.DirectMessage Then Continue For ' Directタブは対象外
5223             For idx As Integer = 0 To DirectCast(ListTab.TabPages(tabidx).Tag, DetailsListView).VirtualListSize - 1
5224                 If _statuses.Item(ListTab.TabPages(tabidx).Text, idx).Id = targetId Then
5225                     ListTab.SelectedIndex = tabidx
5226                     ListTabSelect(ListTab.TabPages(tabidx))
5227                     SelectListItem(_curList, idx)
5228                     _curList.EnsureVisible(idx)
5229                     found = True
5230                     Exit For
5231                 End If
5232             Next
5233             If found Then Exit For
5234         Next
5235     End Sub
5236
5237     Private Sub GoPost(ByVal forward As Boolean)
5238         If _curList.SelectedIndices.Count = 0 OrElse _curPost Is Nothing Then Exit Sub
5239         Dim fIdx As Integer = 0
5240         Dim toIdx As Integer = 0
5241         Dim stp As Integer = 1
5242
5243         If forward Then
5244             fIdx = _curList.SelectedIndices(0) + 1
5245             If fIdx > _curList.VirtualListSize - 1 Then Exit Sub
5246             toIdx = _curList.VirtualListSize - 1
5247             stp = 1
5248         Else
5249             fIdx = _curList.SelectedIndices(0) - 1
5250             If fIdx < 0 Then Exit Sub
5251             toIdx = 0
5252             stp = -1
5253         End If
5254
5255         Dim name As String = ""
5256         If _curPost.RetweetedId = 0 Then
5257             name = _curPost.Name
5258         Else
5259             name = _curPost.RetweetedBy
5260         End If
5261         For idx As Integer = fIdx To toIdx Step stp
5262             If _statuses.Item(_curTab.Text, idx).RetweetedId = 0 Then
5263                 If _statuses.Item(_curTab.Text, idx).Name = name Then
5264                     SelectListItem(_curList, idx)
5265                     _curList.EnsureVisible(idx)
5266                     Exit For
5267                 End If
5268             Else
5269                 If _statuses.Item(_curTab.Text, idx).RetweetedBy = name Then
5270                     SelectListItem(_curList, idx)
5271                     _curList.EnsureVisible(idx)
5272                     Exit For
5273                 End If
5274             End If
5275         Next
5276     End Sub
5277
5278     Private Sub GoRelPost(ByVal forward As Boolean)
5279         If _curList.SelectedIndices.Count = 0 Then Exit Sub
5280
5281         Dim fIdx As Integer = 0
5282         Dim toIdx As Integer = 0
5283         Dim stp As Integer = 1
5284         If forward Then
5285             fIdx = _curList.SelectedIndices(0) + 1
5286             If fIdx > _curList.VirtualListSize - 1 Then Exit Sub
5287             toIdx = _curList.VirtualListSize - 1
5288             stp = 1
5289         Else
5290             fIdx = _curList.SelectedIndices(0) - 1
5291             If fIdx < 0 Then Exit Sub
5292             toIdx = 0
5293             stp = -1
5294         End If
5295
5296         If Not _anchorFlag Then
5297             If _curPost Is Nothing Then Exit Sub
5298             _anchorPost = _curPost
5299             _anchorFlag = True
5300         Else
5301             If _anchorPost Is Nothing Then Exit Sub
5302         End If
5303
5304         For idx As Integer = fIdx To toIdx Step stp
5305             Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
5306             If post.Name = _anchorPost.Name OrElse _
5307                post.RetweetedBy = _anchorPost.Name OrElse _
5308                post.Name = _anchorPost.RetweetedBy OrElse _
5309                (Not String.IsNullOrEmpty(post.RetweetedBy) AndAlso post.RetweetedBy = _anchorPost.RetweetedBy) OrElse _
5310                _anchorPost.ReplyToList.Contains(post.Name.ToLower()) OrElse _
5311                _anchorPost.ReplyToList.Contains(post.RetweetedBy.ToLower()) OrElse _
5312                post.ReplyToList.Contains(_anchorPost.Name.ToLower()) OrElse _
5313                post.ReplyToList.Contains(_anchorPost.RetweetedBy.ToLower()) Then
5314                 SelectListItem(_curList, idx)
5315                 _curList.EnsureVisible(idx)
5316                 Exit For
5317             End If
5318         Next
5319     End Sub
5320
5321     Private Sub GoAnchor()
5322         If _anchorPost Is Nothing Then Exit Sub
5323         Dim idx As Integer = _statuses.Tabs(_curTab.Text).IndexOf(_anchorPost.Id)
5324         If idx = -1 Then Exit Sub
5325
5326         SelectListItem(_curList, idx)
5327         _curList.EnsureVisible(idx)
5328     End Sub
5329
5330     Private Sub GoTopEnd(ByVal GoTop As Boolean)
5331         Dim _item As ListViewItem
5332         Dim idx As Integer
5333
5334         If GoTop Then
5335             _item = _curList.GetItemAt(0, 25)
5336             If _item Is Nothing Then
5337                 idx = 0
5338             Else
5339                 idx = _item.Index
5340             End If
5341         Else
5342             _item = _curList.GetItemAt(0, _curList.ClientSize.Height - 1)
5343             If _item Is Nothing Then
5344                 idx = _curList.VirtualListSize - 1
5345             Else
5346                 idx = _item.Index
5347             End If
5348         End If
5349         SelectListItem(_curList, idx)
5350     End Sub
5351
5352     Private Sub GoMiddle()
5353         Dim _item As ListViewItem
5354         Dim idx1 As Integer
5355         Dim idx2 As Integer
5356         Dim idx3 As Integer
5357
5358         _item = _curList.GetItemAt(0, 0)
5359         If _item Is Nothing Then
5360             idx1 = 0
5361         Else
5362             idx1 = _item.Index
5363         End If
5364         _item = _curList.GetItemAt(0, _curList.ClientSize.Height - 1)
5365         If _item Is Nothing Then
5366             idx2 = _curList.VirtualListSize - 1
5367         Else
5368             idx2 = _item.Index
5369         End If
5370         idx3 = (idx1 + idx2) \ 2
5371
5372         SelectListItem(_curList, idx3)
5373     End Sub
5374
5375     Private Sub GoLast()
5376         If _curList.VirtualListSize = 0 Then Exit Sub
5377
5378         If _statuses.SortOrder = SortOrder.Ascending Then
5379             SelectListItem(_curList, _curList.VirtualListSize - 1)
5380             _curList.EnsureVisible(_curList.VirtualListSize - 1)
5381         Else
5382             SelectListItem(_curList, 0)
5383             _curList.EnsureVisible(0)
5384         End If
5385     End Sub
5386
5387     Private Sub MoveTop()
5388         If _curList.SelectedIndices.Count = 0 Then Exit Sub
5389         Dim idx As Integer = _curList.SelectedIndices(0)
5390         If _statuses.SortOrder = SortOrder.Ascending Then
5391             _curList.EnsureVisible(_curList.VirtualListSize - 1)
5392         Else
5393             _curList.EnsureVisible(0)
5394         End If
5395         _curList.EnsureVisible(idx)
5396     End Sub
5397
5398     Private Sub GoInReplyToPost()
5399         If _curPost IsNot Nothing AndAlso _curPost.InReplyToUser IsNot Nothing AndAlso _curPost.InReplyToId > 0 Then
5400             If _statuses.Tabs(_curTab.Text).TabType = TabUsageType.Lists Then
5401                 If _statuses.Tabs(_curTab.Text).Posts.ContainsKey(_curPost.InReplyToId) Then
5402                     Dim idx As Integer = _statuses.Tabs(_curTab.Text).IndexOf(_curPost.InReplyToId)
5403                     If idx = -1 Then
5404                         Dim repPost As PostClass = _statuses.Item(_curPost.InReplyToId)
5405                         MessageBox.Show(repPost.Name + " / " + repPost.Nickname + "   (" + repPost.PDate.ToString() + ")" + Environment.NewLine + repPost.Data)
5406                     Else
5407                         If replyChains Is Nothing OrElse (replyChains.Count > 0 AndAlso replyChains.Peek().InReplyToId <> _curPost.Id) Then
5408                             replyChains = New Stack(Of ReplyChain)
5409                         End If
5410                         replyChains.Push(New ReplyChain(_curPost.Id, _curPost.InReplyToId, _curTab))
5411                         SelectListItem(_curList, idx)
5412                         _curList.EnsureVisible(idx)
5413                     End If
5414                 Else
5415                     OpenUriAsync("http://twitter.com/" + _curPost.InReplyToUser + "/statuses/" + _curPost.InReplyToId.ToString())
5416                 End If
5417             Else
5418                 If _statuses.ContainsKey(_curPost.InReplyToId) Then
5419                     Dim tab As TabPage = _curTab
5420                     Dim idx As Integer = _statuses.Tabs(_curTab.Text).IndexOf(_curPost.InReplyToId)
5421                     If idx = -1 Then
5422                         For Each tab In ListTab.TabPages
5423                             idx = _statuses.Tabs(tab.Text).IndexOf(_curPost.InReplyToId)
5424                             If idx <> -1 Then
5425                                 Exit For
5426                             End If
5427                         Next
5428                     End If
5429                     If idx = -1 Then
5430                         Dim repPost As PostClass = _statuses.Item(_curPost.InReplyToId)
5431                         MessageBox.Show(repPost.Name + " / " + repPost.Nickname + "   (" + repPost.PDate.ToString() + ")" + Environment.NewLine + repPost.Data)
5432                     Else
5433                         If replyChains Is Nothing OrElse (replyChains.Count > 0 AndAlso replyChains.Peek().InReplyToId <> _curPost.Id) Then
5434                             replyChains = New Stack(Of ReplyChain)
5435                         End If
5436                         replyChains.Push(New ReplyChain(_curPost.Id, _curPost.InReplyToId, _curTab))
5437
5438                         If tab IsNot _curTab Then
5439                             ListTab.SelectTab(tab)
5440                         End If
5441                         SelectListItem(_curList, idx)
5442                         _curList.EnsureVisible(idx)
5443                     End If
5444                 Else
5445                     OpenUriAsync("http://twitter.com/" + _curPost.InReplyToUser + "/statuses/" + _curPost.InReplyToId.ToString())
5446                 End If
5447             End If
5448         End If
5449     End Sub
5450
5451     Private Sub GoBackInReplyToPost()
5452         If replyChains Is Nothing OrElse replyChains.Count < 1 Then
5453             Exit Sub
5454         End If
5455
5456         Dim chainHead As ReplyChain = replyChains.Pop()
5457         If chainHead.InReplyToId = _curPost.Id Then
5458             Dim idx As Integer = _statuses.Tabs(chainHead.OriginalTab.Text).IndexOf(chainHead.OriginalId)
5459             If idx = -1 Then
5460                 replyChains = Nothing
5461             Else
5462                 Try
5463                     ListTab.SelectTab(chainHead.OriginalTab)
5464                 Catch ex As Exception
5465                     replyChains = Nothing
5466                 End Try
5467                 SelectListItem(_curList, idx)
5468                 _curList.EnsureVisible(idx)
5469             End If
5470         Else
5471             replyChains = Nothing
5472         End If
5473     End Sub
5474
5475     Private Sub MyList_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
5476         _anchorFlag = False
5477     End Sub
5478
5479     Private Sub StatusText_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StatusText.Enter
5480         ' フォーカスの戻り先を StatusText に設定
5481         Me.Tag = StatusText
5482         StatusText.BackColor = _clInputBackcolor
5483     End Sub
5484
5485     Public Property InputBackColor() As System.Drawing.Color
5486         Get
5487             Return _clInputBackcolor
5488         End Get
5489         Set(ByVal value As System.Drawing.Color)
5490             _clInputBackcolor = value
5491         End Set
5492     End Property
5493
5494     Private Sub StatusText_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StatusText.Leave
5495         ' フォーカスがメニューに遷移しないならばフォーカスはタブに移ることを期待
5496         If ListTab.SelectedTab IsNot Nothing AndAlso MenuStrip1.Tag Is Nothing Then Me.Tag = ListTab.SelectedTab.Tag
5497         StatusText.BackColor = Color.FromKnownColor(KnownColor.Window)
5498     End Sub
5499
5500     Private Sub StatusText_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles StatusText.KeyDown
5501         'Modifierキーなし
5502         If e.Modifiers = Keys.None Then
5503             If e.KeyCode = Keys.F1 Then
5504                 e.Handled = True
5505                 e.SuppressKeyPress = True
5506                 OpenUriAsync("http://sourceforge.jp/projects/tween/wiki/FrontPage")
5507             ElseIf e.KeyCode = Keys.F3 Then
5508                 e.Handled = True
5509                 e.SuppressKeyPress = True
5510                 MenuItemSearchNext_Click(Nothing, Nothing)
5511             ElseIf e.KeyCode = Keys.F5 Then
5512                 e.Handled = True
5513                 e.SuppressKeyPress = True
5514                 DoRefresh()
5515             ElseIf e.KeyCode = Keys.F6 Then
5516                 e.Handled = True
5517                 e.SuppressKeyPress = True
5518                 GetTimeline(WORKERTYPE.Reply, 1, 0, "")
5519             ElseIf e.KeyCode = Keys.F7 Then
5520                 e.Handled = True
5521                 e.SuppressKeyPress = True
5522                 GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
5523             End If
5524         End If
5525
5526         'Controlキー
5527         If e.Control AndAlso Not e.Alt AndAlso Not e.Shift Then
5528             If e.KeyCode = Keys.A Then
5529                 StatusText.SelectAll()
5530             ElseIf e.KeyCode = Keys.Up OrElse e.KeyCode = Keys.Down Then
5531                 If StatusText.Text.Trim() <> "" Then
5532                     _history(_hisIdx) = New PostingStatus(StatusText.Text, _reply_to_id, _reply_to_name)
5533                 End If
5534                 If e.KeyCode = Keys.Up Then
5535                     _hisIdx -= 1
5536                     If _hisIdx < 0 Then _hisIdx = 0
5537                 Else
5538                     _hisIdx += 1
5539                     If _hisIdx > _history.Count - 1 Then _hisIdx = _history.Count - 1
5540                 End If
5541                 StatusText.Text = _history(_hisIdx).status
5542                 _reply_to_id = _history(_hisIdx).inReplyToId
5543                 _reply_to_name = _history(_hisIdx).inReplyToName
5544                 StatusText.SelectionStart = StatusText.Text.Length
5545                 e.Handled = True
5546                 e.SuppressKeyPress = True
5547             ElseIf e.KeyCode = Keys.PageUp OrElse e.KeyCode = Keys.P Then
5548                 If ListTab.SelectedIndex = 0 Then
5549                     ListTab.SelectedIndex = ListTab.TabCount - 1
5550                 Else
5551                     ListTab.SelectedIndex -= 1
5552                 End If
5553                 e.Handled = True
5554                 e.SuppressKeyPress = True
5555                 StatusText.Focus()
5556             ElseIf e.KeyCode = Keys.PageDown OrElse e.KeyCode = Keys.N Then
5557                 If ListTab.SelectedIndex = ListTab.TabCount - 1 Then
5558                     ListTab.SelectedIndex = 0
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.R Then
5566                 e.Handled = True
5567                 e.SuppressKeyPress = True
5568                 MakeReplyOrDirectStatus(False, True)
5569             ElseIf e.KeyCode = Keys.M Then
5570                 e.Handled = True
5571                 e.SuppressKeyPress = True
5572                 MakeReplyOrDirectStatus(False, False)
5573             ElseIf e.KeyCode = Keys.S Then
5574                 e.Handled = True
5575                 e.SuppressKeyPress = True
5576                 FavoriteChange(True)
5577             ElseIf e.KeyCode = Keys.I Then
5578                 e.Handled = True
5579                 e.SuppressKeyPress = True
5580                 doRepliedStatusOpen()
5581             ElseIf e.KeyCode = Keys.Q Then
5582                 e.Handled = True
5583                 e.SuppressKeyPress = True
5584                 doQuote()
5585             ElseIf e.KeyCode = Keys.B Then
5586                 e.Handled = True
5587                 e.SuppressKeyPress = True
5588                 ReadedStripMenuItem_Click(Nothing, Nothing)
5589             ElseIf e.KeyCode = Keys.T Then
5590                 e.Handled = True
5591                 e.SuppressKeyPress = True
5592                 HashManageMenuItem_Click(Nothing, Nothing)
5593             ElseIf e.KeyCode = Keys.L Then
5594                 e.Handled = True
5595                 e.SuppressKeyPress = True
5596                 UrlConvertAutoToolStripMenuItem_Click(Nothing, Nothing)
5597             ElseIf e.KeyCode = Keys.Y Then
5598                 e.Handled = True
5599                 e.SuppressKeyPress = True
5600                 MultiLineMenuItem_Click(Nothing, Nothing)
5601             ElseIf e.KeyCode = Keys.F Then
5602                 e.Handled = True
5603                 e.SuppressKeyPress = True
5604                 MenuItemSubSearch_Click(Nothing, Nothing)
5605             End If
5606
5607             Select Case e.KeyCode
5608                 Case Keys.H
5609                     If _curList.SelectedIndices.Count > 0 Then
5610                         OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name)
5611                     ElseIf _curList.SelectedIndices.Count = 0 Then
5612                         OpenUriAsync("http://twitter.com/")
5613                     End If
5614                 Case Keys.G
5615                     If _curList.SelectedIndices.Count > 0 Then
5616                         OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name + "/favorites")
5617                     End If
5618                 Case Keys.E
5619                     OpenURLMenuItem_Click(Nothing, Nothing)
5620                 Case Keys.O
5621                     StatusOpenMenuItem_Click(Nothing, Nothing)
5622             End Select
5623         End If
5624
5625         'Shiftキー
5626         If e.Shift Then
5627             If e.KeyCode = Keys.F3 Then
5628                 e.Handled = True
5629                 e.SuppressKeyPress = True
5630                 MenuItemSearchPrev_Click(Nothing, Nothing)
5631             ElseIf e.KeyCode = Keys.F5 Then
5632                 e.Handled = True
5633                 e.SuppressKeyPress = True
5634                 DoRefreshMore()
5635             ElseIf e.KeyCode = Keys.F6 Then
5636                 e.Handled = True
5637                 e.SuppressKeyPress = True
5638                 GetTimeline(WORKERTYPE.Reply, -1, 0, "")
5639             ElseIf e.KeyCode = Keys.F7 Then
5640                 e.Handled = True
5641                 e.SuppressKeyPress = True
5642                 GetTimeline(WORKERTYPE.DirectMessegeRcv, -1, 0, "")
5643             End If
5644         End If
5645
5646         'Altキー
5647         If e.Alt AndAlso Not e.Control AndAlso e.Shift Then
5648             If e.KeyCode = Keys.R Then
5649                 e.Handled = True
5650                 e.SuppressKeyPress = True
5651                 doReTweetOfficial(True)
5652             ElseIf e.KeyCode = Keys.P AndAlso _curPost IsNot Nothing Then
5653                 e.Handled = True
5654                 e.SuppressKeyPress = True
5655                 doShowUserStatus(_curPost.Name, False)
5656             End If
5657             If e.KeyCode = Keys.Up Then
5658                 ScrollDownPostBrowser(False)
5659             ElseIf e.KeyCode = Keys.Down Then
5660                 ScrollDownPostBrowser(True)
5661             ElseIf e.KeyCode = Keys.PageUp Then
5662                 PageDownPostBrowser(False)
5663             ElseIf e.KeyCode = Keys.PageDown Then
5664                 PageDownPostBrowser(True)
5665             End If
5666         End If
5667
5668         If e.KeyCode = Keys.Space AndAlso e.Modifiers = (Keys.Shift Or Keys.Control) Then
5669             If StatusText.SelectionStart > 0 Then
5670                 Dim endidx As Integer = StatusText.SelectionStart - 1
5671                 Dim startstr As String = ""
5672                 For i As Integer = StatusText.SelectionStart - 1 To 0 Step -1
5673                     Dim c As Char = StatusText.Text.Chars(i)
5674                     If Char.IsLetterOrDigit(c) OrElse c = "_" Then
5675                         Continue For
5676                     End If
5677                     If c = "@" Then
5678                         startstr = StatusText.Text.Substring(i + 1, endidx - i)
5679                         ShowSuplDialog(StatusText, AtIdSupl, startstr.Length + 1, startstr)
5680                     ElseIf c = "#" Then
5681                         startstr = StatusText.Text.Substring(i + 1, endidx - i)
5682                         ShowSuplDialog(StatusText, HashSupl, startstr.Length + 1, startstr)
5683                     Else
5684                         Exit For
5685                     End If
5686                 Next
5687                 e.Handled = True
5688             End If
5689         End If
5690
5691         'Shift+Controlキー
5692         If e.Shift AndAlso e.Control Then
5693             If e.KeyCode = Keys.Up Then
5694                 e.Handled = True
5695                 e.SuppressKeyPress = True
5696                 Dim idx As Integer = 0
5697                 If _curList IsNot Nothing AndAlso _curList.Items.Count <> 0 AndAlso _
5698                             _curList.SelectedIndices.Count > 0 AndAlso _curList.SelectedIndices(0) > 0 Then
5699                     idx = _curList.SelectedIndices(0) - 1
5700                     SelectListItem(_curList, idx)
5701                     _curList.EnsureVisible(idx)
5702                 End If
5703             ElseIf e.KeyCode = Keys.Down Then
5704                 e.Handled = True
5705                 e.SuppressKeyPress = True
5706                 Dim idx As Integer = 0
5707                 If _curList IsNot Nothing AndAlso _curList.Items.Count <> 0 AndAlso _curList.SelectedIndices.Count > 0 _
5708                             AndAlso _curList.SelectedIndices(0) < _curList.Items.Count - 1 Then
5709                     idx = _curList.SelectedIndices(0) + 1
5710                     SelectListItem(_curList, idx)
5711                     _curList.EnsureVisible(idx)
5712                 End If
5713             End If
5714             If e.KeyCode = Keys.R Then
5715                 e.Handled = True
5716                 e.SuppressKeyPress = True
5717                 MakeReplyOrDirectStatus(False, True, True)
5718             ElseIf e.KeyCode = Keys.H Then
5719                 e.Handled = True
5720                 e.SuppressKeyPress = True
5721                 doMoveToRTHome()
5722             ElseIf e.KeyCode = Keys.T Then
5723                 e.Handled = True
5724                 e.SuppressKeyPress = True
5725                 HashToggleMenuItem_Click(Nothing, Nothing)
5726             ElseIf e.KeyCode = Keys.S Then
5727                 e.Handled = True
5728                 e.SuppressKeyPress = True
5729                 FavoriteChange(False)
5730             ElseIf e.KeyCode = Keys.B Then
5731                 e.Handled = True
5732                 e.SuppressKeyPress = True
5733                 UnreadStripMenuItem_Click(Nothing, Nothing)
5734             ElseIf e.KeyCode = Keys.G Then
5735                 e.Handled = True
5736                 e.SuppressKeyPress = True
5737                 FavorareMenuItem_Click(Nothing, Nothing)
5738             ElseIf e.KeyCode = Keys.C Then
5739                 Dim clstr As String = ""
5740                 e.Handled = True
5741                 e.SuppressKeyPress = True
5742                 CopyIdUri()
5743             ElseIf e.KeyCode = Keys.O Then
5744                 e.Handled = True
5745                 e.SuppressKeyPress = True
5746                 FavorareMenuItem_Click(Nothing, Nothing)
5747             ElseIf e.KeyCode = Keys.P Then
5748                 e.Handled = True
5749                 e.SuppressKeyPress = True
5750                 ImageSelectMenuItem_Click(Nothing, Nothing)
5751             ElseIf e.KeyCode = Keys.F Then
5752                 e.Handled = True
5753                 e.SuppressKeyPress = True
5754                 If ListTab.SelectedTab IsNot Nothing Then
5755                     If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.PublicSearch Then Exit Sub
5756                     ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch").Focus()
5757                 End If
5758             End If
5759         End If
5760
5761         'Alt+Shiftキー
5762         If e.Alt AndAlso e.Shift Then
5763             If e.KeyCode = Keys.R Then
5764                 e.Handled = True
5765                 e.SuppressKeyPress = True
5766                 doReTweetUnofficial()
5767             ElseIf e.KeyCode = Keys.C Then
5768                 e.Handled = True
5769                 e.SuppressKeyPress = True
5770                 CopyUserId()
5771             ElseIf e.KeyCode = Keys.Up Then
5772                 Thumbnail.ScrollThumbnail(False)
5773             ElseIf e.KeyCode = Keys.Down Then
5774                 Thumbnail.ScrollThumbnail(True)
5775             End If
5776         End If
5777
5778         ' Alt + Control キー
5779         If e.Alt AndAlso e.Control Then
5780             If e.KeyCode = Keys.S Then
5781                 e.Handled = True
5782                 e.SuppressKeyPress = True
5783                 FavoritesRetweetOriginal()
5784             ElseIf e.KeyCode = Keys.R Then
5785                 e.Handled = True
5786                 e.SuppressKeyPress = True
5787                 FavoritesRetweetUnofficial()
5788             End If
5789         End If
5790
5791         Me.StatusText_TextChanged(Nothing, Nothing)
5792     End Sub
5793
5794     Private Sub SaveConfigsAll(ByVal ifModified As Boolean)
5795         If Not ifModified Then
5796             SaveConfigsCommon()
5797             SaveConfigsLocal()
5798             'SaveConfigsTab(True)    'True:事前に設定ファイル削除
5799             SaveConfigsTabs()
5800         Else
5801             If _modifySettingCommon Then SaveConfigsCommon()
5802             If _modifySettingLocal Then SaveConfigsLocal()
5803             If _modifySettingAtId AndAlso SettingDialog.UseAtIdSupplement AndAlso AtIdSupl IsNot Nothing Then
5804                 _modifySettingAtId = False
5805                 Dim cfgAtId As New SettingAtIdList(AtIdSupl.GetItemList)
5806                 cfgAtId.Save()
5807             End If
5808         End If
5809     End Sub
5810
5811     Private Sub SaveConfigsCommon()
5812         If _ignoreConfigSave Then Exit Sub
5813
5814         _modifySettingCommon = False
5815         SyncLock _syncObject
5816             _cfgCommon.UserName = tw.Username
5817             _cfgCommon.Password = tw.Password
5818             _cfgCommon.IsOAuth = SettingDialog.IsOAuth
5819             _cfgCommon.Token = tw.AccessToken
5820             _cfgCommon.TokenSecret = tw.AccessTokenSecret
5821             _cfgCommon.UserstreamStartup = SettingDialog.UserstreamStartup
5822             _cfgCommon.UserstreamPeriod = SettingDialog.UserstreamPeriodInt
5823             _cfgCommon.TimelinePeriod = SettingDialog.TimelinePeriodInt
5824             _cfgCommon.ReplyPeriod = SettingDialog.ReplyPeriodInt
5825             _cfgCommon.DMPeriod = SettingDialog.DMPeriodInt
5826             _cfgCommon.PubSearchPeriod = SettingDialog.PubSearchPeriodInt
5827             _cfgCommon.ListsPeriod = SettingDialog.ListsPeriodInt
5828             _cfgCommon.Read = SettingDialog.Readed
5829             _cfgCommon.IconSize = SettingDialog.IconSz
5830             _cfgCommon.UnreadManage = SettingDialog.UnreadManage
5831             _cfgCommon.PlaySound = SettingDialog.PlaySound
5832             _cfgCommon.OneWayLove = SettingDialog.OneWayLove
5833
5834             _cfgCommon.NameBalloon = SettingDialog.NameBalloon
5835             _cfgCommon.PostCtrlEnter = SettingDialog.PostCtrlEnter
5836             _cfgCommon.PostShiftEnter = SettingDialog.PostShiftEnter
5837             _cfgCommon.CountApi = SettingDialog.CountApi
5838             _cfgCommon.CountApiReply = SettingDialog.CountApiReply
5839             '_cfgCommon.CheckReply = SettingDialog.CheckReply
5840             _cfgCommon.PostAndGet = SettingDialog.PostAndGet
5841             _cfgCommon.DispUsername = SettingDialog.DispUsername
5842             _cfgCommon.MinimizeToTray = SettingDialog.MinimizeToTray
5843             _cfgCommon.CloseToExit = SettingDialog.CloseToExit
5844             _cfgCommon.DispLatestPost = SettingDialog.DispLatestPost
5845             _cfgCommon.SortOrderLock = SettingDialog.SortOrderLock
5846             _cfgCommon.TinyUrlResolve = SettingDialog.TinyUrlResolve
5847             _cfgCommon.PeriodAdjust = SettingDialog.PeriodAdjust
5848             _cfgCommon.StartupVersion = SettingDialog.StartupVersion
5849             _cfgCommon.StartupFollowers = SettingDialog.StartupFollowers
5850             _cfgCommon.RestrictFavCheck = SettingDialog.RestrictFavCheck
5851             _cfgCommon.AlwaysTop = SettingDialog.AlwaysTop
5852             _cfgCommon.UrlConvertAuto = SettingDialog.UrlConvertAuto
5853             _cfgCommon.Outputz = SettingDialog.OutputzEnabled
5854             _cfgCommon.OutputzKey = SettingDialog.OutputzKey
5855             _cfgCommon.OutputzUrlMode = SettingDialog.OutputzUrlmode
5856             _cfgCommon.UseUnreadStyle = SettingDialog.UseUnreadStyle
5857             _cfgCommon.DateTimeFormat = SettingDialog.DateTimeFormat
5858             _cfgCommon.DefaultTimeOut = SettingDialog.DefaultTimeOut
5859             '_cfgCommon.ProtectNotInclude = SettingDialog.ProtectNotInclude
5860             _cfgCommon.RetweetNoConfirm = SettingDialog.RetweetNoConfirm
5861             _cfgCommon.LimitBalloon = SettingDialog.LimitBalloon
5862             _cfgCommon.AutoShortUrlFirst = SettingDialog.AutoShortUrlFirst
5863             _cfgCommon.TabIconDisp = SettingDialog.TabIconDisp
5864             _cfgCommon.ReplyIconState = SettingDialog.ReplyIconState
5865             _cfgCommon.ReadOwnPost = SettingDialog.ReadOwnPost
5866             _cfgCommon.GetFav = SettingDialog.GetFav
5867             _cfgCommon.IsMonospace = SettingDialog.IsMonospace
5868             If IdeographicSpaceToSpaceToolStripMenuItem IsNot Nothing AndAlso _
5869                IdeographicSpaceToSpaceToolStripMenuItem.IsDisposed = False Then
5870                 _cfgCommon.WideSpaceConvert = Me.IdeographicSpaceToSpaceToolStripMenuItem.Checked
5871             End If
5872             _cfgCommon.ReadOldPosts = SettingDialog.ReadOldPosts
5873             _cfgCommon.UseSsl = SettingDialog.UseSsl
5874             _cfgCommon.BilyUser = SettingDialog.BitlyUser
5875             _cfgCommon.BitlyPwd = SettingDialog.BitlyPwd
5876             _cfgCommon.ShowGrid = SettingDialog.ShowGrid
5877             _cfgCommon.UseAtIdSupplement = SettingDialog.UseAtIdSupplement
5878             _cfgCommon.UseHashSupplement = SettingDialog.UseHashSupplement
5879             _cfgCommon.PreviewEnable = SettingDialog.PreviewEnable
5880             _cfgCommon.Language = SettingDialog.Language
5881
5882             _cfgCommon.SortOrder = _statuses.SortOrder
5883             Select Case _statuses.SortMode
5884                 Case IdComparerClass.ComparerMode.Nickname  'ニックネーム
5885                     _cfgCommon.SortColumn = 1
5886                 Case IdComparerClass.ComparerMode.Data  '本文
5887                     _cfgCommon.SortColumn = 2
5888                 Case IdComparerClass.ComparerMode.Id  '時刻=発言Id
5889                     _cfgCommon.SortColumn = 3
5890                 Case IdComparerClass.ComparerMode.Name  '名前
5891                     _cfgCommon.SortColumn = 4
5892                 Case IdComparerClass.ComparerMode.Source  'Source
5893                     _cfgCommon.SortColumn = 7
5894             End Select
5895
5896             _cfgCommon.Nicoms = SettingDialog.Nicoms
5897             _cfgCommon.HashTags = HashMgr.HashHistories
5898             If HashMgr.IsPermanent Then
5899                 _cfgCommon.HashSelected = HashMgr.UseHash
5900             Else
5901                 _cfgCommon.HashSelected = ""
5902             End If
5903             _cfgCommon.HashIsHead = HashMgr.IsHead
5904             _cfgCommon.HashIsPermanent = HashMgr.IsPermanent
5905             _cfgCommon.TwitterUrl = SettingDialog.TwitterApiUrl
5906             _cfgCommon.TwitterSearchUrl = SettingDialog.TwitterSearchApiUrl
5907             _cfgCommon.HotkeyEnabled = SettingDialog.HotkeyEnabled
5908             _cfgCommon.HotkeyModifier = SettingDialog.HotkeyMod
5909             _cfgCommon.HotkeyKey = SettingDialog.HotkeyKey
5910             _cfgCommon.HotkeyValue = SettingDialog.HotkeyValue
5911             _cfgCommon.BlinkNewMentions = SettingDialog.BlinkNewMentions
5912             If ToolStripFocusLockMenuItem IsNot Nothing AndAlso _
5913                     ToolStripFocusLockMenuItem.IsDisposed = False Then
5914                 _cfgCommon.FocusLockToStatusText = Me.ToolStripFocusLockMenuItem.Checked
5915             End If
5916             _cfgCommon.UseAdditionalCount = SettingDialog.UseAdditionalCount
5917             _cfgCommon.MoreCountApi = SettingDialog.MoreCountApi
5918             _cfgCommon.FirstCountApi = SettingDialog.FirstCountApi
5919             _cfgCommon.SearchCountApi = SettingDialog.SearchCountApi
5920             _cfgCommon.FavoritesCountApi = SettingDialog.FavoritesCountApi
5921             _cfgCommon.TrackWord = tw.TrackWord
5922             _cfgCommon.AllAtReply = tw.AllAtReply
5923
5924             _cfgCommon.Save()
5925         End SyncLock
5926     End Sub
5927
5928     Private Sub SaveConfigsLocal()
5929         If _ignoreConfigSave Then Exit Sub
5930         SyncLock _syncObject
5931             _modifySettingLocal = False
5932             _cfgLocal.FormSize = _mySize
5933             _cfgLocal.FormLocation = _myLoc
5934             _cfgLocal.SplitterDistance = _mySpDis
5935             _cfgLocal.PreviewDistance = _mySpDis3
5936             _cfgLocal.StatusMultiline = StatusText.Multiline
5937             _cfgLocal.StatusTextHeight = _mySpDis2
5938             _cfgLocal.StatusText = SettingDialog.Status
5939
5940             _cfgLocal.FontUnread = _fntUnread
5941             _cfgLocal.ColorUnread = _clUnread
5942             _cfgLocal.FontRead = _fntReaded
5943             _cfgLocal.ColorRead = _clReaded
5944             _cfgLocal.FontDetail = _fntDetail
5945             _cfgLocal.ColorDetail = _clDetail
5946             _cfgLocal.ColorDetailBackcolor = _clDetailBackcolor
5947             _cfgLocal.ColorDetailLink = _clDetailLink
5948             _cfgLocal.ColorFav = _clFav
5949             _cfgLocal.ColorOWL = _clOWL
5950             _cfgLocal.ColorRetweet = _clRetweet
5951             _cfgLocal.ColorSelf = _clSelf
5952             _cfgLocal.ColorAtSelf = _clAtSelf
5953             _cfgLocal.ColorTarget = _clTarget
5954             _cfgLocal.ColorAtTarget = _clAtTarget
5955             _cfgLocal.ColorAtFromTarget = _clAtFromTarget
5956             _cfgLocal.ColorAtTo = _clAtTo
5957             _cfgLocal.ColorListBackcolor = _clListBackcolor
5958             _cfgLocal.ColorInputBackcolor = _clInputBackcolor
5959             _cfgLocal.ColorInputFont = _clInputFont
5960             _cfgLocal.FontInputFont = _fntInputFont
5961
5962             _cfgLocal.BrowserPath = SettingDialog.BrowserPath
5963             _cfgLocal.UseRecommendStatus = SettingDialog.UseRecommendStatus
5964             _cfgLocal.ProxyType = SettingDialog.SelectedProxyType
5965             _cfgLocal.ProxyAddress = SettingDialog.ProxyAddress
5966             _cfgLocal.ProxyPort = SettingDialog.ProxyPort
5967             _cfgLocal.ProxyUser = SettingDialog.ProxyUser
5968             _cfgLocal.ProxyPassword = SettingDialog.ProxyPassword
5969             If _ignoreConfigSave Then Exit Sub
5970             _cfgLocal.Save()
5971         End SyncLock
5972     End Sub
5973
5974     Private Sub SaveConfigsTabs()
5975         Dim tabSetting As New SettingTabs
5976         For i As Integer = 0 To ListTab.TabPages.Count - 1
5977             If _statuses.Tabs(ListTab.TabPages(i).Text).TabType <> TabUsageType.Related Then tabSetting.Tabs.Add(_statuses.Tabs(ListTab.TabPages(i).Text))
5978         Next
5979         tabSetting.Save()
5980     End Sub
5981
5982     Private Sub SaveLogMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveLogMenuItem.Click, SaveFileMenuItem.Click
5983         Dim rslt As DialogResult = MessageBox.Show(String.Format(My.Resources.SaveLogMenuItem_ClickText1, Environment.NewLine), _
5984                 My.Resources.SaveLogMenuItem_ClickText2, _
5985                 MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)
5986         If rslt = Windows.Forms.DialogResult.Cancel Then Exit Sub
5987
5988         SaveFileDialog1.FileName = "TweenPosts" + Format(Now, "yyMMdd-HHmmss") + ".tsv"
5989         SaveFileDialog1.InitialDirectory = My.Application.Info.DirectoryPath
5990         SaveFileDialog1.Filter = My.Resources.SaveLogMenuItem_ClickText3
5991         SaveFileDialog1.FilterIndex = 0
5992         SaveFileDialog1.Title = My.Resources.SaveLogMenuItem_ClickText4
5993         SaveFileDialog1.RestoreDirectory = True
5994
5995         If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
5996             If Not SaveFileDialog1.ValidateNames Then Exit Sub
5997             Using sw As StreamWriter = New StreamWriter(SaveFileDialog1.FileName, False, Encoding.UTF8)
5998                 If rslt = Windows.Forms.DialogResult.Yes Then
5999                     'All
6000                     For idx As Integer = 0 To _curList.VirtualListSize - 1
6001                         Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
6002                         Dim protect As String = ""
6003                         If post.IsProtect Then protect = "Protect"
6004                         sw.WriteLine(post.Nickname & vbTab & _
6005                                  """" & post.Data.Replace(vbLf, "").Replace("""", """""") + """" & vbTab & _
6006                                  post.PDate.ToString() & vbTab & _
6007                                  post.Name & vbTab & _
6008                                  post.Id.ToString() & vbTab & _
6009                                  post.ImageUrl & vbTab & _
6010                                  """" & post.OriginalData.Replace(vbLf, "").Replace("""", """""") + """" & vbTab & _
6011                                  protect)
6012                     Next
6013                 Else
6014                     For Each idx As Integer In _curList.SelectedIndices
6015                         Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
6016                         Dim protect As String = ""
6017                         If post.IsProtect Then protect = "Protect"
6018                         sw.WriteLine(post.Nickname & vbTab & _
6019                                  """" & post.Data.Replace(vbLf, "").Replace("""", """""") + """" & vbTab & _
6020                                  post.PDate.ToString() & vbTab & _
6021                                  post.Name & vbTab & _
6022                                  post.Id.ToString() & vbTab & _
6023                                  post.ImageUrl & vbTab & _
6024                                  """" & post.OriginalData.Replace(vbLf, "").Replace("""", """""") + """" & vbTab & _
6025                                  protect)
6026                     Next
6027                 End If
6028                 sw.Close()
6029                 sw.Dispose()
6030             End Using
6031         End If
6032         Me.TopMost = SettingDialog.AlwaysTop
6033     End Sub
6034
6035     Private Sub PostBrowser_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles PostBrowser.PreviewKeyDown
6036         ' ModifiersKeyなし
6037         If e.Modifiers = Keys.None Then
6038             Select Case e.KeyCode
6039                 Case Keys.Space, _
6040                      Keys.ProcessKey
6041                     e.IsInputKey = True
6042                     JumpUnreadMenuItem_Click(Nothing, Nothing)
6043                 Case Keys.G
6044                     e.IsInputKey = True
6045                     ShowRelatedStatusesMenuItem_Click(Nothing, Nothing)
6046                 Case Keys.F1
6047                     e.IsInputKey = True
6048                     OpenUriAsync("http://sourceforge.jp/projects/tween/wiki/FrontPage")
6049                 Case Keys.F3
6050                     e.IsInputKey = True
6051                     MenuItemSearchNext_Click(Nothing, Nothing)
6052                 Case Keys.F5, _
6053                      Keys.R
6054                     e.IsInputKey = True
6055                     DoRefresh()
6056                 Case Keys.F6
6057                     e.IsInputKey = True
6058                     GetTimeline(WORKERTYPE.Reply, 1, 0, "")
6059                 Case Keys.F7
6060                     e.IsInputKey = True
6061                     GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 0, "")
6062                 Case Else
6063
6064             End Select
6065         End If
6066
6067         ' ShiftKey + 何か
6068         If e.Modifiers = Keys.Shift Then
6069             Select Case e.KeyCode
6070                 Case Keys.F3
6071                     e.IsInputKey = True
6072                     MenuItemSearchPrev_Click(Nothing, Nothing)
6073                 Case Keys.F5, _
6074                      Keys.R
6075                     e.IsInputKey = True
6076                     DoRefreshMore()
6077                 Case Keys.F6
6078                     e.IsInputKey = True
6079                     GetTimeline(WORKERTYPE.Reply, -1, 0, "")
6080                 Case Keys.F7
6081                     e.IsInputKey = True
6082                     GetTimeline(WORKERTYPE.DirectMessegeRcv, -1, 0, "")
6083                 Case Else
6084
6085             End Select
6086         End If
6087         ' ControlKey + 何か
6088         If e.Modifiers = Keys.Control Then
6089             Select Case e.KeyCode
6090                 Case Keys.A
6091                     e.IsInputKey = True
6092                     PostBrowser.Document.ExecCommand("SelectAll", False, Nothing)
6093                 Case Keys.C, Keys.Insert
6094                     e.IsInputKey = True
6095                     Dim _selText As String = WebBrowser_GetSelectionText(PostBrowser)
6096                     If Not String.IsNullOrEmpty(_selText) Then
6097                         Try
6098                             Clipboard.SetDataObject(_selText, False, 5, 100)
6099                         Catch ex As Exception
6100                             MessageBox.Show(ex.Message)
6101                         End Try
6102                     End If
6103                 Case Keys.R
6104                     e.IsInputKey = True
6105                     MakeReplyOrDirectStatus(False, True)
6106                 Case Keys.M
6107                     e.IsInputKey = True
6108                     MakeReplyOrDirectStatus(False, False)
6109                 Case Keys.R
6110                     e.IsInputKey = True
6111                     doReTweetOfficial(True)
6112                 Case Keys.Q
6113                     e.IsInputKey = True
6114                     doQuote()
6115                 Case Keys.S
6116                     e.IsInputKey = True
6117                     FavoriteChange(True)
6118                 Case Keys.B
6119                     e.IsInputKey = True
6120                     ReadedStripMenuItem_Click(Nothing, Nothing)
6121                 Case Keys.Y
6122                     e.IsInputKey = True
6123                     MultiLineMenuItem.Checked = Not MultiLineMenuItem.Checked
6124                     MultiLineMenuItem_Click(Nothing, Nothing)
6125                 Case Keys.C
6126                     e.IsInputKey = True
6127                     CopyStot()
6128                 Case Keys.F
6129                     e.IsInputKey = True
6130                     MenuItemSubSearch_Click(Nothing, Nothing)
6131                 Case Keys.H
6132                     e.IsInputKey = True
6133                     If _curList.SelectedIndices.Count > 0 Then
6134                         OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name)
6135                     ElseIf _curList.SelectedIndices.Count = 0 Then
6136                         OpenUriAsync("http://twitter.com/")
6137                     End If
6138                 Case Keys.G
6139                     e.IsInputKey = True
6140                     If _curList.SelectedIndices.Count > 0 Then
6141                         OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).Name + "/favorites")
6142                     End If
6143                 Case Keys.O
6144                     e.IsInputKey = True
6145                     MoveToFavToolStripMenuItem_Click(Nothing, Nothing)
6146                 Case Keys.E
6147                     e.IsInputKey = True
6148                     OpenURLMenuItem_Click(Nothing, Nothing)
6149             End Select
6150         End If
6151
6152         'AltKey + 何か
6153         If e.Modifiers = Keys.Alt Then
6154             If e.KeyCode = Keys.R Then
6155                 e.IsInputKey = True
6156                 doReTweetOfficial(True)
6157             ElseIf e.KeyCode = Keys.P AndAlso _curPost IsNot Nothing Then
6158                 e.IsInputKey = True
6159                 doShowUserStatus(_curPost.Name, False)
6160             End If
6161         End If
6162
6163         ' ControlKey + ShiftKey + 何か
6164         If e.Modifiers = (Keys.Control Or Keys.Shift) Then
6165             Select Case e.KeyCode
6166                 Case Keys.R
6167                     e.IsInputKey = True
6168                     MakeReplyOrDirectStatus(False, True, True)
6169                 Case Keys.F
6170                     e.IsInputKey = True
6171                     If ListTab.SelectedTab IsNot Nothing Then
6172                         If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.PublicSearch Then Exit Sub
6173                         ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch").Focus()
6174                     End If
6175                 Case Keys.S
6176                     e.IsInputKey = True
6177                     FavoriteChange(False)
6178                 Case Keys.B
6179                     e.IsInputKey = True
6180                     UnreadStripMenuItem_Click(Nothing, Nothing)
6181                 Case Keys.T
6182                     e.IsInputKey = True
6183                     HashToggleMenuItem_Click(Nothing, Nothing)
6184                 Case Keys.P
6185                     e.IsInputKey = True
6186                     ImageSelectMenuItem_Click(Nothing, Nothing)
6187                 Case Keys.O
6188                     e.IsInputKey = True
6189                     FavorareMenuItem_Click(Nothing, Nothing)
6190                 Case Keys.H
6191                     e.IsInputKey = True
6192                     doMoveToRTHome()
6193                 Case Else
6194
6195             End Select
6196         End If
6197
6198         'AltKey + ShiftKey + 何か
6199         If e.Modifiers = (Keys.Alt Or Keys.Shift) Then
6200             Select Case e.KeyCode
6201                 Case Keys.R
6202                     e.IsInputKey = False
6203                     doReTweetUnofficial()
6204                 Case Keys.C
6205                     e.IsInputKey = False
6206                     CopyUserId()
6207             End Select
6208
6209         End If
6210
6211         'CtrlKey + AltKey + 何か
6212         If e.Modifiers = (Keys.Control Or Keys.Alt) Then
6213             Select Case e.KeyCode
6214                 Case Keys.R
6215                     e.IsInputKey = True
6216                     FavoritesRetweetUnofficial()
6217                 Case Keys.S
6218                     e.IsInputKey = True
6219                     FavoritesRetweetOriginal()
6220             End Select
6221         End If
6222
6223     End Sub
6224     Public Function TabRename(ByRef tabName As String) As Boolean
6225         'タブ名変更
6226         Dim newTabText As String = Nothing
6227         Using inputName As New InputTabName()
6228             inputName.TabName = tabName
6229             inputName.ShowDialog()
6230             If inputName.DialogResult = Windows.Forms.DialogResult.Cancel Then Return False
6231             newTabText = inputName.TabName
6232             inputName.Dispose()
6233         End Using
6234         Me.TopMost = SettingDialog.AlwaysTop
6235         If Not String.IsNullOrEmpty(newTabText) Then
6236             '新タブ名存在チェック
6237             For i As Integer = 0 To ListTab.TabCount - 1
6238                 If ListTab.TabPages(i).Text = newTabText Then
6239                     Dim tmp As String = String.Format(My.Resources.Tabs_DoubleClickText1, newTabText)
6240                     MessageBox.Show(tmp, My.Resources.Tabs_DoubleClickText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
6241                     Return False
6242                 End If
6243             Next
6244             'タブ名のリスト作り直し(デフォルトタブ以外は再作成)
6245             For i As Integer = 0 To ListTab.TabCount - 1
6246                 If _statuses.Tabs(ListTab.TabPages(i).Text).TabType = TabUsageType.Mentions OrElse _
6247                    (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
6248                     TabDialog.RemoveTab(ListTab.TabPages(i).Text)
6249                 End If
6250                 If ListTab.TabPages(i).Text = tabName Then
6251                     ListTab.TabPages(i).Text = newTabText
6252                 End If
6253             Next
6254             _statuses.RenameTab(tabName, newTabText)
6255
6256             For i As Integer = 0 To ListTab.TabCount - 1
6257                 If _statuses.Tabs(ListTab.TabPages(i).Text).TabType = TabUsageType.Mentions OrElse _
6258                    (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
6259                     If ListTab.TabPages(i).Text = tabName Then
6260                         ListTab.TabPages(i).Text = newTabText
6261                     End If
6262                     TabDialog.AddTab(ListTab.TabPages(i).Text)
6263                 End If
6264             Next
6265             SaveConfigsCommon()
6266             SaveConfigsTabs()
6267             _rclickTabName = newTabText
6268             tabName = newTabText
6269             Return True
6270         Else
6271             Return False
6272         End If
6273     End Function
6274
6275     Private Sub Tabs_DoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListTab.MouseDoubleClick
6276         Dim tn As String = ListTab.SelectedTab.Text
6277         TabRename(tn)
6278     End Sub
6279
6280     Private Sub Tabs_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListTab.MouseDown
6281         Dim cpos As New Point(e.X, e.Y)
6282         If e.Button = Windows.Forms.MouseButtons.Left Then
6283             For i As Integer = 0 To ListTab.TabPages.Count - 1
6284                 Dim rect As Rectangle = ListTab.GetTabRect(i)
6285                 If rect.Left <= cpos.X AndAlso cpos.X <= rect.Right AndAlso _
6286                    rect.Top <= cpos.Y AndAlso cpos.Y <= rect.Bottom Then
6287                     _tabDrag = True
6288                     Exit For
6289                 End If
6290             Next
6291         Else
6292             _tabDrag = False
6293         End If
6294     End Sub
6295
6296     Private Sub Tabs_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListTab.DragEnter
6297         If e.Data.GetDataPresent(GetType(TabPage)) Then
6298             e.Effect = DragDropEffects.Move
6299         Else
6300             e.Effect = DragDropEffects.None
6301         End If
6302     End Sub
6303
6304     Private Sub Tabs_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListTab.DragDrop
6305         If Not e.Data.GetDataPresent(GetType(TabPage)) Then Exit Sub
6306
6307         _tabDrag = False
6308         Dim tn As String = ""
6309         Dim bef As Boolean
6310         Dim cpos As New Point(e.X, e.Y)
6311         Dim spos As Point = ListTab.PointToClient(cpos)
6312         Dim i As Integer
6313         For i = 0 To ListTab.TabPages.Count - 1
6314             Dim rect As Rectangle = ListTab.GetTabRect(i)
6315             If rect.Left <= spos.X AndAlso spos.X <= rect.Right AndAlso _
6316                rect.Top <= spos.Y AndAlso spos.Y <= rect.Bottom Then
6317                 tn = ListTab.TabPages(i).Text
6318                 If spos.X <= (rect.Left + rect.Right) / 2 Then
6319                     bef = True
6320                 Else
6321                     bef = False
6322                 End If
6323                 Exit For
6324             End If
6325         Next
6326
6327         'タブのないところにドロップ->最後尾へ移動
6328         If String.IsNullOrEmpty(tn) Then
6329             tn = ListTab.TabPages(ListTab.TabPages.Count - 1).Text
6330             bef = False
6331             i = ListTab.TabPages.Count - 1
6332         End If
6333
6334         Dim tp As TabPage = DirectCast(e.Data.GetData(GetType(TabPage)), TabPage)
6335         If tp.Text = tn Then Exit Sub
6336
6337         ReOrderTab(tp.Text, tn, bef)
6338     End Sub
6339
6340     Public Sub ReOrderTab(ByVal targetTabText As String, ByVal baseTabText As String, ByVal isBeforeBaseTab As Boolean)
6341         Dim baseIndex As Integer = 0
6342         For baseIndex = 0 To ListTab.TabPages.Count - 1
6343             If ListTab.TabPages(baseIndex).Text = baseTabText Then Exit For
6344         Next
6345
6346         ListTab.SuspendLayout()
6347
6348         Dim mTp As TabPage = Nothing
6349         For j As Integer = 0 To ListTab.TabPages.Count - 1
6350             If ListTab.TabPages(j).Text = targetTabText Then
6351                 mTp = ListTab.TabPages(j)
6352                 ListTab.TabPages.Remove(mTp)
6353                 If j < baseIndex Then baseIndex -= 1
6354                 Exit For
6355             End If
6356         Next
6357         If isBeforeBaseTab Then
6358             ListTab.TabPages.Insert(baseIndex, mTp)
6359         Else
6360             ListTab.TabPages.Insert(baseIndex + 1, mTp)
6361         End If
6362
6363         ListTab.ResumeLayout()
6364
6365         SaveConfigsTabs()
6366     End Sub
6367
6368     Private Sub MakeReplyOrDirectStatus(Optional ByVal isAuto As Boolean = True, Optional ByVal isReply As Boolean = True, Optional ByVal isAll As Boolean = False)
6369         'isAuto:True=先頭に挿入、False=カーソル位置に挿入
6370         'isReply:True=@,False=DM
6371         If Not StatusText.Enabled Then Exit Sub
6372         If _curList Is Nothing Then Exit Sub
6373         If _curTab Is Nothing Then Exit Sub
6374         If _curPost Is Nothing Then Exit Sub
6375
6376         ' 複数あてリプライはReplyではなく通常ポスト
6377         '↑仕様変更で全部リプライ扱いでOK(先頭ドット付加しない)
6378         '090403暫定でドットを付加しないようにだけ修正。単独と複数の処理は統合できると思われる。
6379         '090513 all @ replies 廃止の仕様変更によりドット付加に戻し(syo68k)
6380
6381         If _curList.SelectedIndices.Count > 0 Then
6382             ' アイテムが1件以上選択されている
6383             If _curList.SelectedIndices.Count = 1 AndAlso Not isAll AndAlso _curPost IsNot Nothing Then
6384                 ' 単独ユーザー宛リプライまたはDM
6385                 If (_statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.DirectMessage AndAlso isAuto) OrElse (Not isAuto AndAlso Not isReply) Then
6386                     ' ダイレクトメッセージ
6387                     StatusText.Text = "D " + _curPost.Name + " " + StatusText.Text
6388                     StatusText.SelectionStart = StatusText.Text.Length
6389                     StatusText.Focus()
6390                     _reply_to_id = 0
6391                     _reply_to_name = ""
6392                     Exit Sub
6393                 End If
6394                 If String.IsNullOrEmpty(StatusText.Text) Then
6395                     '空の場合
6396
6397                     ' ステータステキストが入力されていない場合先頭に@ユーザー名を追加する
6398                     StatusText.Text = "@" + _curPost.Name + " "
6399                     If _curPost.RetweetedId > 0 Then
6400                         _reply_to_id = _curPost.RetweetedId
6401                     Else
6402                         _reply_to_id = _curPost.Id
6403                     End If
6404                     _reply_to_name = _curPost.Name
6405                 Else
6406                     '何か入力済の場合
6407
6408                     If isAuto Then
6409                         '1件選んでEnter or DoubleClick
6410                         If StatusText.Text.Contains("@" + _curPost.Name + " ") Then
6411                             If _reply_to_id > 0 AndAlso _reply_to_name = _curPost.Name Then
6412                                 '返信先書き換え
6413                                 If _curPost.RetweetedId > 0 Then
6414                                     _reply_to_id = _curPost.RetweetedId
6415                                 Else
6416                                     _reply_to_id = _curPost.Id
6417                                 End If
6418                                 _reply_to_name = _curPost.Name
6419                             End If
6420                             Exit Sub
6421                         End If
6422                         If Not StatusText.Text.StartsWith("@") Then
6423                             '文頭@以外
6424                             If StatusText.Text.StartsWith(". ") Then
6425                                 ' 複数リプライ
6426                                 StatusText.Text = StatusText.Text.Insert(2, "@" + _curPost.Name + " ")
6427                                 _reply_to_id = 0
6428                                 _reply_to_name = ""
6429                             Else
6430                                 ' 単独リプライ
6431                                 StatusText.Text = "@" + _curPost.Name + " " + StatusText.Text
6432                                 If _curPost.RetweetedId > 0 Then
6433                                     _reply_to_id = _curPost.RetweetedId
6434                                 Else
6435                                     _reply_to_id = _curPost.Id
6436                                 End If
6437                                 _reply_to_name = _curPost.Name
6438                             End If
6439                         Else
6440                             '文頭@
6441                             ' 複数リプライ
6442                             StatusText.Text = ". @" + _curPost.Name + " " + StatusText.Text
6443                             'StatusText.Text = "@" + _curPost.Name + " " + StatusText.Text
6444                             _reply_to_id = 0
6445                             _reply_to_name = ""
6446                         End If
6447                     Else
6448                         '1件選んでCtrl-Rの場合(返信先操作せず)
6449                         Dim sidx As Integer = StatusText.SelectionStart
6450                         Dim id As String = "@" + _curPost.Name + " "
6451                         If sidx > 0 Then
6452                             If StatusText.Text.Substring(sidx - 1, 1) <> " " Then
6453                                 id = " " + id
6454                             End If
6455                         End If
6456                         StatusText.Text = StatusText.Text.Insert(sidx, id)
6457                         sidx += id.Length
6458                         'If StatusText.Text.StartsWith("@") Then
6459                         '    '複数リプライ
6460                         '    StatusText.Text = ". " + StatusText.Text.Insert(sidx, " @" + _curPost.Name + " ")
6461                         '    sidx += 5 + _curPost.Name.Length
6462                         'Else
6463                         '    ' 複数リプライ
6464                         '    StatusText.Text = StatusText.Text.Insert(sidx, " @" + _curPost.Name + " ")
6465                         '    sidx += 3 + _curPost.Name.Length
6466                         'End If
6467                         StatusText.SelectionStart = sidx
6468                         StatusText.Focus()
6469                         '_reply_to_id = 0
6470                         '_reply_to_name = Nothing
6471                         Exit Sub
6472                     End If
6473                 End If
6474             Else
6475                 ' 複数リプライ
6476                 If Not isAuto AndAlso Not isReply Then Exit Sub
6477
6478                 'C-S-rか、複数の宛先を選択中にEnter/DoubleClick/C-r/C-S-r
6479
6480                 If isAuto Then
6481                     'Enter or DoubleClick
6482
6483                     Dim sTxt As String = StatusText.Text
6484                     If Not sTxt.StartsWith(". ") Then
6485                         sTxt = ". " + sTxt
6486                         _reply_to_id = 0
6487                         _reply_to_name = ""
6488                     End If
6489                     For cnt As Integer = 0 To _curList.SelectedIndices.Count - 1
6490                         Dim post As PostClass = _statuses.Item(_curTab.Text, _curList.SelectedIndices(cnt))
6491                         If Not sTxt.Contains("@" + post.Name + " ") Then
6492                             sTxt = sTxt.Insert(2, "@" + post.Name + " ")
6493                             'sTxt = "@" + post.Name + " " + sTxt
6494                         End If
6495                     Next
6496                     StatusText.Text = sTxt
6497                 Else
6498                     'C-S-r or C-r
6499                     If _curList.SelectedIndices.Count > 1 Then
6500                         '複数ポスト選択
6501
6502                         Dim ids As String = ""
6503                         Dim sidx As Integer = StatusText.SelectionStart
6504                         For cnt As Integer = 0 To _curList.SelectedIndices.Count - 1
6505                             Dim post As PostClass = _statuses.Item(_curTab.Text, _curList.SelectedIndices(cnt))
6506                             If Not ids.Contains("@" + post.Name + " ") AndAlso _
6507                                Not post.Name.Equals(tw.Username, StringComparison.CurrentCultureIgnoreCase) Then
6508                                 ids += "@" + post.Name + " "
6509                             End If
6510                             If isAll Then
6511                                 For Each nm As String In post.ReplyToList
6512                                     If Not ids.Contains("@" + nm + " ") AndAlso _
6513                                        Not nm.Equals(tw.Username, StringComparison.CurrentCultureIgnoreCase) Then
6514                                         Dim m As Match = Regex.Match(post.Data, "[@@](?<id>" + nm + ")([^a-zA-Z0-9]|$)", RegexOptions.IgnoreCase)
6515                                         If m.Success Then
6516                                             ids += "@" + m.Result("${id}") + " "
6517                                         Else
6518                                             ids += "@" + nm + " "
6519                                         End If
6520                                     End If
6521                                 Next
6522                             End If
6523                         Next
6524                         If ids.Length = 0 Then Exit Sub
6525                         If Not StatusText.Text.StartsWith(". ") Then
6526                             StatusText.Text = ". " + StatusText.Text
6527                             sidx += 2
6528                             _reply_to_id = 0
6529                             _reply_to_name = ""
6530                         End If
6531                         If sidx > 0 Then
6532                             If StatusText.Text.Substring(sidx - 1, 1) <> " " Then
6533                                 ids = " " + ids
6534                             End If
6535                         End If
6536                         StatusText.Text = StatusText.Text.Insert(sidx, ids)
6537                         sidx += ids.Length
6538                         'If StatusText.Text.StartsWith("@") Then
6539                         '    StatusText.Text = ". " + StatusText.Text.Insert(sidx, ids)
6540                         '    sidx += 2 + ids.Length
6541                         'Else
6542                         '    StatusText.Text = StatusText.Text.Insert(sidx, ids)
6543                         '    sidx += 1 + ids.Length
6544                         'End If
6545                         StatusText.SelectionStart = sidx
6546                         StatusText.Focus()
6547                         Exit Sub
6548                     Else
6549                         '1件のみ選択のC-S-r(返信元付加する可能性あり)
6550
6551                         Dim ids As String = ""
6552                         Dim sidx As Integer = StatusText.SelectionStart
6553                         Dim post As PostClass = _curPost
6554                         If Not ids.Contains("@" + post.Name + " ") AndAlso _
6555                            Not post.Name.Equals(tw.Username, StringComparison.CurrentCultureIgnoreCase) Then
6556                             ids += "@" + post.Name + " "
6557                         End If
6558                         For Each nm As String In post.ReplyToList
6559                             If Not ids.Contains("@" + nm + " ") AndAlso _
6560                                Not nm.Equals(tw.Username, StringComparison.CurrentCultureIgnoreCase) Then
6561                                 Dim m As Match = Regex.Match(post.Data, "[@@](?<id>" + nm + ")([^a-zA-Z0-9]|$)", RegexOptions.IgnoreCase)
6562                                 If m.Success Then
6563                                     ids += "@" + m.Result("${id}") + " "
6564                                 Else
6565                                     ids += "@" + nm + " "
6566                                 End If
6567                             End If
6568                         Next
6569                         If Not String.IsNullOrEmpty(post.RetweetedBy) Then
6570                             If Not ids.Contains("@" + post.RetweetedBy + " ") AndAlso _
6571                                Not post.RetweetedBy.Equals(tw.Username, StringComparison.CurrentCultureIgnoreCase) Then
6572                                 ids += "@" + post.RetweetedBy + " "
6573                             End If
6574                         End If
6575                         If ids.Length = 0 Then Exit Sub
6576                         If String.IsNullOrEmpty(StatusText.Text) Then
6577                             '未入力の場合のみ返信先付加
6578                             StatusText.Text = ids
6579                             StatusText.SelectionStart = ids.Length
6580                             StatusText.Focus()
6581                             If post.RetweetedId > 0 Then
6582                                 _reply_to_id = post.RetweetedId
6583                             Else
6584                                 _reply_to_id = post.Id
6585                             End If
6586                             _reply_to_name = post.Name
6587                             Exit Sub
6588                         End If
6589
6590                         If sidx > 0 Then
6591                             If StatusText.Text.Substring(sidx - 1, 1) <> " " Then
6592                                 ids = " " + ids
6593                             End If
6594                         End If
6595                         StatusText.Text = StatusText.Text.Insert(sidx, ids)
6596                         sidx += ids.Length
6597                         StatusText.SelectionStart = sidx
6598                         StatusText.Focus()
6599                         Exit Sub
6600                     End If
6601                 End If
6602             End If
6603             StatusText.SelectionStart = StatusText.Text.Length
6604             StatusText.Focus()
6605         End If
6606     End Sub
6607
6608     Private Sub ListTab_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListTab.MouseUp
6609         _tabDrag = False
6610     End Sub
6611
6612     Private Sub TimerRefreshIcon_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerRefreshIcon.Tick
6613         '200ms
6614         If _colorize Then Colorize()
6615         If Not TimerRefreshIcon.Enabled Then Exit Sub
6616         Static iconCnt As Integer = 0
6617         Static blinkCnt As Integer = 0
6618         Static blink As Boolean = False
6619         Static idle As Boolean = False
6620         'Static usCheckCnt As Integer = 0
6621
6622         Static iconDlListTopItem As ListViewItem = Nothing
6623         If DirectCast(ListTab.SelectedTab.Tag, ListView).TopItem Is iconDlListTopItem Then
6624             DirectCast(Me.TIconDic, ImageDictionary).PauseGetImage = False
6625         Else
6626             DirectCast(Me.TIconDic, ImageDictionary).PauseGetImage = True
6627         End If
6628         iconDlListTopItem = DirectCast(ListTab.SelectedTab.Tag, ListView).TopItem
6629
6630         iconCnt += 1
6631         blinkCnt += 1
6632         'usCheckCnt += 1
6633
6634         'If usCheckCnt > 300 Then    '1min
6635         '    usCheckCnt = 0
6636         '    If Not Me.IsReceivedUserStream Then
6637         '        TraceOut("ReconnectUserStream")
6638         '        tw.ReconnectUserStream()
6639         '    End If
6640         'End If
6641
6642         Dim busy As Boolean = False
6643         For Each bw As BackgroundWorker In Me._bw
6644             If bw IsNot Nothing AndAlso bw.IsBusy Then
6645                 busy = True
6646                 Exit For
6647             End If
6648         Next
6649
6650         If iconCnt > 3 Then
6651             iconCnt = 0
6652         End If
6653         If blinkCnt > 10 Then
6654             blinkCnt = 0
6655             '未保存の変更を保存
6656             SaveConfigsAll(True)
6657         End If
6658
6659         If busy Then
6660             NotifyIcon1.Icon = NIconRefresh(iconCnt)
6661             idle = False
6662             _myStatusError = False
6663             Exit Sub
6664         End If
6665
6666         Dim tb As TabClass = _statuses.GetTabByType(TabUsageType.Mentions)
6667         If SettingDialog.ReplyIconState <> REPLY_ICONSTATE.None AndAlso tb IsNot Nothing AndAlso tb.UnreadCount > 0 Then
6668             If blinkCnt > 0 Then Exit Sub
6669             blink = Not blink
6670             If blink OrElse SettingDialog.ReplyIconState = REPLY_ICONSTATE.StaticIcon Then
6671                 NotifyIcon1.Icon = ReplyIcon
6672             Else
6673                 NotifyIcon1.Icon = ReplyIconBlink
6674             End If
6675             idle = False
6676             Exit Sub
6677         End If
6678
6679         If idle Then Exit Sub
6680         idle = True
6681         '優先度:エラー→オフライン→アイドル
6682         'エラーは更新アイコンでクリアされる
6683         If _myStatusError Then
6684             NotifyIcon1.Icon = NIconAtRed
6685             Exit Sub
6686         End If
6687         If _myStatusOnline Then
6688             NotifyIcon1.Icon = NIconAt
6689         Else
6690             NotifyIcon1.Icon = NIconAtSmoke
6691         End If
6692     End Sub
6693
6694     Private Sub ContextMenuTabProperty_Opening(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ContextMenuTabProperty.Opening
6695         '右クリックの場合はタブ名が設定済。アプリケーションキーの場合は現在のタブを対象とする
6696         If String.IsNullOrEmpty(_rclickTabName) OrElse sender IsNot ContextMenuTabProperty Then
6697             If ListTab IsNot Nothing AndAlso ListTab.SelectedTab IsNot Nothing Then
6698                 _rclickTabName = ListTab.SelectedTab.Text
6699             Else
6700                 Exit Sub
6701             End If
6702         End If
6703
6704         If _statuses Is Nothing Then Exit Sub
6705         If _statuses.Tabs Is Nothing Then Exit Sub
6706
6707         Dim tb As TabClass = _statuses.Tabs(_rclickTabName)
6708         If tb Is Nothing Then Exit Sub
6709
6710         NotifyDispMenuItem.Checked = tb.Notify
6711         Me.NotifyTbMenuItem.Checked = tb.Notify
6712
6713         soundfileListup = True
6714         SoundFileComboBox.Items.Clear()
6715         Me.SoundFileTbComboBox.Items.Clear()
6716         SoundFileComboBox.Items.Add("")
6717         Me.SoundFileTbComboBox.Items.Add("")
6718         Dim oDir As IO.DirectoryInfo = New IO.DirectoryInfo(My.Application.Info.DirectoryPath + IO.Path.DirectorySeparatorChar)
6719         If IO.Directory.Exists(IO.Path.Combine(My.Application.Info.DirectoryPath, "Sounds")) Then
6720             oDir = oDir.GetDirectories("Sounds")(0)
6721         End If
6722         For Each oFile As IO.FileInfo In oDir.GetFiles("*.wav")
6723             SoundFileComboBox.Items.Add(oFile.Name)
6724             Me.SoundFileTbComboBox.Items.Add(oFile.Name)
6725         Next
6726         Dim idx As Integer = SoundFileComboBox.Items.IndexOf(tb.SoundFile)
6727         If idx = -1 Then idx = 0
6728         SoundFileComboBox.SelectedIndex = idx
6729         Me.SoundFileTbComboBox.SelectedIndex = idx
6730         soundfileListup = False
6731         UreadManageMenuItem.Checked = tb.UnreadManage
6732         Me.UnreadMngTbMenuItem.Checked = tb.UnreadManage
6733
6734         TabMenuControl(_rclickTabName)
6735     End Sub
6736
6737     Private Sub TabMenuControl(ByVal tabName As String)
6738         If _statuses.Tabs(tabName).TabType <> TabUsageType.Mentions AndAlso _statuses.IsDefaultTab(tabName) Then
6739             FilterEditMenuItem.Enabled = True
6740             Me.EditRuleTbMenuItem.Enabled = True
6741             DeleteTabMenuItem.Enabled = False
6742             Me.DeleteTbMenuItem.Enabled = False
6743         ElseIf _statuses.Tabs(tabName).TabType = TabUsageType.Mentions Then
6744             FilterEditMenuItem.Enabled = True
6745             Me.EditRuleTbMenuItem.Enabled = True
6746             DeleteTabMenuItem.Enabled = False
6747             Me.DeleteTbMenuItem.Enabled = False
6748         Else
6749             FilterEditMenuItem.Enabled = True
6750             Me.EditRuleTbMenuItem.Enabled = True
6751             DeleteTabMenuItem.Enabled = True
6752             Me.DeleteTbMenuItem.Enabled = True
6753         End If
6754     End Sub
6755
6756     Private Sub UreadManageMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UreadManageMenuItem.Click, UnreadMngTbMenuItem.Click
6757         UreadManageMenuItem.Checked = DirectCast(sender, ToolStripMenuItem).Checked
6758         Me.UnreadMngTbMenuItem.Checked = UreadManageMenuItem.Checked
6759
6760         If String.IsNullOrEmpty(_rclickTabName) Then Exit Sub
6761         ChangeTabUnreadManage(_rclickTabName, UreadManageMenuItem.Checked)
6762
6763         SaveConfigsTabs()
6764     End Sub
6765
6766     Public Sub ChangeTabUnreadManage(ByVal tabName As String, ByVal isManage As Boolean)
6767
6768         Dim idx As Integer
6769         For idx = 0 To ListTab.TabCount
6770             If ListTab.TabPages(idx).Text = tabName Then Exit For
6771         Next
6772
6773         _statuses.SetTabUnreadManage(tabName, isManage)
6774         If SettingDialog.TabIconDisp Then
6775             If _statuses.Tabs(tabName).UnreadCount > 0 Then
6776                 ListTab.TabPages(idx).ImageIndex = 0
6777             Else
6778                 ListTab.TabPages(idx).ImageIndex = -1
6779             End If
6780         End If
6781
6782         If _curTab.Text = tabName Then
6783             _itemCache = Nothing
6784             _postCache = Nothing
6785             _curList.Refresh()
6786         End If
6787
6788         SetMainWindowTitle()
6789         SetStatusLabelUrl()
6790         If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
6791     End Sub
6792
6793     Private Sub NotifyDispMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NotifyDispMenuItem.Click, NotifyTbMenuItem.Click
6794         NotifyDispMenuItem.Checked = DirectCast(sender, ToolStripMenuItem).Checked
6795         Me.NotifyTbMenuItem.Checked = NotifyDispMenuItem.Checked
6796
6797         If String.IsNullOrEmpty(_rclickTabName) Then Exit Sub
6798
6799         _statuses.Tabs(_rclickTabName).Notify = NotifyDispMenuItem.Checked
6800
6801         SaveConfigsTabs()
6802     End Sub
6803
6804     Private Sub SoundFileComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SoundFileComboBox.SelectedIndexChanged, SoundFileTbComboBox.SelectedIndexChanged
6805         If soundfileListup OrElse _rclickTabName = "" Then Exit Sub
6806
6807         _statuses.Tabs(_rclickTabName).SoundFile = DirectCast(DirectCast(sender, ToolStripComboBox).SelectedItem, String)
6808
6809         SaveConfigsTabs()
6810     End Sub
6811
6812     Private Sub DeleteTabMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DeleteTabMenuItem.Click, DeleteTbMenuItem.Click
6813         If String.IsNullOrEmpty(_rclickTabName) OrElse sender Is Me.DeleteTbMenuItem Then _rclickTabName = ListTab.SelectedTab.Text
6814
6815         RemoveSpecifiedTab(_rclickTabName)
6816         SaveConfigsTabs()
6817     End Sub
6818
6819     Private Sub FilterEditMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FilterEditMenuItem.Click, EditRuleTbMenuItem.Click
6820
6821         If String.IsNullOrEmpty(_rclickTabName) Then _rclickTabName = _statuses.GetTabByType(TabUsageType.Home).TabName
6822         fDialog.SetCurrent(_rclickTabName)
6823         fDialog.ShowDialog()
6824         Me.TopMost = SettingDialog.AlwaysTop
6825
6826         Try
6827             Me.Cursor = Cursors.WaitCursor
6828             _itemCache = Nothing
6829             _postCache = Nothing
6830             _curPost = Nothing
6831             _curItemIndex = -1
6832             _statuses.FilterAll()
6833             For Each tb As TabPage In ListTab.TabPages
6834                 DirectCast(tb.Tag, DetailsListView).VirtualListSize = _statuses.Tabs(tb.Text).AllCount
6835                 If _statuses.Tabs(tb.Text).UnreadCount > 0 Then
6836                     If SettingDialog.TabIconDisp Then
6837                         tb.ImageIndex = 0
6838                     End If
6839                 Else
6840                     If SettingDialog.TabIconDisp Then
6841                         tb.ImageIndex = -1
6842                     End If
6843                 End If
6844             Next
6845             If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
6846         Finally
6847             Me.Cursor = Cursors.Default
6848         End Try
6849         SaveConfigsTabs()
6850     End Sub
6851
6852     Private Sub AddTabMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddTabMenuItem.Click, CreateTbMenuItem.Click
6853         Dim tabName As String = Nothing
6854         Dim tabUsage As TabUsageType
6855         Using inputName As New InputTabName()
6856             inputName.TabName = _statuses.GetUniqueTabName
6857             inputName.IsShowUsage = True
6858             inputName.ShowDialog()
6859             If inputName.DialogResult = Windows.Forms.DialogResult.Cancel Then Exit Sub
6860             tabName = inputName.TabName
6861             tabUsage = inputName.Usage
6862             inputName.Dispose()
6863         End Using
6864         Me.TopMost = SettingDialog.AlwaysTop
6865         If Not String.IsNullOrEmpty(tabName) Then
6866             'List対応
6867             Dim list As ListElement = Nothing
6868             If tabUsage = TabUsageType.Lists Then
6869                 Using listAvail As New ListAvailable
6870                     If listAvail.ShowDialog(Me) = Windows.Forms.DialogResult.Cancel Then Exit Sub
6871                     If listAvail.SelectedList Is Nothing Then Exit Sub
6872                     list = listAvail.SelectedList
6873                 End Using
6874             End If
6875             If Not AddNewTab(tabName, False, tabUsage) Then
6876                 Dim tmp As String = String.Format(My.Resources.AddTabMenuItem_ClickText1, tabName)
6877                 MessageBox.Show(tmp, My.Resources.AddTabMenuItem_ClickText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
6878             Else
6879                 '成功
6880                 _statuses.AddTab(tabName, tabUsage, list)
6881                 SaveConfigsTabs()
6882                 If tabUsage = TabUsageType.PublicSearch Then
6883                     ListTab.SelectedIndex = ListTab.TabPages.Count - 1
6884                     ListTabSelect(ListTab.TabPages(ListTab.TabPages.Count - 1))
6885                     ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch").Focus()
6886                 End If
6887                 If tabUsage = TabUsageType.Lists Then
6888                     ListTab.SelectedIndex = ListTab.TabPages.Count - 1
6889                     ListTabSelect(ListTab.TabPages(ListTab.TabPages.Count - 1))
6890                     GetTimeline(WORKERTYPE.List, 1, 0, tabName)
6891                 End If
6892             End If
6893         End If
6894     End Sub
6895
6896     Private Sub TabMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabMenuItem.Click, CreateTabRuleOpMenuItem.Click
6897         '選択発言を元にフィルタ追加
6898         For Each idx As Integer In _curList.SelectedIndices
6899             Dim tabName As String = ""
6900             'タブ選択(or追加)
6901             If Not SelectTab(tabName) Then Exit Sub
6902
6903             fDialog.SetCurrent(tabName)
6904             If _statuses.Item(_curTab.Text, idx).RetweetedId = 0 Then
6905                 fDialog.AddNewFilter(_statuses.Item(_curTab.Text, idx).Name, _statuses.Item(_curTab.Text, idx).Data)
6906             Else
6907                 fDialog.AddNewFilter(_statuses.Item(_curTab.Text, idx).RetweetedBy, _statuses.Item(_curTab.Text, idx).Data)
6908             End If
6909             fDialog.ShowDialog()
6910             Me.TopMost = SettingDialog.AlwaysTop
6911         Next
6912
6913         Try
6914             Me.Cursor = Cursors.WaitCursor
6915             _itemCache = Nothing
6916             _postCache = Nothing
6917             _curPost = Nothing
6918             _curItemIndex = -1
6919             _statuses.FilterAll()
6920             For Each tb As TabPage In ListTab.TabPages
6921                 DirectCast(tb.Tag, DetailsListView).VirtualListSize = _statuses.Tabs(tb.Text).AllCount
6922                 If _statuses.Tabs(tb.Text).UnreadCount > 0 Then
6923                     If SettingDialog.TabIconDisp Then
6924                         tb.ImageIndex = 0
6925                     End If
6926                 Else
6927                     If SettingDialog.TabIconDisp Then
6928                         tb.ImageIndex = -1
6929                     End If
6930                 End If
6931             Next
6932             If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
6933         Finally
6934             Me.Cursor = Cursors.Default
6935         End Try
6936         SaveConfigsTabs()
6937         If Me.ListTab.SelectedTab IsNot Nothing AndAlso
6938             DirectCast(Me.ListTab.SelectedTab.Tag, DetailsListView).SelectedIndices.Count > 0 Then
6939             _curPost = _statuses.Item(Me.ListTab.SelectedTab.Text, DirectCast(Me.ListTab.SelectedTab.Tag, DetailsListView).SelectedIndices(0))
6940         End If
6941     End Sub
6942
6943     Protected Overrides Function ProcessDialogKey( _
6944         ByVal keyData As Keys) As Boolean
6945         'TextBox1でEnterを押してもビープ音が鳴らないようにする
6946         If (keyData And Keys.KeyCode) = Keys.Enter Then
6947             If StatusText.Focused Then
6948                 '改行
6949                 If StatusText.Multiline AndAlso _
6950                    (Not SettingDialog.PostShiftEnter AndAlso (keyData And Keys.Shift) = Keys.Shift AndAlso _
6951                    (keyData And Keys.Control) <> Keys.Control) OrElse _
6952                    (SettingDialog.PostShiftEnter AndAlso (keyData And Keys.Control) = Keys.Control AndAlso _
6953                    (keyData And Keys.Shift) <> Keys.Shift) Then
6954                     Dim pos1 As Integer = StatusText.SelectionStart
6955                     If StatusText.SelectionLength > 0 Then
6956                         StatusText.Text = StatusText.Text.Remove(pos1, StatusText.SelectionLength)  '選択状態文字列削除
6957                     End If
6958                     StatusText.Text = StatusText.Text.Insert(pos1, Environment.NewLine)  '改行挿入
6959                     StatusText.SelectionStart = pos1 + Environment.NewLine.Length    'カーソルを改行の次の文字へ移動
6960                     Return True
6961                 End If
6962                 '投稿
6963                 If (Not StatusText.Multiline AndAlso _
6964                         ((keyData And Keys.Control) = Keys.Control AndAlso SettingDialog.PostCtrlEnter) OrElse _
6965                         ((keyData And Keys.Shift) = Keys.Shift AndAlso SettingDialog.PostShiftEnter) OrElse _
6966                         (((keyData And Keys.Control) <> Keys.Control AndAlso Not SettingDialog.PostCtrlEnter) AndAlso _
6967                          ((keyData And Keys.Shift) <> Keys.Shift AndAlso Not SettingDialog.PostShiftEnter))) OrElse _
6968                    (StatusText.Multiline AndAlso _
6969                         (Not SettingDialog.PostCtrlEnter AndAlso Not SettingDialog.PostShiftEnter AndAlso _
6970                             ((keyData And Keys.Control) <> Keys.Control AndAlso (keyData And Keys.Shift) <> Keys.Shift) OrElse _
6971                             ((keyData And Keys.Control) = Keys.Control AndAlso (keyData And Keys.Shift) = Keys.Shift)) OrElse _
6972                         (SettingDialog.PostCtrlEnter AndAlso (keyData And Keys.Control) = Keys.Control) OrElse _
6973                         (SettingDialog.PostShiftEnter AndAlso (keyData And Keys.Shift) = Keys.Shift)) Then
6974                     PostButton_Click(Nothing, Nothing)
6975                     Return True
6976                 End If
6977             ElseIf _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.PublicSearch AndAlso _
6978                 (ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch").Focused OrElse _
6979                  ListTab.SelectedTab.Controls("panelSearch").Controls("comboLang").Focused) Then
6980                 Me.SearchButton_Click(ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch"), Nothing)
6981                 Return True
6982             End If
6983         End If
6984
6985         Return MyBase.ProcessDialogKey(keyData)
6986     End Function
6987
6988     Private Sub ReplyAllStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReplyAllStripMenuItem.Click, ReplyAllOpMenuItem.Click
6989         MakeReplyOrDirectStatus(False, True, True)
6990     End Sub
6991
6992     Private Sub IDRuleMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IDRuleMenuItem.Click, CreateIdRuleOpMenuItem.Click
6993         Dim tabName As String = ""
6994
6995         '未選択なら処理終了
6996         If _curList.SelectedIndices.Count = 0 Then Exit Sub
6997
6998         'タブ選択(or追加)
6999         If Not SelectTab(tabName) Then Exit Sub
7000
7001         Dim mv As Boolean = False
7002         Dim mk As Boolean = False
7003         MoveOrCopy(mv, mk)
7004
7005         Dim ids As New List(Of String)
7006         For Each idx As Integer In _curList.SelectedIndices
7007             Dim post As PostClass = _statuses.Item(_curTab.Text, idx)
7008             If Not ids.Contains(post.Name) Then
7009                 Dim fc As New FiltersClass
7010                 ids.Add(post.Name)
7011                 If post.RetweetedId = 0 Then
7012                     fc.NameFilter = post.Name
7013                 Else
7014                     fc.NameFilter = post.RetweetedBy
7015                 End If
7016                 fc.SearchBoth = True
7017                 fc.MoveFrom = mv
7018                 fc.SetMark = mk
7019                 fc.UseRegex = False
7020                 fc.SearchUrl = False
7021                 _statuses.Tabs(tabName).AddFilter(fc)
7022             End If
7023         Next
7024         If ids.Count <> 0 Then
7025             Dim atids As New List(Of String)
7026             For Each id As String In ids
7027                 atids.Add("@" + id)
7028             Next
7029             Dim cnt As Integer = AtIdSupl.ItemCount
7030             AtIdSupl.AddRangeItem(atids.ToArray)
7031             If AtIdSupl.ItemCount <> cnt Then _modifySettingAtId = True
7032         End If
7033
7034         Try
7035             Me.Cursor = Cursors.WaitCursor
7036             _itemCache = Nothing
7037             _postCache = Nothing
7038             _curPost = Nothing
7039             _curItemIndex = -1
7040             _statuses.FilterAll()
7041             For Each tb As TabPage In ListTab.TabPages
7042                 DirectCast(tb.Tag, DetailsListView).VirtualListSize = _statuses.Tabs(tb.Text).AllCount
7043                 If _statuses.ContainsTab(tb.Text) Then
7044                     If _statuses.Tabs(tb.Text).UnreadCount > 0 Then
7045                         If SettingDialog.TabIconDisp Then
7046                             tb.ImageIndex = 0
7047                         End If
7048                     Else
7049                         If SettingDialog.TabIconDisp Then
7050                             tb.ImageIndex = -1
7051                         End If
7052                     End If
7053                 End If
7054             Next
7055             If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
7056         Finally
7057             Me.Cursor = Cursors.Default
7058         End Try
7059         SaveConfigsTabs()
7060     End Sub
7061
7062     Private Function SelectTab(ByRef tabName As String) As Boolean
7063         Do
7064             '振り分け先タブ選択
7065             If TabDialog.ShowDialog = Windows.Forms.DialogResult.Cancel Then
7066                 Me.TopMost = SettingDialog.AlwaysTop
7067                 Return False
7068             End If
7069             Me.TopMost = SettingDialog.AlwaysTop
7070             tabName = TabDialog.SelectedTabName
7071
7072             ListTab.SelectedTab.Focus()
7073             '新規タブを選択→タブ作成
7074             If tabName = My.Resources.IDRuleMenuItem_ClickText1 Then
7075                 Using inputName As New InputTabName()
7076                     inputName.TabName = _statuses.GetUniqueTabName
7077                     inputName.ShowDialog()
7078                     If inputName.DialogResult = Windows.Forms.DialogResult.Cancel Then Return False
7079                     tabName = inputName.TabName
7080                     inputName.Dispose()
7081                 End Using
7082                 Me.TopMost = SettingDialog.AlwaysTop
7083                 If Not String.IsNullOrEmpty(tabName) Then
7084                     If Not AddNewTab(tabName, False, TabUsageType.UserDefined) Then
7085                         Dim tmp As String = String.Format(My.Resources.IDRuleMenuItem_ClickText2, tabName)
7086                         MessageBox.Show(tmp, My.Resources.IDRuleMenuItem_ClickText3, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
7087                         'もう一度タブ名入力
7088                     Else
7089                         _statuses.AddTab(tabName, TabUsageType.UserDefined, Nothing)
7090                         Return True
7091                     End If
7092                 End If
7093             Else
7094                 '既存タブを選択
7095                 Return True
7096             End If
7097         Loop While True
7098
7099     End Function
7100
7101     Private Sub MoveOrCopy(ByRef move As Boolean, ByRef mark As Boolean)
7102         With Block
7103             '移動するか?
7104             Dim _tmp As String = String.Format(My.Resources.IDRuleMenuItem_ClickText4, Environment.NewLine)
7105             If MessageBox.Show(_tmp, My.Resources.IDRuleMenuItem_ClickText5, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
7106                 move = False
7107             Else
7108                 move = True
7109             End If
7110         End With
7111         If Not move Then
7112             'マークするか?
7113             Dim _tmp As String = String.Format(My.Resources.IDRuleMenuItem_ClickText6, vbCrLf)
7114             If MessageBox.Show(_tmp, My.Resources.IDRuleMenuItem_ClickText7, MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
7115                 mark = True
7116             Else
7117                 mark = False
7118             End If
7119         End If
7120     End Sub
7121     Private Sub CopySTOTMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CopySTOTMenuItem.Click
7122         Me.CopyStot()
7123     End Sub
7124
7125     Private Sub CopyURLMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CopyURLMenuItem.Click
7126         Me.CopyIdUri()
7127     End Sub
7128
7129     Private Sub SelectAllMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SelectAllMenuItem.Click, SelAllOpMenuItem.Click
7130         If StatusText.Focused Then
7131             ' 発言欄でのCtrl+A
7132             StatusText.SelectAll()
7133         Else
7134             ' ListView上でのCtrl+A
7135             For i As Integer = 0 To _curList.VirtualListSize - 1
7136                 _curList.SelectedIndices.Add(i)
7137             Next
7138         End If
7139     End Sub
7140
7141     Private Sub MoveMiddle()
7142         Dim _item As ListViewItem
7143         Dim idx1 As Integer
7144         Dim idx2 As Integer
7145
7146         If _curList.SelectedIndices.Count = 0 Then Exit Sub
7147
7148         Dim idx As Integer = _curList.SelectedIndices(0)
7149
7150         _item = _curList.GetItemAt(0, 25)
7151         If _item Is Nothing Then
7152             idx1 = 0
7153         Else
7154             idx1 = _item.Index
7155         End If
7156         _item = _curList.GetItemAt(0, _curList.ClientSize.Height - 1)
7157         If _item Is Nothing Then
7158             idx2 = _curList.VirtualListSize - 1
7159         Else
7160             idx2 = _item.Index
7161         End If
7162
7163         idx -= Math.Abs(idx1 - idx2) \ 2
7164         If idx < 0 Then idx = 0
7165
7166         _curList.EnsureVisible(_curList.VirtualListSize - 1)
7167         _curList.EnsureVisible(idx)
7168     End Sub
7169
7170     Private Sub OpenURLMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenURLMenuItem.Click, OpenUrlOpMenuItem.Click
7171         If PostBrowser.Document.Links.Count > 0 Then
7172             UrlDialog.ClearUrl()
7173
7174             Dim openUrlStr As String = ""
7175
7176             If PostBrowser.Document.Links.Count = 1 Then
7177                 Dim urlStr As String = ""
7178                 Try
7179                     urlStr = IDNDecode(PostBrowser.Document.Links(0).GetAttribute("href"))
7180                 Catch ex As ArgumentException
7181                     '変なHTML?
7182                     Exit Sub
7183                 End Try
7184                 If String.IsNullOrEmpty(urlStr) Then Exit Sub
7185                 openUrlStr = urlEncodeMultibyteChar(urlStr)
7186             Else
7187                 For Each linkElm As HtmlElement In PostBrowser.Document.Links
7188                     Dim urlStr As String = ""
7189                     Dim linkText As String = ""
7190                     Try
7191                         urlStr = IDNDecode(linkElm.GetAttribute("href"))
7192                         linkText = linkElm.InnerText
7193                         If Not linkText.StartsWith("http") AndAlso Not linkText.StartsWith("#") Then
7194                             linkText = "@" + linkText
7195                         End If
7196                     Catch ex As ArgumentException
7197                         '変なHTML?
7198                         Exit Sub
7199                     End Try
7200                     If String.IsNullOrEmpty(urlStr) Then Continue For
7201                     UrlDialog.AddUrl(New OpenUrlItem(linkText, urlEncodeMultibyteChar(urlStr)))
7202                 Next
7203                 Try
7204                     If UrlDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
7205                         openUrlStr = UrlDialog.SelectedUrl
7206                     End If
7207                 Catch ex As Exception
7208                     Exit Sub
7209                 End Try
7210                 Me.TopMost = SettingDialog.AlwaysTop
7211             End If
7212             If String.IsNullOrEmpty(openUrlStr) Then Exit Sub
7213
7214             If openUrlStr.StartsWith("http://twitter.com/search?q=%23") OrElse _
7215                openUrlStr.StartsWith("https://twitter.com/search?q=%23") Then
7216                 'ハッシュタグの場合は、タブで開く
7217                 Dim urlStr As String = HttpUtility.UrlDecode(openUrlStr)
7218                 Dim hash As String = urlStr.Substring(urlStr.IndexOf("#"))
7219                 HashSupl.AddItem(hash)
7220                 HashMgr.AddHashToHistory(hash.Trim, False)
7221                 AddNewTabForSearch(hash)
7222                 Exit Sub
7223             End If
7224
7225             openUrlStr = openUrlStr.Replace("://twitter.com/search?q=#", "://twitter.com/search?q=%23")
7226             OpenUriAsync(openUrlStr)
7227         End If
7228     End Sub
7229
7230     Private Sub ClearTabMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ClearTabMenuItem.Click, ClearTbMenuItem.Click
7231         If String.IsNullOrEmpty(_rclickTabName) Then Exit Sub
7232         ClearTab(_rclickTabName, True)
7233     End Sub
7234
7235     Private Sub ClearTab(ByVal tabName As String, ByVal showWarning As Boolean)
7236         If showWarning Then
7237             Dim tmp As String = String.Format(My.Resources.ClearTabMenuItem_ClickText1, Environment.NewLine)
7238             If MessageBox.Show(tmp, tabName + " " + My.Resources.ClearTabMenuItem_ClickText2, MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then
7239                 Exit Sub
7240             End If
7241         End If
7242
7243         _statuses.ClearTabIds(tabName)
7244         If ListTab.SelectedTab.Text = tabName Then
7245             _anchorPost = Nothing
7246             _anchorFlag = False
7247             _itemCache = Nothing
7248             _postCache = Nothing
7249             _itemCacheIndex = -1
7250             _curItemIndex = -1
7251             _curPost = Nothing
7252         End If
7253         For Each tb As TabPage In ListTab.TabPages
7254             If tb.Text = tabName Then
7255                 tb.ImageIndex = -1
7256                 DirectCast(tb.Tag, DetailsListView).VirtualListSize = 0
7257                 Exit For
7258             End If
7259         Next
7260         If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
7261
7262         SetMainWindowTitle()
7263         SetStatusLabelUrl()
7264     End Sub
7265
7266     Private Sub SetMainWindowTitle()
7267         'メインウインドウタイトルの書き換え
7268         Dim ttl As New StringBuilder(256)
7269         Dim ur As Integer = 0
7270         Dim al As Integer = 0
7271         Static myVer As String = fileVersion
7272         Static followers As Long = 0
7273         If SettingDialog.DispLatestPost <> DispTitleEnum.None AndAlso _
7274            SettingDialog.DispLatestPost <> DispTitleEnum.Post AndAlso _
7275            SettingDialog.DispLatestPost <> DispTitleEnum.Ver AndAlso _
7276            SettingDialog.DispLatestPost <> DispTitleEnum.OwnStatus Then
7277             For Each key As String In _statuses.Tabs.Keys
7278                 ur += _statuses.Tabs(key).UnreadCount
7279                 al += _statuses.Tabs(key).AllCount
7280             Next
7281         End If
7282
7283         If SettingDialog.DispUsername Then ttl.Append(tw.Username).Append(" - ")
7284         ttl.Append("Tween  ")
7285         Select Case SettingDialog.DispLatestPost
7286             Case DispTitleEnum.Ver
7287                 ttl.Append("Ver:").Append(myVer)
7288             Case DispTitleEnum.Post
7289                 If _history IsNot Nothing AndAlso _history.Count > 1 Then
7290                     ttl.Append(_history(_history.Count - 2).status.Replace(vbCrLf, ""))
7291                 End If
7292             Case DispTitleEnum.UnreadRepCount
7293                 ttl.AppendFormat(My.Resources.SetMainWindowTitleText1, _statuses.GetTabByType(TabUsageType.Mentions).UnreadCount + _statuses.GetTabByType(TabUsageType.DirectMessage).UnreadCount)
7294             Case DispTitleEnum.UnreadAllCount
7295                 ttl.AppendFormat(My.Resources.SetMainWindowTitleText2, ur)
7296             Case DispTitleEnum.UnreadAllRepCount
7297                 ttl.AppendFormat(My.Resources.SetMainWindowTitleText3, ur, _statuses.GetTabByType(TabUsageType.Mentions).UnreadCount + _statuses.GetTabByType(TabUsageType.DirectMessage).UnreadCount)
7298             Case DispTitleEnum.UnreadCountAllCount
7299                 ttl.AppendFormat(My.Resources.SetMainWindowTitleText4, ur, al)
7300             Case DispTitleEnum.OwnStatus
7301                 If followers = 0 AndAlso tw.FollowersCount > 0 Then followers = tw.FollowersCount
7302                 ttl.AppendFormat(My.Resources.OwnStatusTitle, tw.StatusesCount, tw.FriendsCount, tw.FollowersCount, tw.FollowersCount - followers)
7303         End Select
7304
7305         Try
7306             Me.Text = ttl.ToString()
7307         Catch ex As AccessViolationException
7308             '原因不明。ポスト内容に依存か?たまーに発生するが再現せず。
7309         End Try
7310     End Sub
7311
7312     Private Function GetStatusLabelText() As String
7313         'ステータス欄にカウント表示
7314         'タブ未読数/タブ発言数 全未読数/総発言数 (未読@+未読DM数)
7315         If _statuses Is Nothing Then Return ""
7316         Dim tbRep As TabClass = _statuses.GetTabByType(TabUsageType.Mentions)
7317         Dim tbDm As TabClass = _statuses.GetTabByType(TabUsageType.DirectMessage)
7318         If tbRep Is Nothing OrElse tbDm Is Nothing Then Return ""
7319         Dim urat As Integer = tbRep.UnreadCount + tbDm.UnreadCount
7320         Dim ur As Integer = 0
7321         Dim al As Integer = 0
7322         Dim tur As Integer = 0
7323         Dim tal As Integer = 0
7324         Dim slbl As StringBuilder = New StringBuilder(256)
7325         Try
7326             For Each key As String In _statuses.Tabs.Keys
7327                 ur += _statuses.Tabs(key).UnreadCount
7328                 al += _statuses.Tabs(key).AllCount
7329                 If key.Equals(_curTab.Text) Then
7330                     tur = _statuses.Tabs(key).UnreadCount
7331                     tal = _statuses.Tabs(key).AllCount
7332                 End If
7333             Next
7334         Catch ex As Exception
7335             Return ""
7336         End Try
7337
7338         UnreadCounter = ur
7339         UnreadAtCounter = urat
7340
7341         slbl.AppendFormat(My.Resources.SetStatusLabelText1, tur, tal, ur, al, urat, _postTimestamps.Count, _favTimestamps.Count, _tlCount)
7342         If SettingDialog.TimelinePeriodInt = 0 Then
7343             slbl.Append(My.Resources.SetStatusLabelText2)
7344         Else
7345             slbl.Append(SettingDialog.TimelinePeriodInt.ToString() + My.Resources.SetStatusLabelText3)
7346         End If
7347         Return slbl.ToString()
7348     End Function
7349
7350     Delegate Sub SetStatusLabelApiDelegate()
7351
7352     Private Sub SetStatusLabelApiHandler(ByVal sender As Object, ByVal e As ApiInformationChangedEventArgs)
7353         If InvokeRequired Then
7354             Invoke(New SetStatusLabelApiDelegate(AddressOf SetStatusLabelApi))
7355         Else
7356             SetStatusLabelApi()
7357         End If
7358     End Sub
7359
7360     Private Sub SetStatusLabelApi()
7361         Me._apiGauge.RemainCount = TwitterApiInfo.RemainCount
7362         Me._apiGauge.MaxCount = TwitterApiInfo.MaxCount
7363         Me._apiGauge.ResetTime = TwitterApiInfo.ResetTime
7364     End Sub
7365
7366     Private Sub SetStatusLabelUrl()
7367         StatusLabelUrl.Text = GetStatusLabelText()
7368     End Sub
7369
7370     Public Sub SetStatusLabel(ByVal text As String)
7371         StatusLabel.Text = text
7372     End Sub
7373
7374     Private Sub SetNotifyIconText()
7375         ' タスクトレイアイコンのツールチップテキスト書き換え
7376         ' Tween [未読/@]
7377         Static ur As New StringBuilder(64)
7378         ur.Remove(0, ur.Length)
7379         If SettingDialog.DispUsername Then
7380             ur.Append(tw.Username)
7381             ur.Append(" - ")
7382         End If
7383         ur.Append("Tween")
7384 #If DEBUG Then
7385         ur.Append("(Debug Build)")
7386 #End If
7387         If UnreadCounter <> -1 AndAlso UnreadAtCounter <> -1 Then
7388             ur.Append(" [")
7389             ur.Append(UnreadCounter)
7390             ur.Append("/@")
7391             ur.Append(UnreadAtCounter)
7392             ur.Append("]")
7393         End If
7394         NotifyIcon1.Text = ur.ToString()
7395     End Sub
7396
7397     Friend Sub CheckReplyTo(ByVal StatusText As String)
7398         Dim m As MatchCollection
7399         'ハッシュタグの保存
7400         m = Regex.Matches(StatusText, "(^|[^a-zA-Z0-9_/])(#|#)(?<hash>[a-zA-Z0-9_]+)")
7401         Dim hstr As String = ""
7402         For Each hm As Match In m
7403             If Not IsNumeric(hm.Result("${hash}")) Then
7404                 If Not hstr.Contains("#" + hm.Result("${hash}") + " ") Then
7405                     hstr += "#" + hm.Result("${hash}") + " "
7406                     HashSupl.AddItem("#" + hm.Result("${hash}"))
7407                 End If
7408             End If
7409         Next
7410         If Not String.IsNullOrEmpty(HashMgr.UseHash) AndAlso Not hstr.Contains(HashMgr.UseHash + " ") Then
7411             hstr += HashMgr.UseHash
7412         End If
7413         If Not String.IsNullOrEmpty(hstr) Then HashMgr.AddHashToHistory(hstr.Trim, False)
7414
7415         ' 本当にリプライ先指定すべきかどうかの判定
7416         m = Regex.Matches(StatusText, "(^|[ -/:-@[-^`{-~])(?<id>@[a-zA-Z0-9_]+)")
7417
7418         If SettingDialog.UseAtIdSupplement Then
7419             Dim bCnt As Integer = AtIdSupl.ItemCount
7420             For Each mid As Match In m
7421                 AtIdSupl.AddItem(mid.Result("${id}"))
7422             Next
7423             If bCnt <> AtIdSupl.ItemCount Then _modifySettingAtId = True
7424         End If
7425
7426         ' リプライ先ステータスIDの指定がない場合は指定しない
7427         If _reply_to_id = 0 Then Exit Sub
7428
7429         ' リプライ先ユーザー名がない場合も指定しない
7430         If String.IsNullOrEmpty(_reply_to_name) Then
7431             _reply_to_id = 0
7432             Exit Sub
7433         End If
7434
7435         ' 通常Reply
7436         ' 次の条件を満たす場合に in_reply_to_status_id 指定
7437         ' 1. Twitterによりリンクと判定される @idが文中に1つ含まれる (2009/5/28 リンク化される@IDのみカウントするように修正)
7438         ' 2. リプライ先ステータスIDが設定されている(リストをダブルクリックで返信している)
7439         ' 3. 文中に含まれた@idがリプライ先のポスト者のIDと一致する
7440
7441         If m IsNot Nothing Then
7442             If StatusText.StartsWith("@") Then
7443                 If StatusText.StartsWith("@" + _reply_to_name) Then Exit Sub
7444             Else
7445                 For Each mid As Match In m
7446                     If StatusText.Contains("QT " + mid.Result("${id}") + ":") AndAlso mid.Result("${id}") = "@" + _reply_to_name Then Exit Sub
7447                 Next
7448             End If
7449         End If
7450
7451         _reply_to_id = 0
7452         _reply_to_name = ""
7453
7454     End Sub
7455
7456     Private Sub TweenMain_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Resize
7457         If Not _initialLayout AndAlso SettingDialog.MinimizeToTray AndAlso WindowState = FormWindowState.Minimized Then
7458             Me.Visible = False
7459         End If
7460         If _initialLayout AndAlso _cfgLocal IsNot Nothing AndAlso Me.WindowState = FormWindowState.Normal AndAlso Me.Visible Then
7461             Me.ClientSize = _cfgLocal.FormSize
7462             '_mySize = Me.ClientSize                     'サイズ保持(最小化・最大化されたまま終了した場合の対応用)
7463             Me.DesktopLocation = _cfgLocal.FormLocation
7464             '_myLoc = Me.DesktopLocation                        '位置保持(最小化・最大化されたまま終了した場合の対応用)
7465             If _cfgLocal.SplitterDistance > Me.SplitContainer1.Panel1MinSize AndAlso _cfgLocal.SplitterDistance < Me.SplitContainer1.Height - Me.SplitContainer1.Panel2MinSize - Me.SplitContainer1.SplitterWidth Then
7466                 Me.SplitContainer1.SplitterDistance = _cfgLocal.SplitterDistance 'Splitterの位置設定
7467             End If
7468             '発言欄複数行
7469             StatusText.Multiline = _cfgLocal.StatusMultiline
7470             If StatusText.Multiline Then
7471                 Dim dis As Integer = SplitContainer2.Height - _cfgLocal.StatusTextHeight - SplitContainer2.SplitterWidth
7472                 If dis > SplitContainer2.Panel1MinSize AndAlso dis < SplitContainer2.Height - SplitContainer2.Panel2MinSize - SplitContainer2.SplitterWidth Then
7473                     SplitContainer2.SplitterDistance = SplitContainer2.Height - _cfgLocal.StatusTextHeight - SplitContainer2.SplitterWidth
7474                 End If
7475                 StatusText.Height = _cfgLocal.StatusTextHeight
7476             Else
7477                 If SplitContainer2.Height - SplitContainer2.Panel2MinSize - SplitContainer2.SplitterWidth > 0 Then
7478                     SplitContainer2.SplitterDistance = SplitContainer2.Height - SplitContainer2.Panel2MinSize - SplitContainer2.SplitterWidth
7479                 End If
7480             End If
7481             If _cfgLocal.PreviewDistance > Me.SplitContainer3.Panel1MinSize AndAlso _cfgLocal.PreviewDistance < Me.SplitContainer3.Width - Me.SplitContainer3.Panel2MinSize - Me.SplitContainer3.SplitterWidth Then
7482                 Me.SplitContainer3.SplitterDistance = _cfgLocal.PreviewDistance
7483             End If
7484             _initialLayout = False
7485         End If
7486     End Sub
7487
7488     Private Sub PlaySoundMenuItem_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PlaySoundMenuItem.CheckedChanged, PlaySoundFileMenuItem.CheckStateChanged
7489         PlaySoundMenuItem.Checked = DirectCast(sender, ToolStripMenuItem).Checked
7490         Me.PlaySoundFileMenuItem.Checked = PlaySoundMenuItem.Checked
7491         If PlaySoundMenuItem.Checked Then
7492             SettingDialog.PlaySound = True
7493         Else
7494             SettingDialog.PlaySound = False
7495         End If
7496         _modifySettingCommon = True
7497     End Sub
7498
7499     Private Sub SplitContainer1_SplitterMoved(ByVal sender As Object, ByVal e As System.Windows.Forms.SplitterEventArgs) Handles SplitContainer1.SplitterMoved
7500         If Me.WindowState = FormWindowState.Normal AndAlso Not _initialLayout Then
7501             _mySpDis = SplitContainer1.SplitterDistance
7502             If StatusText.Multiline Then _mySpDis2 = StatusText.Height
7503             _modifySettingLocal = True
7504         End If
7505     End Sub
7506
7507     Private Sub doRepliedStatusOpen()
7508         If _curPost IsNot Nothing AndAlso _curPost.InReplyToUser IsNot Nothing AndAlso _curPost.InReplyToId > 0 Then
7509             If My.Computer.Keyboard.ShiftKeyDown Then
7510                 OpenUriAsync("http://twitter.com/" + _curPost.InReplyToUser + "/status/" + _curPost.InReplyToId.ToString())
7511                 Exit Sub
7512             End If
7513             If _statuses.ContainsKey(_curPost.InReplyToId) Then
7514                 Dim repPost As PostClass = _statuses.Item(_curPost.InReplyToId)
7515                 MessageBox.Show(repPost.Name + " / " + repPost.Nickname + "   (" + repPost.PDate.ToString() + ")" + Environment.NewLine + repPost.Data)
7516             Else
7517                 For Each tb As TabClass In _statuses.GetTabsByType(TabUsageType.Lists Or TabUsageType.PublicSearch)
7518                     If tb Is Nothing OrElse Not tb.Contains(_curPost.InReplyToId) Then Exit For
7519                     Dim repPost As PostClass = _statuses.Item(_curPost.InReplyToId)
7520                     MessageBox.Show(repPost.Name + " / " + repPost.Nickname + "   (" + repPost.PDate.ToString() + ")" + Environment.NewLine + repPost.Data)
7521                     Exit Sub
7522                 Next
7523                 OpenUriAsync("http://twitter.com/" + _curPost.InReplyToUser + "/status/" + _curPost.InReplyToId.ToString())
7524             End If
7525         End If
7526     End Sub
7527
7528     Private Sub RepliedStatusOpenMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RepliedStatusOpenMenuItem.Click, OpenRepSourceOpMenuItem.Click
7529         doRepliedStatusOpen()
7530     End Sub
7531
7532     Private Sub ContextMenuUserPicture_Opening(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ContextMenuUserPicture.Opening
7533         '発言詳細のアイコン右クリック時のメニュー制御
7534         If _curList.SelectedIndices.Count > 0 AndAlso _curPost IsNot Nothing Then
7535             Dim name As String = _curPost.ImageUrl
7536             If name IsNot Nothing AndAlso name.Length > 0 Then
7537                 Dim idx As Integer = name.LastIndexOf("/"c)
7538                 If idx <> -1 Then
7539                     name = IO.Path.GetFileNameWithoutExtension(name.Substring(idx))
7540                     If name.EndsWith("_normal", StringComparison.OrdinalIgnoreCase) Then
7541                         name = name.Substring(0, name.Length - 7) ' "_normal".Length
7542                         Me.IconNameToolStripMenuItem.Text = name
7543                         Me.IconNameToolStripMenuItem.Enabled = True
7544                     Else
7545                         Me.IconNameToolStripMenuItem.Enabled = False
7546                         Me.IconNameToolStripMenuItem.Text = My.Resources.ContextMenuStrip3_OpeningText1
7547                     End If
7548                 Else
7549                     Me.IconNameToolStripMenuItem.Enabled = False
7550                     Me.IconNameToolStripMenuItem.Text = My.Resources.ContextMenuStrip3_OpeningText1
7551                 End If
7552                 If Me.TIconDic.ContainsKey(_curPost.ImageUrl) AndAlso Me.TIconDic(_curPost.ImageUrl) IsNot Nothing Then
7553                     Me.SaveIconPictureToolStripMenuItem.Enabled = True
7554                 Else
7555                     Me.SaveIconPictureToolStripMenuItem.Enabled = False
7556                 End If
7557             Else
7558                 Me.IconNameToolStripMenuItem.Enabled = False
7559                 Me.SaveIconPictureToolStripMenuItem.Enabled = False
7560                 Me.IconNameToolStripMenuItem.Text = My.Resources.ContextMenuStrip3_OpeningText1
7561             End If
7562         Else
7563             Me.IconNameToolStripMenuItem.Enabled = False
7564             Me.SaveIconPictureToolStripMenuItem.Enabled = False
7565             Me.IconNameToolStripMenuItem.Text = My.Resources.ContextMenuStrip3_OpeningText2
7566         End If
7567         If NameLabel.Tag IsNot Nothing Then
7568             Dim id As String = DirectCast(NameLabel.Tag, String)
7569             If id = tw.Username Then
7570                 FollowToolStripMenuItem.Enabled = False
7571                 UnFollowToolStripMenuItem.Enabled = False
7572                 ShowFriendShipToolStripMenuItem.Enabled = False
7573                 ShowUserStatusToolStripMenuItem.Enabled = True
7574                 SearchAtPostsDetailNameToolStripMenuItem.Enabled = False
7575                 ListManageUserContextToolStripMenuItem3.Enabled = True
7576             Else
7577                 FollowToolStripMenuItem.Enabled = True
7578                 UnFollowToolStripMenuItem.Enabled = True
7579                 ShowFriendShipToolStripMenuItem.Enabled = True
7580                 ShowUserStatusToolStripMenuItem.Enabled = True
7581                 SearchAtPostsDetailNameToolStripMenuItem.Enabled = True
7582                 ListManageUserContextToolStripMenuItem3.Enabled = True
7583             End If
7584         Else
7585             FollowToolStripMenuItem.Enabled = False
7586             UnFollowToolStripMenuItem.Enabled = False
7587             ShowFriendShipToolStripMenuItem.Enabled = False
7588             ShowUserStatusToolStripMenuItem.Enabled = False
7589             SearchAtPostsDetailNameToolStripMenuItem.Enabled = False
7590             ListManageUserContextToolStripMenuItem3.Enabled = False
7591         End If
7592     End Sub
7593
7594     Private Sub IconNameToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IconNameToolStripMenuItem.Click
7595         If _curPost Is Nothing Then Exit Sub
7596         Dim name As String = _curPost.ImageUrl
7597         OpenUriAsync(name.Remove(name.LastIndexOf("_normal"), 7)) ' "_normal".Length
7598     End Sub
7599
7600     Private Sub SaveOriginalSizeIconPictureToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
7601         If _curPost Is Nothing Then Exit Sub
7602         Dim name As String = _curPost.ImageUrl
7603         name = IO.Path.GetFileNameWithoutExtension(name.Substring(name.LastIndexOf("/"c)))
7604
7605         Me.SaveFileDialog1.FileName = name.Substring(0, name.Length - 8) ' "_normal".Length + 1
7606
7607         If Me.SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
7608             ' STUB
7609         End If
7610     End Sub
7611
7612     Private Sub SaveIconPictureToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveIconPictureToolStripMenuItem.Click
7613         If _curPost Is Nothing Then Exit Sub
7614         Dim name As String = _curPost.ImageUrl
7615
7616         Me.SaveFileDialog1.FileName = name.Substring(name.LastIndexOf("/"c) + 1)
7617
7618         If Me.SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
7619             Using bmp2 As New Bitmap(TIconDic(name).Size.Width, TIconDic(name).Size.Height)
7620                 Using g As Graphics = Graphics.FromImage(bmp2)
7621                     g.InterpolationMode = Drawing2D.InterpolationMode.High
7622                     g.DrawImage(TIconDic(name), 0, 0, TIconDic(name).Size.Width, TIconDic(name).Size.Height)
7623                     g.Dispose()
7624                 End Using
7625                 bmp2.Save(Me.SaveFileDialog1.FileName)
7626                 bmp2.Dispose()
7627             End Using
7628         End If
7629     End Sub
7630
7631     Private Sub SplitContainer2_Panel2_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SplitContainer2.Panel2.Resize
7632         Me.StatusText.Multiline = Me.SplitContainer2.Panel2.Height > Me.SplitContainer2.Panel2MinSize + 2
7633         MultiLineMenuItem.Checked = Me.StatusText.Multiline
7634         _modifySettingLocal = True
7635     End Sub
7636
7637     Private Sub StatusText_MultilineChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StatusText.MultilineChanged
7638         If Me.StatusText.Multiline Then
7639             Me.StatusText.ScrollBars = ScrollBars.Vertical
7640         Else
7641             Me.StatusText.ScrollBars = ScrollBars.None
7642         End If
7643         _modifySettingLocal = True
7644     End Sub
7645
7646     Private Sub MultiLineMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MultiLineMenuItem.Click
7647         '発言欄複数行
7648         StatusText.Multiline = MultiLineMenuItem.Checked
7649         _cfgLocal.StatusMultiline = MultiLineMenuItem.Checked
7650         If MultiLineMenuItem.Checked Then
7651             If SplitContainer2.Height - _mySpDis2 - SplitContainer2.SplitterWidth < 0 Then
7652                 SplitContainer2.SplitterDistance = 0
7653             Else
7654                 SplitContainer2.SplitterDistance = SplitContainer2.Height - _mySpDis2 - SplitContainer2.SplitterWidth
7655             End If
7656         Else
7657             SplitContainer2.SplitterDistance = SplitContainer2.Height - SplitContainer2.Panel2MinSize - SplitContainer2.SplitterWidth
7658         End If
7659         _modifySettingLocal = True
7660     End Sub
7661
7662     Private Function UrlConvert(ByVal Converter_Type As UrlConverter) As Boolean
7663         'Converter_Type=Nicomsの場合は、nicovideoのみ短縮する
7664         '参考資料 RFC3986 Uniform Resource Identifier (URI): Generic Syntax
7665         'Appendix A.  Collected ABNF for URI
7666         'http://www.ietf.org/rfc/rfc3986.txt
7667
7668         Dim result As String = ""
7669         Const url As String = "(?<before>(?:[^\""':!=]|^|\:))" + _
7670                                    "(?<url>(?<protocol>https?://)" + _
7671                                    "(?<domain>(?:[\.-]|[^\p{P}\s])+\.[a-z]{2,}(?::[0-9]+)?)" + _
7672                                    "(?<path>/[a-z0-9!*'();:&=+$/%#\-_.,~@]*[a-z0-9)=#/]?)?" + _
7673                                    "(?<query>\?[a-z0-9!*'();:&=+$/%#\-_.,~@?]*[a-z0-9_&=#/])?)"
7674
7675         Const nico As String = "^https?://[a-z]+\.(nicovideo|niconicommons|nicolive)\.jp/[a-z]+/[a-z0-9]+$"
7676
7677         If StatusText.SelectionLength > 0 Then
7678             Dim tmp As String = StatusText.SelectedText
7679             ' httpから始まらない場合、ExcludeStringで指定された文字列で始まる場合は対象としない
7680             If tmp.StartsWith("http") Then
7681                 ' 文字列が選択されている場合はその文字列について処理
7682
7683                 'nico.ms使用、nicovideoにマッチしたら変換
7684                 If SettingDialog.Nicoms AndAlso Regex.IsMatch(tmp, nico) Then
7685                     result = nicoms.Shorten(tmp)
7686                 ElseIf Converter_Type <> UrlConverter.Nicoms Then
7687                     '短縮URL変換 日本語を含むかもしれないのでURLエンコードする
7688                     result = ShortUrl.Make(Converter_Type, tmp)
7689                     If result.Equals("Can't convert") Then
7690                         StatusLabel.Text = result.Insert(0, Converter_Type.ToString() + ":")
7691                         Return False
7692                     End If
7693                 Else
7694                     Return True
7695                 End If
7696
7697                 If Not String.IsNullOrEmpty(result) Then
7698                     Dim undotmp As New urlUndo
7699
7700                     StatusText.Select(StatusText.Text.IndexOf(tmp, StringComparison.Ordinal), tmp.Length)
7701                     StatusText.SelectedText = result
7702
7703                     'undoバッファにセット
7704                     undotmp.Before = tmp
7705                     undotmp.After = result
7706
7707                     If urlUndoBuffer Is Nothing Then
7708                         urlUndoBuffer = New List(Of urlUndo)
7709                         UrlUndoToolStripMenuItem.Enabled = True
7710                     End If
7711
7712                     urlUndoBuffer.Add(undotmp)
7713                 End If
7714             End If
7715         Else
7716             ' 正規表現にマッチしたURL文字列をtinyurl化
7717             For Each mt As Match In Regex.Matches(StatusText.Text, url, RegexOptions.IgnoreCase)
7718                 If StatusText.Text.IndexOf(mt.Result("${url}"), StringComparison.Ordinal) = -1 Then Continue For
7719                 Dim tmp As String = mt.Result("${url}")
7720                 If tmp.StartsWith("w", StringComparison.OrdinalIgnoreCase) Then tmp = "http://" + tmp
7721                 Dim undotmp As New urlUndo
7722
7723                 '選んだURLを選択(?)
7724                 StatusText.Select(StatusText.Text.IndexOf(mt.Result("${url}"), StringComparison.Ordinal), mt.Result("${url}").Length)
7725
7726                 'nico.ms使用、nicovideoにマッチしたら変換
7727                 If SettingDialog.Nicoms AndAlso Regex.IsMatch(tmp, nico) Then
7728                     result = nicoms.Shorten(tmp)
7729                 ElseIf Converter_Type <> UrlConverter.Nicoms Then
7730                     '短縮URL変換 日本語を含むかもしれないのでURLエンコードする
7731                     result = ShortUrl.Make(Converter_Type, tmp)
7732                     If result.Equals("Can't convert") Then
7733                         StatusLabel.Text = result.Insert(0, Converter_Type.ToString() + ":")
7734                         Continue For
7735                     End If
7736                 Else
7737                     Continue For
7738                 End If
7739
7740                 If Not String.IsNullOrEmpty(result) Then
7741                     StatusText.Select(StatusText.Text.IndexOf(mt.Result("${url}"), StringComparison.Ordinal), mt.Result("${url}").Length)
7742                     StatusText.SelectedText = result
7743                     'undoバッファにセット
7744                     undotmp.Before = mt.Result("${url}")
7745                     undotmp.After = result
7746
7747                     If urlUndoBuffer Is Nothing Then
7748                         urlUndoBuffer = New List(Of urlUndo)
7749                         UrlUndoToolStripMenuItem.Enabled = True
7750                     End If
7751
7752                     urlUndoBuffer.Add(undotmp)
7753                 End If
7754             Next
7755         End If
7756
7757         Return True
7758
7759     End Function
7760
7761     Private Sub doUrlUndo()
7762         If urlUndoBuffer IsNot Nothing Then
7763             Dim tmp As String = StatusText.Text
7764             For Each data As urlUndo In urlUndoBuffer
7765                 tmp = tmp.Replace(data.After, data.Before)
7766             Next
7767             StatusText.Text = tmp
7768             urlUndoBuffer = Nothing
7769             UrlUndoToolStripMenuItem.Enabled = False
7770         End If
7771     End Sub
7772
7773     Private Sub TinyURLToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TinyURLToolStripMenuItem.Click
7774         UrlConvert(UrlConverter.TinyUrl)
7775     End Sub
7776
7777     Private Sub IsgdToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IsgdToolStripMenuItem.Click
7778         UrlConvert(UrlConverter.Isgd)
7779     End Sub
7780
7781     Private Sub TwurlnlToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TwurlnlToolStripMenuItem.Click
7782         UrlConvert(UrlConverter.Twurl)
7783     End Sub
7784
7785     Private Sub UrlConvertAutoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UrlConvertAutoToolStripMenuItem.Click
7786         If Not UrlConvert(SettingDialog.AutoShortUrlFirst) Then
7787             Dim svc As UrlConverter = SettingDialog.AutoShortUrlFirst
7788             Dim rnd As New Random()
7789             ' 前回使用した短縮URLサービス以外を選択する
7790             Do
7791                 svc = CType(rnd.Next(System.Enum.GetNames(GetType(UrlConverter)).Length), UrlConverter)
7792             Loop Until svc <> SettingDialog.AutoShortUrlFirst
7793             UrlConvert(svc)
7794         End If
7795     End Sub
7796
7797     Private Sub UrlUndoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UrlUndoToolStripMenuItem.Click
7798         doUrlUndo()
7799     End Sub
7800
7801     Private Sub NewPostPopMenuItem_CheckStateChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles NewPostPopMenuItem.CheckStateChanged, NotifyFileMenuItem.CheckStateChanged
7802         Me.NotifyFileMenuItem.Checked = DirectCast(sender, ToolStripMenuItem).Checked
7803         Me.NewPostPopMenuItem.Checked = Me.NotifyFileMenuItem.Checked
7804         _cfgCommon.NewAllPop = NewPostPopMenuItem.Checked
7805         _modifySettingCommon = True
7806     End Sub
7807
7808     Private Sub ListLockMenuItem_CheckStateChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListLockMenuItem.CheckStateChanged, LockListFileMenuItem.CheckStateChanged
7809         ListLockMenuItem.Checked = DirectCast(sender, ToolStripMenuItem).Checked
7810         Me.LockListFileMenuItem.Checked = ListLockMenuItem.Checked
7811         _cfgCommon.ListLock = ListLockMenuItem.Checked
7812         _modifySettingCommon = True
7813     End Sub
7814
7815     Private Sub MenuStrip1_MenuActivate(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuActivate
7816         ' フォーカスがメニューに移る (MenuStrip1.Tag フラグを立てる)
7817         MenuStrip1.Tag = New Object()
7818         MenuStrip1.Select() ' StatusText がフォーカスを持っている場合 Leave が発生
7819     End Sub
7820
7821     Private Sub MenuStrip1_MenuDeactivate(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuDeactivate
7822         If Me.Tag IsNot Nothing Then ' 設定された戻り先へ遷移
7823             If Me.Tag Is Me.ListTab.SelectedTab Then
7824                 DirectCast(Me.ListTab.SelectedTab.Tag, Control).Select()
7825             Else
7826                 DirectCast(Me.Tag, Control).Select()
7827             End If
7828         Else ' 戻り先が指定されていない (初期状態) 場合はタブに遷移
7829             If ListTab.SelectedIndex > -1 AndAlso ListTab.SelectedTab.HasChildren Then
7830                 Me.Tag = ListTab.SelectedTab.Tag
7831                 DirectCast(Me.Tag, Control).Select()
7832             End If
7833         End If
7834         ' フォーカスがメニューに遷移したかどうかを表すフラグを降ろす
7835         MenuStrip1.Tag = Nothing
7836     End Sub
7837
7838     Private Sub MyList_ColumnReordered(ByVal sender As System.Object, ByVal e As ColumnReorderedEventArgs)
7839         Dim lst As DetailsListView = DirectCast(sender, DetailsListView)
7840         If _cfgLocal Is Nothing Then Exit Sub
7841
7842         If _iconCol Then
7843             _cfgLocal.Width1 = lst.Columns(0).Width
7844             _cfgLocal.Width3 = lst.Columns(1).Width
7845         Else
7846             Dim darr(lst.Columns.Count - 1) As Integer
7847             For i As Integer = 0 To lst.Columns.Count - 1
7848                 darr(lst.Columns(i).DisplayIndex) = i
7849             Next
7850             MoveArrayItem(darr, e.OldDisplayIndex, e.NewDisplayIndex)
7851
7852             For i As Integer = 0 To lst.Columns.Count - 1
7853                 Select Case darr(i)
7854                     Case 0
7855                         _cfgLocal.DisplayIndex1 = i
7856                     Case 1
7857                         _cfgLocal.DisplayIndex2 = i
7858                     Case 2
7859                         _cfgLocal.DisplayIndex3 = i
7860                     Case 3
7861                         _cfgLocal.DisplayIndex4 = i
7862                     Case 4
7863                         _cfgLocal.DisplayIndex5 = i
7864                     Case 5
7865                         _cfgLocal.DisplayIndex6 = i
7866                     Case 6
7867                         _cfgLocal.DisplayIndex7 = i
7868                     Case 7
7869                         _cfgLocal.DisplayIndex8 = i
7870                 End Select
7871             Next
7872             _cfgLocal.Width1 = lst.Columns(0).Width
7873             _cfgLocal.Width2 = lst.Columns(1).Width
7874             _cfgLocal.Width3 = lst.Columns(2).Width
7875             _cfgLocal.Width4 = lst.Columns(3).Width
7876             _cfgLocal.Width5 = lst.Columns(4).Width
7877             _cfgLocal.Width6 = lst.Columns(5).Width
7878             _cfgLocal.Width7 = lst.Columns(6).Width
7879             _cfgLocal.Width8 = lst.Columns(7).Width
7880         End If
7881         _modifySettingLocal = True
7882         _isColumnChanged = True
7883     End Sub
7884
7885     Private Sub MyList_ColumnWidthChanged(ByVal sender As System.Object, ByVal e As ColumnWidthChangedEventArgs)
7886         Dim lst As DetailsListView = DirectCast(sender, DetailsListView)
7887         If _cfgLocal Is Nothing Then Exit Sub
7888         If _iconCol Then
7889             If _cfgLocal.Width1 <> lst.Columns(0).Width Then
7890                 _cfgLocal.Width1 = lst.Columns(0).Width
7891                 _modifySettingLocal = True
7892                 _isColumnChanged = True
7893             End If
7894             If _cfgLocal.Width3 <> lst.Columns(1).Width Then
7895                 _cfgLocal.Width3 = lst.Columns(1).Width
7896                 _modifySettingLocal = True
7897                 _isColumnChanged = True
7898             End If
7899         Else
7900             If _cfgLocal.Width1 <> lst.Columns(0).Width Then
7901                 _cfgLocal.Width1 = lst.Columns(0).Width
7902                 _modifySettingLocal = True
7903                 _isColumnChanged = True
7904             End If
7905             If _cfgLocal.Width2 <> lst.Columns(1).Width Then
7906                 _cfgLocal.Width2 = lst.Columns(1).Width
7907                 _modifySettingLocal = True
7908                 _isColumnChanged = True
7909             End If
7910             If _cfgLocal.Width3 <> lst.Columns(2).Width Then
7911                 _cfgLocal.Width3 = lst.Columns(2).Width
7912                 _modifySettingLocal = True
7913                 _isColumnChanged = True
7914             End If
7915             If _cfgLocal.Width4 <> lst.Columns(3).Width Then
7916                 _cfgLocal.Width4 = lst.Columns(3).Width
7917                 _modifySettingLocal = True
7918                 _isColumnChanged = True
7919             End If
7920             If _cfgLocal.Width5 <> lst.Columns(4).Width Then
7921                 _cfgLocal.Width5 = lst.Columns(4).Width
7922                 _modifySettingLocal = True
7923                 _isColumnChanged = True
7924             End If
7925             If _cfgLocal.Width6 <> lst.Columns(5).Width Then
7926                 _cfgLocal.Width6 = lst.Columns(5).Width
7927                 _modifySettingLocal = True
7928                 _isColumnChanged = True
7929             End If
7930             If _cfgLocal.Width7 <> lst.Columns(6).Width Then
7931                 _cfgLocal.Width7 = lst.Columns(6).Width
7932                 _modifySettingLocal = True
7933                 _isColumnChanged = True
7934             End If
7935             If _cfgLocal.Width8 <> lst.Columns(7).Width Then
7936                 _cfgLocal.Width8 = lst.Columns(7).Width
7937                 _modifySettingLocal = True
7938                 _isColumnChanged = True
7939             End If
7940         End If
7941         ' 非表示の時にColumnChangedが呼ばれた場合はForm初期化処理中なので保存しない
7942         'If changed Then
7943         '    SaveConfigsLocal()
7944         'End If
7945     End Sub
7946
7947     Public Function WebBrowser_GetSelectionText(ByRef ComponentInstance As WebBrowser) As String
7948         '発言詳細で「選択文字列をコピー」を行う
7949         'WebBrowserコンポーネントのインスタンスを渡す
7950         Dim typ As Type = ComponentInstance.ActiveXInstance.GetType()
7951         Dim _SelObj As Object = typ.InvokeMember("selection", BindingFlags.GetProperty, Nothing, ComponentInstance.Document.DomDocument, Nothing)
7952         Dim _objRange As Object = _SelObj.GetType().InvokeMember("createRange", BindingFlags.InvokeMethod, Nothing, _SelObj, Nothing)
7953         Return DirectCast(_objRange.GetType().InvokeMember("text", BindingFlags.GetProperty, Nothing, _objRange, Nothing), String)
7954     End Function
7955
7956     Private Sub SelectionCopyContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SelectionCopyContextMenuItem.Click
7957         '発言詳細で「選択文字列をコピー」
7958         Dim _selText As String = WebBrowser_GetSelectionText(PostBrowser)
7959         Try
7960             Clipboard.SetDataObject(_selText, False, 5, 100)
7961         Catch ex As Exception
7962             MessageBox.Show(ex.Message)
7963         End Try
7964     End Sub
7965
7966     Private Sub doSearchToolStrip(ByVal url As String)
7967         '発言詳細で「選択文字列で検索」(選択文字列取得)
7968         Dim _selText As String = WebBrowser_GetSelectionText(PostBrowser)
7969
7970         If _selText IsNot Nothing Then
7971             If url = My.Resources.SearchItem4Url Then
7972                 '公式検索
7973                 AddNewTabForSearch(_selText)
7974                 Exit Sub
7975             End If
7976
7977             Dim tmp As String = String.Format(url, HttpUtility.UrlEncode(_selText))
7978             OpenUriAsync(tmp)
7979         End If
7980     End Sub
7981
7982     Private Sub SelectionAllContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SelectionAllContextMenuItem.Click
7983         '発言詳細ですべて選択
7984         PostBrowser.Document.ExecCommand("SelectAll", False, Nothing)
7985     End Sub
7986
7987     Private Sub SearchWikipediaContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchWikipediaContextMenuItem.Click
7988         doSearchToolStrip(My.Resources.SearchItem1Url)
7989     End Sub
7990
7991     Private Sub SearchGoogleContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchGoogleContextMenuItem.Click
7992         doSearchToolStrip(My.Resources.SearchItem2Url)
7993     End Sub
7994
7995     Private Sub SearchYatsContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchYatsContextMenuItem.Click
7996         doSearchToolStrip(My.Resources.SearchItem3Url)
7997     End Sub
7998
7999     Private Sub SearchPublicSearchContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchPublicSearchContextMenuItem.Click
8000         doSearchToolStrip(My.Resources.SearchItem4Url)
8001     End Sub
8002
8003     Private Sub UrlCopyContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UrlCopyContextMenuItem.Click
8004         Try
8005             Clipboard.SetDataObject(Me._postBrowserStatusText, False, 5, 100)
8006         Catch ex As Exception
8007             MessageBox.Show(ex.Message)
8008         End Try
8009     End Sub
8010
8011     Private Sub ContextMenuPostBrowser_Opening(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ContextMenuPostBrowser.Opening
8012         ' URLコピーの項目の表示/非表示
8013         If PostBrowser.StatusText.StartsWith("http") Then
8014             Me._postBrowserStatusText = PostBrowser.StatusText
8015             Dim name As String = GetUserId()
8016             UrlCopyContextMenuItem.Enabled = True
8017             If name IsNot Nothing Then
8018                 FollowContextMenuItem.Enabled = True
8019                 RemoveContextMenuItem.Enabled = True
8020                 FriendshipContextMenuItem.Enabled = True
8021                 ShowUserStatusContextMenuItem.Enabled = True
8022                 SearchPostsDetailToolStripMenuItem.Enabled = True
8023                 IdFilterAddMenuItem.Enabled = True
8024                 ListManageUserContextToolStripMenuItem.Enabled = True
8025             Else
8026                 FollowContextMenuItem.Enabled = False
8027                 RemoveContextMenuItem.Enabled = False
8028                 FriendshipContextMenuItem.Enabled = False
8029                 ShowUserStatusContextMenuItem.Enabled = False
8030                 SearchPostsDetailToolStripMenuItem.Enabled = False
8031                 IdFilterAddMenuItem.Enabled = False
8032                 ListManageUserContextToolStripMenuItem.Enabled = False
8033             End If
8034
8035             If Regex.IsMatch(Me._postBrowserStatusText, "^https?://twitter.com/search\?q=%23") Then
8036                 UseHashtagMenuItem.Enabled = True
8037             Else
8038                 UseHashtagMenuItem.Enabled = False
8039             End If
8040         Else
8041             Me._postBrowserStatusText = ""
8042             UrlCopyContextMenuItem.Enabled = False
8043             FollowContextMenuItem.Enabled = False
8044             RemoveContextMenuItem.Enabled = False
8045             FriendshipContextMenuItem.Enabled = False
8046             ShowUserStatusContextMenuItem.Enabled = False
8047             SearchPostsDetailToolStripMenuItem.Enabled = False
8048             UseHashtagMenuItem.Enabled = False
8049             IdFilterAddMenuItem.Enabled = False
8050             ListManageUserContextToolStripMenuItem.Enabled = False
8051         End If
8052         ' 文字列選択されていないときは選択文字列関係の項目を非表示に
8053         Dim _selText As String = WebBrowser_GetSelectionText(PostBrowser)
8054         If _selText Is Nothing Then
8055             SelectionSearchContextMenuItem.Enabled = False
8056             SelectionCopyContextMenuItem.Enabled = False
8057         Else
8058             SelectionSearchContextMenuItem.Enabled = True
8059             SelectionCopyContextMenuItem.Enabled = True
8060         End If
8061         '発言内に自分以外のユーザーが含まれてればフォロー状態全表示を有効に
8062         Dim ma As MatchCollection = Regex.Matches(Me.PostBrowser.DocumentText, "href=""https?://twitter.com/(#!/)?(?<name>[a-zA-Z0-9_]+)""")
8063         Dim fAllFlag As Boolean = False
8064         For Each mu As Match In ma
8065             If mu.Result("${name}").ToLower <> tw.Username.ToLower Then
8066                 fAllFlag = True
8067                 Exit For
8068             End If
8069         Next
8070         Me.FriendshipAllMenuItem.Enabled = fAllFlag
8071
8072         e.Cancel = False
8073     End Sub
8074
8075     Private Sub CurrentTabToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CurrentTabToolStripMenuItem.Click
8076         '発言詳細の選択文字列で現在のタブを検索
8077         Dim _selText As String = WebBrowser_GetSelectionText(PostBrowser)
8078
8079         If _selText IsNot Nothing Then
8080             SearchDialog.SWord = _selText
8081             SearchDialog.CheckCaseSensitive = False
8082             SearchDialog.CheckRegex = False
8083
8084             DoTabSearch(SearchDialog.SWord, _
8085                         SearchDialog.CheckCaseSensitive, _
8086                         SearchDialog.CheckRegex, _
8087                         SEARCHTYPE.NextSearch)
8088         End If
8089     End Sub
8090
8091     Private Sub SplitContainer2_SplitterMoved(ByVal sender As Object, ByVal e As System.Windows.Forms.SplitterEventArgs) Handles SplitContainer2.SplitterMoved
8092         If StatusText.Multiline Then _mySpDis2 = StatusText.Height
8093         _modifySettingLocal = True
8094     End Sub
8095
8096     Private Sub TweenMain_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
8097         If e.Data.GetDataPresent(DataFormats.FileDrop) Then
8098             ImageSelectionPanel.Visible = True
8099             ImageSelectionPanel.Enabled = True
8100             TimelinePanel.Visible = False
8101             TimelinePanel.Enabled = False
8102             ImagefilePathText.Text = CType(e.Data.GetData(DataFormats.FileDrop, False), String())(0)
8103             ImageFromSelectedFile()
8104             Me.Activate()
8105             StatusText.Focus()
8106         ElseIf e.Data.GetDataPresent(DataFormats.StringFormat) Then
8107             Dim data As String = TryCast(e.Data.GetData(DataFormats.StringFormat, True), String)
8108             If data IsNot Nothing Then StatusText.Text += data
8109         End If
8110     End Sub
8111
8112     Private Sub TweenMain_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragOver
8113         If e.Data.GetDataPresent(DataFormats.FileDrop) Then
8114             Dim filename As String = CType(e.Data.GetData(DataFormats.FileDrop, False), String())(0)
8115             Dim fl As New FileInfo(filename)
8116             Dim ext As String = fl.Extension
8117             Dim picsvc As New PictureService(tw)
8118
8119             If picsvc.IsValidExtension(ext, ImageService) AndAlso _
8120                     picsvc.GetMaxFileSize(ext, ImageService) >= fl.Length Then
8121                 e.Effect = DragDropEffects.Copy
8122                 Exit Sub
8123             End If
8124             For Each svc As String In ImageServiceCombo.Items
8125                 If picsvc.IsValidExtension(ext, svc) AndAlso _
8126                         picsvc.GetMaxFileSize(ext, svc) >= fl.Length Then
8127                     ImageServiceCombo.SelectedItem = svc
8128                     e.Effect = DragDropEffects.Copy
8129                     Exit Sub
8130                 Else
8131                     Continue For
8132                 End If
8133             Next
8134             e.Effect = DragDropEffects.None
8135         ElseIf e.Data.GetDataPresent(DataFormats.StringFormat) Then
8136             e.Effect = DragDropEffects.Copy
8137         Else
8138             e.Effect = DragDropEffects.None
8139         End If
8140     End Sub
8141
8142     Public Function IsNetworkAvailable() As Boolean
8143         Dim nw As Boolean = True
8144         Try
8145             nw = My.Computer.Network.IsAvailable
8146         Catch ex As Exception
8147             nw = False
8148         End Try
8149         _myStatusOnline = nw
8150         Return nw
8151     End Function
8152
8153     Public Sub OpenUriAsync(ByVal UriString As String)
8154         Dim args As New GetWorkerArg
8155         args.type = WORKERTYPE.OpenUri
8156         args.url = UriString
8157
8158         RunAsync(args)
8159     End Sub
8160
8161     Private Sub ListTabSelect(ByVal _tab As TabPage)
8162         SetListProperty()
8163
8164         _itemCache = Nothing
8165         _itemCacheIndex = -1
8166         _postCache = Nothing
8167
8168         _curTab = _tab
8169         _curList = DirectCast(_tab.Tag, DetailsListView)
8170         If _curList.SelectedIndices.Count > 0 Then
8171             _curItemIndex = _curList.SelectedIndices(0)
8172             _curPost = GetCurTabPost(_curItemIndex)
8173         Else
8174             _curItemIndex = -1
8175             _curPost = Nothing
8176         End If
8177
8178         _anchorPost = Nothing
8179         _anchorFlag = False
8180
8181         If _iconCol Then
8182             DirectCast(_tab.Tag, DetailsListView).Columns.Item(1).Text = ColumnText(2)
8183         Else
8184             For i As Integer = 0 To _curList.Columns.Count - 1
8185                 DirectCast(_tab.Tag, DetailsListView).Columns.Item(i).Text = ColumnText(i)
8186             Next
8187         End If
8188     End Sub
8189
8190     Private Sub ListTab_Selecting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TabControlCancelEventArgs) Handles ListTab.Selecting
8191         ListTabSelect(e.TabPage)
8192     End Sub
8193
8194     Private Sub SelectListItem(ByVal LView As DetailsListView, ByVal Index As Integer)
8195         '単一
8196         Dim bnd As Rectangle
8197         Dim flg As Boolean = False
8198         If LView.FocusedItem IsNot Nothing Then
8199             bnd = LView.FocusedItem.Bounds
8200             flg = True
8201         End If
8202
8203         LView.SelectedIndices.Clear()
8204         LView.Items(Index).Selected = True
8205         LView.Items(Index).Focused = True
8206
8207         If flg Then LView.Invalidate(bnd)
8208     End Sub
8209
8210     Private Sub SelectListItem(ByVal LView As DetailsListView, ByVal Index() As Integer, ByVal FocusedIndex As Integer)
8211         '複数
8212         Dim bnd As Rectangle
8213         Dim flg As Boolean = False
8214         If LView.FocusedItem IsNot Nothing Then
8215             bnd = LView.FocusedItem.Bounds
8216             flg = True
8217         End If
8218
8219         If Index IsNot Nothing AndAlso Index(0) > -1 Then
8220             LView.SelectedIndices.Clear()
8221             For Each idx As Integer In Index
8222                 LView.SelectedIndices.Add(idx)
8223             Next
8224         End If
8225         If FocusedIndex > -1 Then
8226             LView.Items(FocusedIndex).Focused = True
8227         End If
8228         If flg Then LView.Invalidate(bnd)
8229     End Sub
8230
8231     Private Sub RunAsync(ByVal args As GetWorkerArg)
8232         Dim bw As BackgroundWorker = Nothing
8233         If args.type <> WORKERTYPE.Follower Then
8234             For i As Integer = 0 To _bw.Length - 1
8235                 If _bw(i) IsNot Nothing AndAlso Not _bw(i).IsBusy Then
8236                     bw = _bw(i)
8237                     Exit For
8238                 End If
8239             Next
8240             If bw Is Nothing Then
8241                 For i As Integer = 0 To _bw.Length - 1
8242                     If _bw(i) Is Nothing Then
8243                         _bw(i) = New BackgroundWorker
8244                         bw = _bw(i)
8245                         bw.WorkerReportsProgress = True
8246                         bw.WorkerSupportsCancellation = True
8247                         AddHandler bw.DoWork, AddressOf GetTimelineWorker_DoWork
8248                         AddHandler bw.ProgressChanged, AddressOf GetTimelineWorker_ProgressChanged
8249                         AddHandler bw.RunWorkerCompleted, AddressOf GetTimelineWorker_RunWorkerCompleted
8250                         Exit For
8251                     End If
8252                 Next
8253             End If
8254         Else
8255             If _bwFollower Is Nothing Then
8256                 _bwFollower = New BackgroundWorker
8257                 bw = _bwFollower
8258                 bw.WorkerReportsProgress = True
8259                 bw.WorkerSupportsCancellation = True
8260                 AddHandler bw.DoWork, AddressOf GetTimelineWorker_DoWork
8261                 AddHandler bw.ProgressChanged, AddressOf GetTimelineWorker_ProgressChanged
8262                 AddHandler bw.RunWorkerCompleted, AddressOf GetTimelineWorker_RunWorkerCompleted
8263             Else
8264                 If _bwFollower.IsBusy = False Then
8265                     bw = _bwFollower
8266                 End If
8267             End If
8268         End If
8269         If bw Is Nothing Then Exit Sub
8270
8271         bw.RunWorkerAsync(args)
8272     End Sub
8273
8274     Private Sub TweenMain_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
8275         Try
8276             PostBrowser.Url = New Uri("about:blank")
8277             PostBrowser.DocumentText = ""       '発言詳細部初期化
8278         Catch ex As Exception
8279
8280         End Try
8281
8282         NotifyIcon1.Visible = True
8283
8284         If IsNetworkAvailable() Then
8285             If SettingDialog.StartupFollowers Then
8286                 GetTimeline(WORKERTYPE.Follower, 0, 0, "")
8287             End If
8288             _waitTimeline = True
8289             GetTimeline(WORKERTYPE.Timeline, 1, 1, "")
8290             _waitReply = True
8291             GetTimeline(WORKERTYPE.Reply, 1, 1, "")
8292             _waitDm = True
8293             GetTimeline(WORKERTYPE.DirectMessegeRcv, 1, 1, "")
8294             If SettingDialog.GetFav Then
8295                 _waitFav = True
8296                 GetTimeline(WORKERTYPE.Favorites, 1, 1, "")
8297             End If
8298             _waitPubSearch = True
8299             GetTimeline(WORKERTYPE.PublicSearch, 1, 0, "")  'tabname="":全タブ
8300             _waitLists = True
8301             GetTimeline(WORKERTYPE.List, 1, 0, "")  'tabname="":全タブ
8302             Dim i As Integer = 0
8303             Dim j As Integer = 0
8304             Do While (_waitTimeline OrElse _waitReply OrElse _waitDm OrElse _waitFav OrElse _waitPubSearch OrElse _waitLists) AndAlso Not _endingFlag
8305                 System.Threading.Thread.Sleep(100)
8306                 My.Application.DoEvents()
8307                 i += 1
8308                 j += 1
8309                 If j > 1200 Then Exit Do ' 120秒間初期処理が終了しなかったら強制的に打ち切る
8310                 If i > 50 Then
8311                     If _endingFlag Then
8312                         Exit Sub
8313                     End If
8314                     i = 0
8315                 End If
8316             Loop
8317
8318             If _endingFlag Then Exit Sub
8319
8320             'バージョンチェック(引数:起動時チェックの場合はTrue・・・チェック結果のメッセージを表示しない)
8321             If SettingDialog.StartupVersion Then
8322                 CheckNewVersion(True)
8323             End If
8324
8325             ' 取得失敗の場合は再試行する
8326             If Not tw.GetFollowersSuccess AndAlso SettingDialog.StartupFollowers Then
8327                 GetTimeline(WORKERTYPE.Follower, 0, 0, "")
8328             End If
8329         End If
8330         _initial = False
8331         AddHandler tw.NewPostFromStream, AddressOf tw_NewPostFromStream
8332         AddHandler tw.UserStreamStarted, AddressOf tw_UserStreamStarted
8333         AddHandler tw.UserStreamStopped, AddressOf tw_UserStreamStopped
8334         AddHandler tw.UserStreamPaused, AddressOf tw_UserStreamPaused
8335         AddHandler tw.PostDeleted, AddressOf tw_PostDeleted
8336
8337         MenuItemUserStream.Text = "&UserStream ■"
8338         MenuItemUserStream.Enabled = True
8339         PauseToolStripMenuItem.Text = "&Pause"
8340         PauseToolStripMenuItem.Enabled = False
8341         StopToolStripMenuItem.Text = "&Start"
8342         StopToolStripMenuItem.Enabled = True
8343         If SettingDialog.UserstreamStartup Then tw.StartUserStream()
8344         TimerTimeline.Enabled = True
8345     End Sub
8346
8347     Private Sub doGetFollowersMenu()
8348         GetTimeline(WORKERTYPE.Follower, 1, 0, "")
8349         DispSelectedPost()
8350     End Sub
8351
8352     Private Sub GetFollowersAllToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UpdateFollowersMenuItem1.Click
8353         doGetFollowersMenu()
8354     End Sub
8355
8356     Private Sub doReTweetUnofficial()
8357         'RT @id:内容
8358         If _curPost IsNot Nothing Then
8359             If _curPost.IsDm OrElse _
8360                Not StatusText.Enabled Then Exit Sub
8361
8362             If _curPost.IsProtect Then
8363                 MessageBox.Show("Protected.")
8364                 Exit Sub
8365             End If
8366             Dim rtdata As String = _curPost.OriginalData
8367             rtdata = CreateRetweetUnofficial(rtdata)
8368
8369             StatusText.Text = "RT @" + _curPost.Name + ": " + HttpUtility.HtmlDecode(rtdata)
8370
8371             StatusText.SelectionStart = 0
8372             StatusText.Focus()
8373         End If
8374     End Sub
8375
8376     Private Sub ReTweetStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReTweetStripMenuItem.Click, RtUnOpMenuItem.Click
8377         doReTweetUnofficial()
8378     End Sub
8379
8380     Private Sub doReTweetOfficial(ByVal isConfirm As Boolean)
8381         '公式RT
8382         If _curPost IsNot Nothing Then
8383             If _curPost.IsProtect Then
8384                 MessageBox.Show("Protected.")
8385                 _DoFavRetweetFlags = False
8386                 Exit Sub
8387             End If
8388             If _curList.SelectedIndices.Count > 15 Then
8389                 MessageBox.Show(My.Resources.RetweetLimitText)
8390                 _DoFavRetweetFlags = False
8391                 Exit Sub
8392             ElseIf _curList.SelectedIndices.Count > 1 Then
8393                 Dim QuestionText As String = My.Resources.RetweetQuestion2
8394                 If _DoFavRetweetFlags Then QuestionText = My.Resources.FavoriteRetweetQuestionText1
8395                 Select Case MessageBox.Show(QuestionText, "Retweet", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)
8396                     Case Windows.Forms.DialogResult.Cancel, Windows.Forms.DialogResult.No
8397                         _DoFavRetweetFlags = False
8398                         Exit Sub
8399                 End Select
8400             Else
8401                 If _curPost.IsDm OrElse _curPost.IsMe Then
8402                     _DoFavRetweetFlags = False
8403                     Exit Sub
8404                 End If
8405                 If Not SettingDialog.RetweetNoConfirm Then
8406                     Dim Questiontext As String = My.Resources.RetweetQuestion1
8407                     If _DoFavRetweetFlags Then Questiontext = My.Resources.FavoritesRetweetQuestionText2
8408                     If isConfirm AndAlso MessageBox.Show(Questiontext, "Retweet", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then
8409                         _DoFavRetweetFlags = False
8410                         Exit Sub
8411                     End If
8412                 End If
8413             End If
8414             Dim args As New GetWorkerArg
8415             args.ids = New List(Of Long)
8416             args.sIds = New List(Of Long)
8417             args.tName = _curTab.Text
8418             args.type = WORKERTYPE.Retweet
8419             For Each idx As Integer In _curList.SelectedIndices
8420                 Dim post As PostClass = GetCurTabPost(idx)
8421                 If Not post.IsMe AndAlso Not post.IsProtect AndAlso Not post.IsDm Then args.ids.Add(post.Id)
8422             Next
8423             RunAsync(args)
8424         End If
8425     End Sub
8426
8427     Private Sub ReTweetOriginalStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReTweetOriginalStripMenuItem.Click, RtOpMenuItem.Click
8428         doReTweetOfficial(True)
8429     End Sub
8430
8431     Private Sub FavoritesRetweetOriginal()
8432         If _curPost Is Nothing Then Exit Sub
8433         _DoFavRetweetFlags = True
8434         doReTweetOfficial(True)
8435         If _DoFavRetweetFlags Then
8436             _DoFavRetweetFlags = False
8437             FavoriteChange(True, False)
8438         End If
8439     End Sub
8440
8441     Private Sub FavoritesRetweetUnofficial()
8442         If _curPost IsNot Nothing AndAlso Not _curPost.IsDm Then
8443             _DoFavRetweetFlags = True
8444             FavoriteChange(True)
8445             If Not _curPost.IsProtect AndAlso _DoFavRetweetFlags Then
8446                 _DoFavRetweetFlags = False
8447                 doReTweetUnofficial()
8448             End If
8449         End If
8450     End Sub
8451
8452     Private Function CreateRetweetUnofficial(ByVal status As String) As String
8453
8454         ' Twitterにより省略されているURLを含むaタグをキャプチャしてリンク先URLへ置き換える
8455         '展開しないように変更
8456         '展開するか判定
8457         Dim isUrl As Boolean = False
8458         Dim ms As MatchCollection = Regex.Matches(status, "<a target=""_self"" href=""(?<url>[^""]+)""[^>]*>(?<link>(https?|shttp|ftps?)://[^<]+)</a>")
8459         For Each m As Match In ms
8460             If m.Result("${link}").EndsWith("...") Then
8461                 isUrl = True
8462                 Exit For
8463             End If
8464         Next
8465         If isUrl Then
8466             status = Regex.Replace(status, "<a target=""_self"" href=""(?<url>[^""]+)""[^>]*>(?<link>(https?|shttp|ftps?)://[^<]+)</a>", "${url}")
8467         Else
8468             status = Regex.Replace(status, "<a target=""_self"" href=""(?<url>[^""]+)""[^>]*>(?<link>(https?|shttp|ftps?)://[^<]+)</a>", "${link}")
8469         End If
8470
8471         'その他のリンク(@IDなど)を置き換える
8472         status = Regex.Replace(status, "@<a target=""_self"" href=""https?://twitter.com/(#!/)?(?<url>[^""]+)""[^>]*>(?<link>[^<]+)</a>", "@${url}")
8473         'ハッシュタグ
8474         status = Regex.Replace(status, "<a target=""_self"" href=""(?<url>[^""]+)""[^>]*>(?<link>[^<]+)</a>", "${link}")
8475         '<br>タグ除去
8476         If StatusText.Multiline Then
8477             status = Regex.Replace(status, "(\r\n|\n|\r)?<br>", vbCrLf, RegexOptions.IgnoreCase Or RegexOptions.Multiline)
8478         Else
8479             status = Regex.Replace(status, "(\r\n|\n|\r)?<br>", "", RegexOptions.IgnoreCase Or RegexOptions.Multiline)
8480         End If
8481
8482         _reply_to_id = 0
8483         _reply_to_name = ""
8484         status = status.Replace("&nbsp;", " ")
8485
8486         Return status
8487     End Function
8488
8489     Private Sub DumpPostClassToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DumpPostClassToolStripMenuItem.Click
8490         If _curPost IsNot Nothing Then
8491             DispSelectedPost()
8492         End If
8493     End Sub
8494
8495     Private Sub MenuItemHelp_DropDownOpening(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuItemHelp.DropDownOpening
8496         If DebugBuild OrElse My.Computer.Keyboard.CapsLock AndAlso My.Computer.Keyboard.CtrlKeyDown AndAlso My.Computer.Keyboard.ShiftKeyDown Then
8497             DebugModeToolStripMenuItem.Visible = True
8498         Else
8499             DebugModeToolStripMenuItem.Visible = False
8500         End If
8501     End Sub
8502
8503     Private Sub ToolStripMenuItemUrlAutoShorten_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItemUrlAutoShorten.CheckedChanged
8504         SettingDialog.UrlConvertAuto = ToolStripMenuItemUrlAutoShorten.Checked
8505     End Sub
8506
8507     Private Sub ContextMenuPostMode_Opening(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ContextMenuPostMode.Opening
8508         ToolStripMenuItemUrlAutoShorten.Checked = SettingDialog.UrlConvertAuto
8509     End Sub
8510
8511     Private Sub TraceOutToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TraceOutToolStripMenuItem.Click
8512         If TraceOutToolStripMenuItem.Checked Then
8513             TraceFlag = True
8514         Else
8515             TraceFlag = False
8516         End If
8517     End Sub
8518
8519     Private Sub TweenMain_Deactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Deactivate
8520         '画面が非アクティブになったら、発言欄の背景色をデフォルトへ
8521         Me.StatusText_Leave(StatusText, System.EventArgs.Empty)
8522     End Sub
8523
8524     Private Sub TabRenameMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabRenameMenuItem.Click, RenameTbMenuItem.Click
8525         If String.IsNullOrEmpty(_rclickTabName) Then Exit Sub
8526         TabRename(_rclickTabName)
8527     End Sub
8528
8529     Private Sub BitlyToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BitlyToolStripMenuItem.Click
8530         UrlConvert(UrlConverter.Bitly)
8531     End Sub
8532
8533     Private Sub JmpToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles JmpStripMenuItem.Click
8534         UrlConvert(UrlConverter.Jmp)
8535     End Sub
8536
8537
8538     Private Class GetApiInfoArgs
8539         Public tw As Twitter
8540         Public info As ApiInfo
8541     End Class
8542
8543     Private Sub GetApiInfo_Dowork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
8544         Dim args As GetApiInfoArgs = DirectCast(e.Argument, GetApiInfoArgs)
8545         e.Result = tw.GetInfoApi(args.info)
8546     End Sub
8547
8548     Private Sub ApiInfoMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ApiInfoMenuItem.Click
8549         Dim info As New ApiInfo
8550         Dim tmp As String
8551         Dim args As New GetApiInfoArgs With {.tw = tw, .info = info}
8552
8553         Using dlg As New FormInfo(Me, My.Resources.ApiInfo6, AddressOf GetApiInfo_Dowork, Nothing, args)
8554             dlg.ShowDialog()
8555             If CBool(dlg.Result) Then
8556                 tmp = My.Resources.ApiInfo1 + args.info.MaxCount.ToString() + Environment.NewLine + _
8557                     My.Resources.ApiInfo2 + args.info.RemainCount.ToString + Environment.NewLine + _
8558                     My.Resources.ApiInfo3 + args.info.ResetTime.ToString()
8559                 SetStatusLabelUrl()
8560             Else
8561                 tmp = My.Resources.ApiInfo5
8562             End If
8563         End Using
8564
8565         MessageBox.Show(tmp, My.Resources.ApiInfo4, MessageBoxButtons.OK, MessageBoxIcon.Information)
8566     End Sub
8567
8568     Private Sub FollowCommandMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FollowCommandMenuItem.Click
8569         Dim id As String = ""
8570         If _curPost IsNot Nothing Then id = _curPost.Name
8571         FollowCommand(id)
8572     End Sub
8573
8574     Private Sub FollowCommand_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
8575         Dim arg As FollowRemoveCommandArgs = DirectCast(e.Argument, FollowRemoveCommandArgs)
8576         e.Result = arg.tw.PostFollowCommand(arg.id)
8577     End Sub
8578
8579     Private Sub FollowCommand(ByVal id As String)
8580         Using inputName As New InputTabName()
8581             inputName.FormTitle = "Follow"
8582             inputName.FormDescription = My.Resources.FRMessage1
8583             inputName.TabName = id
8584             If inputName.ShowDialog() = Windows.Forms.DialogResult.OK AndAlso _
8585                Not String.IsNullOrEmpty(inputName.TabName.Trim()) Then
8586                 Dim arg As New FollowRemoveCommandArgs
8587                 arg.tw = tw
8588                 arg.id = inputName.TabName.Trim()
8589                 Using _info As New FormInfo(Me, My.Resources.FollowCommandText1, _
8590                                             AddressOf FollowCommand_DoWork, _
8591                                             Nothing, _
8592                                             arg)
8593                     _info.ShowDialog()
8594                     Dim ret As String = DirectCast(_info.Result, String)
8595                     If Not String.IsNullOrEmpty(ret) Then
8596                         MessageBox.Show(My.Resources.FRMessage2 + ret)
8597                     Else
8598                         MessageBox.Show(My.Resources.FRMessage3)
8599                     End If
8600                 End Using
8601             End If
8602         End Using
8603     End Sub
8604
8605     Private Sub RemoveCommandMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RemoveCommandMenuItem.Click
8606         Dim id As String = ""
8607         If _curPost IsNot Nothing Then id = _curPost.Name
8608         RemoveCommand(id, False)
8609     End Sub
8610
8611     Private Class FollowRemoveCommandArgs
8612         Public tw As Tween.Twitter
8613         Public id As String
8614     End Class
8615
8616     Private Sub RemoveCommand_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
8617         Dim arg As FollowRemoveCommandArgs = DirectCast(e.Argument, FollowRemoveCommandArgs)
8618         e.Result = arg.tw.PostRemoveCommand(arg.id)
8619     End Sub
8620
8621     Private Sub RemoveCommand(ByVal id As String, ByVal skipInput As Boolean)
8622         Dim arg As New FollowRemoveCommandArgs
8623         arg.tw = tw
8624         arg.id = id
8625         If Not skipInput Then
8626             Using inputName As New InputTabName()
8627                 inputName.FormTitle = "Unfollow"
8628                 inputName.FormDescription = My.Resources.FRMessage1
8629                 inputName.TabName = id
8630                 If inputName.ShowDialog() = Windows.Forms.DialogResult.OK AndAlso _
8631                    Not String.IsNullOrEmpty(inputName.TabName.Trim()) Then
8632                     arg.tw = tw
8633                     arg.id = inputName.TabName.Trim()
8634                 Else
8635                     Exit Sub
8636                 End If
8637             End Using
8638         End If
8639
8640         Using _info As New FormInfo(Me, My.Resources.RemoveCommandText1, _
8641                                     AddressOf RemoveCommand_DoWork, _
8642                                     Nothing, _
8643                                     arg)
8644             _info.ShowDialog()
8645             Dim ret As String = DirectCast(_info.Result, String)
8646             If Not String.IsNullOrEmpty(ret) Then
8647                 MessageBox.Show(My.Resources.FRMessage2 + ret)
8648             Else
8649                 MessageBox.Show(My.Resources.FRMessage3)
8650             End If
8651         End Using
8652     End Sub
8653
8654     Private Sub FriendshipMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FriendshipMenuItem.Click
8655         Dim id As String = ""
8656         If _curPost IsNot Nothing Then
8657             id = _curPost.Name
8658         End If
8659         ShowFriendship(id)
8660     End Sub
8661
8662     Private Class ShowFriendshipArgs
8663         Public tw As Tween.Twitter
8664         Public Class FriendshipInfo
8665             Public id As String = ""
8666             Public isFollowing As Boolean = False
8667             Public isFollowed As Boolean = False
8668             Public isError As Boolean = False
8669             Public Sub New(ByVal id As String)
8670                 Me.id = id
8671             End Sub
8672         End Class
8673         Public ids As New List(Of FriendshipInfo)
8674     End Class
8675
8676     Private Sub ShowFriendship_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
8677         Dim arg As ShowFriendshipArgs = DirectCast(e.Argument, ShowFriendshipArgs)
8678         Dim result As String = ""
8679         For Each fInfo As ShowFriendshipArgs.FriendshipInfo In arg.ids
8680             Dim rt As String = arg.tw.GetFriendshipInfo(fInfo.id, fInfo.isFollowing, fInfo.isFollowed)
8681             If Not String.IsNullOrEmpty(rt) Then
8682                 If String.IsNullOrEmpty(result) Then result = rt
8683                 fInfo.isError = True
8684             End If
8685         Next
8686         e.Result = result
8687     End Sub
8688
8689     Private Sub ShowFriendship(ByVal id As String)
8690         Dim args As New ShowFriendshipArgs
8691         args.tw = tw
8692         Using inputName As New InputTabName()
8693             inputName.FormTitle = "Show Friendships"
8694             inputName.FormDescription = My.Resources.FRMessage1
8695             inputName.TabName = id
8696             If inputName.ShowDialog() = Windows.Forms.DialogResult.OK AndAlso _
8697                Not String.IsNullOrEmpty(inputName.TabName.Trim()) Then
8698                 Dim ret As String = ""
8699                 args.ids.Add(New ShowFriendshipArgs.FriendshipInfo(inputName.TabName.Trim))
8700                 Using _info As New FormInfo(Me, My.Resources.ShowFriendshipText1, _
8701                                             AddressOf ShowFriendship_DoWork, _
8702                                             Nothing, _
8703                                             args)
8704                     _info.ShowDialog()
8705                     ret = DirectCast(_info.Result, String)
8706                 End Using
8707                 Dim result As String = ""
8708                 If String.IsNullOrEmpty(ret) Then
8709                     If args.ids(0).isFollowing Then
8710                         result = My.Resources.GetFriendshipInfo1 + System.Environment.NewLine
8711                     Else
8712                         result = My.Resources.GetFriendshipInfo2 + System.Environment.NewLine
8713                     End If
8714                     If args.ids(0).isFollowed Then
8715                         result += My.Resources.GetFriendshipInfo3
8716                     Else
8717                         result += My.Resources.GetFriendshipInfo4
8718                     End If
8719                     result = args.ids(0).id + My.Resources.GetFriendshipInfo5 + System.Environment.NewLine + result
8720                 Else
8721                     result = ret
8722                 End If
8723                 MessageBox.Show(result)
8724             End If
8725         End Using
8726     End Sub
8727
8728     Private Sub ShowFriendship(ByVal ids() As String)
8729         For Each id As String In ids
8730             Dim ret As String = ""
8731             Dim args As New ShowFriendshipArgs
8732             args.tw = tw
8733             args.ids.Add(New ShowFriendshipArgs.FriendshipInfo(id.Trim))
8734             Using _info As New FormInfo(Me, My.Resources.ShowFriendshipText1, _
8735                                         AddressOf ShowFriendship_DoWork, _
8736                                         Nothing, _
8737                                         args)
8738                 _info.ShowDialog()
8739                 ret = DirectCast(_info.Result, String)
8740             End Using
8741             Dim result As String = ""
8742             Dim fInfo As ShowFriendshipArgs.FriendshipInfo = args.ids(0)
8743             Dim ff As String = ""
8744             If String.IsNullOrEmpty(ret) Then
8745                 ff = "  "
8746                 If fInfo.isFollowing Then
8747                     ff += My.Resources.GetFriendshipInfo1
8748                 Else
8749                     ff += My.Resources.GetFriendshipInfo2
8750                 End If
8751                 ff += System.Environment.NewLine + "  "
8752                 If fInfo.isFollowed Then
8753                     ff += My.Resources.GetFriendshipInfo3
8754                 Else
8755                     ff += My.Resources.GetFriendshipInfo4
8756                 End If
8757                 result += fInfo.id + My.Resources.GetFriendshipInfo5 + System.Environment.NewLine + ff
8758                 If fInfo.isFollowing Then
8759                     If MessageBox.Show( _
8760                         My.Resources.GetFriendshipInfo7 + System.Environment.NewLine + result, My.Resources.GetFriendshipInfo8, _
8761                         MessageBoxButtons.YesNo, _
8762                         MessageBoxIcon.Question, _
8763                         MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then
8764                         RemoveCommand(fInfo.id, True)
8765                     End If
8766                 Else
8767                     MessageBox.Show(result)
8768                 End If
8769             Else
8770                 MessageBox.Show(ret)
8771             End If
8772         Next
8773     End Sub
8774
8775     Private Sub OwnStatusMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OwnStatusMenuItem.Click
8776         If Not String.IsNullOrEmpty(tw.UserInfoXml) Then
8777             doShowUserStatus(tw.UserInfoXml)
8778         Else
8779             MessageBox.Show(My.Resources.ShowYourProfileText1, "Your status", MessageBoxButtons.OK, MessageBoxIcon.Information)
8780             Exit Sub
8781         End If
8782     End Sub
8783
8784     ' TwitterIDでない固定文字列を調べる(文字列検証のみ 実際に取得はしない)
8785     ' URLから切り出した文字列を渡す
8786
8787     Private Function IsTwitterId(ByVal name As String) As Boolean
8788         Return Not Regex.Match(name, "^(about|jobs|tos|privacy)$").Success
8789     End Function
8790
8791     Private Function GetUserId() As String
8792         Dim m As Match = Regex.Match(Me._postBrowserStatusText, "^https?://twitter.com/(#!/)?(?<name>[a-zA-Z0-9_]+)$")
8793         If m.Success AndAlso IsTwitterId(m.Result("${name}")) Then
8794             Return m.Result("${name}")
8795         Else
8796             Dim ma As Match = Regex.Match(Me._postBrowserStatusText, "^https?://twitter.com/(#!/)?(?<name>[a-zA-Z0-9_]+)(/(status|statuses)/[0-9]+)$")
8797             If ma.Success AndAlso IsTwitterId(ma.Result("${name}")) Then
8798                 Return ma.Result("${name}")
8799             End If
8800             Return Nothing
8801         End If
8802     End Function
8803
8804     Private Sub FollowContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FollowContextMenuItem.Click
8805         Dim name As String = GetUserId()
8806         If name IsNot Nothing Then FollowCommand(name)
8807     End Sub
8808
8809     Private Sub RemoveContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RemoveContextMenuItem.Click
8810         Dim name As String = GetUserId()
8811         If name IsNot Nothing Then RemoveCommand(name, False)
8812     End Sub
8813
8814     Private Sub FriendshipContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FriendshipContextMenuItem.Click
8815         Dim name As String = GetUserId()
8816         If name IsNot Nothing Then ShowFriendship(name)
8817     End Sub
8818
8819     Private Sub FriendshipAllMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FriendshipAllMenuItem.Click
8820         Dim ma As MatchCollection = Regex.Matches(Me.PostBrowser.DocumentText, "href=""https?://twitter.com/(#!/)?(?<name>[a-zA-Z0-9_]+)""")
8821         Dim ids As New List(Of String)
8822         For Each mu As Match In ma
8823             If mu.Result("${name}").ToLower <> tw.Username.ToLower Then
8824                 ids.Add(mu.Result("${name}"))
8825             End If
8826         Next
8827         ShowFriendship(ids.ToArray)
8828     End Sub
8829
8830     Private Sub ShowUserStatusContextMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShowUserStatusContextMenuItem.Click
8831         Dim name As String = GetUserId()
8832         If name IsNot Nothing Then ShowUserStatus(name)
8833     End Sub
8834
8835     Private Sub SearchPostsDetailToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchPostsDetailToolStripMenuItem.Click
8836         Dim name As String = GetUserId()
8837         If name IsNot Nothing Then AddNewTabForSearch("from:" + name)
8838     End Sub
8839
8840     Private Sub IdeographicSpaceToSpaceToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IdeographicSpaceToSpaceToolStripMenuItem.Click
8841         _modifySettingCommon = True
8842     End Sub
8843
8844     Private Sub ToolStripFocusLockMenuItem_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripFocusLockMenuItem.Click
8845         _modifySettingCommon = True
8846     End Sub
8847
8848     Private Sub doQuote()
8849         'QT @id:内容
8850         '返信先情報付加
8851         If _curPost IsNot Nothing Then
8852             If _curPost.IsDm OrElse _
8853                Not StatusText.Enabled Then Exit Sub
8854
8855             If _curPost.IsProtect Then
8856                 MessageBox.Show("Protected.")
8857                 Exit Sub
8858             End If
8859             Dim rtdata As String = _curPost.OriginalData
8860             rtdata = CreateRetweetUnofficial(rtdata)
8861
8862             StatusText.Text = " QT @" + _curPost.Name + ": " + HttpUtility.HtmlDecode(rtdata)
8863             If _curPost.RetweetedId = 0 Then
8864                 _reply_to_id = _curPost.Id
8865             Else
8866                 _reply_to_id = _curPost.RetweetedId
8867             End If
8868             _reply_to_name = _curPost.Name
8869
8870             StatusText.SelectionStart = 0
8871             StatusText.Focus()
8872         End If
8873     End Sub
8874
8875     Private Sub QuoteStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles QuoteStripMenuItem.Click, QtOpMenuItem.Click
8876         doQuote()
8877     End Sub
8878
8879     Private Sub SearchButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
8880         '公式検索
8881         Dim pnl As Control = DirectCast(sender, Control).Parent
8882         If pnl Is Nothing Then Exit Sub
8883         Dim tbName As String = pnl.Parent.Text
8884         Dim tb As TabClass = _statuses.Tabs(tbName)
8885         Dim cmb As ComboBox = DirectCast(pnl.Controls("comboSearch"), ComboBox)
8886         Dim cmbLang As ComboBox = DirectCast(pnl.Controls("comboLang"), ComboBox)
8887         cmb.Text = cmb.Text.Trim
8888         ' 検索式演算子 OR についてのみ大文字しか認識しないので強制的に大文字とする
8889         Dim Quote As Boolean = False
8890         Dim buf As New StringBuilder()
8891         Dim c As Char() = cmb.Text.ToCharArray()
8892         For cnt As Integer = 0 To cmb.Text.Length - 1
8893             If cnt > cmb.Text.Length - 4 Then
8894                 buf.Append(cmb.Text.Substring(cnt))
8895                 Exit For
8896             End If
8897             If c(cnt) = CChar("""") Then
8898                 Quote = Not Quote
8899             Else
8900                 If Not Quote AndAlso cmb.Text.Substring(cnt, 4).Equals(" or ", StringComparison.OrdinalIgnoreCase) Then
8901                     buf.Append(" OR ")
8902                     cnt += 3
8903                     Continue For
8904                 End If
8905             End If
8906             buf.Append(c(cnt))
8907         Next
8908         cmb.Text = buf.ToString()
8909
8910         tb.SearchWords = cmb.Text
8911         tb.SearchLang = cmbLang.Text
8912         If cmb.Text = "" Then
8913             DirectCast(ListTab.SelectedTab.Tag, DetailsListView).Focus()
8914             SaveConfigsTabs()
8915             Exit Sub
8916         End If
8917         If tb.IsQueryChanged Then
8918             Dim idx As Integer = DirectCast(pnl.Controls("comboSearch"), ComboBox).Items.IndexOf(tb.SearchWords)
8919             If idx > -1 Then DirectCast(pnl.Controls("comboSearch"), ComboBox).Items.RemoveAt(idx)
8920             DirectCast(pnl.Controls("comboSearch"), ComboBox).Items.Insert(0, tb.SearchWords)
8921             cmb.Text = tb.SearchWords
8922             cmb.SelectAll()
8923             Dim lst As DetailsListView = DirectCast(pnl.Parent.Tag, DetailsListView)
8924             lst.VirtualListSize = 0
8925             lst.Items.Clear()
8926             _statuses.ClearTabIds(tbName)
8927             SaveConfigsTabs()   '検索条件の保存
8928         End If
8929
8930         GetTimeline(WORKERTYPE.PublicSearch, 1, 0, tbName)
8931         DirectCast(ListTab.SelectedTab.Tag, DetailsListView).Focus()
8932     End Sub
8933
8934     Private Sub RefreshMoreStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RefreshMoreStripMenuItem.Click, RefreshPrevOpMenuItem.Click
8935         'もっと前を取得
8936         DoRefreshMore()
8937     End Sub
8938
8939     Private Sub UndoRemoveTabMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UndoRemoveTabMenuItem.Click
8940         If _statuses.RemovedTab Is Nothing Then
8941             MessageBox.Show("There isn't removed tab.", "Undo", MessageBoxButtons.OK, MessageBoxIcon.Information)
8942             Exit Sub
8943         Else
8944             Dim tb As TabClass = _statuses.RemovedTab
8945             _statuses.RemovedTab = Nothing
8946             Dim renamed As String = tb.TabName
8947             For i As Integer = 1 To Integer.MaxValue
8948                 If Not _statuses.ContainsTab(renamed) Then Exit For
8949                 renamed = tb.TabName + "(" + i.ToString + ")"
8950             Next
8951             tb.TabName = renamed
8952             _statuses.Tabs.Add(renamed, tb)
8953             AddNewTab(renamed, False, tb.TabType)
8954             ListTab.SelectedIndex = ListTab.TabPages.Count - 1
8955             SaveConfigsTabs()
8956         End If
8957     End Sub
8958
8959     Private Sub doMoveToRTHome()
8960         If _curList.SelectedIndices.Count > 0 Then
8961             Dim post As PostClass = GetCurTabPost(_curList.SelectedIndices(0))
8962             If post.RetweetedId > 0 Then
8963                 OpenUriAsync("http://twitter.com/" + GetCurTabPost(_curList.SelectedIndices(0)).RetweetedBy)
8964             End If
8965         End If
8966     End Sub
8967
8968     Private Sub MoveToRTHomeMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MoveToRTHomeMenuItem.Click, OpenRterHomeMenuItem.Click
8969         doMoveToRTHome()
8970     End Sub
8971
8972     Private Sub IdFilterAddMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IdFilterAddMenuItem.Click
8973         Dim name As String = GetUserId()
8974         If name IsNot Nothing Then
8975             Dim tabName As String = ""
8976
8977             '未選択なら処理終了
8978             If _curList.SelectedIndices.Count = 0 Then Exit Sub
8979
8980             'タブ選択(or追加)
8981             If Not SelectTab(tabName) Then Exit Sub
8982
8983             Dim mv As Boolean = False
8984             Dim mk As Boolean = False
8985             MoveOrCopy(mv, mk)
8986
8987             Dim fc As New FiltersClass
8988             fc.NameFilter = name
8989             fc.SearchBoth = True
8990             fc.MoveFrom = mv
8991             fc.SetMark = mk
8992             fc.UseRegex = False
8993             fc.SearchUrl = False
8994             _statuses.Tabs(tabName).AddFilter(fc)
8995
8996             Try
8997                 Me.Cursor = Cursors.WaitCursor
8998                 _itemCache = Nothing
8999                 _postCache = Nothing
9000                 _curPost = Nothing
9001                 _curItemIndex = -1
9002                 _statuses.FilterAll()
9003                 For Each tb As TabPage In ListTab.TabPages
9004                     DirectCast(tb.Tag, DetailsListView).VirtualListSize = _statuses.Tabs(tb.Text).AllCount
9005                     If _statuses.Tabs(tb.Text).UnreadCount > 0 Then
9006                         If SettingDialog.TabIconDisp Then
9007                             tb.ImageIndex = 0
9008                         End If
9009                     Else
9010                         If SettingDialog.TabIconDisp Then
9011                             tb.ImageIndex = -1
9012                         End If
9013                     End If
9014                 Next
9015                 If Not SettingDialog.TabIconDisp Then ListTab.Refresh()
9016             Finally
9017                 Me.Cursor = Cursors.Default
9018             End Try
9019             SaveConfigsTabs()
9020         End If
9021     End Sub
9022
9023     Private Sub ListManageUserContextToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListManageUserContextToolStripMenuItem.Click, ListManageMenuItem.Click, ListManageUserContextToolStripMenuItem2.Click, ListManageUserContextToolStripMenuItem3.Click
9024         Dim user As String
9025
9026         Dim menuItem As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
9027
9028         If menuItem.Owner Is Me.ContextMenuPostBrowser Then
9029             user = GetUserId()
9030             If user Is Nothing Then Return
9031         ElseIf Me._curPost IsNot Nothing Then
9032             user = Me._curPost.Name
9033         Else
9034             Return
9035         End If
9036
9037         Dim list As ListElement = Nothing
9038
9039         If TabInformations.GetInstance().SubscribableLists.Count = 0 Then
9040             Dim res As String = Me.tw.GetListsApi()
9041
9042             If res <> "" Then
9043                 MessageBox.Show("Failed to get lists. (" + res + ")")
9044                 Return
9045             End If
9046         End If
9047
9048         Using listSelectForm As New MyLists(user, Me.tw)
9049             listSelectForm.ShowDialog()
9050         End Using
9051     End Sub
9052
9053     Private Sub SearchControls_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs)
9054         Dim pnl As Control = DirectCast(sender, Control)
9055         For Each ctl As Control In pnl.Controls
9056             ctl.TabStop = True
9057         Next
9058     End Sub
9059
9060     Private Sub SearchControls_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs)
9061         Dim pnl As Control = DirectCast(sender, Control)
9062         For Each ctl As Control In pnl.Controls
9063             ctl.TabStop = False
9064         Next
9065     End Sub
9066
9067     Private Sub PublicSearchQueryMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PublicSearchQueryMenuItem.Click
9068         If ListTab.SelectedTab IsNot Nothing Then
9069             If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.PublicSearch Then Exit Sub
9070             ListTab.SelectedTab.Controls("panelSearch").Controls("comboSearch").Focus()
9071         End If
9072     End Sub
9073
9074     Private Sub UseHashtagMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UseHashtagMenuItem.Click
9075         Dim m As Match = Regex.Match(Me._postBrowserStatusText, "^https?://twitter.com/search\?q=%23(?<hash>[a-zA-Z0-9_]+)$")
9076         If m.Success Then
9077             HashMgr.SetPermanentHash("#" + m.Result("${hash}"))
9078             HashStripSplitButton.Text = HashMgr.UseHash
9079             HashToggleMenuItem.Checked = True
9080             HashToggleToolStripMenuItem.Checked = True
9081             '使用ハッシュタグとして設定
9082             _modifySettingCommon = True
9083         End If
9084     End Sub
9085
9086     Private Sub StatusLabel_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StatusLabel.DoubleClick
9087         MessageBox.Show(StatusLabel.TextHistory, "Logs", MessageBoxButtons.OK, MessageBoxIcon.None)
9088     End Sub
9089
9090     Private Sub HashManageMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles HashManageMenuItem.Click, HashManageToolStripMenuItem.Click
9091         Dim rslt As DialogResult
9092         Try
9093             rslt = HashMgr.ShowDialog()
9094         Catch ex As Exception
9095             Exit Sub
9096         End Try
9097         Me.TopMost = SettingDialog.AlwaysTop
9098         If rslt = Windows.Forms.DialogResult.Cancel Then Exit Sub
9099         If HashMgr.UseHash <> "" Then
9100             HashStripSplitButton.Text = HashMgr.UseHash
9101             HashToggleMenuItem.Checked = True
9102             HashToggleToolStripMenuItem.Checked = True
9103         Else
9104             HashStripSplitButton.Text = "#[-]"
9105             HashToggleMenuItem.Checked = False
9106             HashToggleToolStripMenuItem.Checked = False
9107         End If
9108         'If HashMgr.IsInsert AndAlso HashMgr.UseHash <> "" Then
9109         '    Dim sidx As Integer = StatusText.SelectionStart
9110         '    Dim hash As String = HashMgr.UseHash + " "
9111         '    If sidx > 0 Then
9112         '        If StatusText.Text.Substring(sidx - 1, 1) <> " " Then
9113         '            hash = " " + hash
9114         '        End If
9115         '    End If
9116         '    StatusText.Text = StatusText.Text.Insert(sidx, hash)
9117         '    sidx += hash.Length
9118         '    StatusText.SelectionStart = sidx
9119         '    StatusText.Focus()
9120         'End If
9121         _modifySettingCommon = True
9122         Me.StatusText_TextChanged(Nothing, Nothing)
9123     End Sub
9124
9125     Private Sub HashToggleMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles HashToggleMenuItem.Click, HashToggleToolStripMenuItem.Click
9126         HashMgr.ToggleHash()
9127         If HashMgr.UseHash <> "" Then
9128             HashStripSplitButton.Text = HashMgr.UseHash
9129             HashToggleMenuItem.Checked = True
9130             HashToggleToolStripMenuItem.Checked = True
9131         Else
9132             HashStripSplitButton.Text = "#[-]"
9133             HashToggleMenuItem.Checked = False
9134             HashToggleToolStripMenuItem.Checked = False
9135         End If
9136         _modifySettingCommon = True
9137         Me.StatusText_TextChanged(Nothing, Nothing)
9138     End Sub
9139
9140     Private Sub HashStripSplitButton_ButtonClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles HashStripSplitButton.ButtonClick
9141         HashToggleMenuItem_Click(Nothing, Nothing)
9142     End Sub
9143
9144     Private Sub MenuItemOperate_DropDownOpening(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemOperate.DropDownOpening
9145         If ListTab.SelectedTab Is Nothing Then Exit Sub
9146         If _statuses Is Nothing OrElse _statuses.Tabs Is Nothing OrElse Not _statuses.Tabs.ContainsKey(ListTab.SelectedTab.Text) Then Exit Sub
9147         If _curPost Is Nothing Then
9148             Me.ReplyOpMenuItem.Enabled = False
9149             Me.ReplyAllOpMenuItem.Enabled = False
9150             Me.DmOpMenuItem.Enabled = False
9151             Me.ShowProfMenuItem.Enabled = False
9152             Me.ListManageMenuItem.Enabled = False
9153             Me.OpenFavOpMenuItem.Enabled = False
9154             Me.CreateTabRuleOpMenuItem.Enabled = False
9155             Me.CreateIdRuleOpMenuItem.Enabled = False
9156             Me.ReadOpMenuItem.Enabled = False
9157             Me.UnreadOpMenuItem.Enabled = False
9158         Else
9159             Me.ReplyOpMenuItem.Enabled = True
9160             Me.ReplyAllOpMenuItem.Enabled = True
9161             Me.DmOpMenuItem.Enabled = True
9162             Me.ShowProfMenuItem.Enabled = True
9163             Me.ListManageMenuItem.Enabled = True
9164             Me.OpenFavOpMenuItem.Enabled = True
9165             Me.CreateTabRuleOpMenuItem.Enabled = True
9166             Me.CreateIdRuleOpMenuItem.Enabled = True
9167             Me.ReadOpMenuItem.Enabled = True
9168             Me.UnreadOpMenuItem.Enabled = True
9169         End If
9170
9171         If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.DirectMessage OrElse _curPost Is Nothing OrElse _curPost.IsDm Then
9172             Me.FavOpMenuItem.Enabled = False
9173             Me.UnFavOpMenuItem.Enabled = False
9174             Me.OpenStatusOpMenuItem.Enabled = False
9175             Me.OpenFavotterOpMenuItem.Enabled = False
9176             Me.ShowRelatedStatusesMenuItem2.Enabled = False
9177             Me.RtOpMenuItem.Enabled = False
9178             Me.RtUnOpMenuItem.Enabled = False
9179             Me.QtOpMenuItem.Enabled = False
9180             Me.FavoriteRetweetMenuItem.Enabled = False
9181             Me.FavoriteRetweetUnofficialMenuItem.Enabled = False
9182             If _curPost IsNot Nothing AndAlso _curPost.IsDm Then Me.DelOpMenuItem.Enabled = True
9183         Else
9184             Me.FavOpMenuItem.Enabled = True
9185             Me.UnFavOpMenuItem.Enabled = True
9186             Me.OpenStatusOpMenuItem.Enabled = True
9187             Me.OpenFavotterOpMenuItem.Enabled = True
9188             Me.ShowRelatedStatusesMenuItem2.Enabled = True  'PublicSearchの時問題出るかも
9189
9190             If _curPost.IsMe Then
9191                 Me.RtOpMenuItem.Enabled = False
9192                 Me.FavoriteRetweetMenuItem.Enabled = False
9193                 Me.DelOpMenuItem.Enabled = True
9194             Else
9195                 Me.DelOpMenuItem.Enabled = False
9196                 If _curPost.IsProtect Then
9197                     Me.RtOpMenuItem.Enabled = False
9198                     Me.RtUnOpMenuItem.Enabled = False
9199                     Me.QtOpMenuItem.Enabled = False
9200                     Me.FavoriteRetweetMenuItem.Enabled = False
9201                     Me.FavoriteRetweetUnofficialMenuItem.Enabled = False
9202                 Else
9203                     Me.RtOpMenuItem.Enabled = True
9204                     Me.RtUnOpMenuItem.Enabled = True
9205                     Me.QtOpMenuItem.Enabled = True
9206                     Me.FavoriteRetweetMenuItem.Enabled = True
9207                     Me.FavoriteRetweetUnofficialMenuItem.Enabled = True
9208                 End If
9209             End If
9210         End If
9211
9212         If _statuses.Tabs(ListTab.SelectedTab.Text).TabType <> TabUsageType.Favorites Then
9213             Me.RefreshPrevOpMenuItem.Enabled = True
9214         Else
9215             Me.RefreshPrevOpMenuItem.Enabled = False
9216         End If
9217         If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.PublicSearch _
9218                             OrElse _curPost Is Nothing _
9219                             OrElse Not _curPost.InReplyToId > 0 Then
9220             OpenRepSourceOpMenuItem.Enabled = False
9221         Else
9222             OpenRepSourceOpMenuItem.Enabled = True
9223         End If
9224         If _curPost Is Nothing OrElse _curPost.RetweetedBy = "" Then
9225             OpenRterHomeMenuItem.Enabled = False
9226         Else
9227             OpenRterHomeMenuItem.Enabled = True
9228         End If
9229     End Sub
9230
9231     Private Sub MenuItemTab_DropDownOpening(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemTab.DropDownOpening
9232         ContextMenuTabProperty_Opening(sender, Nothing)
9233     End Sub
9234
9235     Public ReadOnly Property TwitterInstance() As Twitter
9236         Get
9237             Return tw
9238         End Get
9239     End Property
9240
9241
9242     Private Sub SplitContainer3_SplitterMoved(ByVal sender As System.Object, ByVal e As System.Windows.Forms.SplitterEventArgs) Handles SplitContainer3.SplitterMoved
9243         If Me.WindowState = FormWindowState.Normal AndAlso Not _initialLayout Then
9244             _mySpDis3 = SplitContainer3.SplitterDistance
9245             _modifySettingLocal = True
9246         End If
9247     End Sub
9248
9249     Private Sub MenuItemEdit_DropDownOpening(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItemEdit.DropDownOpening
9250         If _statuses.RemovedTab Is Nothing Then
9251             UndoRemoveTabMenuItem.Enabled = False
9252         Else
9253             UndoRemoveTabMenuItem.Enabled = True
9254         End If
9255         If ListTab.SelectedTab IsNot Nothing Then
9256             If _statuses.Tabs(ListTab.SelectedTab.Text).TabType = TabUsageType.PublicSearch Then
9257                 PublicSearchQueryMenuItem.Enabled = True
9258             Else
9259                 PublicSearchQueryMenuItem.Enabled = False
9260             End If
9261         Else
9262             PublicSearchQueryMenuItem.Enabled = False
9263         End If
9264         If _curPost Is Nothing Then
9265             Me.CopySTOTMenuItem.Enabled = False
9266             Me.CopyURLMenuItem.Enabled = False
9267             Me.CopyUserIdStripMenuItem.Enabled = False
9268         Else
9269             Me.CopySTOTMenuItem.Enabled = True
9270             Me.CopyURLMenuItem.Enabled = True
9271             Me.CopyUserIdStripMenuItem.Enabled = True
9272             If _curPost.IsProtect Then Me.CopySTOTMenuItem.Enabled = False
9273         End If
9274     End Sub
9275
9276     Private Sub NotifyIcon1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseMove
9277         SetNotifyIconText()
9278     End Sub
9279
9280     Private Sub UserStatusToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UserStatusToolStripMenuItem.Click
9281         Dim id As String = ""
9282         If _curPost IsNot Nothing Then
9283             id = _curPost.Name
9284         End If
9285         ShowUserStatus(id)
9286     End Sub
9287
9288     Private Class GetUserInfoArgs
9289         Public tw As Tween.Twitter
9290         Public id As String
9291         Public xmlbuf As String
9292     End Class
9293
9294     Private Sub GetUserInfo_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
9295         Dim args As GetUserInfoArgs = DirectCast(e.Argument, GetUserInfoArgs)
9296         e.Result = args.tw.GetUserInfo(args.id, args.xmlbuf)
9297     End Sub
9298
9299     Private Overloads Sub doShowUserStatus(ByVal id As String, ByVal ShowInputDialog As Boolean)
9300         Dim result As String = ""
9301         Dim xmlbuf As String = ""
9302         Dim args As New GetUserInfoArgs
9303         If ShowInputDialog Then
9304             Using inputName As New InputTabName()
9305                 inputName.FormTitle = "Show UserStatus"
9306                 inputName.FormDescription = My.Resources.FRMessage1
9307                 inputName.TabName = id
9308                 If inputName.ShowDialog() = Windows.Forms.DialogResult.OK AndAlso _
9309                    Not String.IsNullOrEmpty(inputName.TabName.Trim()) Then
9310                     id = inputName.TabName.Trim
9311                     args.tw = tw
9312                     args.id = id
9313                     args.xmlbuf = xmlbuf
9314                     Using _info As New FormInfo(Me, My.Resources.doShowUserStatusText1, _
9315                                                 AddressOf GetUserInfo_DoWork, _
9316                                                 Nothing, _
9317                                                 args)
9318                         _info.ShowDialog()
9319                         Dim ret As String = DirectCast(_info.Result, String)
9320                         If String.IsNullOrEmpty(ret) Then
9321                             doShowUserStatus(args.xmlbuf)
9322                         Else
9323                             MessageBox.Show(ret)
9324                         End If
9325                     End Using
9326                 End If
9327             End Using
9328         Else
9329             args.tw = tw
9330             args.id = id
9331             args.xmlbuf = xmlbuf
9332             Using _info As New FormInfo(Me, My.Resources.doShowUserStatusText1, _
9333                                         AddressOf GetUserInfo_DoWork, _
9334                                         Nothing, _
9335                                         args)
9336                 _info.ShowDialog()
9337                 Dim ret As String = DirectCast(_info.Result, String)
9338                 If String.IsNullOrEmpty(ret) Then
9339                     doShowUserStatus(args.xmlbuf)
9340                 Else
9341                     MessageBox.Show(ret)
9342                 End If
9343             End Using
9344         End If
9345     End Sub
9346
9347     Private Overloads Sub doShowUserStatus(ByVal xmldata As String)
9348         Using userinfo As New ShowUserInfo()
9349             userinfo.XmlData = xmldata
9350             userinfo.ShowDialog(Me)
9351         End Using
9352     End Sub
9353
9354     Private Overloads Sub ShowUserStatus(ByVal id As String, ByVal ShowInputDialog As Boolean)
9355         doShowUserStatus(id, ShowInputDialog)
9356     End Sub
9357
9358     Private Overloads Sub ShowUserStatus(ByVal id As String)
9359         doShowUserStatus(id, True)
9360     End Sub
9361
9362     Private Sub FollowToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FollowToolStripMenuItem.Click
9363         If NameLabel.Tag IsNot Nothing Then
9364             Dim id As String = DirectCast(NameLabel.Tag, String)
9365             If id <> tw.Username Then
9366                 FollowCommand(id)
9367             End If
9368         End If
9369     End Sub
9370
9371     Private Sub UnFollowToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UnFollowToolStripMenuItem.Click
9372         If NameLabel.Tag IsNot Nothing Then
9373             Dim id As String = DirectCast(NameLabel.Tag, String)
9374             If id <> tw.Username Then
9375                 RemoveCommand(id, False)
9376             End If
9377         End If
9378     End Sub
9379
9380     Private Sub ShowFriendShipToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShowFriendShipToolStripMenuItem.Click
9381         If NameLabel.Tag IsNot Nothing Then
9382             Dim id As String = DirectCast(NameLabel.Tag, String)
9383             If id <> tw.Username Then
9384                 ShowFriendship(id)
9385             End If
9386         End If
9387     End Sub
9388
9389     Private Sub ShowUserStatusToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShowUserStatusToolStripMenuItem.Click
9390         If NameLabel.Tag IsNot Nothing Then
9391             Dim id As String = DirectCast(NameLabel.Tag, String)
9392             ShowUserStatus(id, False)
9393         End If
9394     End Sub
9395
9396     Private Sub SearchPostsDetailNameToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchPostsDetailNameToolStripMenuItem.Click
9397         If NameLabel.Tag IsNot Nothing Then
9398             Dim id As String = DirectCast(NameLabel.Tag, String)
9399             AddNewTabForSearch("from:" + id)
9400         End If
9401     End Sub
9402
9403     Private Sub SearchAtPostsDetailNameToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchAtPostsDetailNameToolStripMenuItem.Click, SearchAtPostsDetailToolStripMenuItem.Click
9404         If NameLabel.Tag IsNot Nothing Then
9405             Dim id As String = DirectCast(NameLabel.Tag, String)
9406             AddNewTabForSearch("@" + id)
9407         End If
9408     End Sub
9409
9410     Private Sub ShowProfileMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShowProfileMenuItem.Click, ShowProfMenuItem.Click
9411         If _curPost IsNot Nothing Then
9412             ShowUserStatus(_curPost.Name, False)
9413         End If
9414     End Sub
9415
9416     Private Sub GetRetweet_DoWork(ByVal sender As Object, ByVal e As ComponentModel.DoWorkEventArgs)
9417         Dim counter As Integer = 0
9418
9419         Dim statusid As Long
9420         If _curPost.RetweetedId > 0 Then
9421             statusid = _curPost.RetweetedId
9422         Else
9423             statusid = _curPost.Id
9424         End If
9425         tw.GetStatus_Retweeted_Count(statusid, counter)
9426
9427         e.Result = counter
9428     End Sub
9429
9430     Private Sub RtCountMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RtCountMenuItem.Click
9431         If _curPost IsNot Nothing Then
9432             Using _info As New FormInfo(Me, My.Resources.RtCountMenuItem_ClickText1, _
9433                             AddressOf GetRetweet_DoWork)
9434                 Dim retweet_count As Integer = 0
9435
9436                 ' ダイアログ表示
9437                 _info.ShowDialog()
9438                 retweet_count = CType(_info.Result, Integer)
9439                 If retweet_count < 0 Then
9440                     MessageBox.Show(My.Resources.RtCountText2)
9441                 Else
9442                     MessageBox.Show(retweet_count.ToString + My.Resources.RtCountText1)
9443                 End If
9444             End Using
9445         End If
9446     End Sub
9447
9448     Private WithEvents _hookGlobalHotkey As HookGlobalHotkey
9449     Public Sub New()
9450
9451         _hookGlobalHotkey = New HookGlobalHotkey(Me)
9452         ' この呼び出しは、Windows フォーム デザイナで必要です。
9453         InitializeComponent()
9454
9455         ' InitializeComponent() 呼び出しの後で初期化を追加します。
9456
9457         Me._apiGauge.Control.Size = New Size(70, 22)
9458         Me._apiGauge.Control.Margin = New Padding(0, 3, 0, 2)
9459         Me._apiGauge.GaugeHeight = 8
9460         AddHandler Me._apiGauge.Control.DoubleClick, AddressOf Me.ApiInfoMenuItem_Click
9461         Me.StatusStrip1.Items.Insert(2, Me._apiGauge)
9462     End Sub
9463
9464     Private Sub _hookGlobalHotkey_HotkeyPressed(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles _hookGlobalHotkey.HotkeyPressed
9465         If (Me.WindowState = FormWindowState.Normal OrElse Me.WindowState = FormWindowState.Maximized) AndAlso Me.Visible AndAlso Form.ActiveForm Is Me Then
9466             'アイコン化
9467             Me.Visible = False
9468         ElseIf Form.ActiveForm Is Nothing Then
9469             Me.Visible = True
9470             If Me.WindowState = FormWindowState.Minimized Then Me.WindowState = FormWindowState.Normal
9471             Me.Activate()
9472             Me.StatusText.Focus()
9473         End If
9474     End Sub
9475
9476     Private Sub UserPicture_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UserPicture.MouseEnter
9477         Me.UserPicture.Cursor = Cursors.Hand
9478     End Sub
9479
9480     Private Sub UserPicture_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UserPicture.MouseLeave
9481         Me.UserPicture.Cursor = Cursors.Default
9482     End Sub
9483
9484     Private Sub UserPicture_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UserPicture.DoubleClick
9485         If NameLabel.Tag IsNot Nothing Then
9486             OpenUriAsync("http://twitter.com/" + NameLabel.Tag.ToString)
9487         End If
9488     End Sub
9489
9490     Private Sub SplitContainer2_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles SplitContainer2.MouseDoubleClick
9491         Me.MultiLineMenuItem.PerformClick()
9492     End Sub
9493
9494     Public ReadOnly Property CurPost As PostClass
9495         Get
9496             Return _curPost
9497         End Get
9498     End Property
9499
9500     Public ReadOnly Property IsPreviewEnable As Boolean
9501         Get
9502             Return SettingDialog.PreviewEnable
9503         End Get
9504     End Property
9505
9506 #Region "画像投稿"
9507     Private Sub ImageSelectMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ImageSelectMenuItem.Click
9508         If ImageSelectionPanel.Visible = True Then
9509             ImagefilePathText.CausesValidation = False
9510             TimelinePanel.Visible = True
9511             TimelinePanel.Enabled = True
9512             ImageSelectionPanel.Visible = False
9513             ImageSelectionPanel.Enabled = False
9514             DirectCast(ListTab.SelectedTab.Tag, DetailsListView).Focus()
9515             ImagefilePathText.CausesValidation = True
9516         Else
9517             ImageSelectionPanel.Visible = True
9518             ImageSelectionPanel.Enabled = True
9519             TimelinePanel.Visible = False
9520             TimelinePanel.Enabled = False
9521             ImagefilePathText.Focus()
9522         End If
9523     End Sub
9524
9525     Private Sub FilePickButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FilePickButton.Click
9526         OpenFileDialog1.Filter = (New PictureService(tw)).GetFileOpenDialogFilter(ImageService)
9527         OpenFileDialog1.Title = My.Resources.PickPictureDialog1
9528         OpenFileDialog1.FileName = ""
9529
9530         Try
9531             Me.AllowDrop = False
9532             If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.Cancel Then Exit Sub
9533         Finally
9534             Me.AllowDrop = True
9535         End Try
9536
9537         ImagefilePathText.Text = OpenFileDialog1.FileName
9538         ImageFromSelectedFile()
9539     End Sub
9540
9541     Private Sub ImagefilePathText_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ImagefilePathText.Validating
9542         If ImageCancelButton.Focused Then
9543             ImagefilePathText.CausesValidation = False
9544             Exit Sub
9545         End If
9546         ImagefilePathText.Text = Trim(ImagefilePathText.Text)
9547         If ImagefilePathText.Text = "" Then
9548             ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9549             ImageSelectedPicture.Tag = UploadFileType.Invalid
9550         Else
9551             ImageFromSelectedFile()
9552         End If
9553     End Sub
9554
9555     Private Sub ImageFromSelectedFile()
9556         Try
9557             Dim svc As New PictureService(tw)
9558             If String.IsNullOrEmpty(Trim(ImagefilePathText.Text)) Then
9559                 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9560                 ImageSelectedPicture.Tag = UploadFileType.Invalid
9561                 ImagefilePathText.Text = ""
9562                 Exit Sub
9563             End If
9564
9565             Dim fl As New FileInfo(Trim(ImagefilePathText.Text))
9566             If Not svc.IsValidExtension(fl.Extension.ToLower, ImageService) Then
9567                 '画像以外の形式
9568                 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9569                 ImageSelectedPicture.Tag = UploadFileType.Invalid
9570                 ImagefilePathText.Text = ""
9571                 Exit Sub
9572             End If
9573
9574             If svc.GetMaxFileSize(fl.Extension, ImageService) < fl.Length Then
9575                 ' ファイルサイズが大きすぎる
9576                 ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9577                 ImageSelectedPicture.Tag = UploadFileType.Invalid
9578                 ImagefilePathText.Text = ""
9579                 MessageBox.Show("File is too large.")
9580                 Exit Sub
9581             End If
9582
9583             Select Case svc.GetFileType(fl.Extension.ToLower, ImageService)
9584                 Case UploadFileType.Invalid
9585                     ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9586                     ImageSelectedPicture.Tag = UploadFileType.Invalid
9587                     ImagefilePathText.Text = ""
9588                 Case UploadFileType.Picture
9589                     Dim img As Image = Nothing
9590                     Using fs As New FileStream(ImagefilePathText.Text, FileMode.Open, FileAccess.Read)
9591                         img = Image.FromStream(fs)
9592                         fs.Close()
9593                     End Using
9594                     ImageSelectedPicture.Image = (New HttpVarious).CheckValidImage( _
9595                                 img, _
9596                                 img.Width, _
9597                                 img.Height)
9598                     ImageSelectedPicture.Tag = UploadFileType.Picture
9599                 Case UploadFileType.MultiMedia
9600                     ImageSelectedPicture.Image = My.Resources.MultiMediaImage
9601                     ImageSelectedPicture.Tag = UploadFileType.MultiMedia
9602                 Case Else
9603                     ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9604                     ImageSelectedPicture.Tag = UploadFileType.Invalid
9605                     ImagefilePathText.Text = ""
9606             End Select
9607
9608         Catch ex As FileNotFoundException
9609             ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9610             ImageSelectedPicture.Tag = UploadFileType.Invalid
9611             ImagefilePathText.Text = ""
9612             MessageBox.Show("File not found.")
9613         Catch ex As Exception
9614             ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9615             ImageSelectedPicture.Tag = UploadFileType.Invalid
9616             ImagefilePathText.Text = ""
9617             MessageBox.Show("The type of this file is not image.")
9618         End Try
9619     End Sub
9620
9621     Private Sub ImageSelection_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles _
9622         ImagefilePathText.KeyDown, _
9623         FilePickButton.KeyDown, _
9624         ImageServiceCombo.KeyDown
9625         If e.KeyCode = Keys.Escape Then
9626             ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9627             ImageSelectedPicture.Tag = UploadFileType.Invalid
9628             TimelinePanel.Visible = True
9629             TimelinePanel.Enabled = True
9630             ImageSelectionPanel.Visible = False
9631             ImageSelectionPanel.Enabled = False
9632             DirectCast(ListTab.SelectedTab.Tag, DetailsListView).Focus()
9633             ImagefilePathText.CausesValidation = True
9634         End If
9635     End Sub
9636
9637     Private Sub ImageSelection_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles _
9638     ImagefilePathText.KeyPress, _
9639     FilePickButton.KeyPress, _
9640     ImageServiceCombo.KeyPress
9641         If Convert.ToInt32(e.KeyChar) = &H1B Then
9642             ImagefilePathText.CausesValidation = False
9643             e.Handled = True
9644         End If
9645     End Sub
9646
9647     Private Sub ImageSelection_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles _
9648     ImagefilePathText.PreviewKeyDown, _
9649     FilePickButton.PreviewKeyDown, _
9650     ImageServiceCombo.PreviewKeyDown
9651         If e.KeyCode = Keys.Escape Then
9652             ImagefilePathText.CausesValidation = False
9653         End If
9654     End Sub
9655
9656     Private Sub SetImageServiceCombo()
9657         Dim svc As String = ""
9658         If ImageServiceCombo.SelectedIndex > -1 Then svc = ImageServiceCombo.SelectedItem.ToString
9659         ImageServiceCombo.Items.Clear()
9660         If SettingDialog.IsOAuth Then
9661             ImageServiceCombo.Items.Add("TwitPic")
9662             ImageServiceCombo.Items.Add("img.ly")
9663             ImageServiceCombo.Items.Add("yfrog")
9664         End If
9665         ImageServiceCombo.Items.Add("TwitVideo")
9666         If svc = "" Then
9667             ImageServiceCombo.SelectedIndex = 0
9668         Else
9669             Dim idx As Integer = ImageServiceCombo.Items.IndexOf(svc)
9670             If idx = -1 Then
9671                 ImageServiceCombo.SelectedIndex = 0
9672             Else
9673                 ImageServiceCombo.SelectedIndex = idx
9674             End If
9675         End If
9676     End Sub
9677
9678     Private ReadOnly Property ImageService() As String
9679         Get
9680             Return CStr(ImageServiceCombo.SelectedItem)
9681         End Get
9682     End Property
9683
9684     Private Sub ImageCancelButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ImageCancelButton.Click
9685         ImagefilePathText.CausesValidation = False
9686         TimelinePanel.Visible = True
9687         TimelinePanel.Enabled = True
9688         ImageSelectionPanel.Visible = False
9689         ImageSelectionPanel.Enabled = False
9690         DirectCast(ListTab.SelectedTab.Tag, DetailsListView).Focus()
9691         ImagefilePathText.CausesValidation = True
9692     End Sub
9693
9694     Private Sub ImageServiceCombo_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ImageServiceCombo.SelectedIndexChanged
9695         If ImageSelectedPicture.Tag IsNot Nothing Then
9696             Dim svc As New PictureService(tw)
9697             Try
9698                 Dim fi As New FileInfo(ImagefilePathText.Text.Trim)
9699                 If Not (svc.IsValidExtension(fi.Extension, ImageService) AndAlso _
9700                         svc.GetMaxFileSize(fi.Extension, ImageService) >= fi.Length) Then
9701                     ImagefilePathText.Text = ""
9702                     ImageSelectedPicture.Image = ImageSelectedPicture.InitialImage
9703                     ImageSelectedPicture.Tag = UploadFileType.Invalid
9704                 End If
9705             Catch ex As Exception
9706
9707             End Try
9708         End If
9709     End Sub
9710 #End Region
9711
9712     Private Sub ListManageToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListManageToolStripMenuItem.Click
9713         Using form As New ListManage(tw)
9714             form.ShowDialog(Me)
9715         End Using
9716     End Sub
9717
9718     Public WriteOnly Property ModifySettingCommon() As Boolean
9719         Set(ByVal value As Boolean)
9720             _modifySettingCommon = value
9721         End Set
9722     End Property
9723
9724     Public WriteOnly Property ModifySettingLocal() As Boolean
9725         Set(ByVal value As Boolean)
9726             _modifySettingLocal = value
9727         End Set
9728     End Property
9729
9730     Public WriteOnly Property ModifySettingAtId() As Boolean
9731         Set(ByVal value As Boolean)
9732             _modifySettingAtId = value
9733         End Set
9734     End Property
9735
9736     Private Sub SourceLinkLabel_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles SourceLinkLabel.LinkClicked
9737         Dim link As String = CType(SourceLinkLabel.Tag, String)
9738         If Not String.IsNullOrEmpty(link) Then
9739             OpenUriAsync(link)
9740         End If
9741     End Sub
9742
9743     Private Sub SourceLinkLabel_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SourceLinkLabel.MouseEnter
9744         Dim link As String = CType(SourceLinkLabel.Tag, String)
9745         If Not String.IsNullOrEmpty(link) Then
9746             StatusLabelUrl.Text = link
9747         End If
9748     End Sub
9749
9750     Private Sub SourceLinkLabel_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SourceLinkLabel.MouseLeave
9751         SetStatusLabelUrl()
9752     End Sub
9753
9754     Private Sub SourceLinkLabel_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SourceLinkLabel.Enter
9755         StatusText.Focus()
9756     End Sub
9757
9758     Private Sub MenuItemCommand_DropDownOpening(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuItemCommand.DropDownOpening
9759         If _curPost IsNot Nothing AndAlso Not _curPost.IsDm Then
9760             RtCountMenuItem.Enabled = True
9761         Else
9762             RtCountMenuItem.Enabled = False
9763         End If
9764     End Sub
9765
9766     Private Sub CopyUserIdStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CopyUserIdStripMenuItem.Click
9767         CopyUserId()
9768     End Sub
9769     Private Sub CopyUserId()
9770         If _curPost Is Nothing Then Exit Sub
9771         Dim clstr As String = _curPost.Name
9772         Try
9773             Clipboard.SetDataObject(clstr, False, 5, 100)
9774         Catch ex As Exception
9775             MessageBox.Show(ex.Message)
9776         End Try
9777     End Sub
9778
9779     Private Sub ShowRelatedStatusesMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShowRelatedStatusesMenuItem.Click, ShowRelatedStatusesMenuItem2.Click
9780         If _curPost IsNot Nothing AndAlso Not _curPost.IsDm Then
9781             'PublicSearchも除外した方がよい?
9782             If _statuses.GetTabByType(TabUsageType.Related) Is Nothing Then
9783                 Const TabName As String = "Related Tweets"
9784                 Dim tName As String = TabName
9785                 If Not Me.AddNewTab(tName, False, TabUsageType.Related) Then
9786                     For i As Integer = 2 To 100
9787                         tName = TabName + i.ToString()
9788                         If Me.AddNewTab(tName, False, TabUsageType.Related) Then
9789                             _statuses.AddTab(tName, TabUsageType.Related, Nothing)
9790                             Exit For
9791                         End If
9792                     Next
9793                 Else
9794                     _statuses.AddTab(tName, TabUsageType.Related, Nothing)
9795                 End If
9796             End If
9797
9798             Dim tb As TabClass = _statuses.GetTabByType(TabUsageType.Related)
9799             tb.RelationTargetPost = _curPost
9800             Me.ClearTab(tb.TabName, False)
9801             For i As Integer = 0 To ListTab.TabPages.Count - 1
9802                 If tb.TabName = ListTab.TabPages(i).Text Then
9803                     ListTab.SelectedIndex = i
9804                     ListTabSelect(ListTab.TabPages(i))
9805                     Exit For
9806                 End If
9807             Next
9808
9809             GetTimeline(WORKERTYPE.Related, 1, 1, tb.TabName)
9810         End If
9811     End Sub
9812
9813     Private Sub CacheInfoMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CacheInfoMenuItem.Click
9814         Dim buf As New StringBuilder
9815         buf.AppendFormat("キャッシュメモリ容量         : {0}bytes({1}MB)" + vbCrLf, DirectCast(TIconDic, ImageDictionary).CacheMemoryLimit, DirectCast(TIconDic, ImageDictionary).CacheMemoryLimit / 1048576)
9816         buf.AppendFormat("物理メモリ使用割合           : {0}%" + vbCrLf, DirectCast(TIconDic, ImageDictionary).PhysicalMemoryLimit)
9817         buf.AppendFormat("キャッシュエントリ保持数     : {0}" + vbCrLf, DirectCast(TIconDic, ImageDictionary).CacheCount)
9818         buf.AppendFormat("キャッシュエントリ破棄数     : {0}" + vbCrLf, DirectCast(TIconDic, ImageDictionary).CacheRemoveCount)
9819         MessageBox.Show(buf.ToString, "アイコンキャッシュ使用状況")
9820     End Sub
9821
9822     Private Sub tw_PostDeleted(ByVal id As Long)
9823         _statuses.RemovePostReserve(id)
9824     End Sub
9825
9826     Private Sub tw_NewPostFromStream()
9827         If SettingDialog.ReadOldPosts Then
9828             _statuses.SetRead() '新着時未読クリア
9829         End If
9830
9831         Dim rsltAddCount As Integer = _statuses.DistributePosts()
9832         SyncLock _syncObject
9833             Dim tm As Date = Now
9834             If _tlTimestamps.ContainsKey(tm) Then
9835                 _tlTimestamps(tm) += rsltAddCount
9836             Else
9837                 _tlTimestamps.Add(Now, rsltAddCount)
9838             End If
9839             Dim oneHour As Date = Now.Subtract(New TimeSpan(1, 0, 0))
9840             Dim keys As New List(Of Date)
9841             _tlCount = 0
9842             For Each key As Date In _tlTimestamps.Keys
9843                 If key.CompareTo(oneHour) < 0 Then
9844                     keys.Add(key)
9845                 Else
9846                     _tlCount += _tlTimestamps(key)
9847                 End If
9848             Next
9849             For Each key As Date In keys
9850                 _tlTimestamps.Remove(key)
9851             Next
9852             keys.Clear()
9853
9854             'Static before As DateTime = Now
9855             'If before.Subtract(Now).Seconds > -5 Then Exit Sub
9856             'before = Now
9857         End SyncLock
9858
9859         If SettingDialog.UserstreamPeriodInt > 0 Then Exit Sub
9860
9861         Try
9862             If InvokeRequired AndAlso Not IsDisposed Then
9863                 Invoke(New Action(Of Boolean)(AddressOf RefreshTimeline), True)
9864                 Exit Sub
9865             End If
9866         Catch ex As ObjectDisposedException
9867             Exit Sub
9868         End Try
9869     End Sub
9870     Private Sub tw_UserStreamStarted()
9871         If InvokeRequired Then
9872             Invoke(New MethodInvoker(AddressOf tw_UserStreamStarted))
9873             Exit Sub
9874         End If
9875
9876         MenuItemUserStream.Text = "&UserStream ▶"
9877         MenuItemUserStream.Enabled = True
9878         PauseToolStripMenuItem.Text = "&Pause"
9879         PauseToolStripMenuItem.Enabled = True
9880         StopToolStripMenuItem.Text = "&Stop"
9881         StopToolStripMenuItem.Enabled = True
9882
9883         StatusLabel.Text = "UserStream Started."
9884     End Sub
9885
9886     Private Sub tw_UserStreamStopped()
9887         If InvokeRequired Then
9888             Invoke(New MethodInvoker(AddressOf tw_UserStreamStopped))
9889             Exit Sub
9890         End If
9891
9892         MenuItemUserStream.Text = "&UserStream ■"
9893         MenuItemUserStream.Enabled = True
9894         PauseToolStripMenuItem.Text = "&Pause"
9895         PauseToolStripMenuItem.Enabled = False
9896         StopToolStripMenuItem.Text = "&Start"
9897         StopToolStripMenuItem.Enabled = True
9898
9899         StatusLabel.Text = "UserStream Stopped."
9900     End Sub
9901
9902     Private Sub tw_UserStreamPaused()
9903         If InvokeRequired Then
9904             Invoke(New MethodInvoker(AddressOf tw_UserStreamPaused))
9905             Exit Sub
9906         End If
9907
9908         MenuItemUserStream.Text = "&UserStream ||"
9909         MenuItemUserStream.Enabled = True
9910         PauseToolStripMenuItem.Text = "&Resume"
9911         PauseToolStripMenuItem.Enabled = True
9912         StopToolStripMenuItem.Text = "&Stop"
9913         StopToolStripMenuItem.Enabled = True
9914
9915         StatusLabel.Text = "UserStream Paused."
9916     End Sub
9917
9918     'Private ReadOnly Property IsReceivedUserStream As Boolean
9919     '    Get
9920     '        Static lastTime As DateTime
9921     '        Dim changed As Boolean = (lastTime.CompareTo(tw.LastReceivedUserStream) < 0)
9922     '        lastTime = tw.LastReceivedUserStream
9923     '        Return changed
9924     '    End Get
9925     'End Property
9926
9927     Private Sub PauseToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PauseToolStripMenuItem.Click
9928         MenuItemUserStream.Enabled = False
9929         tw.PauseUserStream()
9930     End Sub
9931
9932     Private Sub StopToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopToolStripMenuItem.Click
9933         MenuItemUserStream.Enabled = False
9934         tw.StartUserStream()
9935     End Sub
9936
9937     Private Sub TrackToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackToolStripMenuItem.Click
9938         Static inputTrack As String = ""
9939         If TrackToolStripMenuItem.Checked Then
9940             Using inputForm As New InputTabName
9941                 inputForm.TabName = inputTrack
9942                 inputForm.FormTitle = "Input track word"
9943                 inputForm.FormDescription = "Track word"
9944                 If inputForm.ShowDialog() <> Windows.Forms.DialogResult.OK Then
9945                     TrackToolStripMenuItem.Checked = False
9946                     Exit Sub
9947                 End If
9948                 inputTrack = inputForm.TabName.Trim()
9949             End Using
9950             If Not inputTrack.Equals(tw.TrackWord) Then
9951                 tw.TrackWord = inputTrack
9952                 Me._modifySettingCommon = True
9953                 TrackToolStripMenuItem.Checked = Not String.IsNullOrEmpty(inputTrack)
9954                 tw.ReconnectUserStream()
9955             End If
9956         Else
9957             tw.TrackWord = ""
9958             tw.ReconnectUserStream()
9959         End If
9960     End Sub
9961
9962     Private Sub AllrepliesToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AllrepliesToolStripMenuItem.Click
9963         tw.AllAtReply = AllrepliesToolStripMenuItem.Checked
9964         Me._modifySettingCommon = True
9965         tw.ReconnectUserStream()
9966     End Sub
9967
9968     Private Sub TweenRestartMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles TweenRestartMenuItem.Click
9969         _endingFlag = True
9970         Application.Restart()
9971     End Sub
9972
9973     Private Sub OpenOwnFavedMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles OpenOwnFavedMenuItem.Click
9974         If Not tw.Username = "" Then OpenUriAsync(My.Resources.FavstarUrl + "users/" + tw.Username + "/recent")
9975     End Sub
9976
9977     Private Sub OpenOwnHomeMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles OpenOwnHomeMenuItem.Click
9978         OpenUriAsync("http://twitter.com/" + tw.Username)
9979     End Sub
9980 End Class