1 /******************************************************************************
2 * Copyright (c) 2007 java2script.org 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
9 * Zhou Renjian - initial API and implementation
10 *****************************************************************************/
12 * @author zhou renjian
13 * @create March 10, 2006
16 if (window["Clazz"] == null || window["Clazz"].unloadClass == null) {
18 * Once ClassExt.js is part of Class.js.
19 * In order to make the Class.js as small as possible, part of its content
20 * is moved into this ClassExt.js.
22 * See also http://j2s.sourceforge.net/j2sclazz/
26 * Clazz.MethodNotFoundException is used to notify the developer about calling
27 * methods with incorrect parameters.
30 // Override the Clazz.MethodNotFoundException in Class.js to give details
31 Clazz.MethodNotFoundException = function (obj, clazz, method, params) {
34 paramStr = params.substring (1).replace (/\\/g, ",");
37 if (method != null && method != "construct") {
38 leadingStr = "Method";
40 leadingStr = "Constructor";
42 this.message = leadingStr + " " + Clazz.getClassName (clazz, true) + "."
43 + method + "(" + paramStr + ") is not found!";
44 this.toString = function () {
45 return "MethodNotFoundException:" + this.message;
50 * Prepare callback for instance of anonymous Class.
51 * For example for the callback:
52 * this.callbacks.MyEditor.sayHello();
54 * @param objThis the host object for callback
55 * @param args arguments object. args[0] will be classThisObj -- the "this"
58 * Attention: parameters should not be null!
61 Clazz.prepareCallback = function (objThis, args) {
62 var classThisObj = args[0];
63 var cbName = "b$"; // "callbacks";
64 if (objThis != null && classThisObj != null && classThisObj !== window) {
65 var obs = new Array ();
66 if (objThis[cbName] == null) {
67 objThis[cbName] = obs;
68 } else { // must make a copy!
69 for (var s in objThis[cbName]) {
71 obs[s] = objThis[cbName][s];
74 objThis[cbName] = obs;
76 var className = Clazz.getClassName (classThisObj, true);
77 //if (obs[className] == null) { /* == null make no sense! */
78 //obs[className] = classThisObj;
80 * TODO: the following line is SWT-specific! Try to move it out!
82 obs[className.replace (/org\.eclipse\.swt\./, "$wt.")] = classThisObj;
83 var clazz = Clazz.getClass (classThisObj);
84 while (clazz.superClazz != null) {
85 clazz = clazz.superClazz;
86 //obs[Clazz.getClassName (clazz)] = classThisObj;
88 * TODO: the following line is SWT-specific! Try to move it out!
90 obs[Clazz.getClassName (clazz, true)
91 .replace (/org\.eclipse\.swt\./, "$wt.")] = classThisObj;
94 var cbs = classThisObj[cbName];
95 if (cbs != null && cbs instanceof Array) {
103 // Shift the arguments
104 for (var i = 0; i < args.length - 1; i++) {
105 args[i] = args[i + 1];
108 // arguments will be returned!
112 * Construct instance of the given inner class.
114 * @param classInner given inner class, alway with name like "*$*"
115 * @param objThis this instance which can be used to call back.
116 * @param finalVars final variables which the inner class may use
117 * @return the constructed object
119 * @see Clazz#cloneFinals
122 Clazz.innerTypeInstance = function (clazzInner, objThis, finalVars) {
123 if (clazzInner == null) {
124 clazzInner = arguments.callee.caller;
127 /*if (arguments.length == 2) {
128 obj = new clazzInner (objThis);
129 } else */if (arguments.length == 3) {
130 obj = new clazzInner (objThis);
131 } else if (arguments.length == 4) {
132 if (objThis.__CLASS_NAME__ == clazzInner.__CLASS_NAME__
133 && arguments[3] === Clazz.inheritArgs) {
136 obj = new clazzInner (objThis, arguments[3]);
138 } else if (arguments.length == 5) {
139 obj = new clazzInner (objThis, arguments[3], arguments[4]);
140 } else if (arguments.length == 6) {
141 obj = new clazzInner (objThis, arguments[3], arguments[4],
143 } else if (arguments.length == 7) {
144 obj = new clazzInner (objThis, arguments[3], arguments[4],
145 arguments[5], arguments[6]);
146 } else if (arguments.length == 8) {
147 obj = new clazzInner (objThis, arguments[3], arguments[4],
148 arguments[5], arguments[6], arguments[7]);
149 } else if (arguments.length == 9) {
150 obj = new clazzInner (objThis, arguments[3], arguments[4],
151 arguments[5], arguments[6], arguments[7], arguments[8]);
152 } else if (arguments.length == 10) {
153 obj = new clazzInner (objThis, arguments[3], arguments[4],
154 arguments[5], arguments[6], arguments[7], arguments[8],
158 * Should construct instance manually.
160 obj = new clazzInner ();
161 if (obj.construct == null) {
162 throw new String ("No support anonymous class constructor with "
163 + "more than 7 parameters.");
165 var args = new Array ();
166 for (var i = 3; i < arguments.length; i++) {
167 args[i - 3] = arguments[i];
169 obj.construct.apply (obj, args);
171 // f$ is short for the once choosen "$finals"
172 if (finalVars != null && objThis.f$ == null) {
174 } else if (finalVars == null && objThis.f$ != null) {
176 } else if (finalVars != null && objThis.f$ != null) {
177 var o = new Object ();
178 for (var attr in objThis.f$) {
179 o[attr] = objThis.f$[attr];
181 for (var attr in finalVars) {
182 o[attr] = finalVars[attr];
187 if (finalVars != null && objThis.$finals == null) {
188 obj.$finals = finalVars;
189 } else if (finalVars == null && objThis.$finals != null) {
190 obj.$finals = objThis.$finals;
191 } else if (finalVars != null && objThis.$finals != null) {
192 var o = new Object ();
193 for (var attr in objThis.$finals) {
194 o[attr] = objThis.$finals[attr];
196 for (var attr in finalVars) {
197 o[attr] = finalVars[attr];
202 //Clazz.prepareCallback (obj, objThis);
207 * Clone variables whose modifier is "final".
208 * Usage: var o = Clazz.cloneFinals ("name", name, "age", age);
210 * @return Object with all final variables
213 Clazz.cloneFinals = function () {
214 var o = new Object ();
215 var length = arguments.length / 2;
216 for (var i = 0; i < length; i++) {
217 o[arguments[i + i]] = arguments[i + i + 1];
223 Clazz.isClassDefined = Clazz.isDefinedClass = function (clazzName) {
224 if (clazzName != null && clazzName.length != 0) {
225 if (Clazz.allClasses[clazzName]) {
228 var pkgFrags = clazzName.split (/\./);
230 for (var i = 0; i < pkgFrags.length; i++) {
232 if (Clazz.allPackage[pkgFrags[0]] == null) {
233 //error (clazzName + " / " + false);
236 pkg = Clazz.allPackage[pkgFrags[0]];
238 if (pkg[pkgFrags[i]] == null) {
239 //error (clazzName + " / " + false);
242 pkg = pkg[pkgFrags[i]]
245 //error (clazzName + " / " + (pkg != null));
246 //return pkg != null;
248 Clazz.allClasses[clazzName] = true;
254 /* consider null or empty name as non-defined class */
259 * Define the enum constant.
260 * @param classEnum enum type
261 * @param enumName enum constant
262 * @param enumOrdinal enum ordinal
263 * @param initialParams enum constant constructor parameters
264 * @return return defined enum constant
267 Clazz.defineEnumConstant = function (clazzEnum, enumName, enumOrdinal, initialParams, clazzEnumExt) {
269 if (clazzEnumExt != null) {
270 o = new clazzEnumExt ();
272 o = new clazzEnum ();
274 Clazz.superConstructor (o, clazzEnum, [enumName, enumOrdinal]);
275 if (initialParams != null && initialParams.length != 0) {
276 o.construct.apply (o, initialParams);
278 clazzEnum[enumName] = o;
279 clazzEnum.prototype[enumName] = o;
286 * @return the created Array object
289 Clazz.newArray = function () {
290 var args = arguments;
291 if (arguments.length == 1) {
292 if (arguments[0] instanceof Array) {
296 if (args.length <= 1) {
298 } else if (args.length == 2) {
300 if (typeof dim == "string") {
301 dim = dim.charCodeAt (0); // char
304 var arr = new Array (dim);
305 for (var i = 0; i < dim; i++) {
311 if (typeof dim == "string") {
312 dim = dim.charCodeAt (0); // char
314 var len = args.length - 1;
315 var xargs = new Array (len);
316 for (var i = 0; i < len; i++) {
317 xargs[i] = args[i + 1];
319 var arr = new Array (dim);
320 for (var i = 0; i < dim; i++) {
322 arr[i] = Clazz.newArray (xargs);
329 * Make the RunnableCompatiability instance as a JavaScript function.
331 * @param jsr Instance of RunnableCompatiability
332 * @return JavaScript function instance represents the method run of jsr.
335 Clazz.makeFunction = function (jsr) {
336 return function (e) {
340 if (jsr.setEvent != null) {
345 if (e != null && jsr.isReturned != null && jsr.isReturned()) {
346 // Is it correct to stopPropagation here? --Feb 19, 2006
347 e.cancelBubble = true;
348 if (e.stopPropagation) {
353 if (jsr.returnSet == 1) {
354 return jsr.returnNumber;
355 } else if (jsr.returnSet == 2) {
356 return jsr.returnBoolean;
357 } else if (jsr.returnSet == 3) {
358 return jsr.returnObject;
364 Clazz.defineStatics = function (clazz) {
365 for (var i = 0; i < (arguments.length - 1) / 2; i++) {
366 var name = arguments[i + i + 1];
367 clazz[name] = clazz.prototype[name] = arguments[i + i + 2];
372 Clazz.prepareFields = function (clazz, fieldsFun) {
373 var stacks = new Array ();
374 if (clazz.con$truct != null) {
375 var ss = clazz.con$truct.stacks;
376 var idx = clazz.con$truct.index;
377 for (var i = idx; i < ss.length; i++) {
381 clazz.con$truct = clazz.prototype.con$truct = function () {
382 var stacks = arguments.callee.stacks;
383 if (stacks != null) {
384 for (var i = 0; i < stacks.length; i++) {
385 stacks[i].apply (this, []);
389 stacks[stacks.length] = fieldsFun;
390 clazz.con$truct.stacks = stacks;
391 clazz.con$truct.index = 0;
395 * Serialize those public or protected fields in class
396 * net.sf.j2s.ajax.SimpleSerializable.
399 Clazz.registerSerializableFields = function (clazz) {
400 var args = arguments;
401 var length = args.length;
402 var newArr = new Array ();
403 if (clazz.declared$Fields != null) {
404 for (var i = 0; i < clazz.declared$Fields.length; i++) {
405 newArr[i] = clazz.declared$Fields[i];
408 clazz.declared$Fields = newArr;
410 if (length > 0 && length % 2 == 1) {
411 var fs = clazz.declared$Fields;
412 for (var i = 1; i <= (length - 1) / 2; i++) {
413 var o = { name : args[i + i - 1], type : args[i + i] };
415 for (var j = 0; j < fs.length; j++) {
416 if (fs[j].name == o.name) { // reloaded classes
417 fs[j].type = o.type; // update type
430 * Get the caller method for those methods that are wrapped by
431 * Clazz.searchAndExecuteMethod.
433 * @param args caller method's arguments
434 * @return caller method, null if there is not wrapped by
435 * Clazz.searchAndExecuteMethod or is called directly.
438 /*-# getMixedCallerMethod -> gMCM #-*/
439 Clazz.getMixedCallerMethod = function (args) {
440 var o = new Object ();
441 var argc = args.callee.caller; // Clazz.tryToSearchAndExecute
442 if (argc == null) return null;
443 if (argc !== Clazz.tryToSearchAndExecute) { // inherited method's apply
444 argc = argc.arguments.callee.caller;
445 if (argc == null) return null;
447 if (argc !== Clazz.tryToSearchAndExecute) return null;
448 argc = argc.arguments.callee.caller; // Clazz.searchAndExecuteMethod
449 if (argc == null || argc !== Clazz.searchAndExecuteMethod) return null;
450 o.claxxRef = argc.arguments[1];
451 o.fxName = argc.arguments[2];
452 o.paramTypes = Clazz.getParamsType (argc.arguments[3]);
453 argc = argc.arguments.callee.caller; // Clazz.generateDelegatingMethod
454 if (argc == null) return null;
455 argc = argc.arguments.callee.caller; // the private method's caller
456 if (argc == null) return null;
462 * Check and return super private method.
463 * In order make private methods be executed correctly, some extra javascript
464 * must be inserted into the beggining of the method body of the non-private
465 * methods that with the same method signature as following:
467 * var $private = Clazz.checkPrivateMethod (arguments);
468 * if ($private != null) {
469 * return $private.apply (this, arguments);
472 * Be cautious about this. The above codes should be insert by Java2Script
473 * compiler or with double checks to make sure things work correctly.
475 * @param args caller method's arguments
476 * @return private method if there are private method fitted for the current
477 * calling environment
480 Clazz.checkPrivateMethod = function (args) {
481 var m = Clazz.getMixedCallerMethod (args);
482 if (m == null) return null;
483 var callerFx = m.claxxRef.prototype[m.caller.exName];
484 if (callerFx == null) return null; // may not be in the class hierarchies
486 if (callerFx.claxxOwner != null) {
487 ppFun = callerFx.claxxOwner.prototype[m.fxName];
489 var stacks = callerFx.stacks;
490 for (var i = stacks.length - 1; i >= 0; i--) {
491 var fx = stacks[i].prototype[m.caller.exName];
492 if (fx === m.caller) {
493 ppFun = stacks[i].prototype[m.fxName];
494 } else if (fx != null) {
496 if (fn.indexOf ('\\') == 0 && fx[fn] === m.caller) {
497 ppFun = stacks[i].prototype[m.fxName];
507 if (ppFun != null && ppFun.claxxOwner == null) {
508 ppFun = ppFun["\\" + m.paramTypes];
510 if (ppFun != null && ppFun.isPrivate && ppFun !== args.callee) {
515 var $fz = null; // for private method declaration
518 /*-# cla$$$tack -> cst #-*/
519 Clazz.cla$$$tack = new Array ();
520 Clazz.pu$h = function () {
521 if (c$ != null) { // if (cla$$ != null) {
522 Clazz.cla$$$tack[Clazz.cla$$$tack.length] = c$; // cla$$;
525 Clazz.p0p = function () {
526 if (Clazz.cla$$$tack.length > 0) {
527 var clazz = Clazz.cla$$$tack[Clazz.cla$$$tack.length - 1];
528 Clazz.cla$$$tack.length--;
535 /*# {$no.debug.support} >>x #*/
537 * Option to switch on/off of stack traces.
540 Clazz.tracingCalling = false;
543 * Use to mark that the Throwable instance is created or not.
546 Clazz.initializingException = false;
549 Clazz.callingStack = function (caller, owner) {
550 this.caller = caller;
553 Clazz.callingStackTraces = new Array ();
554 Clazz.pu$hCalling = function (stack) {
555 Clazz.callingStackTraces[Clazz.callingStackTraces.length] = stack;
557 Clazz.p0pCalling = function () {
558 var length = Clazz.callingStackTraces.length;
560 var stack = Clazz.callingStackTraces[length - 1];
561 Clazz.callingStackTraces.length--;
570 * The first folder is considered as the primary folder.
571 * And try to be compatiable with ClazzLoader system.
574 if (window["ClazzLoader"] != null && ClazzLoader.binaryFolders != null) {
575 Clazz.binaryFolders = ClazzLoader.binaryFolders;
577 Clazz.binaryFolders = ["bin/", "", "j2slib/"];
580 Clazz.addBinaryFolder = function (bin) {
582 var bins = Clazz.binaryFolders;
583 for (var i = 0; i < bins.length; i++) {
584 if (bins[i] == bin) {
588 bins[bins.length] = bin;
591 Clazz.removeBinaryFolder = function (bin) {
593 var bins = Clazz.binaryFolders;
594 for (var i = 0; i < bins.length; i++) {
595 if (bins[i] == bin) {
596 for (var j = i; j < bins.length - 1; j++) {
597 bins[j] = bins[j + 1];
606 Clazz.setPrimaryFolder = function (bin) {
608 Clazz.removeBinaryFolder (bin);
609 var bins = Clazz.binaryFolders;
610 for (var i = bins.length - 1; i >= 0; i--) {
611 bins[i + 1] = bins[i];
618 * This is a simple implementation for Clazz#load. It just ignore dependencies
619 * of the class. This will be fine for jar *.z.js file.
620 * It will be overriden by ClazzLoader#load.
621 * For more details, see ClazzLoader.js
624 Clazz.load = function (musts, clazz, optionals, declaration) {
625 if (declaration != null) {
631 * Invade the Object prototype!
632 * TODO: make sure that invading Object prototype does not affect other
633 * existed library, such as Dojo, YUI, Prototype, ...
635 java.lang.Object = Clazz._O;
637 JavaObject.getName = Clazz.innerFunctions.getName;
639 w$ = window; // Short for browser's window object
640 d$ = document; // Short for browser's document object
642 currentTimeMillis : function () {
643 return new Date ().getTime ();
645 props : null, //new java.util.Properties (),
646 getProperties : function () {
649 setProperties : function (props) {
650 System.props = props;
652 getProperty : function (key, def) {
653 if (System.props != null) {
654 return System.props.getProperty (key, def);
661 setProperty : function (key, val) {
662 if (System.props == null) {
665 System.props.setProperty (key, val);
667 currentTimeMillis : function () {
668 return new Date ().getTime ();
670 arraycopy : function (src, srcPos, dest, destPos, length) {
672 for (var i = 0; i < length; i++) {
673 dest[destPos + i] = src[srcPos + i];
677 for (var i = 0; i < length; i++) {
678 swap[i] = src[srcPos + i];
680 for (var i = 0; i < length; i++) {
681 dest[destPos + i] = swap[i];
686 System.out = new Clazz._O ();
687 System.out.__CLASS_NAME__ = "java.io.PrintStream";
688 System.out.print = function () {};
689 System.out.printf = function () {};
690 System.out.println = function () {};
692 System.err = new Clazz._O ();
693 System.err.__CLASS_NAME__ = "java.io.PrintStream";
694 System.err.print = function () {};
695 System.err.printf = function () {};
696 System.err.println = function () {};
698 popup = assert = log = error = window.alert;
700 Thread = function () {};
701 Thread.J2S_THREAD = Thread.prototype.J2S_THREAD = new Thread ();
702 Thread.currentThread = Thread.prototype.currentThread = function () {
703 return this.J2S_THREAD;
707 Clazz.intCast = function (n) { // 32bit
708 var b1 = (n & 0xff000000) >> 24;
709 var b2 = (n & 0xff0000) >> 16;
710 var b3 = (n & 0xff00) >> 8;
712 if ((b1 & 0x80) != 0) {
713 return -(((b1 & 0x7f) << 24) + (b2 << 16) + (b3 << 8) + b4 + 1);
715 return (b1 << 24) + (b2 << 16) + (b3 << 8) + b4;
720 Clazz.shortCast = function (s) { // 16bit
721 var b1 = (n & 0xff00) >> 8;
723 if ((b1 & 0x80) != 0) {
724 return -(((b1 & 0x7f) << 8) + b2 + 1);
726 return (b1 << 8) + b4;
731 Clazz.byteCast = function (b) { // 8bit
732 if ((b & 0x80) != 0) {
733 return -((b & 0x7f) + 1);
740 Clazz.charCast = function (c) { // 8bit
741 return String.fromCharCode (c & 0xff).charAt (0);
745 * Warning: Unsafe conversion!
748 Clazz.floatCast = function (f) { // 32bit
753 * Try to fix JavaScript's shift operator defects on long type numbers.
756 Clazz.longMasks = [];
758 Clazz.longReverseMasks = [];
764 for (var i = 1; i < 53; i++) {
765 arr[i] = arr[i - 1] + arr[i - 1]; // * 2 or << 1
767 Clazz.longBits = arr;
768 Clazz.longMasks[52] = arr[52];
769 for (var i = 51; i >= 0; i--) {
770 Clazz.longMasks[i] = Clazz.longMasks[i + 1] + arr[i];
772 Clazz.longReverseMasks[0] = arr[0];
773 for (var i = 1; i < 52; i++) {
774 Clazz.longReverseMasks[i] = Clazz.longReverseMasks[i - 1] + arr[i];
779 Clazz.longLeftShift = function (l, o) { // 64bit
780 if (o == 0) return l;
781 if (o >= 64) return 0;
783 error ("[Java2Script] Error : JavaScript does not support long shift!");
786 if ((l & Clazz.longMasks[o - 1]) != 0) {
787 error ("[Java2Script] Error : Such shift operator results in wrong calculation!");
790 var high = l & Clazz.longMasks[52 - 32 + o];
792 return high * Clazz.longBits[o] + (l & Clazz.longReverseMasks[32 - o]) << 0;
799 Clazz.intLeftShift = function (n, o) { // 32bit
800 return (n << o) & 0xffffffff;
804 Clazz.longRightShift = function (l, o) { // 64bit
805 if ((l & Clazz.longMasks[52 - 32]) != 0) {
806 return Math.round((l & Clazz.longMasks[52 - 32]) / Clazz.longBits[32 - o]) + (l & Clazz.longReverseMasks[o]) >> o;
813 Clazz.intRightShift = function (n, o) { // 32bit
814 return n >> o; // no needs for this shifting wrapper
818 Clazz.long0RightShift = function (l, o) { // 64bit
823 Clazz.int0RightShift = function (n, o) { // 64bit
824 return n >>> o; // no needs for this shifting wrapper
827 // Compress the common public API method in shorter name
828 $_L=Clazz.load;$_W=Clazz.declareAnonymous;$_T=Clazz.declareType;$_J=Clazz.declarePackage;$_C=Clazz.decorateAsClass;$_Z=Clazz.instantialize;$_I=Clazz.declareInterface;$_D=Clazz.isClassDefined;$_H=Clazz.pu$h;$_P=Clazz.p0p;$_B=Clazz.prepareCallback;$_N=Clazz.innerTypeInstance;$_K=Clazz.makeConstructor;$_U=Clazz.superCall;$_R=Clazz.superConstructor;$_M=Clazz.defineMethod;$_V=Clazz.overrideMethod;$_S=Clazz.defineStatics;$_E=Clazz.defineEnumConstant;$_F=Clazz.cloneFinals;$_Y=Clazz.prepareFields;$_A=Clazz.newArray;$_O=Clazz.instanceOf;$_G=Clazz.inheritArgs;$_X=Clazz.checkPrivateMethod;$_Q=Clazz.makeFunction;$_s=Clazz.registerSerializableFields;
831 var reflect = Clazz.declarePackage ("java.lang.reflect");
832 Clazz.declarePackage ("java.security");
834 Clazz.innerFunctionNames = Clazz.innerFunctionNames.concat (["getSuperclass",
835 "isAssignableFrom", "getMethods", "getMethod", "getDeclaredMethods",
836 "getDeclaredMethod", "getConstructor", "getModifiers", "isArray", "newInstance"]);
838 Clazz.innerFunctions.getSuperclass = function () {
839 return this.superClazz;
841 Clazz.innerFunctions.isAssignableFrom = function (clazz) {
842 return Clazz.getInheritedLevel (clazz, this) >= 0;
844 Clazz.innerFunctions.getConstructor = function () {
845 return new java.lang.reflect.Constructor (this, [], [],
846 java.lang.reflect.Modifier.PUBLIC);
849 * TODO: fix bug for polymorphic methods!
851 Clazz.innerFunctions.getDeclaredMethods = Clazz.innerFunctions.getMethods = function () {
852 var ms = new Array ();
853 var p = this.prototype;
854 for (var attr in p) {
855 if (typeof p[attr] == "function" && p[attr].__CLASS_NAME__ == null) {
856 /* there are polynormical methods. */
857 ms[ms.length] = new java.lang.reflect.Method (this, attr,
858 [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC);
862 for (var attr in p) {
863 if (typeof p[attr] == "function" && p[attr].__CLASS_NAME__ == null) {
864 ms[ms.length] = new java.lang.reflect.Method (this, attr,
865 [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC
866 | java.lang.reflect.Modifier.STATIC);
871 Clazz.innerFunctions.getDeclaredMethod = Clazz.innerFunctions.getMethod = function (name, clazzes) {
872 var p = this.prototype;
873 for (var attr in p) {
874 if (name == attr && typeof p[attr] == "function"
875 && p[attr].__CLASS_NAME__ == null) {
876 /* there are polynormical methods. */
877 return new java.lang.reflect.Method (this, attr,
878 [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC);
882 for (var attr in p) {
883 if (name == attr && typeof p[attr] == "function"
884 && p[attr].__CLASS_NAME__ == null) {
885 return new java.lang.reflect.Method (this, attr,
886 [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC
887 | java.lang.reflect.Modifier.STATIC);
892 Clazz.innerFunctions.getModifiers = function () {
893 return java.lang.reflect.Modifier.PUBLIC;
895 Clazz.innerFunctions.isArray = function () {
898 Clazz.innerFunctions.newInstance = function () {
903 //Object.newInstance = Clazz.innerFunctions.newInstance;
905 var inF = Clazz.innerFunctionNames;
906 for (var i = 0; i < inF.length; i++) {
907 JavaObject[inF[i]] = Clazz.innerFunctions[inF[i]];
908 Array[inF[i]] = Clazz.innerFunctions[inF[i]];
910 Array["isArray"] = function () {
916 Clazz.forName = function (clazzName) {
917 if (Clazz.isClassDefined (clazzName)) {
918 return Clazz.evalType (clazzName);
920 if (window["ClazzLoader"] != null) {
921 ClazzLoader.setLoadingMode ("xhr.sync");
922 ClazzLoader.loadClass (clazzName);
923 return Clazz.evalType (clazzName);
925 alert ("[Java2Script] Error: No ClassLoader!");
929 /* For hotspot and unloading */
932 Clazz.cleanDelegateMethod = function (m) {
933 if (m == null) return;
934 if (typeof m == "function" && m.lastMethod != null
935 && m.lastParams != null && m.lastClaxxRef != null) {
938 m.lastClaxxRef = null;
943 Clazz.unloadClass = function (qClazzName) {
944 var cc = Clazz.evalType (qClazzName);
946 Clazz.unloadedClasses[qClazzName] = cc;
947 var clazzName = qClazzName;
948 var pkgFrags = clazzName.split (/\./);
950 for (var i = 0; i < pkgFrags.length - 1; i++) {
952 pkg = Clazz.allPackage[pkgFrags[0]];
954 pkg = pkg[pkgFrags[i]]
958 Clazz.allPackage[pkgFrags[0]] = null;
959 window[pkgFrags[0]] = null;
960 // also try to unload inner or anonymous classes
961 for (var c in window) {
962 if (c.indexOf (qClazzName + "$") == 0) {
963 Clazz.unloadClass (c);
968 pkg[pkgFrags[pkgFrags.length - 1]] = null;
969 // also try to unload inner or anonymous classes
971 if (c.indexOf (pkgFrags[pkgFrags.length - 1] + "$") == 0) {
972 Clazz.unloadClass (pkg.__PKG_NAME__ + "." + c);
978 if (Clazz.allClasses[qClazzName] == true) {
979 Clazz.allClasses[qClazzName] = false;
980 // also try to unload inner or anonymous classes
981 for (var c in Clazz.allClasses) {
982 if (c.indexOf (qClazzName + "$") == 0) {
983 Clazz.allClasses[c] = false;
989 Clazz.cleanDelegateMethod (cc[m]);
991 for (var m in cc.prototype) {
992 Clazz.cleanDelegateMethod (cc.prototype[m]);
995 if (window["ClazzLoader"] != null) {
996 ClazzLoader.unloadClassExt (qClazzName);
1004 //written by Dean Edwards, 2005
1005 //with input from Tino Zijdel, Matthias Miller, Diego Perini
1007 //http://dean.edwards.name/weblog/2005/10/add-event/
1009 // Merge Dean Edwards' addEvent for Java2Script
1011 Clazz.addEvent = function (element, type, handler) {
1012 if (element.addEventListener) {
1013 element.addEventListener(type, handler, false);
1015 // assign each event handler a unique ID
1016 if (!handler.$$guid) handler.$$guid = Clazz.addEvent.guid++;
1017 // create a hash table of event types for the element
1018 if (!element.events) element.events = {};
1019 // create a hash table of event handlers for each element/event pair
1020 var handlers = element.events[type];
1022 handlers = element.events[type] = {};
1023 // store the existing event handler (if there is one)
1024 if (element["on" + type]) {
1025 handlers[0] = element["on" + type];
1028 // store the event handler in the hash table
1029 handlers[handler.$$guid] = handler;
1030 // assign a global event handler to do all the work
1031 element["on" + type] = Clazz.handleEvent;
1035 //a counter used to create unique IDs
1036 Clazz.addEvent.guid = 1;
1039 Clazz.removeEvent = function (element, type, handler) {
1040 if (element.removeEventListener) {
1041 element.removeEventListener(type, handler, false);
1043 // delete the event handler from the hash table
1044 if (element.events && element.events[type]) {
1045 delete element.events[type][handler.$$guid];
1051 Clazz.isVeryOldIE = navigator.userAgent.indexOf("MSIE 6.0") != -1 || navigator.userAgent.indexOf("MSIE 5.5") != -1 || navigator.userAgent.indexOf("MSIE 5.0") != -1;
1054 Clazz.handleEvent = function (event) {
1055 var returnValue = true;
1056 // grab the event object (IE uses a global event object)
1057 if (!Clazz.isVeryOldIE) {
1058 event = event || Clazz.fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
1059 } else { // The above line is buggy in IE 6.0
1060 if (event == null) {
1063 var pWindow = (this.ownerDocument || this.document || this).parentWindow;
1064 if (pWindow != null) {
1065 evt = pWindow.event;
1070 event = Clazz.fixEvent(evt);
1073 // get a reference to the hash table of event handlers
1074 var handlers = this.events[event.type];
1075 // execute each event handler
1076 for (var i in handlers) {
1080 this.$$handleEvent = handlers[i];
1081 if (typeof this.$$handleEvent != "function") {
1084 if (this.$$handleEvent(event) === false) {
1085 returnValue = false;
1092 Clazz.fixEvent = function (event) {
1093 // add W3C standard event methods
1094 event.preventDefault = Clazz.fixEvent.preventDefault;
1095 event.stopPropagation = Clazz.fixEvent.stopPropagation;
1098 Clazz.fixEvent.preventDefault = function() {
1099 this.returnValue = false;
1101 Clazz.fixEvent.stopPropagation = function() {
1102 this.cancelBubble = true;