Mercurial > projects > dwt-win
diff dwt/internal/Compatibility.d @ 2:57151e2793a2
More common modules from dwt-linux
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Wed, 23 Jan 2008 12:01:46 +0100 |
parents | |
children | ab60f3309436 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dwt/internal/Compatibility.d Wed Jan 23 12:01:46 2008 +0100 @@ -0,0 +1,356 @@ +/******************************************************************************* + * Copyright (c) 2000, 2006 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + * Port to the D programming language: + * Frank Benoit <benoit@tionex.de> + *******************************************************************************/ +module dwt.internal.Compatibility; + +/+ +import java.io.*; +import java.text.MessageFormat; +import java.util.MissingResourceException; +import java.util.ResourceBundle; +import java.util.zip.InflaterInputStream; ++/ + +import dwt.DWT; +public import dwt.dwthelper.FileInputStream; +public import dwt.dwthelper.FileOutputStream; +public import dwt.dwthelper.InflaterInputStream; + +import Math = tango.math.Math; +import Unicode = tango.text.Unicode; +import tango.sys.Process; + +/** + * This class is a placeholder for utility methods commonly + * used on J2SE platforms but not supported on some J2ME + * profiles. + * <p> + * It is part of our effort to provide support for both J2SE + * and J2ME platforms. + * </p> + * <p> + * IMPORTANT: some of the methods have been modified from their + * J2SE parents. Refer to the description of each method for + * specific changes. + * </p> + * <ul> + * <li>Exceptions thrown may differ since J2ME's set of + * exceptions is a subset of J2SE's one. + * </li> + * <li>The range of the mathematic functions is subject to + * change. + * </li> + * </ul> + */ +public final class Compatibility { + +/** + * Returns the PI constant as a double. + */ +public static const real PI = Math.PI; + +static const real toRadians = PI / 180; + +/** + * Answers the length of the side adjacent to the given angle + * of a right triangle. In other words, it returns the integer + * conversion of length * cos (angle). + * <p> + * IMPORTANT: the j2me version has an additional restriction on + * the argument. length must be between -32767 and 32767 (inclusive). + * </p> + * + * @param angle the angle in degrees + * @param length the length of the triangle's hypotenuse + * @return the integer conversion of length * cos (angle) + */ +public static int cos(int angle, int length) { + return cast(int)(Math.cos(angle * toRadians) * length); +} + +/** + * Answers the length of the side opposite to the given angle + * of a right triangle. In other words, it returns the integer + * conversion of length * sin (angle). + * <p> + * IMPORTANT: the j2me version has an additional restriction on + * the argument. length must be between -32767 and 32767 (inclusive). + * </p> + * + * @param angle the angle in degrees + * @param length the length of the triangle's hypotenuse + * @return the integer conversion of length * sin (angle) + */ +public static int sin(int angle, int length) { + return cast(int)(Math.sin(angle * toRadians) * length); +} + +/** + * Answers the most negative (i.e. closest to negative infinity) + * integer value which is greater than the number obtained by dividing + * the first argument p by the second argument q. + * + * @param p numerator + * @param q denominator (must be different from zero) + * @return the ceiling of the rational number p / q. + */ +public static int ceil(int p, int q) { + return cast(int)Math.ceil(cast(float)p / q); +} + +/** + * Answers the most positive (i.e. closest to positive infinity) + * integer value which is less than the number obtained by dividing + * the first argument p by the second argument q. + * + * @param p numerator + * @param q denominator (must be different from zero) + * @return the floor of the rational number p / q. + */ +public static int floor(int p, int q) { + return cast(int)Math.floor(cast(double)p / q); +} + +/** + * Answers the result of rounding to the closest integer the number obtained + * by dividing the first argument p by the second argument q. + * <p> + * IMPORTANT: the j2me version has an additional restriction on + * the arguments. p must be within the range 0 - 32767 (inclusive). + * q must be within the range 1 - 32767 (inclusive). + * </p> + * + * @param p numerator + * @param q denominator (must be different from zero) + * @return the closest integer to the rational number p / q + */ +public static int round(int p, int q) { + return cast(int)Math.round(cast(float)p / q); +} + +/** + * Returns 2 raised to the power of the argument. + * + * @param n an int value between 0 and 30 (inclusive) + * @return 2 raised to the power of the argument + * + * @exception IllegalArgumentException <ul> + * <li>ERROR_INVALID_RANGE - if the argument is not between 0 and 30 (inclusive)</li> + * </ul> + */ +public static int pow2(int n) { + if (n >= 1 && n <= 30) + return 2 << (n - 1); + else if (n != 0) { + DWT.error(DWT.ERROR_INVALID_RANGE); + } + return 1; +} + +/** + * Open a file if such things are supported. + * + * @param filename the name of the file to open + * @return a stream on the file if it could be opened. + * @exception IOException + */ +public static InputStream newFileInputStream(char[] filename) { + return new FileInputStream(filename); +} + +/** + * Open a file if such things are supported. + * + * @param filename the name of the file to open + * @return a stream on the file if it could be opened. + * @exception IOException + */ +public static OutputStream newFileOutputStream(char[] filename) { + return new FileOutputStream(filename); +} + +/** + * Create an InflaterInputStream if such things are supported. + * + * @param stream the input stream + * @return a inflater stream or <code>null</code> + * @exception IOException + * + * @since 3.3 + */ +public static InflaterInputStream newInflaterInputStream(InputStream stream) { + return new InflaterInputStream(stream); +} + +/** + * Answers whether the character is a letter. + * + * @param c the character + * @return true when the character is a letter + */ +public static bool isLetter(dchar c) { + return Unicode.isLetter(c); +} + +/** + * Answers whether the character is a letter or a digit. + * + * @param c the character + * @return true when the character is a letter or a digit + */ +public static bool isLetterOrDigit(dchar c) { + return Unicode.isLetterOrDigit(c); +} + +/** + * Answers whether the character is a Unicode space character. + * + * @param c the character + * @return true when the character is a Unicode space character + */ +public static bool isSpaceChar(dchar c) { + return Unicode.isSpace(c); +} + +/** + * Answers whether the character is a whitespace character. + * + * @param c the character to test + * @return true if the character is whitespace + */ +public static bool isWhitespace(dchar c) { + return Unicode.isWhitespace(c); +} + +/** + * Execute a program in a separate platform process if the + * underlying platform support this. + * <p> + * The new process inherits the environment of the caller. + * </p> + * + * @param prog the name of the program to execute + * + * @exception ProcessException + * if the program cannot be executed + */ +public static void exec(char[] prog) { + auto proc = new Process( prog ); + proc.execute; +} + +/** + * Execute progArray[0] in a separate platform process if the + * underlying platform support this. + * <p> + * The new process inherits the environment of the caller. + * <p> + * + * @param progArray array containing the program to execute and its arguments + * + * @exception ProcessException + * if the program cannot be executed + */ +public static void exec(char[][] progArray) { + auto proc = new Process( progArray ); + proc.execute; +} +/++ PORTING_LEFT +private static ResourceBundle msgs = null; + +/** + * Returns the NLS'ed message for the given argument. This is only being + * called from DWT. + * + * @param key the key to look up + * @return the message for the given key + * + * @see DWT#getMessage(String) + */ +public static String getMessage(String key) { + String answer = key; + + if (key == null) { + DWT.error (DWT.ERROR_NULL_ARGUMENT); + } + if (msgs == null) { + try { + msgs = ResourceBundle.getBundle("dwt.internal.SWTMessages"); //$NON-NLS-1$ + } catch (MissingResourceException ex) { + answer = key + " (no resource bundle)"; //$NON-NLS-1$ + } + } + if (msgs != null) { + try { + answer = msgs.getString(key); + } catch (MissingResourceException ex2) {} + } + return answer; +} + +public static String getMessage(String key, Object[] args) { + String answer = key; + + if (key == null || args == null) { + DWT.error (DWT.ERROR_NULL_ARGUMENT); + } + if (msgs == null) { + try { + msgs = ResourceBundle.getBundle("dwt.internal.SWTMessages"); //$NON-NLS-1$ + } catch (MissingResourceException ex) { + answer = key + " (no resource bundle)"; //$NON-NLS-1$ + } + } + if (msgs != null) { + try { + MessageFormat formatter = new MessageFormat(""); + formatter.applyPattern(msgs.getString(key)); + answer = formatter.format(args); + } catch (MissingResourceException ex2) {} + } + return answer; +} +++/ + + +/** + * Interrupt the current thread. + * <p> + * Note that this is not available on CLDC. + * </p> + */ +public static void interrupt() { + //PORTING_FIXME: how to implement?? + //Thread.currentThread().interrupt(); +} + +/** + * Compares two instances of class String ignoring the case of the + * characters and answers if they are equal. + * + * @param s1 string + * @param s2 string + * @return true if the two instances of class String are equal + */ +public static bool equalsIgnoreCase(char[] s1, char[] s2) { + char[] s1b = new char[ s1.length ]; + char[] s2b = new char[ s1.length ]; + scope(exit){ + delete s1b; + delete s2b; + } + char[] s1c = Unicode.toFold( s1, s1b ); + char[] s2c = Unicode.toFold( s2, s2b ); + return s1c == s2c; +} + +}