OSDN Git Service

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