OSDN Git Service

アイコンを一時ファイルにキャッシュしてメモリ使用量を抑えるよう修正
authoranis774 <anis774@users.sourceforge.jp>
Mon, 6 Sep 2010 11:07:23 +0000 (11:07 +0000)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sat, 18 Feb 2012 14:15:12 +0000 (23:15 +0900)
git-svn-id: http://svn.sourceforge.jp/svnroot/tween/trunk@810 e39ad16e-3079-482e-bb30-4b4d378143b6

Tween/ImageCacheDictionary.vb [new file with mode: 0644]
Tween/StatusDictionary.vb
Tween/Tween.resx
Tween/Tween.vb
Tween/Tween.vbproj
Tween/Twitter.vb

diff --git a/Tween/ImageCacheDictionary.vb b/Tween/ImageCacheDictionary.vb
new file mode 100644 (file)
index 0000000..06cd8a2
--- /dev/null
@@ -0,0 +1,161 @@
+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
index 1ded5b2..34e3d4f 100644 (file)
@@ -48,7 +48,6 @@ Public NotInheritable Class PostClass
     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
@@ -85,7 +84,6 @@ Public NotInheritable Class PostClass
             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, _
@@ -110,7 +108,6 @@ Public NotInheritable Class PostClass
         _Source = Source
         _ReplyToList = ReplyToList
         _IsMe = IsMe
-        _ImageIndex = ImageIndex
         _IsDm = IsDm
         _Uid = Uid
         _FilterHit = FilterHit
@@ -295,14 +292,6 @@ Public NotInheritable Class PostClass
             _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
@@ -955,7 +944,6 @@ Public NotInheritable Class TabInformations
                         item.Source, _
                         item.ReplyToList, _
                         item.IsMe, _
-                        item.ImageIndex, _
                         item.IsDm, _
                         item.Uid, _
                         item.FilterHit, _
index 5a1d05d..6edf1d5 100644 (file)
     <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>発言欄複数行入力(&amp;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>投稿画像選択(&amp;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="&gt;&gt;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>タブ作成(&amp;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>タブ名の変更(&amp;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>未読管理(&amp;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>新着通知表示(&amp;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>振り分けルール編集(&amp;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>このタブの発言をクリア(&amp;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>タブ削除(&amp;D)</value>
   </data>
   <data name="ContextMenuTabProperty.Size" type="System.Drawing.Size, System.Drawing">
-    <value>227, 212</value>
+    <value>189, 206</value>
   </data>
   <data name="&gt;&gt;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>フォローする(&amp;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>フォロー解除(&amp;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>相互フォロー状態表示(&amp;H)</value>
     <value>リスト管理(&amp;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>プロフィール表示(&amp;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>このユーザーの発言を検索(&amp;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>保存(&amp;I)...</value>
     <value>ハッシュタグを固定(&amp;H)</value>
   </data>
   <data name="ContextMenuPostBrowser.Size" type="System.Drawing.Size, System.Drawing">
-    <value>211, 342</value>
+    <value>211, 320</value>
   </data>
   <data name="&gt;&gt;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>@返信(&amp;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(&amp;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送信(&amp;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&amp;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&amp;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>&amp;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追加(&amp;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削除(&amp;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した人のホームを開く(&amp;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>開く(&amp;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>振り分けルール作成(&amp;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>リスト管理(&amp;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>未読状態変更(&amp;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>未読へジャンプ(&amp;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>全て選択(&amp;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>削除(&amp;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>更新(&amp;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>前データを取得(&amp;I)</value>
   </data>
   <data name="ContextMenuOperate.Size" type="System.Drawing.Size, System.Drawing">
-    <value>203, 418</value>
+    <value>183, 418</value>
   </data>
   <data name="&gt;&gt;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>設定(&amp;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>ファイル保存(&amp;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>新着通知(&amp;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>サウンド再生(&amp;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>新着時リスト固定(&amp;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>終了(&amp;X)</value>
   </data>
   <data name="ContextMenuFile.Size" type="System.Drawing.Size, System.Drawing">
-    <value>190, 154</value>
+    <value>169, 154</value>
   </data>
   <data name="&gt;&gt;ContextMenuFile.Name" xml:space="preserve">
     <value>ContextMenuFile</value>
index 0d3a8a1..35c36d7 100644 (file)
@@ -119,8 +119,7 @@ Public Class TweenMain
     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        タスクトレイアイコン:オフライン時
@@ -326,7 +325,7 @@ Public Class TweenMain
             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()
@@ -986,13 +985,10 @@ Public Class TweenMain
         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       '画面右下の状態表示を変更
@@ -3227,14 +3223,7 @@ Public Class TweenMain
         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
@@ -3265,7 +3254,11 @@ Public Class TweenMain
             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
@@ -3392,14 +3385,7 @@ Public Class TweenMain
         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
@@ -3709,10 +3695,10 @@ Public Class TweenMain
         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
         '未読管理していなかったら既読として扱う
@@ -3727,12 +3713,7 @@ Public Class TweenMain
         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でうまく判定できない???
@@ -3773,6 +3754,10 @@ Public Class TweenMain
             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でうまく判定できない???
                 '選択されていない行
@@ -3800,6 +3785,8 @@ Public Class TweenMain
                         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
@@ -3813,6 +3800,8 @@ Public Class TweenMain
                         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
@@ -3820,6 +3809,8 @@ Public Class TweenMain
                         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
@@ -3828,8 +3819,18 @@ Public Class TweenMain
                 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
 
@@ -4200,7 +4201,7 @@ RETRY:
         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
@@ -4219,7 +4220,7 @@ RETRY:
             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)
index 679fd6c..3fa093d 100644 (file)
       <SubType>Form</SubType>
     </Compile>
     <Compile Include="HookGlobalHotkey.vb" />
+    <Compile Include="ImageCacheDictionary.vb" />
     <Compile Include="InputTabName.Designer.vb">
       <DependentUpon>InputTabName.vb</DependentUpon>
     </Compile>
index 16a2b48..3c14847 100644 (file)
@@ -52,8 +52,7 @@ Public Class Twitter
     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
@@ -234,20 +233,15 @@ Public Class Twitter
 
     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
@@ -255,7 +249,7 @@ Public Class Twitter
             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
@@ -263,28 +257,18 @@ Public Class Twitter
             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
@@ -293,7 +277,6 @@ Public Class Twitter
             'タイミングによってはキー重複
         Finally
             img = Nothing
-            bmp2 = Nothing
             post = Nothing
         End Try
     End Sub
@@ -1282,14 +1265,11 @@ Public Class Twitter
     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