root/dwt/internal/Compatibility.d

Revision 318:f7a1b148cb35, 12.5 kB (checked in by Frank Benoit <benoit@tionex.de>, 2 months ago)

Fix the languag file support.

Line 
1 /*******************************************************************************
2  * Copyright (c) 2000, 2007 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  * Port to the D programming language:
11  *     Frank Benoit <benoit@tionex.de>
12  *******************************************************************************/
13 module dwt.internal.Compatibility;
14
15 /+
16 import java.io.*;
17 import java.io.File;
18 import java.text.MessageFormat;
19 import java.util.MissingResourceException;
20 import java.util.ResourceBundle;
21 import java.util.zip.DeflaterOutputStream;
22 import java.util.zip.InflaterInputStream;
23 +/
24
25 import dwt.DWT;
26 public import dwt.dwthelper.FileInputStream;
27 public import dwt.dwthelper.FileOutputStream;
28 public import dwt.dwthelper.InflaterInputStream;
29
30 import Math = tango.math.Math;
31 import Unicode = tango.text.Unicode;
32 import tango.sys.Process;
33 import dwt.dwthelper.utils;
34 import dwt.dwthelper.ResourceBundle;
35 import tango.io.Path;
36 import tango.text.convert.Format;
37
38 /**
39  * This class is a placeholder for utility methods commonly
40  * used on J2SE platforms but not supported on some J2ME
41  * profiles.
42  * <p>
43  * It is part of our effort to provide support for both J2SE
44  * and J2ME platforms.
45  * </p>
46  * <p>
47  * IMPORTANT: some of the methods have been modified from their
48  * J2SE parents. Refer to the description of each method for
49  * specific changes.
50  * </p>
51  * <ul>
52  * <li>Exceptions thrown may differ since J2ME's set of
53  * exceptions is a subset of J2SE's one.
54  * </li>
55  * <li>The range of the mathematic functions is subject to
56  * change.
57  * </li>
58  * </ul>
59  */
60 public final class Compatibility {
61
62 /**
63  * Returns the PI constant as a double.
64  */
65 public static const real PI = Math.PI;
66
67 static const real toRadians = PI / 180;
68
69 /**
70  * Answers the length of the side adjacent to the given angle
71  * of a right triangle. In other words, it returns the integer
72  * conversion of length * cos (angle).
73  * <p>
74  * IMPORTANT: the j2me version has an additional restriction on
75  * the argument. length must be between -32767 and 32767 (inclusive).
76  * </p>
77  *
78  * @param angle the angle in degrees
79  * @param length the length of the triangle's hypotenuse
80  * @return the integer conversion of length * cos (angle)
81  */
82 public static int cos(int angle, int length) {
83     return cast(int)(Math.cos(angle * toRadians) * length);
84 }
85
86 /**
87  * Answers the length of the side opposite to the given angle
88  * of a right triangle. In other words, it returns the integer
89  * conversion of length * sin (angle).
90  * <p>
91  * IMPORTANT: the j2me version has an additional restriction on
92  * the argument. length must be between -32767 and 32767 (inclusive).
93  * </p>
94  *
95  * @param angle the angle in degrees
96  * @param length the length of the triangle's hypotenuse
97  * @return the integer conversion of length * sin (angle)
98  */
99 public static int sin(int angle, int length) {
100     return cast(int)(Math.sin(angle * toRadians) * length);
101 }
102
103 /**
104  * Answers the most negative (i.e. closest to negative infinity)
105  * integer value which is greater than the number obtained by dividing
106  * the first argument p by the second argument q.
107  *
108  * @param p numerator
109  * @param q denominator (must be different from zero)
110  * @return the ceiling of the rational number p / q.
111  */
112 public static int ceil(int p, int q) {
113     return cast(int)Math.ceil(cast(float)p / q);
114 }
115
116 /**
117  * Answers whether the indicated file exists or not.
118  *
119  * @param parent the file's parent directory
120  * @param child the file's name
121  * @return true if the file exists
122  */
123 public static bool fileExists(String parent, String child) {
124     return FS.exists( FS.join(parent, child));
125 }
126
127 /**
128  * Answers the most positive (i.e. closest to positive infinity)
129  * integer value which is less than the number obtained by dividing
130  * the first argument p by the second argument q.
131  *
132  * @param p numerator
133  * @param q denominator (must be different from zero)
134  * @return the floor of the rational number p / q.
135  */
136 public static int floor(int p, int q) {
137     return cast(int)Math.floor(cast(double)p / q);
138 }
139
140 /**
141  * Answers the result of rounding to the closest integer the number obtained
142  * by dividing the first argument p by the second argument q.
143  * <p>
144  * IMPORTANT: the j2me version has an additional restriction on
145  * the arguments. p must be within the range 0 - 32767 (inclusive).
146  * q must be within the range 1 - 32767 (inclusive).
147  * </p>
148  *
149  * @param p numerator
150  * @param q denominator (must be different from zero)
151  * @return the closest integer to the rational number p / q
152  */
153 public static int round(int p, int q) {
154     return cast(int)Math.round(cast(float)p / q);
155 }
156
157 /**
158  * Returns 2 raised to the power of the argument.
159  *
160  * @param n an int value between 0 and 30 (inclusive)
161  * @return 2 raised to the power of the argument
162  *
163  * @exception IllegalArgumentException <ul>
164  *    <li>ERROR_INVALID_RANGE - if the argument is not between 0 and 30 (inclusive)</li>
165  * </ul>
166  */
167 public static int pow2(int n) {
168     if (n >= 1 && n <= 30)
169         return 2 << (n - 1);
170     else if (n != 0) {
171         DWT.error(DWT.ERROR_INVALID_RANGE);
172     }
173     return 1;
174 }
175
176 /**
177  * Create an DeflaterOutputStream if such things are supported.
178  *
179  * @param stream the output stream
180  * @return a deflater stream or <code>null</code>
181  * @exception IOException
182  *
183  * @since 3.4
184  */
185 public static OutputStream newDeflaterOutputStream(OutputStream stream) {
186     //DWT_TODO
187     implMissing(__FILE__,__LINE__);
188     return null;
189     //return new DeflaterOutputStream(stream);
190 }
191
192 /**
193  * Open a file if such things are supported.
194  *
195  * @param filename the name of the file to open
196  * @return a stream on the file if it could be opened.
197  * @exception IOException
198  */
199 public static InputStream newFileInputStream(String filename) {
200     return new FileInputStream(filename);
201 }
202
203 /**
204  * Open a file if such things are supported.
205  *
206  * @param filename the name of the file to open
207  * @return a stream on the file if it could be opened.
208  * @exception IOException
209  */
210 public static OutputStream newFileOutputStream(String filename) {
211     return new FileOutputStream(filename);
212 }
213
214 /**
215  * Create an InflaterInputStream if such things are supported.
216  *
217  * @param stream the input stream
218  * @return a inflater stream or <code>null</code>
219  * @exception IOException
220  *
221  * @since 3.3
222  */
223 public static InflaterInputStream newInflaterInputStream(InputStream stream) {
224     return new InflaterInputStream(stream);
225 }
226
227 /**
228  * Answers whether the character is a letter.
229  *
230  * @param c the character
231  * @return true when the character is a letter
232  */
233 public static bool isLetter(dchar c) {
234     return Unicode.isLetter(c);
235 }
236
237 /**
238  * Answers whether the character is a letter or a digit.
239  *
240  * @param c the character
241  * @return true when the character is a letter or a digit
242  */
243 public static bool isLetterOrDigit(dchar c) {
244     return Unicode.isLetterOrDigit(c);
245 }
246
247 /**
248  * Answers whether the character is a Unicode space character.
249  *
250  * @param c  the character
251  * @return true when the character is a Unicode space character
252  */
253 public static bool isSpaceChar(dchar c) {
254     return Unicode.isSpace(c);
255 }
256
257 /**
258  * Answers whether the character is a whitespace character.
259  *
260  * @param c the character to test
261  * @return true if the character is whitespace
262  */
263 public static bool isWhitespace(dchar c) {
264     return Unicode.isWhitespace(c);
265 }
266
267 /**
268  * Execute a program in a separate platform process if the
269  * underlying platform support this.
270  * <p>
271  * The new process inherits the environment of the caller.
272  * </p>
273  *
274  * @param prog the name of the program to execute
275  *
276  * @exception ProcessException
277  *  if the program cannot be executed
278  */
279 public static void exec(String prog) {
280     auto proc = new Process( prog );
281     proc.execute;
282 }
283
284 /**
285  * Execute progArray[0] in a separate platform process if the
286  * underlying platform support this.
287  * <p>
288  * The new process inherits the environment of the caller.
289  * <p>
290  *
291  * @param progArray array containing the program to execute and its arguments
292  *
293  * @exception ProcessException
294  *  if the program cannot be executed
295  */
296 public static void exec(String[] progArray) {
297     auto proc = new Process( progArray );
298     proc.execute;
299 }
300
301 const ImportData[] SWTMessagesBundleData = [
302     getImportData!( "swt.internal.SWTMessages.properties" ),
303     getImportData!( "swt.internal.SWTMessages_ar.properties" ),
304     getImportData!( "swt.internal.SWTMessages_cs.properties" ),
305     getImportData!( "swt.internal.SWTMessages_da.properties" ),
306     getImportData!( "swt.internal.SWTMessages_de.properties" ),
307     getImportData!( "swt.internal.SWTMessages_el.properties" ),
308     getImportData!( "swt.internal.SWTMessages_es.properties" ),
309     getImportData!( "swt.internal.SWTMessages_fi.properties" ),
310     getImportData!( "swt.internal.SWTMessages_fr.properties" ),
311     getImportData!( "swt.internal.SWTMessages_hu.properties" ),
312     getImportData!( "swt.internal.SWTMessages_it.properties" ),
313     getImportData!( "swt.internal.SWTMessages_iw.properties" ),
314     getImportData!( "swt.internal.SWTMessages_ja.properties" ),
315     getImportData!( "swt.internal.SWTMessages_ko.properties" ),
316     getImportData!( "swt.internal.SWTMessages_nl.properties" ),
317     getImportData!( "swt.internal.SWTMessages_no.properties" ),
318     getImportData!( "swt.internal.SWTMessages_pl.properties" ),
319     getImportData!( "swt.internal.SWTMessages_pt_BR.properties" ),
320     getImportData!( "swt.internal.SWTMessages_pt.properties" ),
321     getImportData!( "swt.internal.SWTMessages_ru.properties" ),
322     getImportData!( "swt.internal.SWTMessages_sv.properties" ),
323     getImportData!( "swt.internal.SWTMessages_tr.properties" ),
324     getImportData!( "swt.internal.SWTMessages_zh_HK.properties" ),
325     getImportData!( "swt.internal.SWTMessages_zh.properties" ),
326     getImportData!( "swt.internal.SWTMessages_zh_TW.properties" )
327 ];
328
329 private static ResourceBundle msgs = null;
330
331 /**
332  * Returns the NLS'ed message for the given argument. This is only being
333  * called from DWT.
334  *
335  * @param key the key to look up
336  * @return the message for the given key
337  *
338  * @see DWT#getMessage(String)
339  */
340 public static String getMessage(String key) {
341     String answer = key;
342
343     if (key is null) {
344         DWT.error (DWT.ERROR_NULL_ARGUMENT);
345     }
346     if (msgs is null) {
347         try {
348             msgs = ResourceBundle.getBundle(SWTMessagesBundleData); //$NON-NLS-1$
349         } catch (MissingResourceException ex) {
350             answer = key ~ " (no resource bundle)"; //$NON-NLS-1$
351         }
352     }
353     if (msgs !is null) {
354         try {
355             answer = msgs.getString(key);
356         } catch (MissingResourceException ex2) {}
357     }
358     return answer;
359 }
360
361 public static String getMessage(String key, Object[] args) {
362     String answer = key;
363
364     if (key is null || args is null) {
365         DWT.error (DWT.ERROR_NULL_ARGUMENT);
366     }
367     if (msgs is null) {
368         try {
369             msgs = ResourceBundle.getBundle(SWTMessagesBundleData); //$NON-NLS-1$
370         } catch (MissingResourceException ex) {
371             answer = key ~ " (no resource bundle)"; //$NON-NLS-1$
372         }
373     }
374     if (msgs !is null) {
375         try {
376             char[] frmt = msgs.getString(key);
377             switch( args.length ){
378             case 0: answer = Format(frmt); break;
379             case 1: answer = Format(frmt, args[0]); break;
380             case 2: answer = Format(frmt, args[0], args[1]); break;
381             case 3: answer = Format(frmt, args[0], args[1], args[2]); break;
382             case 4: answer = Format(frmt, args[0], args[1], args[2], args[3]); break;
383             case 5: answer = Format(frmt, args[0], args[1], args[2], args[3], args[4]); break;
384             default:
385                 implMissing(__FILE__, __LINE__ );
386             }
387         } catch (MissingResourceException ex2) {}
388     }
389     return answer;
390 }
391
392
393 /**
394  * Interrupt the current thread.
395  * <p>
396  * Note that this is not available on CLDC.
397  * </p>
398  */
399 public static void interrupt() {
400     //PORTING_FIXME: how to implement??
401     //Thread.currentThread().interrupt();
402 }
403
404 /**
405  * Compares two instances of class String ignoring the case of the
406  * characters and answers if they are equal.
407  *
408  * @param s1 string
409  * @param s2 string
410  * @return true if the two instances of class String are equal
411  */
412 public static bool equalsIgnoreCase(String s1, String s2) {
413     String s1b = new char[ s1.length ];
414     String s2b = new char[ s1.length ];
415     scope(exit){
416         delete s1b;
417         delete s2b;
418     }
419     String s1c = Unicode.toFold( s1, s1b );
420     String s2c = Unicode.toFold( s2, s2b );
421     return s1c == s2c;
422 }
423
424 }
Note: See TracBrowser for help on using the browser.