--- /dev/null
+Imports System.Drawing
+Imports System.IO
+
+Public Class ImageCacheDictionary
+ Implements IDictionary(Of String, Image), IDisposable
+
+ Dim memoryCacheCount As Integer
+ Private dictionary As Dictionary(Of String, Image)
+ Private sortedKeyList As List(Of String)
+ Private keyTmpFileDictionary As New Dictionary(Of String, String)()
+
+ Public Sub New(ByVal memoryCacheCount As Integer)
+ Me.dictionary = New Dictionary(Of String, Image)(memoryCacheCount)
+ Me.sortedKeyList = New List(Of String)(memoryCacheCount)
+ Me.memoryCacheCount = memoryCacheCount
+ End Sub
+
+ Public Sub Add(ByVal item As System.Collections.Generic.KeyValuePair(Of String, Image)) Implements System.Collections.Generic.ICollection(Of System.Collections.Generic.KeyValuePair(Of String, Image)).Add
+ Me.Add1(item.Key, item.Value)
+ End Sub
+
+ Public Sub Add1(ByVal key As String, ByVal value As Image) Implements System.Collections.Generic.IDictionary(Of String, Image).Add
+ Me.dictionary.Add(key, value)
+ Me.sortedKeyList.Add(key)
+
+ Dim path_ As String = Path.GetTempFileName()
+ Me.keyTmpFileDictionary.Add(key, path_)
+ value.Save(path_)
+
+ While Me.dictionary.Count > memoryCacheCount
+ Me.dictionary.Remove(Me.sortedKeyList(0))
+ Me.sortedKeyList.RemoveAt(0)
+ End While
+ End Sub
+
+ Public Function Remove(ByVal item As System.Collections.Generic.KeyValuePair(Of String, Image)) As Boolean Implements System.Collections.Generic.ICollection(Of System.Collections.Generic.KeyValuePair(Of String, Image)).Remove
+ Return Me.Remove1(item.Key)
+ End Function
+
+ Public Function Remove1(ByVal key As String) As Boolean Implements System.Collections.Generic.IDictionary(Of String, Image).Remove
+ Me.sortedKeyList.Remove(key)
+ File.Delete(Me.keyTmpFileDictionary(key))
+ Me.keyTmpFileDictionary.Remove(key)
+ Return Me.dictionary.Remove(key)
+ End Function
+
+ Default Public Property Item(ByVal key As String) As Image Implements System.Collections.Generic.IDictionary(Of String, Image).Item
+ Get
+ If (Not Me.dictionary.ContainsKey(key)) AndAlso Me.keyTmpFileDictionary.ContainsKey(key) Then
+ Me.dictionary.Add(key, Image.FromFile(Me.keyTmpFileDictionary(key)))
+ End If
+
+ While Me.dictionary.Count > memoryCacheCount
+ Me.dictionary.Remove(Me.sortedKeyList(0))
+ Me.sortedKeyList.RemoveAt(0)
+ End While
+
+ Me.sortedKeyList.Remove(key)
+ Me.sortedKeyList.Add(key)
+ Return Me.dictionary(key)
+ End Get
+ Set(ByVal value As Image)
+ If (Not Me.dictionary.ContainsKey(key)) AndAlso Me.keyTmpFileDictionary.ContainsKey(key) Then
+ Me.dictionary.Add(key, Nothing)
+ End If
+
+ Me.sortedKeyList.Remove(key)
+ Me.sortedKeyList.Add(key)
+ Me.dictionary(key) = value
+
+ value.Save(Me.keyTmpFileDictionary(key))
+ End Set
+ End Property
+
+ Public Sub Clear() Implements System.Collections.Generic.ICollection(Of System.Collections.Generic.KeyValuePair(Of String, Image)).Clear
+ Me.dictionary.Clear()
+ Me.sortedKeyList.Clear()
+
+ For Each path As String In Me.keyTmpFileDictionary.Values
+ File.Delete(path)
+ Next
+ Me.keyTmpFileDictionary.Clear()
+ End Sub
+
+ Public Function Contains(ByVal item As System.Collections.Generic.KeyValuePair(Of String, Image)) As Boolean Implements System.Collections.Generic.ICollection(Of System.Collections.Generic.KeyValuePair(Of String, Image)).Contains
+ Return Me.keyTmpFileDictionary.ContainsKey(item.Key) AndAlso Me.keyTmpFileDictionary(item.Key) Is item.Value
+ End Function
+
+ Public Sub CopyTo(ByVal array() As System.Collections.Generic.KeyValuePair(Of String, Image), ByVal arrayIndex As Integer) Implements System.Collections.Generic.ICollection(Of System.Collections.Generic.KeyValuePair(Of String, Image)).CopyTo
+ Dim index As Integer = arrayIndex
+ For Each Item As KeyValuePair(Of String, Image) In Me.dictionary
+ If array.Length - 1 < index Then
+ Exit For
+ End If
+
+ array(index) = Item
+ index += 1
+ Next
+ End Sub
+
+ Public ReadOnly Property Count As Integer Implements System.Collections.Generic.ICollection(Of System.Collections.Generic.KeyValuePair(Of String, Image)).Count
+ Get
+ Return Me.keyTmpFileDictionary.Count
+ End Get
+ End Property
+
+ Public ReadOnly Property IsReadOnly As Boolean Implements System.Collections.Generic.ICollection(Of System.Collections.Generic.KeyValuePair(Of String, Image)).IsReadOnly
+ Get
+ Return False
+ End Get
+ End Property
+
+ Public Function ContainsKey(ByVal key As String) As Boolean Implements System.Collections.Generic.IDictionary(Of String, Image).ContainsKey
+ Return Me.keyTmpFileDictionary.ContainsKey(key)
+ End Function
+
+ Public ReadOnly Property Keys As System.Collections.Generic.ICollection(Of String) Implements System.Collections.Generic.IDictionary(Of String, Image).Keys
+ Get
+ Return Me.keyTmpFileDictionary.Keys
+ End Get
+ End Property
+
+ Public Function TryGetValue(ByVal key As String, ByRef value As Image) As Boolean Implements System.Collections.Generic.IDictionary(Of String, Image).TryGetValue
+ If Me.keyTmpFileDictionary.ContainsKey(key) Then
+ value = Me.Item(key)
+ Return True
+ Else
+ Return False
+ End If
+ End Function
+
+ Public ReadOnly Property Values As System.Collections.Generic.ICollection(Of Image) Implements System.Collections.Generic.IDictionary(Of String, Image).Values
+ Get
+ Dim imageList As New List(Of Image)(Me.keyTmpFileDictionary.Count)
+ imageList.AddRange(Me.dictionary.Values)
+ For Each key As String In Me.keyTmpFileDictionary.Keys
+ If Not Me.dictionary.ContainsKey(key) Then
+ imageList.Add(Image.FromFile(Me.keyTmpFileDictionary(key)))
+ End If
+ Next
+
+ Return imageList
+ End Get
+ End Property
+
+ Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of System.Collections.Generic.KeyValuePair(Of String, Image)) Implements System.Collections.Generic.IEnumerable(Of System.Collections.Generic.KeyValuePair(Of String, Image)).GetEnumerator
+ Throw New NotImplementedException()
+ Return Me.dictionary.GetEnumerator()
+ End Function
+
+ Public Function GetEnumerator1() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
+ Throw New NotImplementedException()
+ Return Me.dictionary.GetEnumerator()
+ End Function
+
+ Public Sub Dispose() Implements IDisposable.Dispose
+ For Each tmpFilePath As String In Me.keyTmpFileDictionary.Values
+ File.Delete(tmpFilePath)
+ Next
+ End Sub
+End Class
\ No newline at end of file
Private _Source As String
Private _ReplyToList As New List(Of String)
Private _IsMe As Boolean
- Private _ImageIndex As Integer
Private _IsDm As Boolean
Private _statuses As Statuses = Statuses.None
Private _Uid As Long
ByVal Source As String, _
ByVal ReplyToList As List(Of String), _
ByVal IsMe As Boolean, _
- ByVal ImageIndex As Integer, _
ByVal IsDm As Boolean, _
ByVal Uid As Long, _
ByVal FilterHit As Boolean, _
_Source = Source
_ReplyToList = ReplyToList
_IsMe = IsMe
- _ImageIndex = ImageIndex
_IsDm = IsDm
_Uid = Uid
_FilterHit = FilterHit
_IsMe = value
End Set
End Property
- Public Property ImageIndex() As Integer
- Get
- Return _ImageIndex
- End Get
- Set(ByVal value As Integer)
- _ImageIndex = value
- End Set
- End Property
Public Property IsDm() As Boolean
Get
Return _IsDm
item.Source, _
item.ReplyToList, _
item.IsMe, _
- item.ImageIndex, _
item.IsDm, _
item.Uid, _
item.FilterHit, _
<value>263, 17</value>
</metadata>
<data name="ToolStripMenuItemUrlMultibyteSplit.Size" type="System.Drawing.Size, System.Drawing">
- <value>280, 22</value>
+ <value>237, 22</value>
</data>
<data name="ToolStripMenuItemUrlMultibyteSplit.Text" xml:space="preserve">
<value>URLからの全角文字列の切り離し</value>
</data>
<data name="ToolStripMenuItemApiCommandEvasion.Size" type="System.Drawing.Size, System.Drawing">
- <value>280, 22</value>
+ <value>237, 22</value>
</data>
<data name="ToolStripMenuItemApiCommandEvasion.Text" xml:space="preserve">
<value>APIコマンドを回避する</value>
</data>
<data name="ToolStripMenuItemUrlAutoShorten.Size" type="System.Drawing.Size, System.Drawing">
- <value>280, 22</value>
+ <value>237, 22</value>
</data>
<data name="ToolStripMenuItemUrlAutoShorten.Text" xml:space="preserve">
<value>自動的にURLを短縮する</value>
</data>
<data name="IdeographicSpaceToSpaceToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>280, 22</value>
+ <value>237, 22</value>
</data>
<data name="IdeographicSpaceToSpaceToolStripMenuItem.Text" xml:space="preserve">
<value>全角スペースを半角スペースにする</value>
<value>Ctrl+Y</value>
</data>
<data name="MultiLineMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>280, 22</value>
+ <value>237, 22</value>
</data>
<data name="MultiLineMenuItem.Text" xml:space="preserve">
<value>発言欄複数行入力(&M)</value>
</data>
<data name="ToolStripFocusLockMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>280, 22</value>
+ <value>237, 22</value>
</data>
<data name="ToolStripFocusLockMenuItem.Text" xml:space="preserve">
<value>フォーカスを発言欄へロックする</value>
</data>
<data name="ToolStripSeparator35.Size" type="System.Drawing.Size, System.Drawing">
- <value>277, 6</value>
+ <value>234, 6</value>
</data>
<data name="ImageSelectMenuItem.ShortcutKeys" type="System.Windows.Forms.Keys, System.Windows.Forms">
<value>Ctrl+Shift+P</value>
</data>
<data name="ImageSelectMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>280, 22</value>
+ <value>237, 22</value>
</data>
<data name="ImageSelectMenuItem.Text" xml:space="preserve">
<value>投稿画像選択(&P)</value>
</data>
<data name="ToolStripSeparator8.Size" type="System.Drawing.Size, System.Drawing">
- <value>277, 6</value>
+ <value>234, 6</value>
</data>
<data name="HashToggleMenuItem.ShortcutKeys" type="System.Windows.Forms.Keys, System.Windows.Forms">
<value>Ctrl+Shift+T</value>
</data>
<data name="HashToggleMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>280, 22</value>
+ <value>237, 22</value>
</data>
<data name="HashToggleMenuItem.Text" xml:space="preserve">
<value>ハッシュタグ自動付加</value>
<value>Ctrl+T</value>
</data>
<data name="HashManageMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>280, 22</value>
+ <value>237, 22</value>
</data>
<data name="HashManageMenuItem.Text" xml:space="preserve">
<value>ハッシュタグ設定</value>
</data>
<data name="ContextMenuPostMode.Size" type="System.Drawing.Size, System.Drawing">
- <value>281, 214</value>
+ <value>238, 214</value>
</data>
<data name=">>ContextMenuPostMode.Name" xml:space="preserve">
<value>ContextMenuPostMode</value>
<value>130, 99</value>
</metadata>
<data name="AddTabMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>226, 22</value>
+ <value>188, 22</value>
</data>
<data name="AddTabMenuItem.Text" xml:space="preserve">
<value>タブ作成(&N)...</value>
</data>
<data name="TabRenameMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>226, 22</value>
+ <value>188, 22</value>
</data>
<data name="TabRenameMenuItem.Text" xml:space="preserve">
<value>タブ名の変更(&R)</value>
</data>
<data name="ToolStripSeparator20.Size" type="System.Drawing.Size, System.Drawing">
- <value>223, 6</value>
+ <value>185, 6</value>
</data>
<data name="UreadManageMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>226, 22</value>
+ <value>188, 22</value>
</data>
<data name="UreadManageMenuItem.Text" xml:space="preserve">
<value>未読管理(&U)</value>
</data>
<data name="NotifyDispMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>226, 22</value>
+ <value>188, 22</value>
</data>
<data name="NotifyDispMenuItem.Text" xml:space="preserve">
<value>新着通知表示(&Q)</value>
<value>再生するwavファイルを指定してください</value>
</data>
<data name="ToolStripSeparator18.Size" type="System.Drawing.Size, System.Drawing">
- <value>223, 6</value>
+ <value>185, 6</value>
</data>
<data name="FilterEditMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>226, 22</value>
+ <value>188, 22</value>
</data>
<data name="FilterEditMenuItem.Text" xml:space="preserve">
<value>振り分けルール編集(&F)...</value>
</data>
<data name="ToolStripSeparator19.Size" type="System.Drawing.Size, System.Drawing">
- <value>223, 6</value>
+ <value>185, 6</value>
</data>
<data name="ClearTabMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>226, 22</value>
+ <value>188, 22</value>
</data>
<data name="ClearTabMenuItem.Text" xml:space="preserve">
<value>このタブの発言をクリア(&C)</value>
</data>
<data name="ToolStripSeparator11.Size" type="System.Drawing.Size, System.Drawing">
- <value>223, 6</value>
+ <value>185, 6</value>
</data>
<data name="DeleteTabMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>226, 22</value>
+ <value>188, 22</value>
</data>
<data name="DeleteTabMenuItem.Text" xml:space="preserve">
<value>タブ削除(&D)</value>
</data>
<data name="ContextMenuTabProperty.Size" type="System.Drawing.Size, System.Drawing">
- <value>227, 212</value>
+ <value>189, 206</value>
</data>
<data name=">>ContextMenuTabProperty.Name" xml:space="preserve">
<value>ContextMenuTabProperty</value>
<value>635, 58</value>
</metadata>
<data name="FollowToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>238, 22</value>
+ <value>210, 22</value>
</data>
<data name="FollowToolStripMenuItem.Text" xml:space="preserve">
<value>フォローする(&F)</value>
</data>
<data name="UnFollowToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>238, 22</value>
+ <value>210, 22</value>
</data>
<data name="UnFollowToolStripMenuItem.Text" xml:space="preserve">
<value>フォロー解除(&N)</value>
</data>
<data name="ShowFriendShipToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>238, 22</value>
+ <value>210, 22</value>
</data>
<data name="ShowFriendShipToolStripMenuItem.Text" xml:space="preserve">
<value>相互フォロー状態表示(&H)</value>
<value>リスト管理(&L)</value>
</data>
<data name="ToolStripSeparator37.Size" type="System.Drawing.Size, System.Drawing">
- <value>235, 6</value>
+ <value>207, 6</value>
</data>
<data name="ShowUserStatusToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>238, 22</value>
+ <value>210, 22</value>
</data>
<data name="ShowUserStatusToolStripMenuItem.Text" xml:space="preserve">
<value>プロフィール表示(&P)</value>
</data>
<data name="SearchPostsDetailNameToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>238, 22</value>
+ <value>210, 22</value>
</data>
<data name="SearchPostsDetailNameToolStripMenuItem.Text" xml:space="preserve">
<value>このユーザーの発言を検索(&S)</value>
</data>
<data name="ToolStripMenuItem1.Size" type="System.Drawing.Size, System.Drawing">
- <value>235, 6</value>
+ <value>207, 6</value>
</data>
<data name="IconNameToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>238, 22</value>
+ <value>210, 22</value>
</data>
<data name="IconNameToolStripMenuItem.Text" xml:space="preserve">
<value>IconName</value>
</data>
<data name="SaveIconPictureToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>238, 22</value>
+ <value>210, 22</value>
</data>
<data name="SaveIconPictureToolStripMenuItem.Text" xml:space="preserve">
<value>保存(&I)...</value>
<value>ハッシュタグを固定(&H)</value>
</data>
<data name="ContextMenuPostBrowser.Size" type="System.Drawing.Size, System.Drawing">
- <value>211, 342</value>
+ <value>211, 320</value>
</data>
<data name=">>ContextMenuPostBrowser.Name" xml:space="preserve">
<value>ContextMenuPostBrowser</value>
<value>443, 58</value>
</metadata>
<data name="ReplyStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="ReplyStripMenuItem.Text" xml:space="preserve">
<value>@返信(&R)</value>
</data>
<data name="ReplyAllStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="ReplyAllStripMenuItem.Text" xml:space="preserve">
<value>@返信ALL(&E)</value>
</data>
<data name="DMStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="DMStripMenuItem.Text" xml:space="preserve">
<value>DM送信(&M)</value>
</data>
<data name="ReTweetOriginalStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="ReTweetOriginalStripMenuItem.Text" xml:space="preserve">
<value>Re&tweet</value>
</data>
<data name="ReTweetStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="ReTweetStripMenuItem.Text" xml:space="preserve">
<value>Retweet(U&nofficial)</value>
</data>
<data name="QuoteStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="QuoteStripMenuItem.Text" xml:space="preserve">
<value>&Quote</value>
</data>
<data name="ToolStripSeparator2.Size" type="System.Drawing.Size, System.Drawing">
- <value>199, 6</value>
+ <value>179, 6</value>
</data>
<data name="FavAddToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="FavAddToolStripMenuItem.Text" xml:space="preserve">
<value>Fav追加(&F)</value>
</data>
<data name="FavRemoveToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="FavRemoveToolStripMenuItem.Text" xml:space="preserve">
<value>Fav削除(&V)</value>
</data>
<data name="ShowProfileMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="ShowProfileMenuItem.Text" xml:space="preserve">
<value>プロフィール表示</value>
<value>RTした人のホームを開く(&R)</value>
</data>
<data name="ToolStripMenuItem6.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="ToolStripMenuItem6.Text" xml:space="preserve">
<value>開く(&O)</value>
<value>ID振り分けルール作成...</value>
</data>
<data name="ToolStripMenuItem7.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="ToolStripMenuItem7.Text" xml:space="preserve">
<value>振り分けルール作成(&C)</value>
</data>
<data name="ListManageUserContextToolStripMenuItem2.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="ListManageUserContextToolStripMenuItem2.Text" xml:space="preserve">
<value>リスト管理(&L)</value>
</data>
<data name="ToolStripSeparator4.Size" type="System.Drawing.Size, System.Drawing">
- <value>199, 6</value>
+ <value>179, 6</value>
</data>
<data name="ReadedStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>138, 22</value>
<value>未読にする</value>
</data>
<data name="ToolStripMenuItem11.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="ToolStripMenuItem11.Text" xml:space="preserve">
<value>未読状態変更(&H)</value>
</data>
<data name="JumpUnreadMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="JumpUnreadMenuItem.Text" xml:space="preserve">
<value>未読へジャンプ(&J)</value>
</data>
<data name="ToolStripSeparator10.Size" type="System.Drawing.Size, System.Drawing">
- <value>199, 6</value>
+ <value>179, 6</value>
</data>
<data name="SelectAllMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="SelectAllMenuItem.Text" xml:space="preserve">
<value>全て選択(&A)</value>
</data>
<data name="DeleteStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="DeleteStripMenuItem.Text" xml:space="preserve">
<value>削除(&D)</value>
</data>
<data name="RefreshStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="RefreshStripMenuItem.Text" xml:space="preserve">
<value>更新(&U)</value>
</data>
<data name="RefreshMoreStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>202, 22</value>
+ <value>182, 22</value>
</data>
<data name="RefreshMoreStripMenuItem.Text" xml:space="preserve">
<value>前データを取得(&I)</value>
</data>
<data name="ContextMenuOperate.Size" type="System.Drawing.Size, System.Drawing">
- <value>203, 418</value>
+ <value>183, 418</value>
</data>
<data name=">>ContextMenuOperate.Name" xml:space="preserve">
<value>ContextMenuOperate</value>
<value>276, 58</value>
</metadata>
<data name="SettingStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>189, 22</value>
+ <value>168, 22</value>
</data>
<data name="SettingStripMenuItem.Text" xml:space="preserve">
<value>設定(&O)...</value>
</data>
<data name="ToolStripSeparator9.Size" type="System.Drawing.Size, System.Drawing">
- <value>186, 6</value>
+ <value>165, 6</value>
</data>
<data name="SaveLogMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>189, 22</value>
+ <value>168, 22</value>
</data>
<data name="SaveLogMenuItem.Text" xml:space="preserve">
<value>ファイル保存(&S)...</value>
</data>
<data name="ToolStripSeparator17.Size" type="System.Drawing.Size, System.Drawing">
- <value>186, 6</value>
+ <value>165, 6</value>
</data>
<data name="NewPostPopMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>189, 22</value>
+ <value>168, 22</value>
</data>
<data name="NewPostPopMenuItem.Text" xml:space="preserve">
<value>新着通知(&Q)</value>
</data>
<data name="PlaySoundMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>189, 22</value>
+ <value>168, 22</value>
</data>
<data name="PlaySoundMenuItem.Text" xml:space="preserve">
<value>サウンド再生(&P)</value>
</data>
<data name="ListLockMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>189, 22</value>
+ <value>168, 22</value>
</data>
<data name="ListLockMenuItem.Text" xml:space="preserve">
<value>新着時リスト固定(&L)</value>
</data>
<data name="ToolStripSeparator15.Size" type="System.Drawing.Size, System.Drawing">
- <value>186, 6</value>
+ <value>165, 6</value>
</data>
<data name="EndToolStripMenuItem.ShowShortcutKeys" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="EndToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
- <value>189, 22</value>
+ <value>168, 22</value>
</data>
<data name="EndToolStripMenuItem.Text" xml:space="preserve">
<value>終了(&X)</value>
</data>
<data name="ContextMenuFile.Size" type="System.Drawing.Size, System.Drawing">
- <value>190, 154</value>
+ <value>169, 154</value>
</data>
<data name=">>ContextMenuFile.Name" xml:space="preserve">
<value>ContextMenuFile</value>
Private _clInputBackcolor As Color '入力欄背景色
Private _clInputFont As Color '入力欄文字色
Private _fntInputFont As Font '入力欄フォント
- Private TIconDic As Dictionary(Of String, Image) '発言詳細部用アイコン画像リスト
- Private TIconSmallList As ImageList 'リスト表示用アイコン画像リスト
+ Private TIconDic As IDictionary(Of String, Image) 'アイコン画像リスト
Private NIconAt As Icon 'At.ico タスクトレイアイコン:通常時
Private NIconAtRed As Icon 'AtRed.ico タスクトレイアイコン:通信エラー時
Private NIconAtSmoke As Icon 'AtSmoke.ico タスクトレイアイコン:オフライン時
Next
TIconDic.Clear()
End If
- If TIconSmallList IsNot Nothing Then TIconSmallList.Dispose()
+ DirectCast(TIconDic, IDisposable).Dispose()
If NIconAt IsNot Nothing Then NIconAt.Dispose()
If NIconAtRed IsNot Nothing Then NIconAtRed.Dispose()
If NIconAtSmoke IsNot Nothing Then NIconAtSmoke.Dispose()
If _iconSz = 0 Then
sz = 16
End If
- TIconSmallList = New ImageList
- TIconSmallList.ImageSize = New Size(sz, sz)
- TIconSmallList.ColorDepth = ColorDepth.Depth32Bit
- '発言詳細部のアイコンリスト作成
- TIconDic = New Dictionary(Of String, Image)
- tw.ListIcon = TIconSmallList
+ 'アイコンリスト作成
+ TIconDic = New ImageCacheDictionary(3000)
+
tw.DetailIcon = TIconDic
StatusLabel.Text = My.Resources.Form1_LoadText1 '画面右下の状態表示を変更
AddHandler _listCustom.DrawColumnHeader, AddressOf MyList_DrawColumnHeader
AddHandler _listCustom.DragDrop, AddressOf TweenMain_DragDrop
AddHandler _listCustom.DragOver, AddressOf TweenMain_DragOver
-
- Select Case _iconSz
- Case 26, 48
- AddHandler _listCustom.DrawItem, AddressOf MyList_DrawItem
- Case Else
- AddHandler _listCustom.DrawItem, AddressOf MyList_DrawItemDefault
- End Select
-
+ AddHandler _listCustom.DrawItem, AddressOf MyList_DrawItem
AddHandler _listCustom.MouseClick, AddressOf MyList_MouseClick
AddHandler _listCustom.ColumnReordered, AddressOf MyList_ColumnReordered
AddHandler _listCustom.ColumnWidthChanged, AddressOf MyList_ColumnWidthChanged
TabDialog.AddTab(tabName)
End If
- _listCustom.SmallImageList = TIconSmallList
+ _listCustom.SmallImageList = New ImageList()
+ If _iconSz > 0 Then
+ _listCustom.SmallImageList.ImageSize = New Size(_iconSz, _iconSz)
+ End If
+
Dim dispOrder(7) As Integer
If Not startup Then
For i As Integer = 0 To _curList.Columns.Count - 1
RemoveHandler _listCustom.DrawColumnHeader, AddressOf MyList_DrawColumnHeader
RemoveHandler _listCustom.DragDrop, AddressOf TweenMain_DragDrop
RemoveHandler _listCustom.DragOver, AddressOf TweenMain_DragOver
-
- Select Case _iconSz
- Case 26, 48
- RemoveHandler _listCustom.DrawItem, AddressOf MyList_DrawItem
- Case Else
- RemoveHandler _listCustom.DrawItem, AddressOf MyList_DrawItemDefault
- End Select
-
+ RemoveHandler _listCustom.DrawItem, AddressOf MyList_DrawItem
RemoveHandler _listCustom.MouseClick, AddressOf MyList_MouseClick
RemoveHandler _listCustom.ColumnReordered, AddressOf MyList_ColumnReordered
RemoveHandler _listCustom.ColumnWidthChanged, AddressOf MyList_ColumnWidthChanged
Dim itm As ListViewItem
If Post.RetweetedId = 0 Then
Dim sitem() As String = {"", Post.Nickname, Post.Data, Post.PDate.ToString(SettingDialog.DateTimeFormat), Post.Name, "", mk, Post.Source}
- itm = New ListViewItem(sitem, Post.ImageIndex)
+ itm = New ListViewItem(sitem, Post.ImageUrl)
Else
Dim sitem() As String = {"", Post.Nickname, Post.Data, Post.PDate.ToString(SettingDialog.DateTimeFormat), Post.Name + "(RT:" + Post.RetweetedBy + ")", "", mk, Post.Source}
- itm = New ListViewItem(sitem, Post.ImageIndex)
+ itm = New ListViewItem(sitem, Post.ImageUrl)
End If
Dim read As Boolean = Post.IsRead
'未読管理していなかったら既読として扱う
e.DrawDefault = True
End Sub
- Private Sub MyList_DrawItemDefault(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawListViewItemEventArgs)
- e.DrawDefault = True
- End Sub
-
Private Sub MyList_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawListViewItemEventArgs)
- 'アイコンサイズ26,48はオーナードロー(DrawSubItem発生させる)
If e.State = 0 Then Exit Sub
e.DrawDefault = False
If Not e.Item.Selected Then 'e.ItemStateでうまく判定できない???
rct.Width = e.Header.Width
rctB.Width = e.Header.Width
If _iconCol Then rct.Height = e.Item.Font.Height
+
+ If _iconSz = 16 Then
+ rct.Inflate(0, (rct.Height - e.Item.Font.Height) / -2)
+ End If
'アイコン以外の列
If Not e.Item.Selected Then 'e.ItemStateでうまく判定できない???
'選択されていない行
e.Graphics.DrawString(System.Environment.NewLine + e.Item.SubItems(2).Text, e.Item.Font, brs, rctB, sf)
e.Graphics.DrawString(e.Item.SubItems(4).Text + " / " + e.Item.SubItems(1).Text + " (" + e.Item.SubItems(3).Text + ") " + e.Item.SubItems(5).Text + e.Item.SubItems(6).Text + " [" + e.Item.SubItems(7).Text + "]", fnt, brs, rct, sf)
fnt.Dispose()
+ ElseIf _iconSz = 16 Then
+ e.Graphics.DrawString(e.SubItem.Text.Replace(Environment.NewLine, " "), e.Item.Font, brs, rct, sf)
Else
e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, brs, rct, sf)
End If
If _iconCol Then
e.Graphics.DrawString(System.Environment.NewLine + e.Item.SubItems(2).Text, e.Item.Font, _brsHighLightText, rctB, sf)
e.Graphics.DrawString(e.Item.SubItems(4).Text + " / " + e.Item.SubItems(1).Text + " (" + e.Item.SubItems(3).Text + ") " + e.Item.SubItems(5).Text + e.Item.SubItems(6).Text + " [" + e.Item.SubItems(7).Text + "]", fnt, _brsHighLightText, rct, sf)
+ ElseIf _iconSz = 16 Then
+ e.Graphics.DrawString(e.SubItem.Text.Replace(Environment.NewLine, " "), e.Item.Font, _brsHighLightText, rct, sf)
Else
e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, _brsHighLightText, rct, sf)
End If
If _iconCol Then
e.Graphics.DrawString(System.Environment.NewLine + e.Item.SubItems(2).Text, e.Item.Font, _brsForeColorUnread, rctB, sf)
e.Graphics.DrawString(e.Item.SubItems(4).Text + " / " + e.Item.SubItems(1).Text + " (" + e.Item.SubItems(3).Text + ") " + e.Item.SubItems(5).Text + e.Item.SubItems(6).Text + " [" + e.Item.SubItems(7).Text + "]", fnt, _brsForeColorUnread, rct, sf)
+ ElseIf _iconSz = 16 Then
+ e.Graphics.DrawString(e.SubItem.Text.Replace(Environment.NewLine, " "), e.Item.Font, _brsForeColorUnread, rct, sf)
Else
e.Graphics.DrawString(e.SubItem.Text, e.Item.Font, _brsForeColorUnread, rct, sf)
End If
End If
End If
Else
- 'アイコン列はデフォルト描画
- e.DrawDefault = True
+ If _iconSz > 0 Then
+ If Not String.IsNullOrEmpty(e.Item.ImageKey) Then
+ 'e.Bounds.Leftが常に0を指すから自前で計算
+ Dim x As Integer = 0
+ For Each columns As ColumnHeader In e.Item.ListView.Columns
+ If columns.DisplayIndex < e.Header.DisplayIndex Then
+ x += columns.Width
+ End If
+ Next
+ e.Graphics.DrawImage(tw.DetailIcon(e.Item.ImageKey), New Rectangle(x, e.Bounds.Top, Math.Min(_iconSz, e.Bounds.Width), _iconSz))
+ End If
+ End If
End If
End Sub
If Not String.IsNullOrEmpty(_curPost.RetweetedBy) Then
NameLabel.Text += " (RT:" + _curPost.RetweetedBy + ")"
End If
- If _curPost.ImageIndex > -1 Then
+ If _curPost.ImageUrl IsNot Nothing Then
UserPicture.Image = TIconDic(_curPost.ImageUrl)
Else
UserPicture.Image = Nothing
sb.AppendFormat("Data : {0}<br>", _curPost.Data)
sb.AppendFormat("(PlainText) : <xmp>{0}</xmp><br>", _curPost.Data)
sb.AppendFormat("Id : {0}<br>", _curPost.Id.ToString)
- sb.AppendFormat("ImageIndex : {0}<br>", _curPost.ImageIndex.ToString)
+ 'sb.AppendFormat("ImageIndex : {0}<br>", _curPost.ImageIndex.ToString)
sb.AppendFormat("ImageUrl : {0}<br>", _curPost.ImageUrl)
sb.AppendFormat("InReplyToId : {0}<br>", _curPost.InReplyToId.ToString)
sb.AppendFormat("InReplyToUser : {0}<br>", _curPost.InReplyToUser)
<SubType>Form</SubType>
</Compile>
<Compile Include="HookGlobalHotkey.vb" />
+ <Compile Include="ImageCacheDictionary.vb" />
<Compile Include="InputTabName.Designer.vb">
<DependentUpon>InputTabName.vb</DependentUpon>
</Compile>
Private _uid As String
Private _iconSz As Integer
Private _getIcon As Boolean
- Private _lIcon As ImageList
- Private _dIcon As Dictionary(Of String, Image)
+ Private _dIcon As IDictionary(Of String, Image)
Private _tinyUrlResolve As Boolean
Private _restrictFavCheck As Boolean
Private Sub GetIconImage(ByVal post As PostClass)
Dim img As Image
- Dim bmp2 As Bitmap
Try
If Not _getIcon Then
- post.ImageIndex = -1
+ post.ImageUrl = Nothing
TabInformations.GetInstance.AddPost(post)
Exit Sub
End If
- SyncLock LockObj
- post.ImageIndex = _lIcon.Images.IndexOfKey(post.ImageUrl)
- End SyncLock
-
- If post.ImageIndex > -1 Then
+ If _dIcon.ContainsKey(post.ImageUrl) Then
TabInformations.GetInstance.AddPost(post)
Exit Sub
End If
Dim httpVar As New HttpVarious
img = httpVar.GetImage(post.ImageUrl, 10000)
If img Is Nothing Then
- post.ImageIndex = -1
+ post.ImageUrl = Nothing
TabInformations.GetInstance.AddPost(post)
Exit Sub
End If
If _endingFlag Then Exit Sub
SyncLock LockObj
- post.ImageIndex = _lIcon.Images.IndexOfKey(post.ImageUrl)
- If post.ImageIndex = -1 Then
+ If Not _dIcon.ContainsKey(post.ImageUrl) Then
Try
- bmp2 = New Bitmap(_iconSz, _iconSz)
- Using g As Graphics = Graphics.FromImage(bmp2)
- g.InterpolationMode = Drawing2D.InterpolationMode.High
- g.DrawImage(img, 0, 0, _iconSz, _iconSz)
- g.Dispose()
- End Using
-
_dIcon.Add(post.ImageUrl, img)
- _lIcon.Images.Add(post.ImageUrl, bmp2)
- post.ImageIndex = _lIcon.Images.IndexOfKey(post.ImageUrl)
Catch ex As InvalidOperationException
'タイミングにより追加できない場合がある?(キー重複ではない)
- post.ImageIndex = -1
+ post.ImageUrl = Nothing
Catch ex As System.OverflowException
'不正なアイコン?DrawImageに失敗する場合あり
- post.ImageIndex = -1
+ post.ImageUrl = Nothing
Catch ex As OutOfMemoryException
'DrawImageで発生
- post.ImageIndex = -1
+ post.ImageUrl = Nothing
End Try
End If
End SyncLock
'タイミングによってはキー重複
Finally
img = Nothing
- bmp2 = Nothing
post = Nothing
End Try
End Sub
End Function
#End Region
- Public WriteOnly Property ListIcon() As ImageList
- Set(ByVal value As ImageList)
- _lIcon = value
- End Set
- End Property
-
- Public WriteOnly Property DetailIcon() As Dictionary(Of String, Image)
- Set(ByVal value As Dictionary(Of String, Image))
+ Public Property DetailIcon() As IDictionary(Of String, Image)
+ Get
+ Return _dIcon
+ End Get
+ Set(ByVal value As IDictionary(Of String, Image))
_dIcon = value
End Set
End Property