X-Git-Url: http://source.jalview.org/gitweb/?p=jalviewjs.git;a=blobdiff_plain;f=site%2Fj2s%2Fjava%2Flang%2FClassExt.js;h=7c4d2bf8056c7fa6357b271d851fd8962759d58b;hp=48e59f28512697f9e8dc04bea9942b02edf26dc2;hb=b9b7a352eee79b7764c3b09c9d19663075061d8c;hpb=8ffd05b3abe52c0b6b79b011c0966361f82d5fe6 diff --git a/site/j2s/java/lang/ClassExt.js b/site/j2s/java/lang/ClassExt.js index 48e59f2..7c4d2bf 100644 --- a/site/j2s/java/lang/ClassExt.js +++ b/site/j2s/java/lang/ClassExt.js @@ -1,1105 +1,1105 @@ -/****************************************************************************** - * 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; -}; - -} +/****************************************************************************** + * 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; +}; + +}