diff --git a/trunk/Boare.Lib.AppUtil/Util.cs b/trunk/Boare.Lib.AppUtil/Util.cs
new file mode 100644
index 0000000..5ae0a20
--- /dev/null
+++ b/trunk/Boare.Lib.AppUtil/Util.cs
@@ -0,0 +1,516 @@
+/*
+ * Misc.cs
+ * Copyright (c) 2008-2009 kbinani
+ *
+ * This file is part of Boare.Lib.AppUtil.
+ *
+ * Boare.Lib.AppUtil is free software; you can redistribute it and/or
+ * modify it under the terms of the BSD License.
+ *
+ * Boare.Lib.AppUtil is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+#if JAVA
+package org.kbinani.apputil;
+
+import java.awt.*;
+import javax.swing.*;
+import java.awt.image.*;
+#else
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Reflection;
+using System.Windows.Forms;
+using bocoree;
+
+namespace Boare.Lib.AppUtil {
+ using java = bocoree.java;
+ using boolean = System.Boolean;
+#endif
+
+#if JAVA
+ public class Util{
+#else
+ public static partial class Util {
+#endif
+#if JAVA
+ public static void applyContextMenuFontRecurse( MenuElement item, Font font ){
+ applyToolStripFontRecurse( item, font );
+ }
+#else
+ public static void applyContextMenuFontRecurse( ContextMenuStrip item, bocoree.java.awt.Font font ) {
+ item.Font = font.font;
+ foreach ( ToolStripItem tsi in item.Items ) {
+ applyToolStripFontRecurse( tsi, font );
+ }
+ }
+#endif
+
+#if JAVA
+ public static void applyToolStripFontRecurse( MenuElement item, Font font ){
+ if( item instanceof Component ){
+ ((Component)item).setFont( font );
+ }
+ for( MenuElement element : item.getSubElements() ){
+ applyToolStripFontRecurse( element, font );
+ }
+ }
+#else
+ public static void applyToolStripFontRecurse( ToolStripItem item, bocoree.java.awt.Font font ) {
+ item.Font = font.font;
+ if ( item is ToolStripMenuItem ) {
+ ToolStripMenuItem tsmi = (ToolStripMenuItem)item;
+ foreach ( ToolStripItem tsi in tsmi.DropDownItems ) {
+ applyToolStripFontRecurse( tsi, font );
+ }
+ } else if ( item is ToolStripDropDownItem ) {
+ ToolStripDropDownItem tsdd = (ToolStripDropDownItem)item;
+ foreach ( ToolStripItem tsi in tsdd.DropDownItems ) {
+ applyToolStripFontRecurse( tsi, font );
+ }
+ }
+ }
+#endif
+
+ ///
+ /// 指定したフォントを描画するとき、描画指定したy座標と、描かれる文字の中心線のズレを調べます
+ ///
+ ///
+ ///
+ public static int getStringDrawOffset( java.awt.Font font ) {
+ int ret = 0;
+ String pangram = "cozy lummox gives smart squid who asks for job pen. 01234567890 THE QUICK BROWN FOX JUMPED OVER THE LAZY DOGS.";
+ java.awt.Dimension size = measureString( pangram, font );
+ if ( size.height <= 0 ) {
+ return 0;
+ }
+ java.awt.image.BufferedImage b = null;
+ java.awt.Graphics2D g = null;
+#if JAVA
+ java.awt.image.BufferedImage b2 = null;
+#else
+ BitmapEx b2 = null;
+#endif
+ try {
+ int w = size.width * 3;
+ int h = size.height * 3;
+ b = new java.awt.image.BufferedImage( w, h, java.awt.image.BufferedImage.TYPE_INT_BGR );
+ g = b.createGraphics();
+ g.setColor( java.awt.Color.white );
+ g.fillRect( 0, 0, w, h );
+ g.setFont( font );
+ g.setColor( java.awt.Color.black );
+ g.drawString( pangram, size.width, size.height );
+
+#if JAVA
+ Graphics2D g2 = b.createGraphics();
+ g2.drawImage( b, 0, 0, null );
+#else
+ b2 = new BitmapEx( b.m_image );
+#endif
+ // 上端に最初に現れる色つきピクセルを探す
+ int firsty = 0;
+ boolean found = false;
+ for ( int y = 0; y < h; y++ ) {
+ for ( int x = 0; x < w; x++ ) {
+#if JAVA
+ int ic = b2.getRGB( x, y );
+ Color c = new Color( ic );
+#else
+ java.awt.Color c = new bocoree.java.awt.Color( b2.GetPixel( x, y ) );
+#endif
+ if ( c.getRed() != 255 || c.getGreen() != 255 || c.getBlue() != 255 ) {
+ found = true;
+ firsty = y;
+ break;
+ }
+ }
+ if ( found ) {
+ break;
+ }
+ }
+
+ // 下端
+ int endy = h - 1;
+ found = false;
+ for ( int y = h - 1; y >= 0; y-- ) {
+ for ( int x = 0; x < w; x++ ) {
+#if JAVA
+ int ic = b2.getRGB( x, y );
+ Color c = new Color( ic );
+#else
+ java.awt.Color c = new bocoree.java.awt.Color( b2.GetPixel( x, y ) );
+#endif
+ if ( c.getRed() != 255 || c.getGreen() != 255 || c.getBlue() != 255 ) {
+ found = true;
+ endy = y;
+ break;
+ }
+ }
+ if ( found ) {
+ break;
+ }
+ }
+
+ int center = (firsty + endy) / 2;
+ ret = center - (int)size.height;
+ } catch ( Exception ex ) {
+ } finally {
+#if JAVA
+#else
+ if ( b != null && b.m_image != null ) {
+ b.m_image.Dispose();
+ }
+ if ( g != null ) {
+ g.nativeGraphics.Dispose();
+ }
+ if ( b2 != null && b2 != null ) {
+ b2.Dispose();
+ }
+#endif
+ }
+ return ret;
+ }
+
+ ///
+ /// 指定した言語コードの表す言語が、右から左へ記述する言語かどうかを調べます
+ ///
+ ///
+ ///
+ public static boolean isRightToLeftLanguage( String language_code ) {
+ language_code = language_code.ToLower();
+ if ( language_code.Equals( "ar" ) ||
+ language_code.Equals( "he" ) ||
+ language_code.Equals( "iw" ) ||
+ language_code.Equals( "fa" ) ||
+ language_code.Equals( "ur" ) ) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+#if !JAVA
+ ///
+ /// 指定したディレクトリに作成可能な、一時ファイル名を取得します
+ ///
+ /// ディレクトリ
+ ///
+ public static string GetTempFileNameIn( string directory ) {
+ for ( uint i = uint.MinValue; i <= uint.MaxValue; i++ ) {
+ string file = Path.Combine( directory, "temp" + i );
+ if ( !File.Exists( file ) ) {
+ return file;
+ }
+ }
+ return "";
+ }
+#endif
+
+#if !JAVA
+ ///
+ /// 指定したディレクトリに作成可能な、一時ファイル名を取得します
+ ///
+ /// ディレクトリ
+ /// 拡張子(ex. ".txt")
+ ///
+ public static string GetTempFileNameIn( string directory, string extention ){
+ for ( uint i = uint.MinValue; i <= uint.MaxValue; i++ ) {
+ string file = Path.Combine( directory, "temp" + i + extention );
+ if ( !File.Exists( file ) ) {
+ return file;
+ }
+ }
+ return "";
+ }
+#endif
+
+#if !JAVA
+ ///
+ /// 指定した画像ファイルから新しいBitmapオブジェクトを作成します
+ ///
+ ///
+ ///
+ public static Bitmap BitmapFromStream( string file ) {
+ if ( !File.Exists( file ) ) {
+ return null;
+ }
+ FileStream fs = new FileStream( file, FileMode.Open );
+ Bitmap ret = new Bitmap( fs );
+ fs.Close();
+ return ret;
+ }
+#endif
+
+#if !JAVA
+ ///
+ /// 指定した画像ファイルから新しいImageオブジェクトを作成します
+ ///
+ ///
+ ///
+ public static Image ImageFromStream( string file ) {
+ if ( !File.Exists( file ) ) {
+ return null;
+ }
+ FileStream fs = new FileStream( file, FileMode.Open );
+ Image ret = Image.FromStream( fs );
+ fs.Close();
+ return ret;
+ }
+#endif
+
+#if !JAVA
+ ///
+ /// ImageFormatから,デフォルトの拡張子を取得します
+ ///
+ ///
+ ///
+ public static string GetExtensionFromImageFormat( ImageFormat format ) {
+ switch ( format.ToString().ToLower() ) {
+ case "bmp":
+ return ".bmp";
+ case "emf":
+ return ".emf";
+ case "gif":
+ return ".gif";
+ case "jpeg":
+ return ".jpg";
+ case "png":
+ return ".png";
+ case "tiff":
+ return ".tiff";
+ case "wmf":
+ return ".wmf";
+ default:
+ return "";
+
+ }
+ }
+#endif
+
+#if !JAVA
+ ///
+ /// System.Drawimg.Imaging.ImageFormatで使用可能なフォーマットの一覧を取得します
+ ///
+ ///
+ public static ImageFormat[] GetImageFormats() {
+#if DEBUG
+ Console.WriteLine( "GetImageFormats()" );
+#endif
+ PropertyInfo[] properties = typeof( System.Drawing.Imaging.ImageFormat ).GetProperties();
+ List ret = new List();
+ foreach ( PropertyInfo pi in properties ) {
+ if ( pi.PropertyType.Equals( typeof( System.Drawing.Imaging.ImageFormat ) ) ) {
+ ImageFormat ifmt = (System.Drawing.Imaging.ImageFormat)pi.GetValue( null, null );
+#if DEBUG
+ Console.WriteLine( ifmt.ToString() );
+#endif
+ ret.Add( ifmt );
+ }
+ }
+ return ret.ToArray();
+ }
+#endif
+
+#if !JAVA
+ public static void RgbToHsv( int r, int g, int b, out double h, out double s, out double v ) {
+ RgbToHsv( r / 255.0, g / 255.0, b / 255.0, out h, out s, out v );
+ }
+
+ public static void RgbToHsv( double r, double g, double b, out double h, out double s, out double v ) {
+ double tmph, imax, imin;
+ const double sqrt3 = 1.7320508075688772935274463415059;
+ imax = Math.Max( r, Math.Max( g, b ) );
+ imin = Math.Min( r, Math.Min( g, b ) );
+ if ( imax == 0.0 ) {
+ h = 0;
+ s = 0;
+ v = 0;
+ return;
+ } else if ( imax == imin ) {
+ tmph = 0;
+ } else {
+ if ( r == imax ) {
+ tmph = 60.0 * (g - b) / (imax - imin);
+ } else if ( g == imax ) {
+ tmph = 60.0 * (b - r) / (imax - imin) + 120.0;
+ } else {
+ tmph = 60.0 * (r - g) / (imax - imin) + 240.0;
+ }
+ }
+ while ( tmph < 0.0 ) {
+ tmph = tmph + 360.0;
+ }
+ while ( tmph >= 360.0 ) {
+ tmph = tmph - 360.0;
+ }
+ h = tmph / 360.0;
+ s = (imax - imin) / imax;
+ v = imax;
+ }
+
+ public static Color HsvToColor( double h, double s, double v ) {
+ double dr, dg, db;
+ HsvToRgb( h, s, v, out dr, out dg, out db );
+ return Color.FromArgb( (int)(dr * 255), (int)(dg * 255), (int)(db * 255) );
+ }
+
+ public static void HsvToRgb( double h, double s, double v, out byte r, out byte g, out byte b ) {
+ double dr, dg, db;
+ HsvToRgb( h, s, v, out dr, out dg, out db );
+ r = (byte)(dr * 255);
+ g = (byte)(dg * 255);
+ b = (byte)(db * 255);
+ }
+
+ public static void HsvToRgb( double h, double s, double v, out double r, out double g, out double b ) {
+ double f, p, q, t, hh;
+ int hi;
+ r = g = b = 0.0;
+ if ( s == 0 ) {
+ r = v;
+ g = v;
+ b = v;
+ } else {
+ hh = h * 360.0;
+ hi = (int)(hh / 60.0) % 6;
+ f = hh / 60.0 - (double)(hi);
+ p = v * (1.0 - s);
+ q = v * (1.0 - f * s);
+ t = v * (1.0 - (1.0 - f) * s);
+ switch ( hi ) {
+ case 0:
+ r = v;
+ g = t;
+ b = p;
+ break;
+ case 1:
+ r = q;
+ g = v;
+ b = p;
+ break;
+ case 2:
+ r = p;
+ g = v;
+ b = t;
+ break;
+ case 3:
+ r = p;
+ g = q;
+ b = v;
+ break;
+ case 4:
+ r = t;
+ g = p;
+ b = v;
+ break;
+ case 5:
+ r = v;
+ g = p;
+ b = q;
+ break;
+ }
+ }
+ }
+#endif
+
+ ///
+ /// 指定された文字列を指定されたフォントで描画したときのサイズを計測します。
+ ///
+ ///
+ ///
+ ///
+#if JAVA
+ public static Dimension measureString( String text, Font font ){
+ BufferedImage dumy = new BufferedImage( 1, 1, BufferedImage.TYPE_INT_BGR );
+ Graphics2D g = dumy.createGraphics();
+ g.setFont( font );
+ FontMetrics fm = g.getFontMetrics();
+ Dimension ret = new Dimension( fm.stringWidth( text ), fm.getHeight() );
+ g = null;
+ dumy = null;
+ return ret;
+ }
+#else
+ public static java.awt.Dimension measureString( string text, java.awt.Font font ) {
+ Size s = measureString( text, font.font );
+ return new bocoree.java.awt.Dimension( s.Width, s.Height );
+ }
+
+ public static Size measureString( string text, Font font ) {
+ using ( Bitmap dumy = new Bitmap( 1, 1 ) )
+ using ( Graphics g = Graphics.FromImage( dumy ) ) {
+ SizeF tmp = g.MeasureString( text, font );
+ return new Size( (int)tmp.Width, (int)tmp.Height );
+ }
+ }
+#endif
+
+ ///
+ /// 指定したコントロールと、その子コントロールのフォントを再帰的に変更します
+ ///
+ ///
+ ///
+#if JAVA
+ public static void applyFontRecurse( Component c, Font font ){
+#else
+ public static void applyFontRecurse( Control c, java.awt.Font font ) {
+#endif
+#if JAVA
+ c.setFont( font );
+ if( c instanceof Container ){
+ Container container = (Container)c;
+ int count = container.getComponentCount();
+ for( int i = 0; i < count; i++ ){
+ Component component = container.getComponent( i );
+ applyFontRecurse( component, font );
+ }
+ }
+#else
+ applyFontRecurse( c, font.font );
+#endif
+ }
+
+#if !JAVA
+ public static void applyFontRecurse( Control c, System.Drawing.Font font ) {
+ c.Font = font;
+ for ( int i = 0; i < c.Controls.Count; i++ ) {
+ applyFontRecurse( c.Controls[i], font );
+ }
+ }
+#endif
+
+#if !JAVA
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static bool IsOverwrapped( double start1, double end1, double start2, double end2 ) {
+ if ( start2 <= start1 && start1 < end2 ) {
+ return true;
+ } else if ( start2 < end1 && end1 < end2 ) {
+ return true;
+ } else {
+ if ( start1 <= start2 && start2 < end1 ) {
+ return true;
+ } else if ( start1 < end2 && end2 < end1 ) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+#endif
+ }
+
+#if !JAVA
+}
+#endif