/****************************************************************************** * Copyright (c) 2007 java2script.org 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: * Zhou Renjian - initial API and implementation *****************************************************************************/ /******* * @author zhou renjian * @create March 10, 2006 *******/ if (window["Clazz"] == null || window["Clazz"].unloadClass == null) { /** * Once ClassExt.js is part of Class.js. * In order to make the Class.js as small as possible, part of its content * is moved into this ClassExt.js. * * See also http://j2s.sourceforge.net/j2sclazz/ */ /** * Clazz.MethodNotFoundException is used to notify the developer about calling * methods with incorrect parameters. */ /* protected */ // Override the Clazz.MethodNotFoundException in Class.js to give details Clazz.MethodNotFoundException = function (obj, clazz, method, params) { var paramStr = ""; if (params != null) { paramStr = params.substring (1).replace (/\\/g, ","); } var leadingStr = ""; if (method != null && method != "construct") { leadingStr = "Method"; } else { leadingStr = "Constructor"; } this.message = leadingStr + " " + Clazz.getClassName (clazz, true) + "." + method + "(" + paramStr + ") is not found!"; this.toString = function () { return "MethodNotFoundException:" + this.message; } }; /** * Prepare callback for instance of anonymous Class. * For example for the callback: * this.callbacks.MyEditor.sayHello(); * * @param objThis the host object for callback * @param args arguments object. args[0] will be classThisObj -- the "this" * object to be hooked * * Attention: parameters should not be null! */ /* protected */ Clazz.prepareCallback = function (objThis, args) { var classThisObj = args[0]; var cbName = "b$"; // "callbacks"; if (objThis != null && classThisObj != null && classThisObj !== window) { var obs = new Array (); if (objThis[cbName] == null) { objThis[cbName] = obs; } else { // must make a copy! for (var s in objThis[cbName]) { if (s != "length") { obs[s] = objThis[cbName][s]; } } objThis[cbName] = obs; } var className = Clazz.getClassName (classThisObj, true); //if (obs[className] == null) { /* == null make no sense! */ //obs[className] = classThisObj; /* * TODO: the following line is SWT-specific! Try to move it out! */ obs[className.replace (/org\.eclipse\.swt\./, "$wt.")] = classThisObj; var clazz = Clazz.getClass (classThisObj); while (clazz.superClazz != null) { clazz = clazz.superClazz; //obs[Clazz.getClassName (clazz)] = classThisObj; /* * TODO: the following line is SWT-specific! Try to move it out! */ obs[Clazz.getClassName (clazz, true) .replace (/org\.eclipse\.swt\./, "$wt.")] = classThisObj; } //} var cbs = classThisObj[cbName]; if (cbs != null && cbs instanceof Array) { for (var s in cbs) { if (s != "length") { obs[s] = cbs[s]; } } } } // Shift the arguments for (var i = 0; i < args.length - 1; i++) { args[i] = args[i + 1]; } args.length--; // arguments will be returned! }; /** * Construct instance of the given inner class. * * @param classInner given inner class, alway with name like "*$*" * @param objThis this instance which can be used to call back. * @param finalVars final variables which the inner class may use * @return the constructed object * * @see Clazz#cloneFinals */ /* public */ Clazz.innerTypeInstance = function (clazzInner, objThis, finalVars) { if (clazzInner == null) { clazzInner = arguments.callee.caller; } var obj = null; /*if (arguments.length == 2) { obj = new clazzInner (objThis); } else */if (arguments.length == 3) { obj = new clazzInner (objThis); } else if (arguments.length == 4) { if (objThis.__CLASS_NAME__ == clazzInner.__CLASS_NAME__ && arguments[3] === Clazz.inheritArgs) { obj = objThis; } else { obj = new clazzInner (objThis, arguments[3]); } } else if (arguments.length == 5) { obj = new clazzInner (objThis, arguments[3], arguments[4]); } else if (arguments.length == 6) { obj = new clazzInner (objThis, arguments[3], arguments[4], arguments[5]); } else if (arguments.length == 7) { obj = new clazzInner (objThis, arguments[3], arguments[4], arguments[5], arguments[6]); } else if (arguments.length == 8) { obj = new clazzInner (objThis, arguments[3], arguments[4], arguments[5], arguments[6], arguments[7]); } else if (arguments.length == 9) { obj = new clazzInner (objThis, arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8]); } else if (arguments.length == 10) { obj = new clazzInner (objThis, arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9]); } else { /* * Should construct instance manually. */ obj = new clazzInner (); if (obj.construct == null) { throw new String ("No support anonymous class constructor with " + "more than 7 parameters."); } var args = new Array (); for (var i = 3; i < arguments.length; i++) { args[i - 3] = arguments[i]; } obj.construct.apply (obj, args); } // f$ is short for the once choosen "$finals" if (finalVars != null && objThis.f$ == null) { obj.f$ = finalVars; } else if (finalVars == null && objThis.f$ != null) { obj.f$ = objThis.f$; } else if (finalVars != null && objThis.f$ != null) { var o = new Object (); for (var attr in objThis.f$) { o[attr] = objThis.f$[attr]; } for (var attr in finalVars) { o[attr] = finalVars[attr]; } obj.f$ = o; } /* if (finalVars != null && objThis.$finals == null) { obj.$finals = finalVars; } else if (finalVars == null && objThis.$finals != null) { obj.$finals = objThis.$finals; } else if (finalVars != null && objThis.$finals != null) { var o = new Object (); for (var attr in objThis.$finals) { o[attr] = objThis.$finals[attr]; } for (var attr in finalVars) { o[attr] = finalVars[attr]; } obj.$finals = o; } */ //Clazz.prepareCallback (obj, objThis); return obj; }; /** * Clone variables whose modifier is "final". * Usage: var o = Clazz.cloneFinals ("name", name, "age", age); * * @return Object with all final variables */ /* protected */ Clazz.cloneFinals = function () { var o = new Object (); var length = arguments.length / 2; for (var i = 0; i < length; i++) { o[arguments[i + i]] = arguments[i + i + 1]; } return o; }; /* public */ Clazz.isClassDefined = Clazz.isDefinedClass = function (clazzName) { if (clazzName != null && clazzName.length != 0) { if (Clazz.allClasses[clazzName]) { return true; } var pkgFrags = clazzName.split (/\./); var pkg = null; for (var i = 0; i < pkgFrags.length; i++) { if (pkg == null) { if (Clazz.allPackage[pkgFrags[0]] == null) { //error (clazzName + " / " + false); return false; } pkg = Clazz.allPackage[pkgFrags[0]]; } else { if (pkg[pkgFrags[i]] == null) { //error (clazzName + " / " + false); return false; } pkg = pkg[pkgFrags[i]] } } //error (clazzName + " / " + (pkg != null)); //return pkg != null; if (pkg != null) { Clazz.allClasses[clazzName] = true; return true; } else { return false; } } else { /* consider null or empty name as non-defined class */ return false; } }; /** * Define the enum constant. * @param classEnum enum type * @param enumName enum constant * @param enumOrdinal enum ordinal * @param initialParams enum constant constructor parameters * @return return defined enum constant */ /* public */ Clazz.defineEnumConstant = function (clazzEnum, enumName, enumOrdinal, initialParams, clazzEnumExt) { var o = null; if (clazzEnumExt != null) { o = new clazzEnumExt (); } else { o = new clazzEnum (); } Clazz.superConstructor (o, clazzEnum, [enumName, enumOrdinal]); if (initialParams != null && initialParams.length != 0) { o.construct.apply (o, initialParams); } clazzEnum[enumName] = o; clazzEnum.prototype[enumName] = o; return o; }; /** * Make arrays. * * @return the created Array object */ /* public */ Clazz.newArray = function () { var args = arguments; if (arguments.length == 1) { if (arguments[0] instanceof Array) { args = arguments[0]; } } if (args.length <= 1) { return new Array (); } else if (args.length == 2) { var dim = args[0]; if (typeof dim == "string") { dim = dim.charCodeAt (0); // char } var val = args[1]; var arr = new Array (dim); for (var i = 0; i < dim; i++) { arr[i] = val; } return arr; } else { var dim = args[0]; if (typeof dim == "string") { dim = dim.charCodeAt (0); // char } var len = args.length - 1; var xargs = new Array (len); for (var i = 0; i < len; i++) { xargs[i] = args[i + 1]; } var arr = new Array (dim); for (var i = 0; i < dim; i++) { // Call recursively! arr[i] = Clazz.newArray (xargs); } return arr; } }; /** * Make the RunnableCompatiability instance as a JavaScript function. * * @param jsr Instance of RunnableCompatiability * @return JavaScript function instance represents the method run of jsr. */ /* public */ Clazz.makeFunction = function (jsr) { return function (e) { if (e == null) { e = window.event; } if (jsr.setEvent != null) { jsr.setEvent (e); } jsr.run (); /* if (e != null && jsr.isReturned != null && jsr.isReturned()) { // Is it correct to stopPropagation here? --Feb 19, 2006 e.cancelBubble = true; if (e.stopPropagation) { e.stopPropagation(); } } */ if (jsr.returnSet == 1) { return jsr.returnNumber; } else if (jsr.returnSet == 2) { return jsr.returnBoolean; } else if (jsr.returnSet == 3) { return jsr.returnObject; } }; }; /* protected */ Clazz.defineStatics = function (clazz) { for (var i = 0; i < (arguments.length - 1) / 2; i++) { var name = arguments[i + i + 1]; clazz[name] = clazz.prototype[name] = arguments[i + i + 2]; } }; /* protected */ Clazz.prepareFields = function (clazz, fieldsFun) { var stacks = new Array (); if (clazz.con$truct != null) { var ss = clazz.con$truct.stacks; var idx = clazz.con$truct.index; for (var i = idx; i < ss.length; i++) { stacks[i] = ss[i]; } } clazz.con$truct = clazz.prototype.con$truct = function () { var stacks = arguments.callee.stacks; if (stacks != null) { for (var i = 0; i < stacks.length; i++) { stacks[i].apply (this, []); } } }; stacks[stacks.length] = fieldsFun; clazz.con$truct.stacks = stacks; clazz.con$truct.index = 0; }; /* * Serialize those public or protected fields in class * net.sf.j2s.ajax.SimpleSerializable. */ /* protected */ Clazz.registerSerializableFields = function (clazz) { var args = arguments; var length = args.length; var newArr = new Array (); if (clazz.declared$Fields != null) { for (var i = 0; i < clazz.declared$Fields.length; i++) { newArr[i] = clazz.declared$Fields[i]; } } clazz.declared$Fields = newArr; if (length > 0 && length % 2 == 1) { var fs = clazz.declared$Fields; for (var i = 1; i <= (length - 1) / 2; i++) { var o = { name : args[i + i - 1], type : args[i + i] }; var existed = false; for (var j = 0; j < fs.length; j++) { if (fs[j].name == o.name) { // reloaded classes fs[j].type = o.type; // update type existed = true; break; } } if (!existed) { fs[fs.length] = o; } } } }; /* * Get the caller method for those methods that are wrapped by * Clazz.searchAndExecuteMethod. * * @param args caller method's arguments * @return caller method, null if there is not wrapped by * Clazz.searchAndExecuteMethod or is called directly. */ /* protected */ /*-# getMixedCallerMethod -> gMCM #-*/ Clazz.getMixedCallerMethod = function (args) { var o = new Object (); var argc = args.callee.caller; // Clazz.tryToSearchAndExecute if (argc == null) return null; if (argc !== Clazz.tryToSearchAndExecute) { // inherited method's apply argc = argc.arguments.callee.caller; if (argc == null) return null; } if (argc !== Clazz.tryToSearchAndExecute) return null; argc = argc.arguments.callee.caller; // Clazz.searchAndExecuteMethod if (argc == null || argc !== Clazz.searchAndExecuteMethod) return null; o.claxxRef = argc.arguments[1]; o.fxName = argc.arguments[2]; o.paramTypes = Clazz.getParamsType (argc.arguments[3]); argc = argc.arguments.callee.caller; // Clazz.generateDelegatingMethod if (argc == null) return null; argc = argc.arguments.callee.caller; // the private method's caller if (argc == null) return null; o.caller = argc; return o; }; /* * Check and return super private method. * In order make private methods be executed correctly, some extra javascript * must be inserted into the beggining of the method body of the non-private * methods that with the same method signature as following: * * var $private = Clazz.checkPrivateMethod (arguments); * if ($private != null) { * return $private.apply (this, arguments); * } * * Be cautious about this. The above codes should be insert by Java2Script * compiler or with double checks to make sure things work correctly. * * @param args caller method's arguments * @return private method if there are private method fitted for the current * calling environment */ /* public */ Clazz.checkPrivateMethod = function (args) { var m = Clazz.getMixedCallerMethod (args); if (m == null) return null; var callerFx = m.claxxRef.prototype[m.caller.exName]; if (callerFx == null) return null; // may not be in the class hierarchies var ppFun = null; if (callerFx.claxxOwner != null) { ppFun = callerFx.claxxOwner.prototype[m.fxName]; } else { var stacks = callerFx.stacks; for (var i = stacks.length - 1; i >= 0; i--) { var fx = stacks[i].prototype[m.caller.exName]; if (fx === m.caller) { ppFun = stacks[i].prototype[m.fxName]; } else if (fx != null) { for (var fn in fx) { if (fn.indexOf ('\\') == 0 && fx[fn] === m.caller) { ppFun = stacks[i].prototype[m.fxName]; break; } } } if (ppFun != null) { break; } } } if (ppFun != null && ppFun.claxxOwner == null) { ppFun = ppFun["\\" + m.paramTypes]; } if (ppFun != null && ppFun.isPrivate && ppFun !== args.callee) { return ppFun; } return null; }; var $fz = null; // for private method declaration //var cla$$ = null; var c$ = null; /*-# cla$$$tack -> cst #-*/ Clazz.cla$$$tack = new Array (); Clazz.pu$h = function () { if (c$ != null) { // if (cla$$ != null) { Clazz.cla$$$tack[Clazz.cla$$$tack.length] = c$; // cla$$; } }; Clazz.p0p = function () { if (Clazz.cla$$$tack.length > 0) { var clazz = Clazz.cla$$$tack[Clazz.cla$$$tack.length - 1]; Clazz.cla$$$tack.length--; return clazz; } else { return null; } }; /*# {$no.debug.support} >>x #*/ /* * Option to switch on/off of stack traces. */ /* protect */ Clazz.tracingCalling = false; /* * Use to mark that the Throwable instance is created or not. */ /* private */ Clazz.initializingException = false; /* private */ Clazz.callingStack = function (caller, owner) { this.caller = caller; this.owner = owner; }; Clazz.callingStackTraces = new Array (); Clazz.pu$hCalling = function (stack) { Clazz.callingStackTraces[Clazz.callingStackTraces.length] = stack; }; Clazz.p0pCalling = function () { var length = Clazz.callingStackTraces.length; if (length > 0) { var stack = Clazz.callingStackTraces[length - 1]; Clazz.callingStackTraces.length--; return stack; } else { return null; } }; /*# x<< #*/ /** * The first folder is considered as the primary folder. * And try to be compatiable with ClazzLoader system. */ /* private */ if (window["ClazzLoader"] != null && ClazzLoader.binaryFolders != null) { Clazz.binaryFolders = ClazzLoader.binaryFolders; } else { Clazz.binaryFolders = ["bin/", "", "j2slib/"]; } Clazz.addBinaryFolder = function (bin) { if (bin != null) { var bins = Clazz.binaryFolders; for (var i = 0; i < bins.length; i++) { if (bins[i] == bin) { return ; } } bins[bins.length] = bin; } }; Clazz.removeBinaryFolder = function (bin) { if (bin != null) { var bins = Clazz.binaryFolders; for (var i = 0; i < bins.length; i++) { if (bins[i] == bin) { for (var j = i; j < bins.length - 1; j++) { bins[j] = bins[j + 1]; } bins.length--; return bin; } } } return null; }; Clazz.setPrimaryFolder = function (bin) { if (bin != null) { Clazz.removeBinaryFolder (bin); var bins = Clazz.binaryFolders; for (var i = bins.length - 1; i >= 0; i--) { bins[i + 1] = bins[i]; } bins[0] = bin; } }; /** * This is a simple implementation for Clazz#load. It just ignore dependencies * of the class. This will be fine for jar *.z.js file. * It will be overriden by ClazzLoader#load. * For more details, see ClazzLoader.js */ /* protected */ Clazz.load = function (musts, clazz, optionals, declaration) { if (declaration != null) { declaration (); } }; /* * Invade the Object prototype! * TODO: make sure that invading Object prototype does not affect other * existed library, such as Dojo, YUI, Prototype, ... */ java.lang.Object = Clazz._O; JavaObject.getName = Clazz.innerFunctions.getName; w$ = window; // Short for browser's window object d$ = document; // Short for browser's document object System = { currentTimeMillis : function () { return new Date ().getTime (); }, props : null, //new java.util.Properties (), getProperties : function () { return System.props; }, setProperties : function (props) { System.props = props; }, getProperty : function (key, def) { if (System.props != null) { return System.props.getProperty (key, def); } if (def != null) { return def; } return key; }, setProperty : function (key, val) { if (System.props == null) { return ; } System.props.setProperty (key, val); }, currentTimeMillis : function () { return new Date ().getTime (); }, arraycopy : function (src, srcPos, dest, destPos, length) { if (src !== dest) { for (var i = 0; i < length; i++) { dest[destPos + i] = src[srcPos + i]; } } else { var swap = []; for (var i = 0; i < length; i++) { swap[i] = src[srcPos + i]; } for (var i = 0; i < length; i++) { dest[destPos + i] = swap[i]; } } } }; System.out = new Clazz._O (); System.out.__CLASS_NAME__ = "java.io.PrintStream"; System.out.print = function () {}; System.out.printf = function () {}; System.out.println = function () {}; System.err = new Clazz._O (); System.err.__CLASS_NAME__ = "java.io.PrintStream"; System.err.print = function () {}; System.err.printf = function () {}; System.err.println = function () {}; popup = assert = log = error = window.alert; Thread = function () {}; Thread.J2S_THREAD = Thread.prototype.J2S_THREAD = new Thread (); Thread.currentThread = Thread.prototype.currentThread = function () { return this.J2S_THREAD; }; /* public */ Clazz.intCast = function (n) { // 32bit var b1 = (n & 0xff000000) >> 24; var b2 = (n & 0xff0000) >> 16; var b3 = (n & 0xff00) >> 8; var b4 = n & 0xff; if ((b1 & 0x80) != 0) { return -(((b1 & 0x7f) << 24) + (b2 << 16) + (b3 << 8) + b4 + 1); } else { return (b1 << 24) + (b2 << 16) + (b3 << 8) + b4; } }; /* public */ Clazz.shortCast = function (s) { // 16bit var b1 = (n & 0xff00) >> 8; var b2 = n & 0xff; if ((b1 & 0x80) != 0) { return -(((b1 & 0x7f) << 8) + b2 + 1); } else { return (b1 << 8) + b4; } }; /* public */ Clazz.byteCast = function (b) { // 8bit if ((b & 0x80) != 0) { return -((b & 0x7f) + 1); } else { return b & 0xff; } }; /* public */ Clazz.charCast = function (c) { // 8bit return String.fromCharCode (c & 0xff).charAt (0); }; /** * Warning: Unsafe conversion! */ /* public */ Clazz.floatCast = function (f) { // 32bit return f; }; /* * Try to fix JavaScript's shift operator defects on long type numbers. */ Clazz.longMasks = []; Clazz.longReverseMasks = []; Clazz.longBits = []; (function () { var arr = [1]; for (var i = 1; i < 53; i++) { arr[i] = arr[i - 1] + arr[i - 1]; // * 2 or << 1 } Clazz.longBits = arr; Clazz.longMasks[52] = arr[52]; for (var i = 51; i >= 0; i--) { Clazz.longMasks[i] = Clazz.longMasks[i + 1] + arr[i]; } Clazz.longReverseMasks[0] = arr[0]; for (var i = 1; i < 52; i++) { Clazz.longReverseMasks[i] = Clazz.longReverseMasks[i - 1] + arr[i]; } }) (); /* public */ Clazz.longLeftShift = function (l, o) { // 64bit if (o == 0) return l; if (o >= 64) return 0; if (o > 52) { error ("[Java2Script] Error : JavaScript does not support long shift!"); return l; } if ((l & Clazz.longMasks[o - 1]) != 0) { error ("[Java2Script] Error : Such shift operator results in wrong calculation!"); return l; } var high = l & Clazz.longMasks[52 - 32 + o]; if (high != 0) { return high * Clazz.longBits[o] + (l & Clazz.longReverseMasks[32 - o]) << 0; } else { return l << o; } }; /* public */ Clazz.intLeftShift = function (n, o) { // 32bit return (n << o) & 0xffffffff; }; /* public */ Clazz.longRightShift = function (l, o) { // 64bit if ((l & Clazz.longMasks[52 - 32]) != 0) { return Math.round((l & Clazz.longMasks[52 - 32]) / Clazz.longBits[32 - o]) + (l & Clazz.longReverseMasks[o]) >> o; } else { return l >> o; } }; /* public */ Clazz.intRightShift = function (n, o) { // 32bit return n >> o; // no needs for this shifting wrapper }; /* public */ Clazz.long0RightShift = function (l, o) { // 64bit return l >>> o; }; /* public */ Clazz.int0RightShift = function (n, o) { // 64bit return n >>> o; // no needs for this shifting wrapper }; // Compress the common public API method in shorter name $_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; var reflect = Clazz.declarePackage ("java.lang.reflect"); Clazz.declarePackage ("java.security"); Clazz.innerFunctionNames = Clazz.innerFunctionNames.concat (["getSuperclass", "isAssignableFrom", "getMethods", "getMethod", "getDeclaredMethods", "getDeclaredMethod", "getConstructor", "getModifiers", "isArray", "newInstance"]); Clazz.innerFunctions.getSuperclass = function () { return this.superClazz; }; Clazz.innerFunctions.isAssignableFrom = function (clazz) { return Clazz.getInheritedLevel (clazz, this) >= 0; }; Clazz.innerFunctions.getConstructor = function () { return new java.lang.reflect.Constructor (this, [], [], java.lang.reflect.Modifier.PUBLIC); }; /** * TODO: fix bug for polymorphic methods! */ Clazz.innerFunctions.getDeclaredMethods = Clazz.innerFunctions.getMethods = function () { var ms = new Array (); var p = this.prototype; for (var attr in p) { if (typeof p[attr] == "function" && p[attr].__CLASS_NAME__ == null) { /* there are polynormical methods. */ ms[ms.length] = new java.lang.reflect.Method (this, attr, [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC); } } p = this; for (var attr in p) { if (typeof p[attr] == "function" && p[attr].__CLASS_NAME__ == null) { ms[ms.length] = new java.lang.reflect.Method (this, attr, [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC | java.lang.reflect.Modifier.STATIC); } } return ms; }; Clazz.innerFunctions.getDeclaredMethod = Clazz.innerFunctions.getMethod = function (name, clazzes) { var p = this.prototype; for (var attr in p) { if (name == attr && typeof p[attr] == "function" && p[attr].__CLASS_NAME__ == null) { /* there are polynormical methods. */ return new java.lang.reflect.Method (this, attr, [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC); } } p = this; for (var attr in p) { if (name == attr && typeof p[attr] == "function" && p[attr].__CLASS_NAME__ == null) { return new java.lang.reflect.Method (this, attr, [], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC | java.lang.reflect.Modifier.STATIC); } } return null; }; Clazz.innerFunctions.getModifiers = function () { return java.lang.reflect.Modifier.PUBLIC; }; Clazz.innerFunctions.isArray = function () { return false; }; Clazz.innerFunctions.newInstance = function () { var clz = this; return new clz (); }; //Object.newInstance = Clazz.innerFunctions.newInstance; { var inF = Clazz.innerFunctionNames; for (var i = 0; i < inF.length; i++) { JavaObject[inF[i]] = Clazz.innerFunctions[inF[i]]; Array[inF[i]] = Clazz.innerFunctions[inF[i]]; } Array["isArray"] = function () { return true; }; } /* public */ Clazz.forName = function (clazzName) { if (Clazz.isClassDefined (clazzName)) { return Clazz.evalType (clazzName); } if (window["ClazzLoader"] != null) { ClazzLoader.setLoadingMode ("xhr.sync"); ClazzLoader.loadClass (clazzName); return Clazz.evalType (clazzName); } else { alert ("[Java2Script] Error: No ClassLoader!"); } }; /* For hotspot and unloading */ /* private */ Clazz.cleanDelegateMethod = function (m) { if (m == null) return; if (typeof m == "function" && m.lastMethod != null && m.lastParams != null && m.lastClaxxRef != null) { m.lastMethod = null; m.lastParams = null; m.lastClaxxRef = null; } }; /* public */ Clazz.unloadClass = function (qClazzName) { var cc = Clazz.evalType (qClazzName); if (cc != null) { Clazz.unloadedClasses[qClazzName] = cc; var clazzName = qClazzName; var pkgFrags = clazzName.split (/\./); var pkg = null; for (var i = 0; i < pkgFrags.length - 1; i++) { if (pkg == null) { pkg = Clazz.allPackage[pkgFrags[0]]; } else { pkg = pkg[pkgFrags[i]] } } if (pkg == null) { Clazz.allPackage[pkgFrags[0]] = null; window[pkgFrags[0]] = null; // also try to unload inner or anonymous classes for (var c in window) { if (c.indexOf (qClazzName + "$") == 0) { Clazz.unloadClass (c); window[c] = null; } } } else { pkg[pkgFrags[pkgFrags.length - 1]] = null; // also try to unload inner or anonymous classes for (var c in pkg) { if (c.indexOf (pkgFrags[pkgFrags.length - 1] + "$") == 0) { Clazz.unloadClass (pkg.__PKG_NAME__ + "." + c); pkg[c] = null; } } } if (Clazz.allClasses[qClazzName] == true) { Clazz.allClasses[qClazzName] = false; // also try to unload inner or anonymous classes for (var c in Clazz.allClasses) { if (c.indexOf (qClazzName + "$") == 0) { Clazz.allClasses[c] = false; } } } for (var m in cc) { Clazz.cleanDelegateMethod (cc[m]); } for (var m in cc.prototype) { Clazz.cleanDelegateMethod (cc.prototype[m]); } if (window["ClazzLoader"] != null) { ClazzLoader.unloadClassExt (qClazzName); } return true; } return false; }; //written by Dean Edwards, 2005 //with input from Tino Zijdel, Matthias Miller, Diego Perini //http://dean.edwards.name/weblog/2005/10/add-event/ // Merge Dean Edwards' addEvent for Java2Script /* public */ Clazz.addEvent = function (element, type, handler) { if (element.addEventListener) { element.addEventListener(type, handler, false); } else { // assign each event handler a unique ID if (!handler.$$guid) handler.$$guid = Clazz.addEvent.guid++; // create a hash table of event types for the element if (!element.events) element.events = {}; // create a hash table of event handlers for each element/event pair var handlers = element.events[type]; if (!handlers) { handlers = element.events[type] = {}; // store the existing event handler (if there is one) if (element["on" + type]) { handlers[0] = element["on" + type]; } } // store the event handler in the hash table handlers[handler.$$guid] = handler; // assign a global event handler to do all the work element["on" + type] = Clazz.handleEvent; } }; /* private */ //a counter used to create unique IDs Clazz.addEvent.guid = 1; /* public */ Clazz.removeEvent = function (element, type, handler) { if (element.removeEventListener) { element.removeEventListener(type, handler, false); } else { // delete the event handler from the hash table if (element.events && element.events[type]) { delete element.events[type][handler.$$guid]; } } }; /* private */ Clazz.isVeryOldIE = navigator.userAgent.indexOf("MSIE 6.0") != -1 || navigator.userAgent.indexOf("MSIE 5.5") != -1 || navigator.userAgent.indexOf("MSIE 5.0") != -1; /* protected */ Clazz.handleEvent = function (event) { var returnValue = true; // grab the event object (IE uses a global event object) if (!Clazz.isVeryOldIE) { event = event || Clazz.fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event); } else { // The above line is buggy in IE 6.0 if (event == null) { var evt = null; try { var pWindow = (this.ownerDocument || this.document || this).parentWindow; if (pWindow != null) { evt = pWindow.event; } } catch (e) { evt = window.event; } event = Clazz.fixEvent(evt); } } // get a reference to the hash table of event handlers var handlers = this.events[event.type]; // execute each event handler for (var i in handlers) { if (isNaN (i)) { continue; } this.$$handleEvent = handlers[i]; if (typeof this.$$handleEvent != "function") { continue; } if (this.$$handleEvent(event) === false) { returnValue = false; } } return returnValue; }; /* private */ Clazz.fixEvent = function (event) { // add W3C standard event methods event.preventDefault = Clazz.fixEvent.preventDefault; event.stopPropagation = Clazz.fixEvent.stopPropagation; return event; }; Clazz.fixEvent.preventDefault = function() { this.returnValue = false; }; Clazz.fixEvent.stopPropagation = function() { this.cancelBubble = true; }; }