OSDN Git Service

HttpConnectionでcontentlengthが不正な場合があるので参照しないように変更。
authorkiri_feather <kiri_feather@users.sourceforge.jp>
Tue, 23 Mar 2010 18:08:26 +0000 (18:08 +0000)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sat, 18 Feb 2012 14:11:19 +0000 (23:11 +0900)
HttpConnectionでパラメータ指定ないときは、クエリを操作しないように変更
基数変換クラスRadixConvert追加
プレビュー領域の区切り位置を設定ファイルに追加
プレビュー領域の保存・復元を追加
プレビュー画像がないときは、プレビュー領域を折りたたむように
プレビュー対応サービスの拡充
URL展開の対象にbkite.comを追加

git-svn-id: http://svn.sourceforge.jp/svnroot/tween/trunk@140 e39ad16e-3079-482e-bb30-4b4d378143b6

Tween/Connection/HttpConnection.vb
Tween/RadixConvert.vb [new file with mode: 0644]
Tween/Setting/SettingLocal.vb
Tween/Tween.Designer.vb
Tween/Tween.resx
Tween/Tween.vb
Tween/Tween.vbproj
Tween/Twitter.vb

index 683ab6d..f557704 100644 (file)
@@ -60,7 +60,7 @@ Public Class HttpConnection
 
         'GETメソッドの場合はクエリとurlを結合
         Dim ub As New UriBuilder(requestUri.AbsoluteUri)
-        If method = "GET" OrElse method = "DELETE" OrElse method = "HEAD" Then
+        If param IsNot Nothing AndAlso (method = "GET" OrElse method = "DELETE" OrElse method = "HEAD") Then
             ub.Query = CreateQueryString(param)
         End If
 
@@ -233,7 +233,8 @@ Public Class HttpConnection
                 'リダイレクト応答の場合は、リダイレクト先を設定
                 GetHeaderInfo(webRes, headerInfo)
                 '応答のストリームをBitmapにして戻す
-                If webRes.ContentLength > 0 Then contentBitmap = New Bitmap(webRes.GetResponseStream)
+                'If webRes.ContentLength > 0 Then contentBitmap = New Bitmap(webRes.GetResponseStream)
+                contentBitmap = New Bitmap(webRes.GetResponseStream)
                 Return statusCode
             End Using
         Catch ex As WebException
diff --git a/Tween/RadixConvert.vb b/Tween/RadixConvert.vb
new file mode 100644 (file)
index 0000000..d0d07bf
--- /dev/null
@@ -0,0 +1,441 @@
+Imports System
+Imports System.Text
+
+
+Public Class RadixConvert
+
+    ''' <summary>
+    ''' \83C\83\93\83X\83^\83\93\83X\89»\82ð\8bÖ\8e~\82µ\82Ä\82¢\82Ü\82·\81B
+    ''' </summary>
+    Private Sub New()
+
+    End Sub
+
+#Region "Int16\8c^\82¨\82æ\82ÑUInt16\8c^\97p\82Ì\83\81\83\\83b\83h\8cQ"
+
+    ''' <summary>
+    ''' 3\81`36\90i\90\94\82Ì\90\94\92l\95\8e\9a\97ñ\82ðInt16\8c^\82Ì\90\94\92l\82É\95Ï\8a·\82µ\82Ü\82·\81B
+    ''' </summary>
+    ''' <remarks>
+    ''' \81¦2\81^8\81^10\81^16\90i\90\94\82Í\81AConvert.ToInt16\83\81\83\\83b\83h\82ð\8eg\82Á\82Ä\82­\82¾\82³\82¢\81B
+    ''' \81¦\81{\82â\81|\82Ì\95\84\8d\86\82â0x\82È\82Ç\82Ì\83v\83\8c\83t\83B\83b\83N\83X\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B
+    ''' \81¦\88ø\90\94\82Æ\82È\82é\90\94\92l\95\8e\9a\97ñ\82É\81A\83X\83y\81[\83X\82È\82Ç\82Ì\95\8e\9a\82ð\8aÜ\82ß\82È\82¢\82Å\82­\82¾\82³\82¢\81B
+    ''' </remarks>
+    ''' <param name="s">\90\94\92l\95\8e\9a\97ñ</param>
+    ''' <param name="radix">\8aî\90\94</param>
+    ''' <returns>\90\94\92l</returns>
+    Public Shared Function ToInt16(ByVal s As String, ByVal radix As Integer) As Short
+
+        Dim digit As ULong = ToUInt64(s, radix)
+        CheckDigitOverflow(digit, Int16.MaxValue)
+        Return CType(digit, Short)
+
+    End Function
+
+    ''' <summary>
+    ''' 3\81`36\90i\90\94\82Ì\90\94\92l\95\8e\9a\97ñ\82ðUInt16\8c^\82Ì\90\94\92l\82É\95Ï\8a·\82µ\82Ü\82·\81B
+    ''' </summary>
+    ''' <remarks>
+    ''' \81¦2\81^8\81^10\81^16\90i\90\94\82Í\81AConvert.ToUInt16\83\81\83\\83b\83h\82ð\8eg\82Á\82Ä\82­\82¾\82³\82¢\81B
+    ''' \81¦\81{\82â\81|\82Ì\95\84\8d\86\82â0x\82È\82Ç\82Ì\83v\83\8c\83t\83B\83b\83N\83X\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B
+    ''' \81¦\88ø\90\94\82Æ\82È\82é\90\94\92l\95\8e\9a\97ñ\82É\81A\83X\83y\81[\83X\82È\82Ç\82Ì\95\8e\9a\82ð\8aÜ\82ß\82È\82¢\82Å\82­\82¾\82³\82¢\81B
+    ''' </remarks>
+    ''' <param name="s">\90\94\92l\95\8e\9a\97ñ</param>
+    ''' <param name="radix">\8aî\90\94</param>
+    ''' <returns>\90\94\92l</returns>
+    Public Shared Function ToUInt16(ByVal s As String, ByVal radix As Integer) As UShort
+
+        Dim digit As ULong = ToUInt64(s, radix)
+        CheckDigitOverflow(digit, UInt16.MaxValue)
+        Return CType(digit, UShort)
+
+    End Function
+
+    ''' <summary>
+    ''' UInt16\8c^\82Ì\90\94\92l\82ð3\81`36\90i\90\94\82Ì\90\94\92l\95\8e\9a\97ñ\82É\95Ï\8a·\82µ\82Ü\82·\81B
+    ''' </summary>
+    ''' <remarks>
+    ''' \81¦2\81^8\81^10\81^16\90i\90\94\82Í\81AConvert.ToString\83\81\83\\83b\83h\82ð\8eg\82Á\82Ä\82­\82¾\82³\82¢\81B
+    ''' \81¦\81|\95\84\8d\86\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B
+    ''' </remarks>
+    ''' <param name="n">\90\94\92l</param>
+    ''' <param name="radix">\8aî\90\94</param>
+    ''' <param name="uppercase">\91å\95\8e\9a\82©\81itrue\81j\81A\8f¬\95\8e\9a\82©\81ifalse\81j</param>
+    ''' <returns>\90\94\92l\95\8e\9a\97ñ</returns>
+    Public Overloads Shared Function ToString(ByVal n As Short, ByVal radix As Integer, ByVal uppercase As Boolean) As String
+
+        Return ToString(CType(n, ULong), radix, uppercase)
+
+    End Function
+
+    ''' <summary>
+    ''' UInt16\8c^\82Ì\90\94\92l\82ð3\81`36\90i\90\94\82Ì\90\94\92l\95\8e\9a\97ñ\82É\95Ï\8a·\82µ\82Ü\82·\81B
+    ''' </summary>
+    ''' <remarks>
+    ''' \81¦2\81^8\81^10\81^16\90i\90\94\82Í\81AConvert.ToString\83\81\83\\83b\83h\82ð\8eg\82Á\82Ä\82­\82¾\82³\82¢\81B
+    ''' \81¦\81|\95\84\8d\86\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B
+    ''' </remarks>
+    ''' <param name="n">\90\94\92l</param>
+    ''' <param name="radix">\8aî\90\94</param>
+    ''' <param name="uppercase">\91å\95\8e\9a\82©\81itrue\81j\81A\8f¬\95\8e\9a\82©\81ifalse\81j</param>
+    ''' <returns>\90\94\92l\95\8e\9a\97ñ</returns>
+    Public Overloads Shared Function ToString(ByVal n As UShort, ByVal radix As Integer, ByVal uppercase As Boolean) As String
+
+        Return ToString(CType(n, ULong), radix, uppercase)
+
+    End Function
+
+#End Region
+
+#Region "Int32\8c^\82¨\82æ\82ÑUInt32\8c^\97p\82Ì\83\81\83\\83b\83h\8cQ"
+
+    ''' <summary>
+    ''' 3\81`36\90i\90\94\82Ì\90\94\92l\95\8e\9a\97ñ\82ðInt32\8c^\82Ì\90\94\92l\82É\95Ï\8a·\82µ\82Ü\82·\81B
+    ''' </summary>
+    ''' <remarks>
+    ''' \81¦2\81^8\81^10\81^16\90i\90\94\82Í\81AConvert.ToInt32\83\81\83\\83b\83h\82ð\8eg\82Á\82Ä\82­\82¾\82³\82¢\81B
+    ''' \81¦\81{\82â\81|\82Ì\95\84\8d\86\82â0x\82È\82Ç\82Ì\83v\83\8c\83t\83B\83b\83N\83X\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B
+    ''' \81¦\88ø\90\94\82Æ\82È\82é\90\94\92l\95\8e\9a\97ñ\82É\81A\83X\83y\81[\83X\82È\82Ç\82Ì\95\8e\9a\82ð\8aÜ\82ß\82È\82¢\82Å\82­\82¾\82³\82¢\81B
+    ''' </remarks>
+    ''' <param name="s">\90\94\92l\95\8e\9a\97ñ</param>
+    ''' <param name="radix">\8aî\90\94</param>
+    ''' <returns>\90\94\92l</returns>
+    Public Shared Function ToInt32(ByVal s As String, ByVal radix As Integer) As Integer
+
+        Dim digit As ULong = ToUInt64(s, radix)
+        CheckDigitOverflow(digit, Int32.MaxValue)
+        Return CType(digit, Integer)
+
+    End Function
+
+    ''' <summary>
+    ''' 3\81`36\90i\90\94\82Ì\90\94\92l\95\8e\9a\97ñ\82ðUInt32\8c^\82Ì\90\94\92l\82É\95Ï\8a·\82µ\82Ü\82·\81B
+    ''' </summary>
+    ''' <remarks>
+    ''' \81¦2\81^8\81^10\81^16\90i\90\94\82Í\81AConvert.ToUInt32\83\81\83\\83b\83h\82ð\8eg\82Á\82Ä\82­\82¾\82³\82¢\81B
+    ''' \81¦\81{\82â\81|\82Ì\95\84\8d\86\82â0x\82È\82Ç\82Ì\83v\83\8c\83t\83B\83b\83N\83X\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B
+    ''' \81¦\88ø\90\94\82Æ\82È\82é\90\94\92l\95\8e\9a\97ñ\82É\81A\83X\83y\81[\83X\82È\82Ç\82Ì\95\8e\9a\82ð\8aÜ\82ß\82È\82¢\82Å\82­\82¾\82³\82¢\81B
+    ''' </remarks>
+    ''' <param name="s">\90\94\92l\95\8e\9a\97ñ</param>
+    ''' <param name="radix">\8aî\90\94</param>
+    ''' <returns>\90\94\92l</returns>
+    Public Shared Function ToUInt32(ByVal s As String, ByVal radix As Integer) As UInteger
+
+        Dim digit As ULong = ToUInt64(s, radix)
+        CheckDigitOverflow(digit, UInt32.MaxValue)
+        Return CType(digit, UInteger)
+
+    End Function
+
+    ''' <summary>
+    ''' UInt32\8c^\82Ì\90\94\92l\82ð3\81`36\90i\90\94\82Ì\90\94\92l\95\8e\9a\97ñ\82É\95Ï\8a·\82µ\82Ü\82·\81B
+    ''' </summary>
+    ''' <remarks>
+    ''' \81¦2\81^8\81^10\81^16\90i\90\94\82Í\81AConvert.ToString\83\81\83\\83b\83h\82ð\8eg\82Á\82Ä\82­\82¾\82³\82¢\81B
+    ''' \81¦\81|\95\84\8d\86\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B
+    ''' </remarks>
+    ''' <param name="n">\90\94\92l</param>
+    ''' <param name="radix">\8aî\90\94</param>
+    ''' <param name="uppercase">\91å\95\8e\9a\82©\81itrue\81j\81A\8f¬\95\8e\9a\82©\81ifalse\81j</param>
+    ''' <returns>\90\94\92l\95\8e\9a\97ñ</returns>
+    Public Overloads Shared Function ToString(ByVal n As Integer, ByVal radix As Integer, ByVal uppercase As Boolean) As String
+
+        Return ToString(CType(n, ULong), radix, uppercase)
+
+    End Function
+
+    ''' <summary>
+    ''' UInt32\8c^\82Ì\90\94\92l\82ð3\81`36\90i\90\94\82Ì\90\94\92l\95\8e\9a\97ñ\82É\95Ï\8a·\82µ\82Ü\82·\81B
+    ''' </summary>
+    ''' <remarks>
+    ''' \81¦2\81^8\81^10\81^16\90i\90\94\82Í\81AConvert.ToString\83\81\83\\83b\83h\82ð\8eg\82Á\82Ä\82­\82¾\82³\82¢\81B
+    ''' \81¦\81|\95\84\8d\86\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B
+    ''' </remarks>
+    ''' <param name="n">\90\94\92l</param>
+    ''' <param name="radix">\8aî\90\94</param>
+    ''' <param name="uppercase">\91å\95\8e\9a\82©\81itrue\81j\81A\8f¬\95\8e\9a\82©\81ifalse\81j</param>
+    ''' <returns>\90\94\92l\95\8e\9a\97ñ</returns>
+    Public Overloads Shared Function ToString(ByVal n As UInteger, ByVal radix As Integer, ByVal uppercase As Boolean) As String
+
+        Return ToString(CType(n, ULong), radix, uppercase)
+
+    End Function
+
+#End Region
+
+#Region "Int64\8c^\82¨\82æ\82ÑUInt64\8c^\97p\82Ì\83\81\83\\83b\83h\8cQ"
+
+    ''' <summary>
+    ''' 3\81`36\90i\90\94\82Ì\90\94\92l\95\8e\9a\97ñ\82ðInt64\8c^\82Ì\90\94\92l\82É\95Ï\8a·\82µ\82Ü\82·\81B
+    ''' </summary>
+    ''' <remarks>
+    ''' \81¦2\81^8\81^10\81^16\90i\90\94\82Í\81AConvert.ToInt64\83\81\83\\83b\83h\82ð\8eg\82Á\82Ä\82­\82¾\82³\82¢\81B
+    ''' \81¦\81{\82â\81|\82Ì\95\84\8d\86\82â0x\82È\82Ç\82Ì\83v\83\8c\83t\83B\83b\83N\83X\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B
+    ''' \81¦\88ø\90\94\82Æ\82È\82é\90\94\92l\95\8e\9a\97ñ\82É\81A\83X\83y\81[\83X\82È\82Ç\82Ì\95\8e\9a\82ð\8aÜ\82ß\82È\82¢\82Å\82­\82¾\82³\82¢\81B
+    ''' </remarks>
+    ''' <param name="s">\90\94\92l\95\8e\9a\97ñ</param>
+    ''' <param name="radix">\8aî\90\94</param>
+    ''' <returns>\90\94\92l</returns>
+    Public Shared Function ToInt64(ByVal s As String, ByVal radix As Integer) As Long
+
+        Dim digit As ULong = ToUInt64(s, radix)
+        CheckDigitOverflow(digit, Int64.MaxValue)
+        Return CType(digit, Long)
+
+    End Function
+
+    ''' <summary>
+    ''' 3\81`36\90i\90\94\82Ì\90\94\92l\95\8e\9a\97ñ\82ðUInt64\8c^\82Ì\90\94\92l\82É\95Ï\8a·\82µ\82Ü\82·\81B
+    ''' </summary>
+    ''' <remarks>
+    ''' \81¦2\81^8\81^10\81^16\90i\90\94\82Í\81AConvert.ToUInt64\83\81\83\\83b\83h\82ð\8eg\82Á\82Ä\82­\82¾\82³\82¢\81B
+    ''' \81¦\81{\82â\81|\82Ì\95\84\8d\86\82â0x\82È\82Ç\82Ì\83v\83\8c\83t\83B\83b\83N\83X\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B
+    ''' \81¦\88ø\90\94\82Æ\82È\82é\90\94\92l\95\8e\9a\97ñ\82É\81A\83X\83y\81[\83X\82È\82Ç\82Ì\95\8e\9a\82ð\8aÜ\82ß\82È\82¢\82Å\82­\82¾\82³\82¢\81B
+    ''' </remarks>
+    ''' <param name="s">\90\94\92l\95\8e\9a\97ñ</param>
+    ''' <param name="radix">\8aî\90\94</param>
+    ''' <returns>\90\94\92l</returns>
+    Public Shared Function ToUInt64(ByVal s As String, ByVal radix As Integer) As ULong
+
+        ' \88ø\90\94\82ð\83`\83F\83b\83N\82ð\82·\82é
+        CheckNumberArgument(s)
+        CheckRadixArgument(radix)
+
+        Dim curValue As ULong = 0                                       ' \95Ï\8a·\92\86\82Ì\90\94\92l
+        Dim maxValue As ULong = CType(UInt64.MaxValue / CType(radix, ULong), ULong)   ' \8dÅ\91å\92l\82Ì1\82¯\82½\91O\82Ì\90\94\92l
+
+        ' \90\94\92l\95\8e\9a\97ñ\82ð\89ð\90Í\82µ\82Ä\90\94\92l\82É\95Ï\8a·\82·\82é
+        Dim num As Char         ' \8f\88\97\9d\92\86\82Ì1\82¯\82½\82Ì\90\94\92l\95\8e\9a\97ñ
+        Dim digit As Integer    ' \8f\88\97\9d\92\86\82Ì1\82¯\82½\82Ì\90\94\92l
+        Dim length As Integer = s.Length
+        For i As Integer = 0 To length - 1
+            num = s(i)
+            digit = GetDigitFromNumber(num)
+            CheckDigitOutOfRange(digit, radix)
+
+            ' \8e\9f\82Éradix\82ð\8a|\82¯\82é\82Æ\82«\82É\90\94\92l\82ª\83I\81[\83o\81[\83t\83\8d\81[\82µ\82È\82¢\82©\82ð\8e\96\91O\82É\83`\83F\83b\83N\82·\82é
+            CheckDigitOverflow(curValue, maxValue)
+            curValue = curValue * CType(radix, ULong) + CType(digit, ULong)
+        Next
+
+        Return curValue
+
+    End Function
+
+    ''' <summary>
+    ''' UInt64\8c^\82Ì\90\94\92l\82ð3\81`36\90i\90\94\82Ì\90\94\92l\95\8e\9a\97ñ\82É\95Ï\8a·\82µ\82Ü\82·\81B
+    ''' </summary>
+    ''' <remarks>
+    ''' \81¦2\81^8\81^10\81^16\90i\90\94\82Í\81AConvert.ToString\83\81\83\\83b\83h\82ð\8eg\82Á\82Ä\82­\82¾\82³\82¢\81B
+    ''' \81¦\81|\95\84\8d\86\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B
+    ''' </remarks>
+    ''' <param name="n">\90\94\92l</param>
+    ''' <param name="radix">\8aî\90\94</param>
+    ''' <param name="uppercase">\91å\95\8e\9a\82©\81itrue\81j\81A\8f¬\95\8e\9a\82©\81ifalse\81j</param>
+    ''' <returns>\90\94\92l\95\8e\9a\97ñ</returns>
+    Public Overloads Shared Function ToString(ByVal n As Long, ByVal radix As Integer, ByVal uppercase As Boolean) As String
+
+        Return ToString(CType(n, ULong), radix, uppercase)
+
+    End Function
+
+    ''' <summary>
+    ''' UInt64\8c^\82Ì\90\94\92l\82ð3\81`36\90i\90\94\82Ì\90\94\92l\95\8e\9a\97ñ\82É\95Ï\8a·\82µ\82Ü\82·\81B
+    ''' </summary>
+    ''' <remarks>
+    ''' \81¦2\81^8\81^10\81^16\90i\90\94\82Í\81AConvert.ToString\83\81\83\\83b\83h\82ð\8eg\82Á\82Ä\82­\82¾\82³\82¢\81B
+    ''' \81¦\81|\95\84\8d\86\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B
+    ''' </remarks>
+    ''' <param name="n">\90\94\92l</param>
+    ''' <param name="radix">\8aî\90\94</param>
+    ''' <param name="uppercase">\91å\95\8e\9a\82©\81itrue\81j\81A\8f¬\95\8e\9a\82©\81ifalse\81j</param>
+    ''' <returns>\90\94\92l\95\8e\9a\97ñ</returns>
+    Public Overloads Shared Function ToString(ByVal n As ULong, ByVal radix As Integer, ByVal uppercase As Boolean) As String
+
+        ' \88ø\90\94\82ð\83`\83F\83b\83N\82ð\82·\82é
+        CheckRadixArgument(radix)
+
+        ' \90\94\92l\82Ì\81u0\81v\82Í\81A\82Ç\82Ì\90i\90\94\82Å\82à\81u0\81v\82É\82È\82é
+        If n = 0 Then
+            Return "0"
+        End If
+
+        Dim curValue As New StringBuilder(41)   ' \95Ï\8a·\92\86\82Ì\90\94\92l\95\8e\9a\97ñ
+        ' \81¦UInt64.MaxValue\82Ì\90\94\92l\82ð3\90i\90\94\82Å\95\\8c»\82·\82é\82Æ41\82¯\82½\82Å\82·\81B
+        Dim curDigit As ULong = n               ' \96¢\8f\88\97\9d\82Ì\90\94\92l
+
+        ' \90\94\92l\82ð\89ð\90Í\82µ\82Ä\90\94\92l\95\8e\9a\97ñ\82É\95Ï\8a·\82·\82é
+        Dim digit As ULong  ' \8f\88\97\9d\92\86\82Ì1\82¯\82½\82Ì\90\94\92l
+        Do
+            ' \88ê\94Ô\89º\82Ì\82¯\82½\82Ì\90\94\92l\82ð\8eæ\82è\8fo\82·
+            digit = curDigit Mod CType(radix, ULong)
+            ' \8eæ\82è\8fo\82µ\82½1\82¯\82½\82ð\90Ø\82è\8eÌ\82Ä\82é
+            curDigit = CType(curDigit / CType(radix, ULong), ULong)
+
+            curValue.Insert(0, GetNumberFromDigit(CType(digit, Integer), uppercase))
+        Loop While curDigit <> 0
+
+        Return curValue.ToString()
+
+    End Function
+
+#End Region
+
+#Region "Decimal\8c^\97p\82Ì\83\81\83\\83b\83h\8cQ"
+
+    ''' <summary>
+    ''' 3\81`36\90i\90\94\82Ì\90\94\92l\95\8e\9a\97ñ\82ðDecimal\8c^\82Ì\90\94\92l\82É\95Ï\8a·\82µ\82Ü\82·\81B
+    ''' </summary>
+    ''' <remarks>
+    ''' \81¦2\81^8\81^10\81^16\90i\90\94\82Í\81AConvert.ToDecimal\83\81\83\\83b\83h\82ð\8eg\82Á\82Ä\82­\82¾\82³\82¢\81B
+    ''' \81¦\81{\82â\81|\82Ì\95\84\8d\86\82â0x\82È\82Ç\82Ì\83v\83\8c\83t\83B\83b\83N\83X\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B
+    ''' \81¦\88ø\90\94\82Æ\82È\82é\90\94\92l\95\8e\9a\97ñ\82É\81A\83X\83y\81[\83X\82È\82Ç\82Ì\95\8e\9a\82ð\8aÜ\82ß\82È\82¢\82Å\82­\82¾\82³\82¢\81B
+    ''' </remarks>
+    ''' <param name="s">\90\94\92l\95\8e\9a\97ñ</param>
+    ''' <param name="radix">\8aî\90\94</param>
+    ''' <returns>\90\94\92l</returns>
+    Public Shared Function ToDecimal(ByVal s As String, ByVal radix As Integer) As Decimal
+
+        ' \88ø\90\94\82ð\83`\83F\83b\83N\82ð\82·\82é
+        CheckNumberArgument(s)
+        CheckRadixArgument(radix)
+
+        Dim curValue As Decimal = 0                                         ' \95Ï\8a·\92\86\82Ì\90\94\92l
+        Dim maxValue As Decimal = Decimal.MaxValue / CType(radix, Decimal)  ' \8dÅ\91å\92l\82Ì1\82¯\82½\91O\82Ì\90\94\92l
+
+        ' \90\94\92l\95\8e\9a\97ñ\82ð\89ð\90Í\82µ\82Ä\90\94\92l\82É\95Ï\8a·\82·\82é
+        Dim num As Char         ' \8f\88\97\9d\92\86\82Ì1\82¯\82½\82Ì\90\94\92l\95\8e\9a\97ñ
+        Dim digit As Integer    ' \8f\88\97\9d\92\86\82Ì1\82¯\82½\82Ì\90\94\92l
+        Dim length As Integer = s.Length
+        For i As Integer = 0 To length - 1
+            num = s(i)
+            digit = GetDigitFromNumber(num)
+            CheckDigitOutOfRange(digit, radix)
+
+            ' \8e\9f\82Éradix\82ð\8a|\82¯\82é\82Æ\82«\82É\90\94\92l\82ª\83I\81[\83o\81[\83t\83\8d\81[\82µ\82È\82¢\82©\82ð\8e\96\91O\82É\83`\83F\83b\83N\82·\82é
+            CheckDigitOverflow(curValue, maxValue)
+            curValue = curValue * CType(radix, Decimal) + CType(digit, Decimal)
+        Next
+
+        Return curValue
+
+    End Function
+
+    ''' <summary>
+    ''' Decimal\8c^\82Ì\90\94\92l\82ð3\81`36\90i\90\94\82Ì\90\94\92l\95\8e\9a\97ñ\82É\95Ï\8a·\82µ\82Ü\82·\81B
+    ''' </summary>
+    ''' <remarks>
+    ''' \81¦2\81^8\81^10\81^16\90i\90\94\82Í\81AConvert.ToString\83\81\83\\83b\83h\82ð\8eg\82Á\82Ä\82­\82¾\82³\82¢\81B
+    ''' \81¦\81|\95\84\8d\86\82É\82Í\91Î\89\9e\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B
+    ''' </remarks>
+    ''' <param name="n">\90\94\92l</param>
+    ''' <param name="radix">\8aî\90\94</param>
+    ''' <param name="uppercase">\91å\95\8e\9a\82©\81itrue\81j\81A\8f¬\95\8e\9a\82©\81ifalse\81j</param>
+    ''' <returns>\90\94\92l\95\8e\9a\97ñ</returns>
+    Public Overloads Shared Function ToString(ByVal n As Decimal, ByVal radix As Integer, ByVal uppercase As Boolean) As String
+
+        ' \88ø\90\94\82ð\83`\83F\83b\83N\82ð\82·\82é
+        CheckRadixArgument(radix)
+
+        ' \90\94\92l\82Ì\81u0\81v\82Í\81A\82Ç\82Ì\90i\90\94\82Å\82à\81u0\81v\82É\82È\82é
+        If n = 0 Then
+            Return "0"
+        End If
+
+        Dim curValue As New StringBuilder(120)  ' \95Ï\8a·\92\86\82Ì\90\94\92l\95\8e\9a\97ñ
+        ' \81¦Decimal.MaxValue\82Ì\90\94\92l\82ð3\90i\90\94\82Å\95\\8c»\82·\82é\82Æ120\82¯\82½\82Å\82·\81B
+        Dim curDigit As Decimal = n             ' \96¢\8f\88\97\9d\82Ì\90\94\92l
+
+        ' \90\94\92l\82ð\89ð\90Í\82µ\82Ä\90\94\92l\95\8e\9a\97ñ\82É\95Ï\8a·\82·\82é
+        Dim digit As Decimal   ' \8f\88\97\9d\92\86\82Ì1\82¯\82½\82Ì\90\94\92l
+        Do
+            ' \88ê\94Ô\89º\82Ì\82¯\82½\82Ì\90\94\92l\82ð\8eæ\82è\8fo\82·
+            digit = curDigit Mod CType(radix, Decimal)
+            ' \8eæ\82è\8fo\82µ\82½1\82¯\82½\82ð\90Ø\82è\8eÌ\82Ä\82é
+            curDigit = curDigit / CType(radix, Decimal)
+
+            curValue.Insert(0, GetNumberFromDigit(CType(digit, Integer), uppercase))
+        Loop While curDigit <> 0
+
+        Return curValue.ToString()
+
+    End Function
+
+#End Region
+
+#Region "\93à\95\94\82Å\8eg\97p\82µ\82Ä\82¢\82é\83\81\83\\83b\83h\8cQ"
+
+    Private Shared Sub CheckNumberArgument(ByVal s As String)
+
+        If s = Nothing OrElse s = String.Empty Then
+            Throw New ArgumentException("\90\94\92l\95\8e\9a\97ñ\82ª\8ew\92è\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B")
+        End If
+
+    End Sub
+
+    Private Shared Sub CheckRadixArgument(ByVal radix As Integer)
+
+        If radix = 2 OrElse radix = 8 OrElse radix = 10 OrElse radix = 16 Then
+            Throw New ArgumentException("2\81^8\81^10\81^16\90i\90\94\82ÍSystem.Convert\83N\83\89\83X\82ð\8eg\82Á\82Ä\82­\82¾\82³\82¢\81B")
+        End If
+        If radix <= 1 OrElse 36 < radix Then
+            Throw New ArgumentException("3\81`36\90i\90\94\82É\82µ\82©\91Î\89\9e\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B")
+        End If
+
+    End Sub
+
+    Private Shared Sub CheckDigitOutOfRange(ByVal digit As Integer, ByVal radix As Integer)
+
+        If digit < 0 OrElse radix <= digit Then
+            Throw New ArgumentOutOfRangeException("\90\94\92l\82ª\94Í\88Í\8aO\82Å\82·\81B")
+        End If
+
+    End Sub
+
+    Private Shared Sub CheckDigitOverflow(ByVal curValue As ULong, ByVal maxValue As ULong)
+
+        If curValue > maxValue Then
+            Throw New OverflowException("\90\94\92l\82ª\8dÅ\91å\92l\82ð\92´\82¦\82Ü\82µ\82½\81B")
+        End If
+
+    End Sub
+
+    Private Shared Sub CheckDigitOverflow(ByVal curValue As Decimal, ByVal maxValue As Decimal)
+
+        If curValue > maxValue Then
+            Throw New OverflowException("\90\94\92l\82ª\8dÅ\91å\92l\82ð\92´\82¦\82Ü\82µ\82½\81B")
+        End If
+
+    End Sub
+
+    Private Shared Function GetDigitFromNumber(ByVal num As Char) As Integer
+
+        Dim ascNum As Integer = Asc(num)
+        If ascNum >= Asc("0") AndAlso ascNum <= Asc("9") Then
+            Return Asc(num) - Asc("0")
+        ElseIf ascNum >= Asc("A") AndAlso ascNum <= Asc("Z") Then
+            Return ascNum - Asc("A") + 10
+        ElseIf ascNum >= Asc("a") AndAlso ascNum <= Asc("z") Then
+            Return Asc(ascNum.ToString) - Asc("a") + 10
+        Else
+            Return -1
+        End If
+
+    End Function
+
+    Private Shared Function GetNumberFromDigit(ByVal digit As Integer, ByVal uppercase As Boolean) As Char
+
+        If digit < 10 Then
+            Return Chr(Asc("0") + digit)
+        ElseIf uppercase Then
+            Return Chr(Asc("A") + digit - 10)
+        Else
+            Return Chr(Asc("a") + digit - 10)
+        End If
+
+    End Function
+
+#End Region
+
+End Class
+
index 3797449..8f9a16d 100644 (file)
@@ -65,6 +65,7 @@ Public Class SettingLocal
     Public ProxyUser As String = ""
     Public StatusMultiline As Boolean = False
     Public StatusTextHeight As Integer = 38
+    Public PreviewDistance As Integer = 50
 
     <Xml.Serialization.XmlIgnore()> _
     Public FontUnread As New Font(SystemFonts.DefaultFont, FontStyle.Bold Or FontStyle.Underline)
index dd21676..3dcf9d9 100644 (file)
@@ -28,6 +28,7 @@ Partial Class TweenMain
         Me.ToolStripContainer1 = New System.Windows.Forms.ToolStripContainer
         Me.StatusStrip1 = New System.Windows.Forms.StatusStrip
         Me.StatusLabelUrl = New System.Windows.Forms.ToolStripStatusLabel
+        Me.StatusLabel = New Tween.TweenCustomControl.ToolStripLabelHistory
         Me.HashStripSplitButton = New System.Windows.Forms.ToolStripSplitButton
         Me.ContextMenuStripPostMode = New System.Windows.Forms.ContextMenuStrip(Me.components)
         Me.ToolStripMenuItemUrlMultibyteSplit = New System.Windows.Forms.ToolStripMenuItem
@@ -55,7 +56,6 @@ Partial Class TweenMain
         Me.DeleteTabMenuItem = New System.Windows.Forms.ToolStripMenuItem
         Me.TabImage = New System.Windows.Forms.ImageList(Me.components)
         Me.SplitContainer2 = New System.Windows.Forms.SplitContainer
-        Me.DummyTextBox = New System.Windows.Forms.TextBox
         Me.TableLayoutPanel1 = New System.Windows.Forms.TableLayoutPanel
         Me.UserPicture = New System.Windows.Forms.PictureBox
         Me.ContextMenuStrip3 = New System.Windows.Forms.ContextMenuStrip(Me.components)
@@ -87,6 +87,7 @@ Partial Class TweenMain
         Me.UseHashtagMenuItem = New System.Windows.Forms.ToolStripMenuItem
         Me.PreviewPicture = New System.Windows.Forms.PictureBox
         Me.PreviewScrollBar = New System.Windows.Forms.VScrollBar
+        Me.DummyTextBox = New System.Windows.Forms.TextBox
         Me.StatusText = New System.Windows.Forms.TextBox
         Me.lblLen = New System.Windows.Forms.Label
         Me.PostButton = New System.Windows.Forms.Button
@@ -234,7 +235,6 @@ Partial Class TweenMain
         Me.SaveFileDialog1 = New System.Windows.Forms.SaveFileDialog
         Me.TimerRefreshIcon = New System.Windows.Forms.Timer(Me.components)
         Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog
-        Me.StatusLabel = New Tween.TweenCustomControl.ToolStripLabelHistory
         Me.ToolStripContainer1.BottomToolStripPanel.SuspendLayout()
         Me.ToolStripContainer1.ContentPanel.SuspendLayout()
         Me.ToolStripContainer1.TopToolStripPanel.SuspendLayout()
@@ -297,6 +297,14 @@ Partial Class TweenMain
         resources.ApplyResources(Me.StatusLabelUrl, "StatusLabelUrl")
         Me.StatusLabelUrl.Spring = True
         '
+        'StatusLabel
+        '
+        Me.StatusLabel.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right
+        Me.StatusLabel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
+        Me.StatusLabel.DoubleClickEnabled = True
+        Me.StatusLabel.Name = "StatusLabel"
+        resources.ApplyResources(Me.StatusLabel, "StatusLabel")
+        '
         'HashStripSplitButton
         '
         Me.HashStripSplitButton.AutoToolTip = False
@@ -485,11 +493,6 @@ Partial Class TweenMain
         Me.SplitContainer2.Panel2.Controls.Add(Me.PostButton)
         Me.SplitContainer2.TabStop = False
         '
-        'DummyTextBox
-        '
-        resources.ApplyResources(Me.DummyTextBox, "DummyTextBox")
-        Me.DummyTextBox.Name = "DummyTextBox"
-        '
         'TableLayoutPanel1
         '
         resources.ApplyResources(Me.TableLayoutPanel1, "TableLayoutPanel1")
@@ -544,8 +547,10 @@ Partial Class TweenMain
         '
         'SplitContainer3
         '
+        Me.SplitContainer3.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
         Me.TableLayoutPanel1.SetColumnSpan(Me.SplitContainer3, 2)
         resources.ApplyResources(Me.SplitContainer3, "SplitContainer3")
+        Me.SplitContainer3.FixedPanel = System.Windows.Forms.FixedPanel.Panel2
         Me.SplitContainer3.Name = "SplitContainer3"
         '
         'SplitContainer3.Panel1
@@ -679,6 +684,11 @@ Partial Class TweenMain
         Me.PreviewScrollBar.Maximum = 0
         Me.PreviewScrollBar.Name = "PreviewScrollBar"
         '
+        'DummyTextBox
+        '
+        resources.ApplyResources(Me.DummyTextBox, "DummyTextBox")
+        Me.DummyTextBox.Name = "DummyTextBox"
+        '
         'StatusText
         '
         resources.ApplyResources(Me.StatusText, "StatusText")
@@ -1441,14 +1451,6 @@ Partial Class TweenMain
         '
         Me.OpenFileDialog1.FileName = "OpenFileDialog1"
         '
-        'StatusLabel
-        '
-        Me.StatusLabel.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right
-        Me.StatusLabel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
-        Me.StatusLabel.DoubleClickEnabled = True
-        Me.StatusLabel.Name = "StatusLabel"
-        resources.ApplyResources(Me.StatusLabel, "StatusLabel")
-        '
         'TweenMain
         '
         Me.AllowDrop = True
index 6ae6736..f0e00ac 100644 (file)
     <value>0, 0</value>
   </data>
   <data name="PostBrowser.Size" type="System.Drawing.Size, System.Drawing">
-    <value>303, 82</value>
+    <value>299, 78</value>
   </data>
   <data name="PostBrowser.TabIndex" type="System.Int32, mscorlib">
     <value>3</value>
     <value>0, 0</value>
   </data>
   <data name="PreviewPicture.Size" type="System.Drawing.Size, System.Drawing">
-    <value>79, 82</value>
+    <value>75, 78</value>
   </data>
   <data name="PreviewPicture.SizeMode" type="System.Windows.Forms.PictureBoxSizeMode, System.Windows.Forms">
     <value>Zoom</value>
     <value>Off</value>
   </data>
   <data name="PreviewScrollBar.Location" type="System.Drawing.Point, System.Drawing">
-    <value>79, 0</value>
+    <value>75, 0</value>
   </data>
   <data name="PreviewScrollBar.Size" type="System.Drawing.Size, System.Drawing">
-    <value>17, 82</value>
+    <value>17, 78</value>
   </data>
   <data name="PreviewScrollBar.TabIndex" type="System.Int32, mscorlib">
     <value>4</value>
   <data name="&gt;&gt;SplitContainer3.Panel2.ZOrder" xml:space="preserve">
     <value>1</value>
   </data>
+  <data name="SplitContainer3.Panel2MinSize" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
   <data name="SplitContainer3.Size" type="System.Drawing.Size, System.Drawing">
     <value>403, 82</value>
   </data>
   <data name="&gt;&gt;StatusLabelUrl.Type" xml:space="preserve">
     <value>System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
+  <data name="&gt;&gt;StatusLabel.Name" xml:space="preserve">
+    <value>StatusLabel</value>
+  </data>
+  <data name="&gt;&gt;StatusLabel.Type" xml:space="preserve">
+    <value>Tween.TweenCustomControl.ToolStripLabelHistory, Tween, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null</value>
+  </data>
   <data name="&gt;&gt;HashStripSplitButton.Name" xml:space="preserve">
     <value>HashStripSplitButton</value>
   </data>
   <data name="&gt;&gt;OpenFileDialog1.Type" xml:space="preserve">
     <value>System.Windows.Forms.OpenFileDialog, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name="&gt;&gt;StatusLabel.Name" xml:space="preserve">
-    <value>StatusLabel</value>
-  </data>
-  <data name="&gt;&gt;StatusLabel.Type" xml:space="preserve">
-    <value>Tween.TweenCustomControl.ToolStripLabelHistory, Tween, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null</value>
-  </data>
   <data name="&gt;&gt;$this.Name" xml:space="preserve">
     <value>TweenMain</value>
   </data>
index 8b9a306..5b03fa2 100644 (file)
@@ -44,6 +44,7 @@ Public Class TweenMain
     Private _myLoc As Point             '画面位置
     Private _mySpDis As Integer         '区切り位置
     Private _mySpDis2 As Integer        '発言欄区切り位置
+    Private _mySpDis3 As Integer        'プレビュー区切り位置
     Private _iconSz As Integer            'アイコンサイズ(現在は16、24、48の3種類。将来直接数字指定可能とする 注:24x24の場合に26と指定しているのはMSゴシック系フォントのための仕様)
     Private _iconCol As Boolean           '1列表示の時True(48サイズのとき)
 
@@ -841,6 +842,7 @@ Public Class TweenMain
         Me.TopMost = SettingDialog.AlwaysTop
         _mySpDis = _cfgLocal.SplitterDistance
         _mySpDis2 = _cfgLocal.StatusTextHeight
+        _mySpDis3 = _cfgLocal.PreviewDistance
         MultiLineMenuItem.Checked = _cfgLocal.StatusMultiline
         'Me.Tween_ClientSizeChanged(Me, Nothing)
         PlaySoundMenuItem.Checked = SettingDialog.PlaySound
@@ -2483,6 +2485,7 @@ Public Class TweenMain
                 If Me.WindowState = FormWindowState.Normal Then
                     _mySize = Me.ClientSize
                     _mySpDis = Me.SplitContainer1.SplitterDistance
+                    _mySpDis3 = Me.SplitContainer3.SplitterDistance
                     If StatusText.Multiline Then _mySpDis2 = Me.StatusText.Height
                     modifySettingLocal = True
                 End If
@@ -4244,7 +4247,12 @@ RETRY:
                 If PostBrowser.DocumentText <> dTxt Then
                     PostBrowser.Visible = False
                     PostBrowser.DocumentText = dTxt
-                    thumbnail(_curPost.Id, dTxt)
+                    Dim rg As New Regex("<a target=""_self"" href=""(?<url>http[^""]+)""", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
+                    Dim lnks As New List(Of String)
+                    For Each lnk As Match In rg.Matches(dTxt)
+                        lnks.Add(lnk.Result("${url}"))
+                    Next
+                    thumbnail(_curPost.Id, lnks)
                 End If
             Catch ex As System.Runtime.InteropServices.COMException
                 '原因不明
@@ -5024,6 +5032,7 @@ RETRY:
             _cfgLocal.FormSize = _mySize
             _cfgLocal.FormLocation = _myLoc
             _cfgLocal.SplitterDistance = _mySpDis
+            _cfgLocal.PreviewDistance = _mySpDis3
             _cfgLocal.StatusMultiline = StatusText.Multiline
             _cfgLocal.StatusTextHeight = _mySpDis2
             _cfgLocal.StatusText = SettingDialog.Status
@@ -6304,6 +6313,7 @@ RETRY:
             Else
                 SplitContainer2.SplitterDistance = SplitContainer2.Height - SplitContainer2.Panel2MinSize - SplitContainer2.SplitterWidth
             End If
+            Me.SplitContainer3.SplitterDistance = _cfgLocal.PreviewDistance
             _initialLayout = False
         End If
     End Sub
@@ -7689,27 +7699,6 @@ RETRY:
     End Property
 
 #Region "イメージプレビュー"
-    Private Function chk_url(ByVal dtxt As String) As String()
-        Dim mc As System.Text.RegularExpressions.MatchCollection = _
-    System.Text.RegularExpressions.Regex.Matches( _
-        dtxt, _
-        "<a\s+[^>]*href\s*=\s*(?:(?<quot>[""'])(?<url>.*?)\k<quot>|" + _
-            "(?<url>[^\s>]+))[^>]*>(?<text>.*?)</a>", _
-        System.Text.RegularExpressions.RegexOptions.IgnoreCase Or _
-        System.Text.RegularExpressions.RegexOptions.Singleline)
-
-        If mc.Count = 0 Then Return Nothing
-
-        Dim result As New List(Of String)
-        'Dim re As Regex = New Regex("htt(p|ps)://twitter.com/.*")
-        For Each m As System.Text.RegularExpressions.Match In mc
-            'If re.IsMatch(m.Groups("url").Value) = False Then
-            result.Add(m.Groups("url").Value)
-            'End If
-        Next
-        Return result.ToArray
-    End Function
-
     Private bgw As BackgroundWorker
     Private lckPrev As New Object
     Private _prev As PreviewData
@@ -7717,9 +7706,9 @@ RETRY:
         Implements IDisposable
 
         Public statusId As Long
-        Public urls As List(Of String)
-        Public pics As New List(Of Image)
-        Public Sub New(ByVal id As Long, ByVal urlList As List(Of String))
+        Public urls As List(Of KeyValuePair(Of String, String))
+        Public pics As New List(Of KeyValuePair(Of String, Image))
+        Public Sub New(ByVal id As Long, ByVal urlList As List(Of KeyValuePair(Of String, String)))
             statusId = id
             urls = urlList
         End Sub
@@ -7734,8 +7723,8 @@ RETRY:
                 End If
 
                 ' TODO: 共有のアンマネージ リソースを解放します
-                For Each bmp As Bitmap In pics
-                    If bmp IsNot Nothing Then bmp.Dispose()
+                For Each pic As KeyValuePair(Of String, Image) In pics
+                    If pic.Value IsNot Nothing Then pic.Value.Dispose()
                 Next
             End If
             Me.disposedValue = True
@@ -7752,10 +7741,11 @@ RETRY:
 
     End Class
 
-    Private Sub thumbnail(ByVal id As Long, ByVal dtxt As String)
+    Private Sub thumbnail(ByVal id As Long, ByVal links As List(Of String))
         If Not PreviewPicture.Image Is Nothing Then
             PreviewPicture.Image.Dispose()
             PreviewPicture.Image = Nothing
+            Me.SplitContainer3.Panel2Collapsed = True
         End If
         SyncLock lckPrev
             If _prev IsNot Nothing Then
@@ -7763,50 +7753,132 @@ RETRY:
                 _prev = Nothing
             End If
         End SyncLock
-        Dim re As Regex
 
-        Dim urls() As String = chk_url(dtxt)
-        If urls Is Nothing Then Exit Sub
+        If links.Count = 0 Then
+            Me.PreviewScrollBar.Maximum = 0
+            Me.PreviewScrollBar.Enabled = False
+            Me.SplitContainer3.Panel2Collapsed = True
+            Exit Sub
+        End If
 
-        Dim imglist As New List(Of String)
+        Dim imglist As New List(Of KeyValuePair(Of String, String))
 
-        For Each url As String In urls
+        For Each url As String In links
+            Dim re As Regex
+            Dim mc As Match
+            'imgur
+            re = New Regex("^http://imgur\.com/(\w+)\.jpg$", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
+            mc = re.Match(url)
+            If mc.Success Then
+                imglist.Add(New KeyValuePair(Of String, String)(url, mc.Result("http://i.imgur.com/${1}l.jpg")))
+                Continue For
+            End If
             '画像拡張子で終わるURL(直リンク)
-            re = New Regex("http://.*(\.jpg|\.jpeg|\.gif|\.png|\.bmp)", RegexOptions.IgnoreCase)
-            If re.IsMatch(url) Then
-                imglist.Add(url)
+            re = New Regex("^http://.*(\.jpg|\.jpeg|\.gif|\.png|\.bmp)$", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
+            mc = re.Match(url)
+            If mc.Success Then
+                imglist.Add(New KeyValuePair(Of String, String)(url, url))
                 Continue For
             End If
             'twitpic
-            re = New Regex("http://twitpic\.com/.*", RegexOptions.IgnoreCase)
-            If re.IsMatch(url) Then
-                If url.IndexOf("http://twitpic.com/show/thumb/") = -1 Then
-                    imglist.Add(url.Replace("http://twitpic.com/", "http://twitpic.com/show/thumb/"))
-                    Continue For
-                End If
+            re = New Regex("^http://twitpic\.com/(\w+)$", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
+            mc = re.Match(url)
+            If mc.Success Then
+                imglist.Add(New KeyValuePair(Of String, String)(url, mc.Result("http://twitpic.com/show/thumb/${1}")))
+                Continue For
             End If
             'yfrog
-            re = New Regex("http://yfrog\.com/.*", RegexOptions.IgnoreCase)
-            If re.IsMatch(url) Then
-                re = New Regex("http://yfrog\.com/.*\.th\.jpg")
-                If re.IsMatch(url) = False Then
-                    imglist.Add(url + ".th.jpg")
-                    Continue For
-                End If
+            re = New Regex("^http://yfrog\.com/(\w+)$", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
+            mc = re.Match(url)
+            If mc.Success Then
+                imglist.Add(New KeyValuePair(Of String, String)(url, url + ".th.jpg"))
+                Continue For
             End If
             'tweetphoto
             Const comp As String = "http://TweetPhotoAPI.com/api/TPAPI.svc/imagefromurl?size=thumbnail&url="
-            re = New Regex("http://tweetphoto\.com/[0-9]*|http://pic\.gd/[a-z0-9]*", RegexOptions.IgnoreCase)
+            re = New Regex("^(http://tweetphoto\.com/[0-9]+|http://pic\.gd/[a-z0-9]+)$", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
             If re.IsMatch(url) Then
-                re = New Regex(comp, RegexOptions.IgnoreCase)
-                If re.IsMatch(url) = False Then
-                    imglist.Add(comp + url)
-                    Continue For
-                End If
+                imglist.Add(New KeyValuePair(Of String, String)(url, comp + url))
+                Continue For
+            End If
+            'Mobypicture
+            re = New Regex("^http://moby\.to/(\w+)$", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
+            mc = re.Match(url)
+            If mc.Success Then
+                imglist.Add(New KeyValuePair(Of String, String)(url, mc.Result("http://mobypicture.com/?${1}:small")))
+                Continue For
+            End If
+            '携帯百景
+            re = New Regex("^http://movapic\.com/pic/(\w+)$", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
+            mc = re.Match(url)
+            If mc.Success Then
+                imglist.Add(New KeyValuePair(Of String, String)(url, mc.Result("http://image.movapic.com/pic/s_${1}.jpeg")))
+                Continue For
+            End If
+            'はてなフォトライフ
+            re = New Regex("^http://f\.hatena\.ne\.jp/(([a-z])[a-z0-9_-]{1,30}[a-z0-9])/((\d{8})\d+)$", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
+            mc = re.Match(url)
+            If mc.Success Then
+                imglist.Add(New KeyValuePair(Of String, String)(url, mc.Result("http://img.f.hatena.ne.jp/images/fotolife/${2}/${1}/${4}/${3}_120.jpg")))
+                Continue For
+            End If
+            'PhotoShare
+            re = New Regex("^http://(?:www\.)?bcphotoshare\.com/photos/\d+/(\d+)$", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
+            mc = re.Match(url)
+            If mc.Success Then
+                imglist.Add(New KeyValuePair(Of String, String)(url, mc.Result("http://images.bcphotoshare.com/storages/${1}/thumb180.jpg")))
+                Continue For
+            End If
+            'PhotoShare の短縮 URL
+            re = New Regex("^http://bctiny\.com/p(\w+)$", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
+            mc = re.Match(url)
+            If mc.Success Then
+                imglist.Add(New KeyValuePair(Of String, String)(url, "http://images.bcphotoshare.com/storages/" + RadixConvert.ToInt32(mc.Result("${1}"), 32).ToString + "/thumb180.jpg"))
+                Continue For
+            End If
+            'img.ly
+            re = New Regex("^http://img\.ly/(\w+)$", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
+            mc = re.Match(url)
+            If mc.Success Then
+                imglist.Add(New KeyValuePair(Of String, String)(url, mc.Result("http://img.ly/show/thumb/${1}")))
+                Continue For
+            End If
+            'brightkite
+            re = New Regex("^http://brightkite\.com/objects/((\w{2})(\w{2})\w+)$", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
+            mc = re.Match(url)
+            If mc.Success Then
+                imglist.Add(New KeyValuePair(Of String, String)(url, mc.Result("http://cdn.brightkite.com/${2}/${3}/${1}-feed.jpg")))
+                Continue For
+            End If
+            'Twitgoo
+            re = New Regex("^http://twitgoo\.com/(\w+)$", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
+            mc = re.Match(url)
+            If mc.Success Then
+                imglist.Add(New KeyValuePair(Of String, String)(url, mc.Result("http://twitgoo.com/${1}/mini")))
+                Continue For
+            End If
+            'pic.im
+            re = New Regex("^http://pic\.im/(\w+)$", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
+            mc = re.Match(url)
+            If mc.Success Then
+                imglist.Add(New KeyValuePair(Of String, String)(url, mc.Result("http://pic.im/website/thumbnail/${1}")))
+                Continue For
+            End If
+            'youtube
+            re = New Regex("^http://www\.youtube\.com/watch\?v=([\w\-]+)$", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
+            mc = re.Match(url)
+            If mc.Success Then
+                imglist.Add(New KeyValuePair(Of String, String)(url, mc.Result("http://i.ytimg.com/vi/${1}/default.jpg")))
+                Continue For
             End If
         Next
 
-        If imglist.Count = 0 Then Exit Sub
+        If imglist.Count = 0 Then
+            Me.PreviewScrollBar.Maximum = 0
+            Me.PreviewScrollBar.Enabled = False
+            Me.SplitContainer3.Panel2Collapsed = True
+            Exit Sub
+        End If
 
         're = New Regex("http://.*\.jpg.*|http://.*(\.jpg|\.jpeg|\.gif|\.png|\.bmp)|http://twitpic\.com/show/thumb/.*|http://TweetPhotoAPI\.com/api/TPAPI\.svc/imagefromurl.*", RegexOptions.IgnoreCase)
         'If re.IsMatch(imglist(0)) = True Then
@@ -7820,11 +7892,11 @@ RETRY:
 
     Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
         Dim arg As PreviewData = DirectCast(e.Argument, PreviewData)
-        For Each url As String In arg.urls
+        For Each url As KeyValuePair(Of String, String) In arg.urls
             Dim http As New HttpVarious
-            Dim img As Image = http.GetImage(url)
+            Dim img As Image = http.GetImage(url.Value)
             If img Is Nothing Then Continue For
-            arg.pics.Add(img)
+            arg.pics.Add(New KeyValuePair(Of String, Image)(url.Key, img))
         Next
         If arg.pics.Count = 0 Then
             Exit Sub
@@ -7837,11 +7909,19 @@ RETRY:
     Private Sub bgw_Completed(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
         SyncLock lckPrev
             If _prev IsNot Nothing AndAlso _curPost IsNot Nothing AndAlso _prev.statusId = _curPost.Id Then
+                Me.SplitContainer3.Panel2Collapsed = False
                 Me.PreviewScrollBar.Maximum = _prev.pics.Count - 1
-                If Me.PreviewScrollBar.Maximum > 1 Then
-                    Me.PreviewScrollBar.Value = 0
+                If Me.PreviewScrollBar.Maximum > 0 Then
+                    Me.PreviewScrollBar.Enabled = True
+                Else
+                    Me.PreviewScrollBar.Enabled = False
                 End If
-                Me.PreviewPicture.Image = _prev.pics(0)
+                Me.PreviewScrollBar.Value = 0
+                Me.PreviewPicture.Image = _prev.pics(0).Value
+            Else
+                Me.PreviewScrollBar.Maximum = 0
+                Me.PreviewScrollBar.Enabled = False
+                Me.SplitContainer3.Panel2Collapsed = True
             End If
         End SyncLock
     End Sub
@@ -7850,11 +7930,19 @@ RETRY:
         SyncLock lckPrev
             If _prev IsNot Nothing AndAlso _curPost IsNot Nothing AndAlso _prev.statusId = _curPost.Id Then
                 If _prev.pics.Count > e.NewValue Then
-                    Me.PreviewPicture.Image = _prev.pics(e.NewValue)
+                    Me.PreviewPicture.Image = _prev.pics(e.NewValue).Value
                 End If
             End If
         End SyncLock
     End Sub
+
+    Private Sub PreviewPicture_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles PreviewPicture.DoubleClick
+        If _prev IsNot Nothing Then
+            If Me.PreviewScrollBar.Value < _prev.pics.Count Then
+                OpenUriAsync(_prev.pics(Me.PreviewScrollBar.Value).Key)
+            End If
+        End If
+    End Sub
 #End Region
 
     Private Sub DummyTextBox_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DummyTextBox.Enter
@@ -7864,4 +7952,11 @@ RETRY:
             DirectCast(Me.ListTab.SelectedTab.Tag, Control).Focus()
         End If
     End Sub
+
+    Private Sub SplitContainer3_SplitterMoved(ByVal sender As System.Object, ByVal e As System.Windows.Forms.SplitterEventArgs) Handles SplitContainer3.SplitterMoved
+        If Me.WindowState = FormWindowState.Normal AndAlso Not _initialLayout Then
+            _mySpDis3 = SplitContainer3.SplitterDistance
+            modifySettingLocal = True
+        End If
+    End Sub
 End Class
index 7cc39fd..c43f18a 100644 (file)
       <SubType>Form</SubType>
     </Compile>
     <Compile Include="Outputz.vb" />
+    <Compile Include="RadixConvert.vb" />
     <Compile Include="SearchWord.Designer.vb">
       <DependentUpon>SearchWord.vb</DependentUpon>
     </Compile>
index daf0709..458f404 100644 (file)
@@ -130,7 +130,8 @@ Public Class Twitter
             "http://bctiny.com/", _
             "http://j.mp/", _
             "http://goo.gl/", _
-            "http://ow.ly/" _
+            "http://ow.ly/", _
+            "http://bkite.com/" _
         }
 
     Private Const _apiHost As String = "api."