diff --git a/bundles/org.eclipse.rap.rwt.q07/resources/client.js b/bundles/org.eclipse.rap.rwt.q07/resources/client.js
index 61fe968..9f715b5 100644
--- a/bundles/org.eclipse.rap.rwt.q07/resources/client.js
+++ b/bundles/org.eclipse.rap.rwt.q07/resources/client.js
@@ -1,221 +1,221 @@
 (function($){if(typeof qxsettings===$[8]){qxsettings={};qxsettings["qx.theme"]="org.eclipse.swt.theme.Default";qxvariants={};qxvariants[$[7]]="off"};
 qx={Class:{createNamespace:function(d,c){var g=d.split(".");var f=window;var b=g[0];for(var e=0,a=g.length-1;e<a;e++,b=g[e]){if(!f[b]){f=f[b]={}}else{f=f[b]}}f[b]=c;return b},define:function(b,a){if(!a){var a={statics:{}}}this.createNamespace(b,a.statics);if(a.defer){a.defer(a.statics)}qx.core.Bootstrap.__registry[b]=a.statics}}};qx.Class.define("qx.core.Bootstrap",{statics:{LOADSTART:new Date,time:function(){return new Date().getTime()},since:function(){return this.time()-this.LOADSTART},__registry:{}}});
 qx.Class.define("qx.lang.Core");if(!Error.prototype.toString||Error.prototype.toString()=="[object Error]"){Error.prototype.toString=function(){return this.message}}if(!Array.prototype.indexOf){Array.prototype.indexOf=function(a,c){if(c==null){c=0}else{if(c<0){c=Math.max(0,this.length+c)}}for(var b=c;b<this.length;b++){if(this[b]===a){return b}}return -1}}if(!Array.prototype.lastIndexOf){Array.prototype.lastIndexOf=function(a,c){if(c==null){c=this.length-1}else{if(c<0){c=Math.max(0,this.length+c)}}for(var b=c;b>=0;b--){if(this[b]===a){return b}}return -1}}if(!Array.prototype.forEach){Array.prototype.forEach=function(d,c){var a=this.length;for(var b=0;b<a;b++){d.call(c,this[b],b,this)}}}if(!Array.prototype.filter){Array.prototype.filter=function(e,d){var a=this.length;var c=[];for(var b=0;b<a;b++){if(e.call(d,this[b],b,this)){c.push(this[b])}}return c}}if(!Array.prototype.map){Array.prototype.map=function(e,d){var a=this.length;var c=[];for(var b=0;b<a;b++){c.push(e.call(d,this[b],b,this))}return c}}if(!Array.prototype.some){Array.prototype.some=function(d,c){var a=this.length;for(var b=0;b<a;b++){if(d.call(c,this[b],b,this)){return true}}return false}}if(!Array.prototype.every){Array.prototype.every=function(d,c){var a=this.length;for(var b=0;b<a;b++){if(!d.call(c,this[b],b,this)){return false}}return true}}if(!String.prototype.quote){String.prototype.quote=function(){return'"'+this.replace(/\\/g,"\\\\").replace(/\"/g,'\\"')+'"'}};
-qx.Class.define("qx.core.Setting",{statics:{__settings:{},define:function(b,a){if(a===undefined){throw new Error('Default value of setting "'+b+$[342])}if(!this.__settings[b]){this.__settings[b]={}}else{if(this.__settings[b].defaultValue!==undefined){throw new Error('Setting "'+b+$[422])}}this.__settings[b].defaultValue=a},get:function(b){var a=this.__settings[b];if(a===undefined){throw new Error('Setting "'+b+$[449])}if(a.value!==undefined){return a.value}return a.defaultValue},isSet:function(a){return this.__settings[a]!==undefined},__init:function(){if(window.qxsettings){for(var b in qxsettings){if((b.split(".")).length<2){throw new Error($[448]+b+$[502])}if(!this.__settings[b]){this.__settings[b]={}}this.__settings[b].value=qxsettings[b]}window.qxsettings=undefined;try{delete window.qxsettings}catch(a){}this.__loadUrlSettings()}},__loadUrlSettings:function(){if(this.get($[534])!=true){return}var d=document.location.search.slice(1).split("&");for(var b=0;b<d.length;b++){var c=d[b].split(":");if(c.length!=3||c[0]!="qxsetting"){continue}var a=c[1];if(!this.__settings[a]){this.__settings[a]={}}this.__settings[a].value=decodeURIComponent(c[2])}}},defer:function(a){a.define($[534],false);a.define($[536],false);a.define($[565],"./resource");a.define($[529],true);a.__init()}});
+qx.Class.define("qx.core.Setting",{statics:{__settings:{},define:function(b,a){if(a===undefined){throw new Error('Default value of setting "'+b+$[345])}if(!this.__settings[b]){this.__settings[b]={}}else{if(this.__settings[b].defaultValue!==undefined){throw new Error('Setting "'+b+$[415])}}this.__settings[b].defaultValue=a},get:function(b){var a=this.__settings[b];if(a===undefined){throw new Error('Setting "'+b+$[539])}if(a.value!==undefined){return a.value}return a.defaultValue},isSet:function(a){return this.__settings[a]!==undefined},__init:function(){if(window.qxsettings){for(var b in qxsettings){if((b.split(".")).length<2){throw new Error($[559]+b+$[474])}if(!this.__settings[b]){this.__settings[b]={}}this.__settings[b].value=qxsettings[b]}window.qxsettings=undefined;try{delete window.qxsettings}catch(a){}this.__loadUrlSettings()}},__loadUrlSettings:function(){if(this.get($[419])!=true){return}var d=document.location.search.slice(1).split("&");for(var b=0;b<d.length;b++){var c=d[b].split(":");if(c.length!=3||c[0]!="qxsetting"){continue}var a=c[1];if(!this.__settings[a]){this.__settings[a]={}}this.__settings[a].value=decodeURIComponent(c[2])}}},defer:function(a){a.define($[419],false);a.define($[558],false);a.define($[512],"./resource");a.define($[478],true);a.__init()}});
 qx.Class.define("qx.lang.Array",{statics:{fromArguments:function(a){return Array.prototype.slice.call(a,0)},fromShortHand:function(c){var b=c.length;if(b>4||b==0){throw new Error("Invalid number of arguments!")}var a=qx.lang.Array.copy(c);switch(b){case 1:a[1]=a[2]=a[3]=a[0];break;case 2:a[2]=a[0];case 3:a[3]=a[1]}return a},copy:function(a){return a.concat()},getLast:function(a){return a[a.length-1]},getFirst:function(a){return a[0]},insertAt:function(a,c,b){a.splice(b,0,c);return a},removeAt:function(a,b){return a.splice(b,1)[0]},remove:function(a,c){var b=a.indexOf(c);if(b!=-1){a.splice(b,1);return c}},contains:function(a,b){return a.indexOf(b)!=-1}}});
-qx.Class.define("qx.core.Variant",{statics:{__variants:{},__cache:{},compilerIsSet:function(){return true},define:function(b,c,a){if(qx.core.Variant.compilerIsSet($[7],"on")){if(!this.__isValidArray(c)){throw new Error('Allowed values of variant "'+b+$[342])}if(a===undefined){throw new Error('Default value of variant "'+b+$[342])}}if(!this.__variants[b]){this.__variants[b]={}}else{if(qx.core.Variant.compilerIsSet($[7],"on")){if(this.__variants[b].defaultValue!==undefined){throw new Error($[381]+b+$[422])}}}this.__variants[b].allowedValues=c;this.__variants[b].defaultValue=a},get:function(a){var b=this.__variants[a];if(qx.core.Variant.compilerIsSet($[7],"on")){if(b===undefined){throw new Error($[381]+a+$[449])}}if(b.value!==undefined){return b.value}return b.defaultValue},__init:function(){if(window.qxvariants){for(var b in qxvariants){if(qx.core.Variant.compilerIsSet($[7],"on")){if((b.split(".")).length<2){throw new Error($[448]+b+$[502])}}if(!this.__variants[b]){this.__variants[b]={}}this.__variants[b].value=qxvariants[b]}window.qxvariants=undefined;try{delete window.qxvariants}catch(a){}this.__loadUrlVariants(this.__variants)}},__loadUrlVariants:function(){if(qx.core.Setting.get($[536])!=true){return}var d=document.location.search.slice(1).split("&");for(var c=0;c<d.length;c++){var b=d[c].split(":");if(b.length!=3||b[0]!="qxvariant"){continue}var a=b[1];if(!this.__variants[a]){this.__variants[a]={}}this.__variants[a].value=decodeURIComponent(b[2])}},select:function(c,a){if(qx.core.Variant.compilerIsSet($[7],"on")){if(!this.__isValidObject(this.__variants[c])){throw new Error($[381]+c+'" is not defined')}if(!this.__isValidObject(a)){throw new Error("the second parameter must be a map!")}}for(var b in a){if(this.isSet(c,b)){return a[b]}}if(a[$[39]]!==undefined){return a[$[39]]}if(qx.core.Variant.compilerIsSet($[7],"on")){throw new Error('No match for variant "'+c+'" in variants ['+qx.lang.Object.getKeysAsString(a)+'] found, and no default ("default") given')}},isSet:function(f,d){var a=f+"$"+d;if(this.__cache[a]!==undefined){return this.__cache[a]}var c=false;if(d.indexOf("|")<0){c=this.get(f)===d}else{var g=d.split("|");for(var e=0,b=g.length;e<b;e++){if(this.get(f)===g[e]){c=true;break}}}this.__cache[a]=c;return c},__isValidArray:function(a){return typeof a===$[10]&&a!==null&&a instanceof Array},__isValidObject:function(a){return typeof a===$[10]&&a!==null&&!(a instanceof Array)},__arrayContains:function(a,d){for(var c=0,b=a.length;c<b;c++){if(a[c]==d){return true}}return false}},defer:function(a){a.define($[7],["on","off"],"on");a.define($[403],["on","off"],"on");a.define("qx.eventMonitorNoListeners",["on","off"],"off");a.define("qx.aspects",["on","off"],"off");a.define("qx.deprecationWarnings",["on","off"],"on");a.__init()}});
-qx.Class.define("org.eclipse.rwt.Client",{statics:{__init:function(){this._engineName=null;this._browserName=null;this._engineVersion=null;this._engineVersionMajor=0;this._engineVersionMinor=0;this._engineVersionRevision=0;this._engineVersionBuild=0;this._browserPlatform=null;this._runsLocally=window.location.protocol==="file:";this._engineQuirksMode=document.compatMode!==$[117];this._defaultLocale="en";this._initOpera();this._initKonqueror();this._initWebkit();this._initGecko();this._initMshtml();this._initBoxSizing();this._initLocale();this._initPlatform()},getRunsLocally:function(){return this._runsLocally},getEngine:function(){return this._engineName},getBrowser:function(){return this._browserName},getVersion:function(){return this._engineVersion},getMajor:function(){return this._engineVersionMajor},getMinor:function(){return this._engineVersionMinor},getRevision:function(){return this._engineVersionRevision},getBuild:function(){return this._engineVersionBuild},isMshtml:function(){return this._engineName===$[18]},isGecko:function(){return this._engineName===$[40]},isOpera:function(){return this._engineName===$[121]},isWebkit:function(){return this._engineName===$[71]},isInQuirksMode:function(){return this._engineQuirksMode},getLocale:function(){return this._browserLocale},getLanguage:function(){var a=this.getLocale();var c;var b=a.indexOf("_");if(b==-1){c=a}else{c=a.substring(0,b)}return c},getTerritory:function(){return this.getLocale().split("_")[1]||""},getDefaultLocale:function(){return this._defaultLocale},usesDefaultLocale:function(){return this._browserLocale===this._defaultLocale},getEngineBoxSizingAttributes:function(){return this._engineBoxSizingAttributes},getPlatform:function(){return this._browserPlatform},isMobileSafari:function(){return this.getPlatform()==="ios"&&this.getBrowser()==="safari"},isAndroidBrowser:function(){return this.getPlatform()==="android"&&this.getBrowser()===$[211]},supportsVml:function(){return(this.getEngine()===$[18])&&(this.getVersion()>=5.5)},supportsSvg:function(){var c=org.eclipse.rwt.Client.getEngine();var b=org.eclipse.rwt.Client.getVersion();var a=c===$[40]&&b>=1.8||c===$[71]&&b>=523||c===$[121]&&b>=9;if(this.isAndroidBrowser()){a=false}return a},supportsCss3:function(){var c=org.eclipse.rwt.Client.getEngine();var b=org.eclipse.rwt.Client.getVersion();var a=c===$[71]&&b>=522||c===$[40]&&b>=2;return a},_initOpera:function(){if(this._engineName===null){var b=window.opera&&/Opera[\s\/]([0-9\.]*)/.test(navigator.userAgent);if(b){this._browserName=$[121];this._engineName=$[121];var a=RegExp.$1;a=a.substring(0,3)+"."+a.substring(3);this._parseVersion(a)}}},_initKonqueror:function(){if(this._engineName===null){var b=navigator.vendor;var a=typeof b===$[13]&&b==="KDE"&&/KHTML\/([0-9-\.]*)/.test(navigator.userAgent);if(a){this._engineName=$[71];this._browserName="konqueror";this._parseVersion("420")}}},_initWebkit:function(){if(this._engineName===null){var d=navigator.userAgent;var a=d.indexOf("AppleWebKit")!=-1&&/AppleWebKit\/([^ ]+)/.test(d);if(a){this._engineName=$[71];var b=RegExp.$1;var c=RegExp("[^\\.0-9]").exec(b);if(c){b=b.slice(0,c.index)}this._parseVersion(b);if(d.indexOf("Chrome")!=-1){this._browserName=$[211]}else{if(d.indexOf("Safari")!=-1){if(d.indexOf("Android")!=-1){this._browserName=$[211]}else{this._browserName="safari"}}else{if(d.indexOf("OmniWeb")!=-1){this._browserName="omniweb"}else{if(d.indexOf("Shiira")!=-1){this._browserName="shiira"}else{if(d.indexOf("NetNewsWire")!=-1){this._browserName="netnewswire"}else{if(d.indexOf("RealPlayer")!=-1){this._browserName="realplayer"}else{if(d.indexOf("Mobile")!=-1){this._browserName="safari"}else{this._browserName="other webkit"}}}}}}}}}},_initGecko:function(){if(this._engineName===null){var c=navigator.product;var b=navigator.userAgent;var a=window.controllers&&typeof c===$[13]&&c==="Gecko"&&/rv\:([^\);]+)(\)|;)/.test(b);if(a){this._engineName=$[40];this._parseVersion(RegExp.$1);if(b.indexOf("Firefox")!=-1){this._browserName="firefox"}else{if(b.indexOf("Camino")!=-1){this._browserName="camino"}else{if(b.indexOf("Galeon")!=-1){this._browserName="galeon"}else{this._browserName="other gecko"}}}}}},_initMshtml:function(){if(this._engineName===null){var a=/MSIE\s+([^\);]+)(\)|;)/.test(navigator.userAgent);if(a){this._engineName=$[18];this._parseVersion(RegExp.$1);this._browserName="explorer"}}},_parseVersion:function(a){if(typeof a===$[13]){versionArr=a.split(".");this._engineVersion=parseFloat(a);this._engineVersionMajor=parseInt(versionArr[0]||0);this._engineVersionMinor=parseFloat(versionArr[1]||0);this._engineVersionRevision=parseFloat(versionArr[2]||0);this._engineVersionBuild=parseInt(versionArr[3]||0)}},_initBoxSizing:function(){var a=[];switch(this._engineName){case $[40]:a.push("-moz-box-sizing");break;case $[71]:a.push("-khtml-box-sizing");a.push("-webkit-box-sizing");break;default:a.push("box-sizing")}this._engineBoxSizingAttributes=a},_initLocale:function(){var c=this._engineName==$[18]?navigator.userLanguage:navigator.language;var b=c.toLowerCase();var a=b.indexOf("-");if(a!=-1){b=b.substr(0,a)}this._browserLocale=b},_initPlatform:function(){var a=navigator.platform;if(a.indexOf("Windows")!=-1||a.indexOf("Win32")!=-1||a.indexOf("Win64")!=-1){this._browserPlatform="win"}else{if(a.indexOf("Macintosh")!=-1||a.indexOf("MacPPC")!=-1||a.indexOf("MacIntel")!=-1){this._browserPlatform="mac"}else{if(a.indexOf("X11")!=-1||a.indexOf("Linux")!=-1||a.indexOf("BSD")!=-1){if(navigator.userAgent.indexOf("Android")!=-1){this._browserPlatform="android"}else{this._browserPlatform="unix"}}else{if(a.indexOf("iPhone")!=-1||a.indexOf("iPod")!=-1||a.indexOf("iPad")!=-1){this._browserPlatform="ios"}else{this._browserPlatform="other"}}}}}},defer:function(c,a,b){c.__init();qx.core.Variant.define($[0],[$[40],$[18],$[121],$[71]],org.eclipse.rwt.Client.getEngine())}});
+qx.Class.define("qx.core.Variant",{statics:{__variants:{},__cache:{},compilerIsSet:function(){return true},define:function(b,c,a){if(qx.core.Variant.compilerIsSet($[7],"on")){if(!this.__isValidArray(c)){throw new Error('Allowed values of variant "'+b+$[345])}if(a===undefined){throw new Error('Default value of variant "'+b+$[345])}}if(!this.__variants[b]){this.__variants[b]={}}else{if(qx.core.Variant.compilerIsSet($[7],"on")){if(this.__variants[b].defaultValue!==undefined){throw new Error($[346]+b+$[415])}}}this.__variants[b].allowedValues=c;this.__variants[b].defaultValue=a},get:function(a){var b=this.__variants[a];if(qx.core.Variant.compilerIsSet($[7],"on")){if(b===undefined){throw new Error($[346]+a+$[539])}}if(b.value!==undefined){return b.value}return b.defaultValue},__init:function(){if(window.qxvariants){for(var b in qxvariants){if(qx.core.Variant.compilerIsSet($[7],"on")){if((b.split(".")).length<2){throw new Error($[559]+b+$[474])}}if(!this.__variants[b]){this.__variants[b]={}}this.__variants[b].value=qxvariants[b]}window.qxvariants=undefined;try{delete window.qxvariants}catch(a){}this.__loadUrlVariants(this.__variants)}},__loadUrlVariants:function(){if(qx.core.Setting.get($[558])!=true){return}var d=document.location.search.slice(1).split("&");for(var c=0;c<d.length;c++){var b=d[c].split(":");if(b.length!=3||b[0]!="qxvariant"){continue}var a=b[1];if(!this.__variants[a]){this.__variants[a]={}}this.__variants[a].value=decodeURIComponent(b[2])}},select:function(c,a){if(qx.core.Variant.compilerIsSet($[7],"on")){if(!this.__isValidObject(this.__variants[c])){throw new Error($[346]+c+'" is not defined')}if(!this.__isValidObject(a)){throw new Error("the second parameter must be a map!")}}for(var b in a){if(this.isSet(c,b)){return a[b]}}if(a[$[38]]!==undefined){return a[$[38]]}if(qx.core.Variant.compilerIsSet($[7],"on")){throw new Error('No match for variant "'+c+'" in variants ['+qx.lang.Object.getKeysAsString(a)+'] found, and no default ("default") given')}},isSet:function(f,d){var a=f+"$"+d;if(this.__cache[a]!==undefined){return this.__cache[a]}var c=false;if(d.indexOf("|")<0){c=this.get(f)===d}else{var g=d.split("|");for(var e=0,b=g.length;e<b;e++){if(this.get(f)===g[e]){c=true;break}}}this.__cache[a]=c;return c},__isValidArray:function(a){return typeof a===$[10]&&a!==null&&a instanceof Array},__isValidObject:function(a){return typeof a===$[10]&&a!==null&&!(a instanceof Array)},__arrayContains:function(a,d){for(var c=0,b=a.length;c<b;c++){if(a[c]==d){return true}}return false}},defer:function(a){a.define($[7],["on","off"],"on");a.define($[473],["on","off"],"on");a.define("qx.eventMonitorNoListeners",["on","off"],"off");a.define("qx.aspects",["on","off"],"off");a.define("qx.deprecationWarnings",["on","off"],"on");a.__init()}});
+qx.Class.define("org.eclipse.rwt.Client",{statics:{__init:function(){this._engineName=null;this._browserName=null;this._engineVersion=null;this._engineVersionMajor=0;this._engineVersionMinor=0;this._engineVersionRevision=0;this._engineVersionBuild=0;this._browserPlatform=null;this._runsLocally=window.location.protocol==="file:";this._engineQuirksMode=document.compatMode!==$[121];this._defaultLocale="en";this._initOpera();this._initKonqueror();this._initWebkit();this._initGecko();this._initMshtml();this._initBoxSizing();this._initLocale();this._initPlatform()},getRunsLocally:function(){return this._runsLocally},getEngine:function(){return this._engineName},getBrowser:function(){return this._browserName},getVersion:function(){return this._engineVersion},getMajor:function(){return this._engineVersionMajor},getMinor:function(){return this._engineVersionMinor},getRevision:function(){return this._engineVersionRevision},getBuild:function(){return this._engineVersionBuild},isMshtml:function(){return this._engineName===$[18]},isGecko:function(){return this._engineName===$[40]},isOpera:function(){return this._engineName===$[122]},isWebkit:function(){return this._engineName===$[69]},isInQuirksMode:function(){return this._engineQuirksMode},getLocale:function(){return this._browserLocale},getLanguage:function(){var a=this.getLocale();var c;var b=a.indexOf("_");if(b==-1){c=a}else{c=a.substring(0,b)}return c},getTerritory:function(){return this.getLocale().split("_")[1]||""},getDefaultLocale:function(){return this._defaultLocale},usesDefaultLocale:function(){return this._browserLocale===this._defaultLocale},getEngineBoxSizingAttributes:function(){return this._engineBoxSizingAttributes},getPlatform:function(){return this._browserPlatform},isMobileSafari:function(){return this.getPlatform()==="ios"&&this.getBrowser()==="safari"},isAndroidBrowser:function(){return this.getPlatform()==="android"&&this.getBrowser()===$[209]},supportsVml:function(){return(this.getEngine()===$[18])&&(this.getVersion()>=5.5)},supportsSvg:function(){var c=org.eclipse.rwt.Client.getEngine();var b=org.eclipse.rwt.Client.getVersion();var a=c===$[40]&&b>=1.8||c===$[69]&&b>=523||c===$[122]&&b>=9;if(this.isAndroidBrowser()){a=false}return a},supportsCss3:function(){var c=org.eclipse.rwt.Client.getEngine();var b=org.eclipse.rwt.Client.getVersion();var a=c===$[69]&&b>=522||c===$[40]&&b>=2;return a},_initOpera:function(){if(this._engineName===null){var b=window.opera&&/Opera[\s\/]([0-9\.]*)/.test(navigator.userAgent);if(b){this._browserName=$[122];this._engineName=$[122];var a=RegExp.$1;a=a.substring(0,3)+"."+a.substring(3);this._parseVersion(a)}}},_initKonqueror:function(){if(this._engineName===null){var b=navigator.vendor;var a=typeof b===$[13]&&b==="KDE"&&/KHTML\/([0-9-\.]*)/.test(navigator.userAgent);if(a){this._engineName=$[69];this._browserName="konqueror";this._parseVersion("420")}}},_initWebkit:function(){if(this._engineName===null){var d=navigator.userAgent;var a=d.indexOf("AppleWebKit")!=-1&&/AppleWebKit\/([^ ]+)/.test(d);if(a){this._engineName=$[69];var b=RegExp.$1;var c=RegExp("[^\\.0-9]").exec(b);if(c){b=b.slice(0,c.index)}this._parseVersion(b);if(d.indexOf("Chrome")!=-1){this._browserName=$[209]}else{if(d.indexOf("Safari")!=-1){if(d.indexOf("Android")!=-1){this._browserName=$[209]}else{this._browserName="safari"}}else{if(d.indexOf("OmniWeb")!=-1){this._browserName="omniweb"}else{if(d.indexOf("Shiira")!=-1){this._browserName="shiira"}else{if(d.indexOf("NetNewsWire")!=-1){this._browserName="netnewswire"}else{if(d.indexOf("RealPlayer")!=-1){this._browserName="realplayer"}else{if(d.indexOf("Mobile")!=-1){this._browserName="safari"}else{this._browserName="other webkit"}}}}}}}}}},_initGecko:function(){if(this._engineName===null){var c=navigator.product;var b=navigator.userAgent;var a=window.controllers&&typeof c===$[13]&&c==="Gecko"&&/rv\:([^\);]+)(\)|;)/.test(b);if(a){this._engineName=$[40];this._parseVersion(RegExp.$1);if(b.indexOf("Firefox")!=-1){this._browserName="firefox"}else{if(b.indexOf("Camino")!=-1){this._browserName="camino"}else{if(b.indexOf("Galeon")!=-1){this._browserName="galeon"}else{this._browserName="other gecko"}}}}}},_initMshtml:function(){if(this._engineName===null){var a=/MSIE\s+([^\);]+)(\)|;)/.test(navigator.userAgent);if(a){this._engineName=$[18];this._parseVersion(RegExp.$1);this._browserName="explorer"}}},_parseVersion:function(a){if(typeof a===$[13]){versionArr=a.split(".");this._engineVersion=parseFloat(a);this._engineVersionMajor=parseInt(versionArr[0]||0);this._engineVersionMinor=parseFloat(versionArr[1]||0);this._engineVersionRevision=parseFloat(versionArr[2]||0);this._engineVersionBuild=parseInt(versionArr[3]||0)}},_initBoxSizing:function(){var a=[];switch(this._engineName){case $[40]:a.push("-moz-box-sizing");break;case $[69]:a.push("-khtml-box-sizing");a.push("-webkit-box-sizing");break;default:a.push("box-sizing")}this._engineBoxSizingAttributes=a},_initLocale:function(){var c=this._engineName==$[18]?navigator.userLanguage:navigator.language;var b=c.toLowerCase();var a=b.indexOf("-");if(a!=-1){b=b.substr(0,a)}this._browserLocale=b},_initPlatform:function(){var a=navigator.platform;if(a.indexOf("Windows")!=-1||a.indexOf("Win32")!=-1||a.indexOf("Win64")!=-1){this._browserPlatform="win"}else{if(a.indexOf("Macintosh")!=-1||a.indexOf("MacPPC")!=-1||a.indexOf("MacIntel")!=-1){this._browserPlatform="mac"}else{if(a.indexOf("X11")!=-1||a.indexOf("Linux")!=-1||a.indexOf("BSD")!=-1){if(navigator.userAgent.indexOf("Android")!=-1){this._browserPlatform="android"}else{this._browserPlatform="unix"}}else{if(a.indexOf("iPhone")!=-1||a.indexOf("iPod")!=-1||a.indexOf("iPad")!=-1){this._browserPlatform="ios"}else{this._browserPlatform="other"}}}}}},defer:function(c,a,b){c.__init();qx.core.Variant.define($[0],[$[40],$[18],$[122],$[69]],org.eclipse.rwt.Client.getEngine())}});
 qx.Class.define("qx.lang.Object",{statics:{isEmpty:function(b){for(var a in b){return false}return true},hasMinLength:function(d,c){var b=0;for(var a in d){if((++b)>=c){return true}}return false},getLength:function(c){var b=0;for(var a in c){b++}return b},_shadowedKeys:["isPrototypeOf","hasOwnProperty","toLocaleString","toString","valueOf"],getKeys:qx.core.Variant.select($[0],{mshtml:function(g){var b=[];for(var f in g){b.push(f)}for(var e=0,d=this._shadowedKeys,c=d.length;e<c;e++){if(g.hasOwnProperty(d[e])){b.push(d[e])}}return b},"default":function(c){var a=[];for(var b in c){a.push(b)}return a}}),getKeysAsString:function(b){var a=qx.lang.Object.getKeys(b);if(a.length==0){return""}return'"'+a.join('", "')+'"'},getValues:function(c){var a=[];for(var b in c){a.push(c[b])}return a},mergeWith:function(d,c,a){if(a===undefined){a=true}for(var b in c){if(a||d[b]===undefined){d[b]=c[b]}}return d},carefullyMergeWith:function(b,a){return qx.lang.Object.mergeWith(b,a,false)},merge:function(d,b){var a=arguments.length;for(var c=1;c<a;c++){qx.lang.Object.mergeWith(d,arguments[c])}return d},copy:function(b){var c={};for(var a in b){c[a]=b[a]}return c},invert:function(c){var a={};for(var b in c){a[c[b].toString()]=b}return a},getKeyFromValue:function(c,b){for(var a in c){if(c[a]===b){return a}}return null},select:function(a,b){return b[a]},fromArray:function(d){var c={};for(var b=0,a=d.length;b<a;b++){if(qx.core.Variant.isSet($[7],"on")){switch(typeof d[b]){case $[10]:case $[44]:case $[8]:throw new Error("Could not convert complex objects like "+d[b]+" at array index "+b+" to map syntax")}}c[d[b].toString()]=true}return c}}});
-qx.Class.define("qx.Class",{statics:{_normalizeConfig:function(a){if(!a){var a={}}if(a.include&&!(a.include instanceof Array)){a.include=[a.include]}if(a.implement&&!(a.implement instanceof Array)){a.implement=[a.implement]}if(!a.hasOwnProperty("extend")&&!a.type){a.type=$[118]}return a},define:function(c,e){e=this._normalizeConfig(e);this.__validateConfig(c,e);var k;if(!e.extend){k=e.statics||{}}else{if(!e.construct){e.construct=this.__createDefaultConstructor()}k=this.__wrapConstructor(e.construct,c,e.type);if(e.statics){var o;for(var g=0,n=qx.lang.Object.getKeys(e.statics),f=n.length;g<f;g++){o=n[g];k[o]=e.statics[o]}}}var m=this.createNamespace(c,k,false);k.name=k.classname=c;k.basename=m;this.__registry[c]=k;if(!k.hasOwnProperty("toString")){k.toString=this.genericToString}if(e.extend){var b=e.extend.prototype;var d=this.__createEmptyFunction();d.prototype=b;var h=new d;k.prototype=h;h.name=h.classname=c;h.basename=m;e.construct.base=k.superclass=e.extend;e.construct.self=k.constructor=h.constructor=k;if(e.destruct){k.$$destructor=e.destruct}var j=this;k.$$initializer=function(){if(e.properties){j.__addProperties(k,e.properties,true)}if(e.members){j.__addMembers(k,e.members,true,true,false)}if(e.events){j.__addEvents(k,e.events,true)}if(e.include){for(var p=0,a=e.include.length;p<a;p++){j.__addMixin(k,e.include[p],false)}}}}if(e.settings){for(var o in e.settings){qx.core.Setting.define(o,e.settings[o])}}if(e.variants){for(var o in e.variants){qx.core.Variant.define(o,e.variants[o].allowedValues,e.variants[o].defaultValue)}}if(e.defer){this.__initializeClass(k);e.defer.self=k;e.defer(k,k.prototype,{add:function(i,a){var l={};l[i]=a;qx.Class.__addProperties(k,l,true)}})}},createNamespace:function(d,c){var g=d.split(".");var f=window;var b=g[0];for(var e=0,a=g.length-1;e<a;e++,b=g[e]){if(!f[b]){f=f[b]={}}else{f=f[b]}}if(qx.core.Variant.isSet($[7],"on")){if(f[b]!==undefined){throw new Error("An object of the name '"+d+"' already exists and overwriting is not allowed!")}}f[b]=c;return b},isDefined:function(a){return this.getByName(a)!==undefined},getTotalNumber:function(){return qx.lang.Object.getLength(this.__registry)},getByName:function(a){return this.__registry[a]},include:function(b,a){if(qx.core.Variant.isSet($[7],"on")){if(!a){throw new Error("Includes of mixins must be mixins. The mixin of class '"+b.classname+"' is undefined/null!")}qx.Mixin.isCompatible(a,b)}qx.Class.__addMixin(b,a,false)},patch:function(b,a){if(qx.core.Variant.isSet($[7],"on")){qx.Mixin.isCompatible(a,b)}qx.Class.__addMixin(b,a,true)},isSubClassOf:function(a,b){if(!a){return false}if(a==b){return true}if(a.prototype instanceof b){return true}return false},getPropertyDefinition:function(b,a){while(b){if(b.$$properties&&b.$$properties[a]){return b.$$properties[a]}b=b.superclass}return null},getByProperty:function(b,a){while(b){if(b.$$properties&&b.$$properties[a]){return b}b=b.superclass}return null},hasProperty:function(b,a){return !!this.getPropertyDefinition(b,a)},getEventType:function(b,a){var b=b.constructor;while(b.superclass){if(b.$$events&&b.$$events[a]!==undefined){return b.$$events[a]}b=b.superclass}return null},supportsEvent:function(b,a){return !!this.getEventType(b,a)},hasOwnMixin:function(b,a){return b.$$includes&&b.$$includes.indexOf(a)!==-1},getByMixin:function(c,b){var e,d,a;while(c){if(c.$$includes){e=c.$$flatIncludes;for(d=0,a=e.length;d<a;d++){if(e[d]===b){return c}}}c=c.superclass}return null},getMixins:function(a){var b=[];while(a){if(a.$$includes){b.push.apply(b,a.$$flatIncludes)}a=a.superclass}return b},hasMixin:function(b,a){return !!this.getByMixin(b,a)},hasOwnInterface:function(a,b){return a.$$implements&&a.$$implements.indexOf(b)!==-1},getByInterface:function(b,e){var d,c,a;while(b){if(b.$$implements){d=b.$$flatImplements;for(c=0,a=d.length;c<a;c++){if(d[c]===e){return b}}}b=b.superclass}return null},getInterfaces:function(a){var b=[];while(a){if(a.$$implements){b.push.apply(b,a.$$flatImplements)}a=a.superclass}return b},hasInterface:function(a,b){return !!this.getByInterface(a,b)},implementsInterface:function(a,b){return false},getInstance:function(){if(!this.$$instance){this.$$allowconstruct=true;this.$$instance=new this;delete this.$$allowconstruct}return this.$$instance},genericToString:function(){return"[Class "+this.classname+"]"},__registry:qx.core.Bootstrap.__registry,__allowedKeys:qx.core.Variant.select($[7],{on:{type:$[13],extend:$[44],implement:$[10],include:$[10],construct:$[44],statics:$[10],properties:$[10],members:$[10],settings:$[10],variants:$[10],events:$[10],defer:$[44],destruct:$[44]},"default":null}),__staticAllowedKeys:qx.core.Variant.select($[7],{on:{type:$[13],statics:$[10],settings:$[10],variants:$[10],defer:$[44]},"default":null}),__validateConfig:qx.core.Variant.select($[7],{on:function(b,c){if(c.type&&!(c.type===$[118]||c.type===$[102]||c.type===$[33])){throw new Error('Invalid type "'+c.type+'" definition for class "'+b+'"!')}var h=c.type===$[118]?this.__staticAllowedKeys:this.__allowedKeys;for(var k in c){if(!h[k]){throw new Error($[286]+k+$[126]+b+$[191])}if(c[k]==null){throw new Error($[161]+k+$[126]+b+$[389])}if(typeof c[k]!==h[k]){throw new Error($[275]+k+$[126]+b+$[287]+h[k]+'"!')}}var g=["statics","properties","members","settings","variants","events"];for(var e=0,d=g.length;e<d;e++){var k=g[e];if(c[k]!==undefined&&(c[k] instanceof Array||c[k] instanceof RegExp||c[k] instanceof Date||c[k].classname!==undefined)){throw new Error($[161]+k+$[126]+b+$[383])}}if(c.include){if(c.include instanceof Array){for(var e=0,j=c.include,d=j.length;e<d;e++){if(j[e]==null||j[e].$$type!=="Mixin"){throw new Error('The include definition in class "'+b+'" contains an invalid mixin at position '+e+": "+j[e])}}}else{throw new Error('Invalid include definition in class "'+b+'"! Only mixins and arrays of mixins are allowed!')}}if(c.implement){if(c.implement instanceof Array){for(var e=0,j=c.implement,d=j.length;e<d;e++){if(j[e]==null||j[e].$$type!=="Interface"){throw new Error('The implement definition in class "'+b+'" contains an invalid interface at position '+e+": "+j[e])}}}else{throw new Error('Invalid implement definition in class "'+b+'"! Only interfaces and arrays of interfaces are allowed!')}}if(c.include){try{qx.Mixin.checkCompatibility(c.include)}catch(f){throw new Error('Error in include definition of class "'+b+'"! '+f.message)}}if(c.variants){for(var k in c.variants){if(k.substr(0,k.indexOf("."))!=b.substr(0,b.indexOf("."))){throw new Error('Forbidden variant "'+k+'" found in "'+b+'". It is forbidden to define a variant for an external namespace!')}}}},"default":function(){}}),__addEvents:function(a,c,d){if(qx.core.Variant.isSet($[7],"on")){if(!qx.core.Target){throw new Error(a.classname+": the class 'qx.core.Target' must be availabe to use events!")}if(typeof c!==$[10]||c instanceof Array){throw new Error(a.classname+": the events must be defined as map!")}for(var b in c){if(typeof c[b]!==$[13]){throw new Error(a.classname+"/"+b+": the event value needs to be a string with the class name of the event object which will be fired.")}}if(a.$$events&&d!==true){for(var b in c){if(a.$$events[b]!==undefined&&a.$$events[b]!==c[b]){throw new Error(a.classname+"/"+b+": the event value/type cannot be changed from "+a.$$events[b]+" to "+c[b])}}}}if(a.$$events){for(var b in c){a.$$events[b]=c[b]}}else{a.$$events=c}},__addProperties:function(d,e,g){var c;if(g===undefined){g=false}var a=!!d.$$propertiesAttached;for(var b in e){c=e[b];if(qx.core.Variant.isSet($[7],"on")){}c.name=b;if(!c.refine){if(d.$$properties===undefined){d.$$properties={}}d.$$properties[b]=c}if(c.init!==undefined){d.prototype["__init$"+b]=c.init}if(c.event!==undefined){var f={};f[c.event]=$[358];this.__addEvents(d,f,g)}if(c.inheritable){qx.core.Property.$$inheritable[b]=true}if(a){qx.core.Property.attachMethods(d,b,c)}if(c._fast){qx.core.LegacyProperty.addFastProperty(c,d.prototype)}else{if(c._cached){qx.core.LegacyProperty.addCachedProperty(c,d.prototype)}else{if(c._legacy){qx.core.LegacyProperty.addProperty(c,d.prototype)}}}}},__validateProperty:qx.core.Variant.select($[7],{on:function(d,a,c,b){var g=this.hasProperty(d,a);var h=c._legacy||c._fast||c._cached;if(g){var i=this.getPropertyDefinition(d,a);var j=i._legacy||i._fast||i._cached;if(h!=j){throw new Error("Could not redefine existing property '"+a+$[520]+d.classname+"'.")}if(c.refine&&i.init===undefined){throw new Error("Could not refine a init value if there was previously no init value defined. Property '"+a+$[520]+d.classname+"'.")}}if(!g&&c.refine){throw new Error("Could not refine non-existent property: "+a+"!")}if(g&&!b){throw new Error("Class "+d.classname+" already has a property: "+a+"!")}if(g&&b&&!h){if(!c.refine){throw new Error('Could not refine property "'+a+'" without a "refine" flag in the property definition! This class: '+d.classname+", original class: "+this.getByProperty(d,a).classname+".")}for(var f in c){if(f!=="init"&&f!=="refine"){throw new Error("Class "+d.classname+" could not refine property: "+a+"! Key: "+f+" could not be refined!")}}}if(h){return}var e=c.group?qx.core.Property.$$allowedGroupKeys:qx.core.Property.$$allowedKeys;for(var f in c){if(e[f]===undefined){throw new Error($[286]+f+$[377]+a+$[126]+d.classname+$[191])}if(c[f]===undefined){throw new Error($[161]+f+$[377]+a+$[126]+d.classname+'"! The value is undefined: '+c[f])}if(e[f]!==null&&typeof c[f]!==e[f]){throw new Error($[275]+f+$[377]+a+$[126]+d.classname+$[287]+e[f]+'"!')}}if(c.transform!=null){if(!(typeof c.transform==$[13])){throw new Error('Invalid transform definition of property "'+a+$[126]+d.classname+'"! Needs to be a String.')}}if(c.check!=null){if(!(typeof c.check==$[13]||c.check instanceof Array||c.check instanceof Function)){throw new Error('Invalid check definition of property "'+a+$[126]+d.classname+'"! Needs to be a String, Array or Function.')}}if(c.event!=null&&!this.isSubClassOf(d,qx.core.Target)){throw new Error("Invalid property '"+a+"' in class '"+d.classname+"': Properties defining an event can only be defined in sub classes of 'qx.core.Target'!")}},"default":null}),__addMembers:function(k,f,d,b,c){var j=k.prototype;var n,h;for(var g=0,m=qx.lang.Object.getKeys(f),e=m.length;g<e;g++){n=m[g];h=f[n];if(qx.core.Variant.isSet($[7],"on")){if(j[n]!==undefined&&n.charAt(0)=="_"&&n.charAt(1)=="_"){throw new Error('Overwriting private member "'+n+$[523]+k.classname+$[191])}if(d!==true&&j[n]!==undefined){throw new Error('Overwriting member "'+n+$[523]+k.classname+$[191])}}if(b!==false&&h instanceof Function){if(c==true){h=this.__mixinMemberWrapper(h,j[n])}else{if(j[n]){h.base=j[n]}h.self=k}}j[n]=h}},__mixinMemberWrapper:function(b,a){if(a){return function(){var d=b.base;b.base=a;var c=b.apply(this,arguments);b.base=d;return c}}else{return b}},__addMixin:function(c,b,g){if(qx.core.Variant.isSet($[7],"on")){if(!c||!b){throw new Error("Incomplete parameters!")}if(this.hasMixin(c,b)){throw new Error('Mixin "'+b.name+'" is already included into Class "'+c.classname+'" by class: '+this.getByMixin(c,b).classname+"!")}}var f=qx.Mixin.flatten([b]);var e;for(var d=0,a=f.length;d<a;d++){e=f[d];if(e.$$events){this.__addEvents(c,e.$$events,g)}if(e.$$properties){this.__addProperties(c,e.$$properties,g)}if(e.$$members){this.__addMembers(c,e.$$members,g,g,g)}}if(c.$$includes){c.$$includes.push(b);c.$$flatIncludes.push.apply(c.$$flatIncludes,f)}else{c.$$includes=[b];c.$$flatIncludes=f}},__createDefaultConstructor:function(){function a(){arguments.callee.base.apply(this,arguments)}return a},__createEmptyFunction:function(){return function(){}},__initializeClass:function(a){if(a.$$initializer){var b=[];var c=a;while(c.$$initializer){b.push(c);c=c.superclass}while(b.length>0){c=b.pop();c.$$initializer();delete c.$$initializer}}},__wrapConstructor:function(a,b,c){var d=this.__initializeClass;var e=function(){var j=arguments.callee.constructor;d(j);if(qx.core.Variant.isSet($[7],"on")){if(!(this instanceof j)){throw new Error("Please initialize "+b+" objects using the new keyword!")}if(c===$[102]){if(this.classname===b){throw new Error("The class "+b+" is abstract! It is not possible to instantiate it.")}}else{if(c===$[33]){if(!j.$$allowconstruct){throw new Error("The class "+b+" is a singleton! It is not possible to instantiate it directly. Use the static getInstance() method instead.")}}}}if(!j.$$propertiesAttached){qx.core.Property.attach(j)}var h=j.$$original.apply(this,arguments);if(j.$$includes){var g=j.$$flatIncludes;for(var k=0,f=g.length;k<f;k++){if(g[k].$$constructor){g[k].$$constructor.apply(this,arguments)}}}if(this.classname===", name, ".classname){this.$$initialized=true}return h};if(c===$[33]){e.getInstance=this.getInstance}e.$$original=a;a.wrapper=e;return e}}});
-qx.Class.define("qx.Mixin",{statics:{define:function(c,b){if(b){if(b.include&&!(b.include instanceof Array)){b.include=[b.include]}if(qx.core.Variant.isSet($[7],"on")){this.__validateConfig(c,b)}var a=b.statics?b.statics:{};for(var d in a){a[d].mixin=a}if(b.construct){a.$$constructor=b.construct}if(b.include){a.$$includes=b.include}if(b.properties){a.$$properties=b.properties}if(b.members){a.$$members=b.members}for(var d in a.$$members){if(a.$$members[d] instanceof Function){a.$$members[d].mixin=a}}if(b.events){a.$$events=b.events}if(b.destruct){a.$$destructor=b.destruct}}else{var a={}}a.$$type="Mixin";a.name=c;a.toString=this.genericToString;a.basename=qx.Class.createNamespace(c,a);this.__registry[c]=a;return a},checkCompatibility:function(c){var e=this.flatten(c);var d=e.length;if(d<2){return true}var f={};var a={};var j={};var h;for(var b=0;b<d;b++){h=e[b];for(var g in h.events){if(j[g]){throw new Error($[355]+h.name+'" and "'+j[g]+$[453]+g+'"!')}j[g]=h.name}for(var g in h.properties){if(f[g]){throw new Error($[355]+h.name+'" and "'+f[g]+'" in property "'+g+'"!')}f[g]=h.name}for(var g in h.members){if(a[g]){throw new Error($[355]+h.name+'" and "'+a[g]+$[453]+g+'"!')}a[g]=h.name}}return true},isCompatible:function(a,b){var c=qx.Class.getMixins(b);c.push(a);return qx.Mixin.checkCompatibility(c)},getByName:function(a){return this.__registry[a]},isDefined:function(a){return this.getByName(a)!==undefined},getTotalNumber:function(){return qx.lang.Object.getLength(this.__registry)},flatten:function(b){if(!b){return[]}var d=b.concat();for(var c=0,a=b.length;c<a;c++){if(b[c].$$includes){d.push.apply(d,this.flatten(b[c].$$includes))}}return d},genericToString:function(){return"[Mixin "+this.name+"]"},__registry:{},__allowedKeys:qx.core.Variant.select($[7],{on:{include:$[10],statics:$[10],members:$[10],properties:$[10],events:$[10],destruct:$[44],construct:$[44]},"default":null}),__validateConfig:qx.core.Variant.select($[7],{on:function(e,d){var j=this.__allowedKeys;for(var g in d){if(!j[g]){throw new Error($[286]+g+$[301]+e+$[191])}if(d[g]==null){throw new Error($[161]+g+$[301]+e+$[389])}if(j[g]!==null&&typeof d[g]!==j[g]){throw new Error($[275]+g+$[301]+e+$[287]+j[g]+'"!')}}var h=["statics","members","properties","events"];for(var f=0,c=h.length;f<c;f++){var g=h[f];if(d[g]!==undefined&&(d[g] instanceof Array||d[g] instanceof RegExp||d[g] instanceof Date||d[g].classname!==undefined)){throw new Error($[161]+g+$[301]+e+$[383])}}if(d.include){for(var f=0,b=d.include,c=b.length;f<c;f++){if(b[f]==null){throw new Error($[476]+(f+1)+$[488]+e+"'is undefined/null!")}if(b[f].$$type!=="Mixin"){throw new Error($[476]+(f+1)+$[488]+e+"'is not a mixin!")}}this.checkCompatibility(d.include)}},"default":function(){}})}});
+qx.Class.define("qx.Class",{statics:{_normalizeConfig:function(a){if(!a){var a={}}if(a.include&&!(a.include instanceof Array)){a.include=[a.include]}if(a.implement&&!(a.implement instanceof Array)){a.implement=[a.implement]}if(!a.hasOwnProperty("extend")&&!a.type){a.type=$[119]}return a},define:function(c,e){e=this._normalizeConfig(e);this.__validateConfig(c,e);var k;if(!e.extend){k=e.statics||{}}else{if(!e.construct){e.construct=this.__createDefaultConstructor()}k=this.__wrapConstructor(e.construct,c,e.type);if(e.statics){var o;for(var g=0,n=qx.lang.Object.getKeys(e.statics),f=n.length;g<f;g++){o=n[g];k[o]=e.statics[o]}}}var m=this.createNamespace(c,k,false);k.name=k.classname=c;k.basename=m;this.__registry[c]=k;if(!k.hasOwnProperty("toString")){k.toString=this.genericToString}if(e.extend){var b=e.extend.prototype;var d=this.__createEmptyFunction();d.prototype=b;var h=new d;k.prototype=h;h.name=h.classname=c;h.basename=m;e.construct.base=k.superclass=e.extend;e.construct.self=k.constructor=h.constructor=k;if(e.destruct){k.$$destructor=e.destruct}var j=this;k.$$initializer=function(){if(e.properties){j.__addProperties(k,e.properties,true)}if(e.members){j.__addMembers(k,e.members,true,true,false)}if(e.events){j.__addEvents(k,e.events,true)}if(e.include){for(var p=0,a=e.include.length;p<a;p++){j.__addMixin(k,e.include[p],false)}}}}if(e.settings){for(var o in e.settings){qx.core.Setting.define(o,e.settings[o])}}if(e.variants){for(var o in e.variants){qx.core.Variant.define(o,e.variants[o].allowedValues,e.variants[o].defaultValue)}}if(e.defer){this.__initializeClass(k);e.defer.self=k;e.defer(k,k.prototype,{add:function(i,a){var l={};l[i]=a;qx.Class.__addProperties(k,l,true)}})}},createNamespace:function(d,c){var g=d.split(".");var f=window;var b=g[0];for(var e=0,a=g.length-1;e<a;e++,b=g[e]){if(!f[b]){f=f[b]={}}else{f=f[b]}}if(qx.core.Variant.isSet($[7],"on")){if(f[b]!==undefined){throw new Error("An object of the name '"+d+"' already exists and overwriting is not allowed!")}}f[b]=c;return b},isDefined:function(a){return this.getByName(a)!==undefined},getTotalNumber:function(){return qx.lang.Object.getLength(this.__registry)},getByName:function(a){return this.__registry[a]},include:function(b,a){if(qx.core.Variant.isSet($[7],"on")){if(!a){throw new Error("Includes of mixins must be mixins. The mixin of class '"+b.classname+"' is undefined/null!")}qx.Mixin.isCompatible(a,b)}qx.Class.__addMixin(b,a,false)},patch:function(b,a){if(qx.core.Variant.isSet($[7],"on")){qx.Mixin.isCompatible(a,b)}qx.Class.__addMixin(b,a,true)},isSubClassOf:function(a,b){if(!a){return false}if(a==b){return true}if(a.prototype instanceof b){return true}return false},getPropertyDefinition:function(b,a){while(b){if(b.$$properties&&b.$$properties[a]){return b.$$properties[a]}b=b.superclass}return null},getByProperty:function(b,a){while(b){if(b.$$properties&&b.$$properties[a]){return b}b=b.superclass}return null},hasProperty:function(b,a){return !!this.getPropertyDefinition(b,a)},getEventType:function(b,a){var b=b.constructor;while(b.superclass){if(b.$$events&&b.$$events[a]!==undefined){return b.$$events[a]}b=b.superclass}return null},supportsEvent:function(b,a){return !!this.getEventType(b,a)},hasOwnMixin:function(b,a){return b.$$includes&&b.$$includes.indexOf(a)!==-1},getByMixin:function(c,b){var e,d,a;while(c){if(c.$$includes){e=c.$$flatIncludes;for(d=0,a=e.length;d<a;d++){if(e[d]===b){return c}}}c=c.superclass}return null},getMixins:function(a){var b=[];while(a){if(a.$$includes){b.push.apply(b,a.$$flatIncludes)}a=a.superclass}return b},hasMixin:function(b,a){return !!this.getByMixin(b,a)},hasOwnInterface:function(a,b){return a.$$implements&&a.$$implements.indexOf(b)!==-1},getByInterface:function(b,e){var d,c,a;while(b){if(b.$$implements){d=b.$$flatImplements;for(c=0,a=d.length;c<a;c++){if(d[c]===e){return b}}}b=b.superclass}return null},getInterfaces:function(a){var b=[];while(a){if(a.$$implements){b.push.apply(b,a.$$flatImplements)}a=a.superclass}return b},hasInterface:function(a,b){return !!this.getByInterface(a,b)},implementsInterface:function(a,b){return false},getInstance:function(){if(!this.$$instance){this.$$allowconstruct=true;this.$$instance=new this;delete this.$$allowconstruct}return this.$$instance},genericToString:function(){return"[Class "+this.classname+"]"},__registry:qx.core.Bootstrap.__registry,__allowedKeys:qx.core.Variant.select($[7],{on:{type:$[13],extend:$[44],implement:$[10],include:$[10],construct:$[44],statics:$[10],properties:$[10],members:$[10],settings:$[10],variants:$[10],events:$[10],defer:$[44],destruct:$[44]},"default":null}),__staticAllowedKeys:qx.core.Variant.select($[7],{on:{type:$[13],statics:$[10],settings:$[10],variants:$[10],defer:$[44]},"default":null}),__validateConfig:qx.core.Variant.select($[7],{on:function(b,c){if(c.type&&!(c.type===$[119]||c.type===$[97]||c.type===$[33])){throw new Error('Invalid type "'+c.type+'" definition for class "'+b+'"!')}var h=c.type===$[119]?this.__staticAllowedKeys:this.__allowedKeys;for(var k in c){if(!h[k]){throw new Error($[273]+k+$[123]+b+$[204])}if(c[k]==null){throw new Error($[166]+k+$[123]+b+$[397])}if(typeof c[k]!==h[k]){throw new Error($[291]+k+$[123]+b+$[277]+h[k]+'"!')}}var g=["statics","properties","members","settings","variants","events"];for(var e=0,d=g.length;e<d;e++){var k=g[e];if(c[k]!==undefined&&(c[k] instanceof Array||c[k] instanceof RegExp||c[k] instanceof Date||c[k].classname!==undefined)){throw new Error($[166]+k+$[123]+b+$[401])}}if(c.include){if(c.include instanceof Array){for(var e=0,j=c.include,d=j.length;e<d;e++){if(j[e]==null||j[e].$$type!=="Mixin"){throw new Error('The include definition in class "'+b+'" contains an invalid mixin at position '+e+": "+j[e])}}}else{throw new Error('Invalid include definition in class "'+b+'"! Only mixins and arrays of mixins are allowed!')}}if(c.implement){if(c.implement instanceof Array){for(var e=0,j=c.implement,d=j.length;e<d;e++){if(j[e]==null||j[e].$$type!=="Interface"){throw new Error('The implement definition in class "'+b+'" contains an invalid interface at position '+e+": "+j[e])}}}else{throw new Error('Invalid implement definition in class "'+b+'"! Only interfaces and arrays of interfaces are allowed!')}}if(c.include){try{qx.Mixin.checkCompatibility(c.include)}catch(f){throw new Error('Error in include definition of class "'+b+'"! '+f.message)}}if(c.variants){for(var k in c.variants){if(k.substr(0,k.indexOf("."))!=b.substr(0,b.indexOf("."))){throw new Error('Forbidden variant "'+k+'" found in "'+b+'". It is forbidden to define a variant for an external namespace!')}}}},"default":function(){}}),__addEvents:function(a,c,d){if(qx.core.Variant.isSet($[7],"on")){if(!qx.core.Target){throw new Error(a.classname+": the class 'qx.core.Target' must be availabe to use events!")}if(typeof c!==$[10]||c instanceof Array){throw new Error(a.classname+": the events must be defined as map!")}for(var b in c){if(typeof c[b]!==$[13]){throw new Error(a.classname+"/"+b+": the event value needs to be a string with the class name of the event object which will be fired.")}}if(a.$$events&&d!==true){for(var b in c){if(a.$$events[b]!==undefined&&a.$$events[b]!==c[b]){throw new Error(a.classname+"/"+b+": the event value/type cannot be changed from "+a.$$events[b]+" to "+c[b])}}}}if(a.$$events){for(var b in c){a.$$events[b]=c[b]}}else{a.$$events=c}},__addProperties:function(d,e,g){var c;if(g===undefined){g=false}var a=!!d.$$propertiesAttached;for(var b in e){c=e[b];if(qx.core.Variant.isSet($[7],"on")){}c.name=b;if(!c.refine){if(d.$$properties===undefined){d.$$properties={}}d.$$properties[b]=c}if(c.init!==undefined){d.prototype["__init$"+b]=c.init}if(c.event!==undefined){var f={};f[c.event]=$[399];this.__addEvents(d,f,g)}if(c.inheritable){qx.core.Property.$$inheritable[b]=true}if(a){qx.core.Property.attachMethods(d,b,c)}if(c._fast){qx.core.LegacyProperty.addFastProperty(c,d.prototype)}else{if(c._cached){qx.core.LegacyProperty.addCachedProperty(c,d.prototype)}else{if(c._legacy){qx.core.LegacyProperty.addProperty(c,d.prototype)}}}}},__validateProperty:qx.core.Variant.select($[7],{on:function(d,a,c,b){var g=this.hasProperty(d,a);var h=c._legacy||c._fast||c._cached;if(g){var i=this.getPropertyDefinition(d,a);var j=i._legacy||i._fast||i._cached;if(h!=j){throw new Error("Could not redefine existing property '"+a+$[463]+d.classname+"'.")}if(c.refine&&i.init===undefined){throw new Error("Could not refine a init value if there was previously no init value defined. Property '"+a+$[463]+d.classname+"'.")}}if(!g&&c.refine){throw new Error("Could not refine non-existent property: "+a+"!")}if(g&&!b){throw new Error("Class "+d.classname+" already has a property: "+a+"!")}if(g&&b&&!h){if(!c.refine){throw new Error('Could not refine property "'+a+'" without a "refine" flag in the property definition! This class: '+d.classname+", original class: "+this.getByProperty(d,a).classname+".")}for(var f in c){if(f!=="init"&&f!=="refine"){throw new Error("Class "+d.classname+" could not refine property: "+a+"! Key: "+f+" could not be refined!")}}}if(h){return}var e=c.group?qx.core.Property.$$allowedGroupKeys:qx.core.Property.$$allowedKeys;for(var f in c){if(e[f]===undefined){throw new Error($[273]+f+$[374]+a+$[123]+d.classname+$[204])}if(c[f]===undefined){throw new Error($[166]+f+$[374]+a+$[123]+d.classname+'"! The value is undefined: '+c[f])}if(e[f]!==null&&typeof c[f]!==e[f]){throw new Error($[291]+f+$[374]+a+$[123]+d.classname+$[277]+e[f]+'"!')}}if(c.transform!=null){if(!(typeof c.transform==$[13])){throw new Error('Invalid transform definition of property "'+a+$[123]+d.classname+'"! Needs to be a String.')}}if(c.check!=null){if(!(typeof c.check==$[13]||c.check instanceof Array||c.check instanceof Function)){throw new Error('Invalid check definition of property "'+a+$[123]+d.classname+'"! Needs to be a String, Array or Function.')}}if(c.event!=null&&!this.isSubClassOf(d,qx.core.Target)){throw new Error("Invalid property '"+a+"' in class '"+d.classname+"': Properties defining an event can only be defined in sub classes of 'qx.core.Target'!")}},"default":null}),__addMembers:function(k,f,d,b,c){var j=k.prototype;var n,h;for(var g=0,m=qx.lang.Object.getKeys(f),e=m.length;g<e;g++){n=m[g];h=f[n];if(qx.core.Variant.isSet($[7],"on")){if(j[n]!==undefined&&n.charAt(0)=="_"&&n.charAt(1)=="_"){throw new Error('Overwriting private member "'+n+$[476]+k.classname+$[204])}if(d!==true&&j[n]!==undefined){throw new Error('Overwriting member "'+n+$[476]+k.classname+$[204])}}if(b!==false&&h instanceof Function){if(c==true){h=this.__mixinMemberWrapper(h,j[n])}else{if(j[n]){h.base=j[n]}h.self=k}}j[n]=h}},__mixinMemberWrapper:function(b,a){if(a){return function(){var d=b.base;b.base=a;var c=b.apply(this,arguments);b.base=d;return c}}else{return b}},__addMixin:function(c,b,g){if(qx.core.Variant.isSet($[7],"on")){if(!c||!b){throw new Error("Incomplete parameters!")}if(this.hasMixin(c,b)){throw new Error('Mixin "'+b.name+'" is already included into Class "'+c.classname+'" by class: '+this.getByMixin(c,b).classname+"!")}}var f=qx.Mixin.flatten([b]);var e;for(var d=0,a=f.length;d<a;d++){e=f[d];if(e.$$events){this.__addEvents(c,e.$$events,g)}if(e.$$properties){this.__addProperties(c,e.$$properties,g)}if(e.$$members){this.__addMembers(c,e.$$members,g,g,g)}}if(c.$$includes){c.$$includes.push(b);c.$$flatIncludes.push.apply(c.$$flatIncludes,f)}else{c.$$includes=[b];c.$$flatIncludes=f}},__createDefaultConstructor:function(){function a(){arguments.callee.base.apply(this,arguments)}return a},__createEmptyFunction:function(){return function(){}},__initializeClass:function(a){if(a.$$initializer){var b=[];var c=a;while(c.$$initializer){b.push(c);c=c.superclass}while(b.length>0){c=b.pop();c.$$initializer();delete c.$$initializer}}},__wrapConstructor:function(a,b,c){var d=this.__initializeClass;var e=function(){var j=arguments.callee.constructor;d(j);if(qx.core.Variant.isSet($[7],"on")){if(!(this instanceof j)){throw new Error("Please initialize "+b+" objects using the new keyword!")}if(c===$[97]){if(this.classname===b){throw new Error("The class "+b+" is abstract! It is not possible to instantiate it.")}}else{if(c===$[33]){if(!j.$$allowconstruct){throw new Error("The class "+b+" is a singleton! It is not possible to instantiate it directly. Use the static getInstance() method instead.")}}}}if(!j.$$propertiesAttached){qx.core.Property.attach(j)}var h=j.$$original.apply(this,arguments);if(j.$$includes){var g=j.$$flatIncludes;for(var k=0,f=g.length;k<f;k++){if(g[k].$$constructor){g[k].$$constructor.apply(this,arguments)}}}if(this.classname===", name, ".classname){this.$$initialized=true}return h};if(c===$[33]){e.getInstance=this.getInstance}e.$$original=a;a.wrapper=e;return e}}});
+qx.Class.define("qx.Mixin",{statics:{define:function(c,b){if(b){if(b.include&&!(b.include instanceof Array)){b.include=[b.include]}if(qx.core.Variant.isSet($[7],"on")){this.__validateConfig(c,b)}var a=b.statics?b.statics:{};for(var d in a){a[d].mixin=a}if(b.construct){a.$$constructor=b.construct}if(b.include){a.$$includes=b.include}if(b.properties){a.$$properties=b.properties}if(b.members){a.$$members=b.members}for(var d in a.$$members){if(a.$$members[d] instanceof Function){a.$$members[d].mixin=a}}if(b.events){a.$$events=b.events}if(b.destruct){a.$$destructor=b.destruct}}else{var a={}}a.$$type="Mixin";a.name=c;a.toString=this.genericToString;a.basename=qx.Class.createNamespace(c,a);this.__registry[c]=a;return a},checkCompatibility:function(c){var e=this.flatten(c);var d=e.length;if(d<2){return true}var f={};var a={};var j={};var h;for(var b=0;b<d;b++){h=e[b];for(var g in h.events){if(j[g]){throw new Error($[366]+h.name+'" and "'+j[g]+$[406]+g+'"!')}j[g]=h.name}for(var g in h.properties){if(f[g]){throw new Error($[366]+h.name+'" and "'+f[g]+'" in property "'+g+'"!')}f[g]=h.name}for(var g in h.members){if(a[g]){throw new Error($[366]+h.name+'" and "'+a[g]+$[406]+g+'"!')}a[g]=h.name}}return true},isCompatible:function(a,b){var c=qx.Class.getMixins(b);c.push(a);return qx.Mixin.checkCompatibility(c)},getByName:function(a){return this.__registry[a]},isDefined:function(a){return this.getByName(a)!==undefined},getTotalNumber:function(){return qx.lang.Object.getLength(this.__registry)},flatten:function(b){if(!b){return[]}var d=b.concat();for(var c=0,a=b.length;c<a;c++){if(b[c].$$includes){d.push.apply(d,this.flatten(b[c].$$includes))}}return d},genericToString:function(){return"[Mixin "+this.name+"]"},__registry:{},__allowedKeys:qx.core.Variant.select($[7],{on:{include:$[10],statics:$[10],members:$[10],properties:$[10],events:$[10],destruct:$[44],construct:$[44]},"default":null}),__validateConfig:qx.core.Variant.select($[7],{on:function(e,d){var j=this.__allowedKeys;for(var g in d){if(!j[g]){throw new Error($[273]+g+$[274]+e+$[204])}if(d[g]==null){throw new Error($[166]+g+$[274]+e+$[397])}if(j[g]!==null&&typeof d[g]!==j[g]){throw new Error($[291]+g+$[274]+e+$[277]+j[g]+'"!')}}var h=["statics","members","properties","events"];for(var f=0,c=h.length;f<c;f++){var g=h[f];if(d[g]!==undefined&&(d[g] instanceof Array||d[g] instanceof RegExp||d[g] instanceof Date||d[g].classname!==undefined)){throw new Error($[166]+g+$[274]+e+$[401])}}if(d.include){for(var f=0,b=d.include,c=b.length;f<c;f++){if(b[f]==null){throw new Error($[503]+(f+1)+$[436]+e+"'is undefined/null!")}if(b[f].$$type!=="Mixin"){throw new Error($[503]+(f+1)+$[436]+e+"'is not a mixin!")}}this.checkCompatibility(d.include)}},"default":function(){}})}});
 qx.Mixin.define("qx.core.MUserData",{members:{setUserData:function(a,b){if(!this.__userData){this.__userData={}}this.__userData[a]=b},getUserData:function(a){if(!this.__userData){return null}var b=this.__userData[a];return b===undefined?null:b}},destruct:function(){this._disposeFields("__userData")}});
-qx.Class.define("qx.core.LegacyProperty",{statics:{getSetterName:function(a){return qx.core.Property.$$method.set[a]},getGetterName:function(a){return qx.core.Property.$$method.get[a]},getResetterName:function(a){return qx.core.Property.$$method.reset[a]},addFastProperty:function(b,d){var c=b.name;var g=qx.lang.String.toFirstUp(c);var h="_value"+g;var f="get"+g;var e="set"+g;var a="_compute"+g;d[h]=typeof b.defaultValue!==$[8]?b.defaultValue:null;if(b.noCompute){d[f]=function(){return this[h]}}else{d[f]=function(){return this[h]==null?this[h]=this[a]():this[h]}}d[f].self=d.constructor;if(b.setOnlyOnce){d[e]=function(i){this[h]=i;this[e]=null;return i}}else{d[e]=function(i){return this[h]=i}}d[e].self=d.constructor;if(!b.noCompute){d[a]=function(){return null};d[a].self=d.constructor}},addCachedProperty:function(c,e){var d=c.name;var f=qx.lang.String.toFirstUp(d);var g="_cached"+f;var a="_compute"+f;var b="_change"+f;if(typeof c.defaultValue!==$[8]){e[g]=c.defaultValue}e["get"+f]=function(){if(this[g]==null){this[g]=this[a]()}return this[g]};e[$[554]+f]=function(){if(this[g]!=null){this[g]=null;if(c.addToQueueRuntime){this.addToQueueRuntime(c.name)}}};e["_recompute"+f]=function(){var h=this[g];var i=this[a]();if(i!=h){this[g]=i;this[b](i,h);return true}return false};e[b]=function(i,h){};e[a]=function(){return null};e["get"+f].self=e.constructor;e[$[554]+f].self=e.constructor;e["_recompute"+f].self=e.constructor},addProperty:function(c,f){if(typeof c!==$[10]){throw new Error("AddProperty: Param should be an object!")}if(typeof c.name!==$[13]){throw new Error("AddProperty: Malformed input parameters: name needed!")}if(c.dispose===undefined&&(c.type==$[44]||c.type==$[10])){c.dispose=true}c.method=qx.lang.String.toFirstUp(c.name);c.implMethod=c.impl?qx.lang.String.toFirstUp(c.impl):c.method;if(c.defaultValue==undefined){c.defaultValue=null}c.allowNull=c.allowNull!==false;c.allowMultipleArguments=c.allowMultipleArguments===true;if(typeof c.type===$[13]){c.hasType=true}else{if(typeof c.type!==$[8]){throw new Error("AddProperty: Invalid type definition for property "+c.name+": "+c.type)}else{c.hasType=false}}if(typeof c.instance===$[13]){c.hasInstance=true}else{if(typeof c.instance!==$[8]){throw new Error("AddProperty: Invalid instance definition for property "+c.name+": "+c.instance)}else{c.hasInstance=false}}if(typeof c.classname===$[13]){c.hasClassName=true}else{if(typeof c.classname!==$[8]){throw new Error("AddProperty: Invalid classname definition for property "+c.name+": "+c.classname)}else{c.hasClassName=false}}c.hasConvert=c.convert!=null;c.hasPossibleValues=c.possibleValues!=null;c.addToQueue=c.addToQueue||false;c.addToQueueRuntime=c.addToQueueRuntime||false;c.up=c.name.toUpperCase();var e=qx.core.Property.$$store.user[c.name]="__user$"+c.name;var a=$[79]+c.method;var d="_modify"+c.implMethod;var b="_check"+c.implMethod;var g=qx.core.Property.$$method;if(!g.set[c.name]){g.set[c.name]="set"+c.method;g.get[c.name]="get"+c.method;g.reset[c.name]=$[138]+c.method}f[e]=c.defaultValue;f["get"+c.method]=function(){return this[e]};f["force"+c.method]=function(h){return this[e]=h};f[$[138]+c.method]=function(){return this["set"+c.method](c.defaultValue)};if(c.type===$[124]){f["toggle"+c.method]=function(h){return this["set"+c.method](!this[e])}}if(c.allowMultipleArguments||c.hasConvert||c.hasInstance||c.hasClassName||c.hasPossibleValues||c.hasUnitDetection||c.addToQueue||c.addToQueueRuntime||c.addToStateQueue){f["set"+c.method]=function(j){if(c.allowMultipleArguments&&arguments.length>1){j=qx.lang.Array.fromArguments(arguments)}if(c.hasConvert){try{j=c.convert.call(this,j,c)}catch(i){throw new Error("Attention! Could not convert new value for "+c.name+": "+j+": "+i)}}var h=this[e];if(j===h){return j}if(!(c.allowNull&&j==null)){if(c.hasType&&typeof j!==c.type){throw new Error($[250]+j+$[224]+c.name+$[432]+c.type+$[548]+typeof j+'"!')}if(qx.Class.getByName(c.instance)){if(c.hasInstance&&!(j instanceof qx.Class.getByName(c.instance))){throw new Error($[250]+j+$[224]+c.name+$[537]+c.instance+'"!')}}else{if(qx.core.Variant.isSet($[403],"on")){if(c.hasInstance&&!(j instanceof qx.OO.classes[c.instance])){throw new Error($[250]+j+$[224]+c.name+$[537]+c.instance+'"!')}}}if(c.hasClassName&&j.classname!=c.classname){throw new Error($[250]+j+$[224]+c.name+'" which must be an object with the classname "'+c.classname+'"!')}if(c.hasPossibleValues&&j!=null&&!qx.lang.Array.contains(c.possibleValues,j)){throw new Error("Failed to save value for "+c.name+". '"+j+"' is not a possible value!")}}if(this[b]){try{j=this[b](j,c);if(j===h){return j}}catch(i){throw new Error($[569]+c.name+" "+i)}}this[e]=j;if(this[d]){try{this[d](j,h,c)}catch(i){throw new Error('Modification of property "'+c.name+$[528]+i)}}if(c.addToQueue){this.addToQueue(c.name)}if(c.addToQueueRuntime){this.addToQueueRuntime(c.name)}if(c.addToStateQueue){this.addToStateQueue()}if(this.hasEventListeners&&this.hasEventListeners(a)){try{this.createDispatchDataEvent(a,j)}catch(i){throw new Error("Property "+c.name+$[530]+i)}}return j}}else{f["set"+c.method]=function(l){var i=this[e];if(l===i){return l}if(!(c.allowNull&&l==null)){if(c.hasType&&typeof l!==c.type){throw new Error($[250]+l+$[224]+c.name+$[432]+c.type+$[548]+typeof l+'"!')}}if(this[b]){try{l=this[b](l,c);if(l===i){return l}}catch(j){throw new Error($[569]+c.name+" "+j)}}this[e]=l;if(this[d]){try{this[d](l,i,c)}catch(j){var h=new String(l).substring(0,50);throw new Error('Setting property "'+c.name+'" to "'+h+$[528]+j)}}if(this.hasEventListeners&&this.hasEventListeners(a)){var k=new qx.event.type.DataEvent(a,l,i,false);k.setTarget(this);try{this.dispatchEvent(k,true)}catch(j){throw new Error("Property "+c.name+$[530]+j)}}return l}}f["set"+c.method].self=f.constructor;if(typeof c.getAlias===$[13]){f[c.getAlias]=f["get"+c.method]}if(typeof c.setAlias===$[13]){f[c.setAlias]=f["set"+c.method]}}}});
-qx.Class.define("qx.core.Property",{statics:{__checks:{Boolean:'typeof value === "boolean"',String:'typeof value === "string"',NonEmptyString:'typeof value === "string" && value.length > 0',Number:$[337],Integer:'typeof value === "number" && isFinite(value) && value%1 === 0',Float:$[337],Double:$[337],Error:"value instanceof Error",RegExp:"value instanceof RegExp",Object:'value !== null && typeof value === "object"',Array:"value instanceof Array",Map:'value !== null && typeof value === "object" && !(value instanceof Array) && !(value instanceof qx.core.Object)',Function:"value instanceof Function",Date:"value instanceof Date",Node:"value !== null && value.nodeType !== undefined",Element:"value !== null && value.nodeType === 1 && value.attributes",Document:"value !== null && value.nodeType === 9 && value.documentElement",Window:"value !== null && window.document",Event:"value !== null && value.type !== undefined",Class:'value !== null && value.$$type === "Class"',Mixin:'value !== null && value.$$type === "Mixin"',Interface:'value !== null && value.$$type === "Interface"',Theme:'value !== null && value.$$type === "Theme"',Color:'typeof value === "string" && qx.util.ColorUtil.isValid(value)',Border:$[478],Font:$[478],Label:'value !== null && typeof value === "string"'},__dispose:{Object:true,Array:true,Map:true,Function:true,Date:true,Node:true,Element:true,Document:true,Window:true,Event:true,Class:true,Mixin:true,Interface:true,Theme:true,Border:true,Font:true},$$inherit:$[133],$$idcounter:0,$$store:{user:{},theme:{},inherit:{},init:{},useinit:{}},$$method:{get:{},set:{},reset:{},init:{},refresh:{},style:{},unstyle:{}},$$allowedKeys:{name:$[13],dispose:$[124],inheritable:$[124],nullable:$[124],themeable:$[124],refine:$[124],init:null,apply:$[13],event:$[13],check:null,transform:$[13],deferredInit:$[124]},$$allowedGroupKeys:{name:$[13],group:$[10],mode:$[13],themeable:$[124]},$$inheritable:{},refresh:function(g){var f=g.getParent();if(f){var c=g.constructor;var b=this.$$store.inherit;var e=this.$$method.refresh;var d;if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[235])>1){g.debug("Update widget: "+g)}}while(c){d=c.$$properties;if(d){for(var a in this.$$inheritable){if(d[a]&&g[e[a]]){if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[235])>2){g.debug("Updating property: "+a+" to '"+f[b[a]]+"'")}}g[e[a]](f[b[a]])}}}c=c.superclass}}},attach:function(b){var c=b.$$properties;if(c){for(var a in c){this.attachMethods(b,a,c[a])}}b.$$propertiesAttached=true},attachMethods:function(c,b,a){if(a._legacy||a._fast||a._cached){return}var d,e;if(b.charAt(0)==="_"){if(b.charAt(1)==="_"){d="__";e=qx.lang.String.toFirstUp(b.substring(2))}else{d="_";e=qx.lang.String.toFirstUp(b.substring(1))}}else{d="";e=qx.lang.String.toFirstUp(b)}a.group?this.__attachGroupMethods(c,a,d,e):this.__attachPropertyMethods(c,a,d,e)},__attachGroupMethods:function(n,e,k,r){var h=n.prototype;var b=e.name;var d=e.themeable===true;if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[235])>1){console.debug("Generating property group: "+b)}}var g=[];var o=[];if(d){var s=[];var m=[]}var c="var a=arguments[0] instanceof Array?arguments[0]:arguments;";g.push(c);if(d){s.push(c)}if(e.mode==$[253]){var p="a=qx.lang.Array.fromShortHand(qx.lang.Array.fromArguments(a));";g.push(p);if(d){s.push(p)}}for(var j=0,q=e.group,f=q.length;j<f;j++){if(qx.core.Variant.isSet($[7],"on")){if(!this.$$method.set[q[j]]||!this.$$method.reset[q[j]]){throw new Error("Cannot create property group '"+b+"' including non-existing property '"+q[j]+"'!")}}g.push($[69],this.$$method.set[q[j]],"(a[",j,"]);");o.push($[69],this.$$method.reset[q[j]],"();");if(d){if(qx.core.Variant.isSet($[7],"on")){if(!this.$$method.style[q[j]]){throw new Error("Cannot add the non themable property '"+q[j]+"' to the themable property group '"+b+"'")}}s.push($[69],this.$$method.style[q[j]],"(a[",j,"]);");m.push($[69],this.$$method.unstyle[q[j]],"();")}}this.$$method.set[b]=k+"set"+r;h[this.$$method.set[b]]=new Function(g.join(""));this.$$method.reset[b]=k+$[138]+r;h[this.$$method.reset[b]]=new Function(o.join(""));if(d){this.$$method.style[b]=k+$[83]+r;h[this.$$method.style[b]]=new Function(s.join(""));this.$$method.unstyle[b]=k+$[150]+r;h[this.$$method.unstyle[b]]=new Function(m.join(""))}},__attachPropertyMethods:function(e,d,f,h){var b=e.prototype;var c=d.name;if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[235])>1){console.debug("Generating property wrappers: "+c)}}if(d.dispose===undefined&&typeof d.check===$[13]){d.dispose=this.__dispose[d.check]||qx.Class.isDefined(d.check)}var g=this.$$method;var a=this.$$store;a.user[c]="__user$"+c;a.theme[c]="__theme$"+c;a.init[c]="__init$"+c;a.inherit[c]="__inherit$"+c;a.useinit[c]="__useinit$"+c;g.get[c]=f+"get"+h;b[g.get[c]]=function(){return qx.core.Property.executeOptimizedGetter(this,e,c,"get")};g.set[c]=f+"set"+h;b[g.set[c]]=function(i){return qx.core.Property.executeOptimizedSetter(this,e,c,"set",arguments)};g.reset[c]=f+$[138]+h;b[g.reset[c]]=function(){return qx.core.Property.executeOptimizedSetter(this,e,c,$[138])};if(d.inheritable||d.apply||d.event||d.deferredInit){g.init[c]=f+"init"+h;b[g.init[c]]=function(i){return qx.core.Property.executeOptimizedSetter(this,e,c,"init",arguments)}}if(d.inheritable){g.refresh[c]=f+$[168]+h;b[g.refresh[c]]=function(i){return qx.core.Property.executeOptimizedSetter(this,e,c,$[168],arguments)}}if(d.themeable){g.style[c]=f+$[83]+h;b[g.style[c]]=function(i){return qx.core.Property.executeOptimizedSetter(this,e,c,$[83],arguments)};g.unstyle[c]=f+$[150]+h;b[g.unstyle[c]]=function(){return qx.core.Property.executeOptimizedSetter(this,e,c,$[150])}}if(d.check===$[3]){b[f+"toggle"+h]=new Function($[163]+g.set[c]+"(!this."+g.get[c]+"())");b[f+"is"+h]=new Function($[163]+g.get[c]+"()")}},__errors:{0:"Could not change or apply init value after constructing phase!",1:"Requires exactly one argument!",2:"Undefined value is not allowed!",3:"Does not allow any arguments!",4:"Null value is not allowed!",5:"Is invalid!"},error:function(e,g,c,a,b){var d=e.constructor.classname;var f="Error in property "+c+" of class "+d+" in method "+this.$$method[a][c]+" with incoming value '"+b+"': ";throw new Error(f+(this.__errors[g]||"Unknown reason: "+g))},__unwrapFunctionFromCode:function(a,c,e,g,h,d){var b=this.$$method[g][e];if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[235])>1){console.debug("Code["+this.$$method[g][e]+"]: "+h.join(""))}try{c[b]=new Function("value",h.join(""))}catch(f){alert("Malformed generated code to unwrap method: "+this.$$method[g][e]+"\n"+h.join(""))}}else{c[b]=new Function("value",h.join(""))}if(d===undefined){return a[b]()}else{if(qx.core.Variant.isSet($[7],"on")){return a[b].apply(a,d)}else{return a[b](d[0])}}},executeOptimizedGetter:function(a,e,d,f){var c=e.$$properties[d];var b=e.prototype;var g=[];if(c.inheritable){g.push($[129],this.$$store.inherit[d],$[157]);g.push($[163],this.$$store.inherit[d],";");g.push("else ")}g.push($[129],this.$$store.user[d],$[157]);g.push($[163],this.$$store.user[d],";");if(c.themeable){g.push($[241],this.$$store.theme[d],$[157]);g.push($[163],this.$$store.theme[d],";")}if(c.deferredInit&&c.init===undefined){g.push($[241],this.$$store.init[d],$[157]);g.push($[163],this.$$store.init[d],";")}g.push("else ");if(c.init!==undefined){g.push($[163],this.$$store.init[d],";")}else{if(c.inheritable||c.nullable){g.push("return null;")}else{g.push('throw new Error("Property ',d," of an instance of ",e.classname,' is not (yet) ready!");')}}return this.__unwrapFunctionFromCode(a,b,d,f,g)},executeOptimizedSetter:function(k,g,a,e,h){var d=g.$$properties[a];var f=g.prototype;var b=[];var i=e==="set"||e===$[83]||(e==="init"&&d.init===undefined);var l=e===$[138]||e===$[150];var c=d.apply||d.event||d.inheritable;if(e===$[83]||e===$[150]){var j=this.$$store.theme[a]}else{if(e==="init"){var j=this.$$store.init[a]}else{var j=this.$$store.user[a]}}if(qx.core.Variant.isSet($[7],"on")){b.push($[461]);if(e==="init"){b.push('if(this.$$initialized)prop.error(this,0,"'+a+'","'+e+$[177])}if(e===$[168]){}else{if(i){b.push('if(arguments.length!==1)prop.error(this,1,"'+a+'","'+e+$[177]);b.push($[471]+a+'","'+e+$[177])}else{b.push('if(arguments.length!==0)prop.error(this,3,"'+a+'","'+e+$[177])}}}else{if(!d.nullable||d.check||d.inheritable){b.push($[461])}if(qx.core.Variant.isSet($[7],"on")&&e==="set"){b.push($[471]+a+'","'+e+$[177])}}if(i){if(d.transform){b.push("value=this.",d.transform,"(value);")}}if(c){if(i){b.push($[129],j,"===value)return value;")}else{if(l){b.push($[129],j,"===undefined)return;")}}}if(d.inheritable){b.push("var inherit=prop.$$inherit;")}if(i&&qx.core.Variant.isSet($[7],"on")){if(!d.nullable){b.push('if(value===null)prop.error(this,4,"'+a+'","'+e+$[177])}if(d.check!==undefined){if(d.nullable){b.push("if(value!==null)")}if(d.inheritable){b.push("if(value!==inherit)")}b.push("if(");if(this.__checks[d.check]!==undefined){b.push("!(",this.__checks[d.check],")")}else{if(qx.Class.isDefined(d.check)){b.push("!(value instanceof ",d.check,")")}else{if(typeof d.check===$[44]){b.push("!",g.classname,$[496],a);b.push(".check.call(this, value)")}else{if(typeof d.check===$[13]){b.push("!(",d.check,")")}else{if(d.check instanceof Array){d.checkMap=qx.lang.Object.fromArray(d.check);b.push(g.classname,$[496],a);b.push(".checkMap[value]===undefined")}else{throw new Error("Could not add check to property "+a+" of class "+g.classname)}}}}}b.push(')prop.error(this,5,"'+a+'","'+e+$[177])}}if(!c){if(e==="set"){b.push($[69],this.$$store.user[a],$[81])}else{if(e===$[138]){b.push($[129],this.$$store.user[a],$[157]);b.push($[148],this.$$store.user[a],";")}else{if(e===$[83]){b.push($[69],this.$$store.theme[a],$[81])}else{if(e===$[150]){b.push($[129],this.$$store.theme[a],$[157]);b.push($[148],this.$$store.theme[a],";")}else{if(e==="init"&&i){b.push($[69],this.$$store.init[a],$[81])}}}}}}else{if(d.inheritable){b.push("var computed, old=this.",this.$$store.inherit[a],";")}else{b.push("var computed, old;")}b.push($[129],this.$$store.user[a],$[293]);if(e==="set"){if(!d.inheritable){b.push($[274],this.$$store.user[a],";")}b.push($[59],this.$$store.user[a],$[81])}else{if(e===$[138]){if(!d.inheritable){b.push($[274],this.$$store.user[a],";")}b.push($[148],this.$$store.user[a],";");b.push($[129],this.$$store.theme[a],$[157]);b.push($[59],this.$$store.theme[a],";");b.push($[241],this.$$store.init[a],$[293]);b.push($[59],this.$$store.init[a],";");b.push($[69],this.$$store.useinit[a],"=true;");b.push("}")}else{if(d.inheritable){b.push($[59],this.$$store.user[a],";")}else{b.push("old=computed=this.",this.$$store.user[a],";")}if(e===$[83]){b.push($[69],this.$$store.theme[a],$[81])}else{if(e===$[150]){b.push($[148],this.$$store.theme[a],";")}else{if(e==="init"&&i){b.push($[69],this.$$store.init[a],$[81])}}}}}b.push("}");if(d.themeable){b.push($[241],this.$$store.theme[a],$[293]);if(!d.inheritable){b.push($[274],this.$$store.theme[a],";")}if(e==="set"){b.push($[59],this.$$store.user[a],$[81])}else{if(e===$[83]){b.push($[59],this.$$store.theme[a],$[81])}else{if(e===$[150]){b.push($[148],this.$$store.theme[a],";");b.push($[129],this.$$store.init[a],$[293]);b.push($[59],this.$$store.init[a],";");b.push($[69],this.$$store.useinit[a],"=true;");b.push("}")}else{if(e==="init"){if(i){b.push($[69],this.$$store.init[a],$[81])}b.push($[59],this.$$store.theme[a],";")}else{if(e===$[168]){b.push($[59],this.$$store.theme[a],";")}}}}}b.push("}")}b.push($[241],this.$$store.useinit[a],"){");if(!d.inheritable){b.push($[274],this.$$store.init[a],";")}if(e==="init"){if(i){b.push($[59],this.$$store.init[a],$[81])}else{b.push($[59],this.$$store.init[a],";")}}else{if(e==="set"||e===$[83]||e===$[168]){b.push($[148],this.$$store.useinit[a],";");if(e==="set"){b.push($[59],this.$$store.user[a],$[81])}else{if(e===$[83]){b.push($[59],this.$$store.theme[a],$[81])}else{if(e===$[168]){b.push($[59],this.$$store.init[a],";")}}}}}b.push("}");if(e==="set"||e===$[83]||e==="init"){b.push("else{");if(e==="set"){b.push($[59],this.$$store.user[a],$[81])}else{if(e===$[83]){b.push($[59],this.$$store.theme[a],$[81])}else{if(e==="init"){if(i){b.push($[59],this.$$store.init[a],$[81])}else{b.push($[59],this.$$store.init[a],";")}b.push($[69],this.$$store.useinit[a],"=true;")}}}b.push("}")}}if(d.inheritable){b.push("if(computed===undefined||computed===inherit){");if(e===$[168]){b.push("computed=value;")}else{b.push("var pa=this.getParent();if(pa)computed=pa.",this.$$store.inherit[a],";")}b.push("if((computed===undefined||computed===inherit)&&");b.push($[69],this.$$store.init[a],"!==undefined&&");b.push($[69],this.$$store.init[a],"!==inherit){");b.push($[59],this.$$store.init[a],";");b.push($[69],this.$$store.useinit[a],"=true;");b.push("}else{");b.push($[148],this.$$store.useinit[a],";}");b.push("}");b.push($[524]);b.push("if(computed===inherit){");b.push("computed=undefined;delete this.",this.$$store.inherit[a],";");b.push("}");b.push("else if(computed===undefined)");b.push($[148],this.$$store.inherit[a],";");b.push("else this.",this.$$store.inherit[a],"=computed;");b.push("var backup=computed;");b.push($[546]);b.push($[407])}else{if(c){if(e!=="set"&&e!==$[83]){b.push($[546])}b.push($[524]);b.push($[407])}}if(c){if(d.apply){b.push($[69],d.apply,"(computed, old);")}if(d.event){b.push('this.createDispatchChangeEvent("',d.event,'", computed, old);')}if(d.inheritable&&f.getChildren){b.push("var a=this.getChildren();if(a)for(var i=0,l=a.length;i<l;i++){");b.push("if(a[i].",this.$$method.refresh[a],")a[i].",this.$$method.refresh[a],"(backup);");b.push("}")}}if(i){b.push("return value;")}return this.__unwrapFunctionFromCode(k,f,a,e,b,h)}},settings:{"qx.propertyDebugLevel":0}});
+qx.Class.define("qx.core.LegacyProperty",{statics:{getSetterName:function(a){return qx.core.Property.$$method.set[a]},getGetterName:function(a){return qx.core.Property.$$method.get[a]},getResetterName:function(a){return qx.core.Property.$$method.reset[a]},addFastProperty:function(b,d){var c=b.name;var g=qx.lang.String.toFirstUp(c);var h="_value"+g;var f="get"+g;var e="set"+g;var a="_compute"+g;d[h]=typeof b.defaultValue!==$[8]?b.defaultValue:null;if(b.noCompute){d[f]=function(){return this[h]}}else{d[f]=function(){return this[h]==null?this[h]=this[a]():this[h]}}d[f].self=d.constructor;if(b.setOnlyOnce){d[e]=function(i){this[h]=i;this[e]=null;return i}}else{d[e]=function(i){return this[h]=i}}d[e].self=d.constructor;if(!b.noCompute){d[a]=function(){return null};d[a].self=d.constructor}},addCachedProperty:function(c,e){var d=c.name;var f=qx.lang.String.toFirstUp(d);var g="_cached"+f;var a="_compute"+f;var b="_change"+f;if(typeof c.defaultValue!==$[8]){e[g]=c.defaultValue}e["get"+f]=function(){if(this[g]==null){this[g]=this[a]()}return this[g]};e[$[553]+f]=function(){if(this[g]!=null){this[g]=null;if(c.addToQueueRuntime){this.addToQueueRuntime(c.name)}}};e["_recompute"+f]=function(){var h=this[g];var i=this[a]();if(i!=h){this[g]=i;this[b](i,h);return true}return false};e[b]=function(i,h){};e[a]=function(){return null};e["get"+f].self=e.constructor;e[$[553]+f].self=e.constructor;e["_recompute"+f].self=e.constructor},addProperty:function(c,f){if(typeof c!==$[10]){throw new Error("AddProperty: Param should be an object!")}if(typeof c.name!==$[13]){throw new Error("AddProperty: Malformed input parameters: name needed!")}if(c.dispose===undefined&&(c.type==$[44]||c.type==$[10])){c.dispose=true}c.method=qx.lang.String.toFirstUp(c.name);c.implMethod=c.impl?qx.lang.String.toFirstUp(c.impl):c.method;if(c.defaultValue==undefined){c.defaultValue=null}c.allowNull=c.allowNull!==false;c.allowMultipleArguments=c.allowMultipleArguments===true;if(typeof c.type===$[13]){c.hasType=true}else{if(typeof c.type!==$[8]){throw new Error("AddProperty: Invalid type definition for property "+c.name+": "+c.type)}else{c.hasType=false}}if(typeof c.instance===$[13]){c.hasInstance=true}else{if(typeof c.instance!==$[8]){throw new Error("AddProperty: Invalid instance definition for property "+c.name+": "+c.instance)}else{c.hasInstance=false}}if(typeof c.classname===$[13]){c.hasClassName=true}else{if(typeof c.classname!==$[8]){throw new Error("AddProperty: Invalid classname definition for property "+c.name+": "+c.classname)}else{c.hasClassName=false}}c.hasConvert=c.convert!=null;c.hasPossibleValues=c.possibleValues!=null;c.addToQueue=c.addToQueue||false;c.addToQueueRuntime=c.addToQueueRuntime||false;c.up=c.name.toUpperCase();var e=qx.core.Property.$$store.user[c.name]="__user$"+c.name;var a=$[79]+c.method;var d="_modify"+c.implMethod;var b="_check"+c.implMethod;var g=qx.core.Property.$$method;if(!g.set[c.name]){g.set[c.name]="set"+c.method;g.get[c.name]="get"+c.method;g.reset[c.name]=$[140]+c.method}f[e]=c.defaultValue;f["get"+c.method]=function(){return this[e]};f["force"+c.method]=function(h){return this[e]=h};f[$[140]+c.method]=function(){return this["set"+c.method](c.defaultValue)};if(c.type===$[132]){f["toggle"+c.method]=function(h){return this["set"+c.method](!this[e])}}if(c.allowMultipleArguments||c.hasConvert||c.hasInstance||c.hasClassName||c.hasPossibleValues||c.hasUnitDetection||c.addToQueue||c.addToQueueRuntime||c.addToStateQueue){f["set"+c.method]=function(j){if(c.allowMultipleArguments&&arguments.length>1){j=qx.lang.Array.fromArguments(arguments)}if(c.hasConvert){try{j=c.convert.call(this,j,c)}catch(i){throw new Error("Attention! Could not convert new value for "+c.name+": "+j+": "+i)}}var h=this[e];if(j===h){return j}if(!(c.allowNull&&j==null)){if(c.hasType&&typeof j!==c.type){throw new Error($[223]+j+$[227]+c.name+$[560]+c.type+$[459]+typeof j+'"!')}if(qx.Class.getByName(c.instance)){if(c.hasInstance&&!(j instanceof qx.Class.getByName(c.instance))){throw new Error($[223]+j+$[227]+c.name+$[410]+c.instance+'"!')}}else{if(qx.core.Variant.isSet($[473],"on")){if(c.hasInstance&&!(j instanceof qx.OO.classes[c.instance])){throw new Error($[223]+j+$[227]+c.name+$[410]+c.instance+'"!')}}}if(c.hasClassName&&j.classname!=c.classname){throw new Error($[223]+j+$[227]+c.name+'" which must be an object with the classname "'+c.classname+'"!')}if(c.hasPossibleValues&&j!=null&&!qx.lang.Array.contains(c.possibleValues,j)){throw new Error("Failed to save value for "+c.name+". '"+j+"' is not a possible value!")}}if(this[b]){try{j=this[b](j,c);if(j===h){return j}}catch(i){throw new Error($[563]+c.name+" "+i)}}this[e]=j;if(this[d]){try{this[d](j,h,c)}catch(i){throw new Error('Modification of property "'+c.name+$[429]+i)}}if(c.addToQueue){this.addToQueue(c.name)}if(c.addToQueueRuntime){this.addToQueueRuntime(c.name)}if(c.addToStateQueue){this.addToStateQueue()}if(this.hasEventListeners&&this.hasEventListeners(a)){try{this.createDispatchDataEvent(a,j)}catch(i){throw new Error("Property "+c.name+$[521]+i)}}return j}}else{f["set"+c.method]=function(l){var i=this[e];if(l===i){return l}if(!(c.allowNull&&l==null)){if(c.hasType&&typeof l!==c.type){throw new Error($[223]+l+$[227]+c.name+$[560]+c.type+$[459]+typeof l+'"!')}}if(this[b]){try{l=this[b](l,c);if(l===i){return l}}catch(j){throw new Error($[563]+c.name+" "+j)}}this[e]=l;if(this[d]){try{this[d](l,i,c)}catch(j){var h=new String(l).substring(0,50);throw new Error('Setting property "'+c.name+'" to "'+h+$[429]+j)}}if(this.hasEventListeners&&this.hasEventListeners(a)){var k=new qx.event.type.DataEvent(a,l,i,false);k.setTarget(this);try{this.dispatchEvent(k,true)}catch(j){throw new Error("Property "+c.name+$[521]+j)}}return l}}f["set"+c.method].self=f.constructor;if(typeof c.getAlias===$[13]){f[c.getAlias]=f["get"+c.method]}if(typeof c.setAlias===$[13]){f[c.setAlias]=f["set"+c.method]}}}});
+qx.Class.define("qx.core.Property",{statics:{__checks:{Boolean:'typeof value === "boolean"',String:'typeof value === "string"',NonEmptyString:'typeof value === "string" && value.length > 0',Number:$[385],Integer:'typeof value === "number" && isFinite(value) && value%1 === 0',Float:$[385],Double:$[385],Error:"value instanceof Error",RegExp:"value instanceof RegExp",Object:'value !== null && typeof value === "object"',Array:"value instanceof Array",Map:'value !== null && typeof value === "object" && !(value instanceof Array) && !(value instanceof qx.core.Object)',Function:"value instanceof Function",Date:"value instanceof Date",Node:"value !== null && value.nodeType !== undefined",Element:"value !== null && value.nodeType === 1 && value.attributes",Document:"value !== null && value.nodeType === 9 && value.documentElement",Window:"value !== null && window.document",Event:"value !== null && value.type !== undefined",Class:'value !== null && value.$$type === "Class"',Mixin:'value !== null && value.$$type === "Mixin"',Interface:'value !== null && value.$$type === "Interface"',Theme:'value !== null && value.$$type === "Theme"',Color:'typeof value === "string" && qx.util.ColorUtil.isValid(value)',Border:$[456],Font:$[456],Label:'value !== null && typeof value === "string"'},__dispose:{Object:true,Array:true,Map:true,Function:true,Date:true,Node:true,Element:true,Document:true,Window:true,Event:true,Class:true,Mixin:true,Interface:true,Theme:true,Border:true,Font:true},$$inherit:$[125],$$idcounter:0,$$store:{user:{},theme:{},inherit:{},init:{},useinit:{}},$$method:{get:{},set:{},reset:{},init:{},refresh:{},style:{},unstyle:{}},$$allowedKeys:{name:$[13],dispose:$[132],inheritable:$[132],nullable:$[132],themeable:$[132],refine:$[132],init:null,apply:$[13],event:$[13],check:null,transform:$[13],deferredInit:$[132]},$$allowedGroupKeys:{name:$[13],group:$[10],mode:$[13],themeable:$[132]},$$inheritable:{},refresh:function(g){var f=g.getParent();if(f){var c=g.constructor;var b=this.$$store.inherit;var e=this.$$method.refresh;var d;if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[245])>1){g.debug("Update widget: "+g)}}while(c){d=c.$$properties;if(d){for(var a in this.$$inheritable){if(d[a]&&g[e[a]]){if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[245])>2){g.debug("Updating property: "+a+" to '"+f[b[a]]+"'")}}g[e[a]](f[b[a]])}}}c=c.superclass}}},attach:function(b){var c=b.$$properties;if(c){for(var a in c){this.attachMethods(b,a,c[a])}}b.$$propertiesAttached=true},attachMethods:function(c,b,a){if(a._legacy||a._fast||a._cached){return}var d,e;if(b.charAt(0)==="_"){if(b.charAt(1)==="_"){d="__";e=qx.lang.String.toFirstUp(b.substring(2))}else{d="_";e=qx.lang.String.toFirstUp(b.substring(1))}}else{d="";e=qx.lang.String.toFirstUp(b)}a.group?this.__attachGroupMethods(c,a,d,e):this.__attachPropertyMethods(c,a,d,e)},__attachGroupMethods:function(n,e,k,r){var h=n.prototype;var b=e.name;var d=e.themeable===true;if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[245])>1){console.debug("Generating property group: "+b)}}var g=[];var o=[];if(d){var s=[];var m=[]}var c="var a=arguments[0] instanceof Array?arguments[0]:arguments;";g.push(c);if(d){s.push(c)}if(e.mode==$[247]){var p="a=qx.lang.Array.fromShortHand(qx.lang.Array.fromArguments(a));";g.push(p);if(d){s.push(p)}}for(var j=0,q=e.group,f=q.length;j<f;j++){if(qx.core.Variant.isSet($[7],"on")){if(!this.$$method.set[q[j]]||!this.$$method.reset[q[j]]){throw new Error("Cannot create property group '"+b+"' including non-existing property '"+q[j]+"'!")}}g.push($[75],this.$$method.set[q[j]],"(a[",j,"]);");o.push($[75],this.$$method.reset[q[j]],"();");if(d){if(qx.core.Variant.isSet($[7],"on")){if(!this.$$method.style[q[j]]){throw new Error("Cannot add the non themable property '"+q[j]+"' to the themable property group '"+b+"'")}}s.push($[75],this.$$method.style[q[j]],"(a[",j,"]);");m.push($[75],this.$$method.unstyle[q[j]],"();")}}this.$$method.set[b]=k+"set"+r;h[this.$$method.set[b]]=new Function(g.join(""));this.$$method.reset[b]=k+$[140]+r;h[this.$$method.reset[b]]=new Function(o.join(""));if(d){this.$$method.style[b]=k+$[84]+r;h[this.$$method.style[b]]=new Function(s.join(""));this.$$method.unstyle[b]=k+$[139]+r;h[this.$$method.unstyle[b]]=new Function(m.join(""))}},__attachPropertyMethods:function(e,d,f,h){var b=e.prototype;var c=d.name;if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[245])>1){console.debug("Generating property wrappers: "+c)}}if(d.dispose===undefined&&typeof d.check===$[13]){d.dispose=this.__dispose[d.check]||qx.Class.isDefined(d.check)}var g=this.$$method;var a=this.$$store;a.user[c]="__user$"+c;a.theme[c]="__theme$"+c;a.init[c]="__init$"+c;a.inherit[c]="__inherit$"+c;a.useinit[c]="__useinit$"+c;g.get[c]=f+"get"+h;b[g.get[c]]=function(){return qx.core.Property.executeOptimizedGetter(this,e,c,"get")};g.set[c]=f+"set"+h;b[g.set[c]]=function(i){return qx.core.Property.executeOptimizedSetter(this,e,c,"set",arguments)};g.reset[c]=f+$[140]+h;b[g.reset[c]]=function(){return qx.core.Property.executeOptimizedSetter(this,e,c,$[140])};if(d.inheritable||d.apply||d.event||d.deferredInit){g.init[c]=f+"init"+h;b[g.init[c]]=function(i){return qx.core.Property.executeOptimizedSetter(this,e,c,"init",arguments)}}if(d.inheritable){g.refresh[c]=f+$[172]+h;b[g.refresh[c]]=function(i){return qx.core.Property.executeOptimizedSetter(this,e,c,$[172],arguments)}}if(d.themeable){g.style[c]=f+$[84]+h;b[g.style[c]]=function(i){return qx.core.Property.executeOptimizedSetter(this,e,c,$[84],arguments)};g.unstyle[c]=f+$[139]+h;b[g.unstyle[c]]=function(){return qx.core.Property.executeOptimizedSetter(this,e,c,$[139])}}if(d.check===$[3]){b[f+"toggle"+h]=new Function($[161]+g.set[c]+"(!this."+g.get[c]+"())");b[f+"is"+h]=new Function($[161]+g.get[c]+"()")}},__errors:{0:"Could not change or apply init value after constructing phase!",1:"Requires exactly one argument!",2:"Undefined value is not allowed!",3:"Does not allow any arguments!",4:"Null value is not allowed!",5:"Is invalid!"},error:function(e,g,c,a,b){var d=e.constructor.classname;var f="Error in property "+c+" of class "+d+" in method "+this.$$method[a][c]+" with incoming value '"+b+"': ";throw new Error(f+(this.__errors[g]||"Unknown reason: "+g))},__unwrapFunctionFromCode:function(a,c,e,g,h,d){var b=this.$$method[g][e];if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[245])>1){console.debug("Code["+this.$$method[g][e]+"]: "+h.join(""))}try{c[b]=new Function("value",h.join(""))}catch(f){alert("Malformed generated code to unwrap method: "+this.$$method[g][e]+"\n"+h.join(""))}}else{c[b]=new Function("value",h.join(""))}if(d===undefined){return a[b]()}else{if(qx.core.Variant.isSet($[7],"on")){return a[b].apply(a,d)}else{return a[b](d[0])}}},executeOptimizedGetter:function(a,e,d,f){var c=e.$$properties[d];var b=e.prototype;var g=[];if(c.inheritable){g.push($[130],this.$$store.inherit[d],$[178]);g.push($[161],this.$$store.inherit[d],";");g.push("else ")}g.push($[130],this.$$store.user[d],$[178]);g.push($[161],this.$$store.user[d],";");if(c.themeable){g.push($[226],this.$$store.theme[d],$[178]);g.push($[161],this.$$store.theme[d],";")}if(c.deferredInit&&c.init===undefined){g.push($[226],this.$$store.init[d],$[178]);g.push($[161],this.$$store.init[d],";")}g.push("else ");if(c.init!==undefined){g.push($[161],this.$$store.init[d],";")}else{if(c.inheritable||c.nullable){g.push("return null;")}else{g.push('throw new Error("Property ',d," of an instance of ",e.classname,' is not (yet) ready!");')}}return this.__unwrapFunctionFromCode(a,b,d,f,g)},executeOptimizedSetter:function(k,g,a,e,h){var d=g.$$properties[a];var f=g.prototype;var b=[];var i=e==="set"||e===$[84]||(e==="init"&&d.init===undefined);var l=e===$[140]||e===$[139];var c=d.apply||d.event||d.inheritable;if(e===$[84]||e===$[139]){var j=this.$$store.theme[a]}else{if(e==="init"){var j=this.$$store.init[a]}else{var j=this.$$store.user[a]}}if(qx.core.Variant.isSet($[7],"on")){b.push($[566]);if(e==="init"){b.push('if(this.$$initialized)prop.error(this,0,"'+a+'","'+e+$[164])}if(e===$[172]){}else{if(i){b.push('if(arguments.length!==1)prop.error(this,1,"'+a+'","'+e+$[164]);b.push($[519]+a+'","'+e+$[164])}else{b.push('if(arguments.length!==0)prop.error(this,3,"'+a+'","'+e+$[164])}}}else{if(!d.nullable||d.check||d.inheritable){b.push($[566])}if(qx.core.Variant.isSet($[7],"on")&&e==="set"){b.push($[519]+a+'","'+e+$[164])}}if(i){if(d.transform){b.push("value=this.",d.transform,"(value);")}}if(c){if(i){b.push($[130],j,"===value)return value;")}else{if(l){b.push($[130],j,"===undefined)return;")}}}if(d.inheritable){b.push("var inherit=prop.$$inherit;")}if(i&&qx.core.Variant.isSet($[7],"on")){if(!d.nullable){b.push('if(value===null)prop.error(this,4,"'+a+'","'+e+$[164])}if(d.check!==undefined){if(d.nullable){b.push("if(value!==null)")}if(d.inheritable){b.push("if(value!==inherit)")}b.push("if(");if(this.__checks[d.check]!==undefined){b.push("!(",this.__checks[d.check],")")}else{if(qx.Class.isDefined(d.check)){b.push("!(value instanceof ",d.check,")")}else{if(typeof d.check===$[44]){b.push("!",g.classname,$[486],a);b.push(".check.call(this, value)")}else{if(typeof d.check===$[13]){b.push("!(",d.check,")")}else{if(d.check instanceof Array){d.checkMap=qx.lang.Object.fromArray(d.check);b.push(g.classname,$[486],a);b.push(".checkMap[value]===undefined")}else{throw new Error("Could not add check to property "+a+" of class "+g.classname)}}}}}b.push(')prop.error(this,5,"'+a+'","'+e+$[164])}}if(!c){if(e==="set"){b.push($[75],this.$$store.user[a],$[81])}else{if(e===$[140]){b.push($[130],this.$$store.user[a],$[178]);b.push($[148],this.$$store.user[a],";")}else{if(e===$[84]){b.push($[75],this.$$store.theme[a],$[81])}else{if(e===$[139]){b.push($[130],this.$$store.theme[a],$[178]);b.push($[148],this.$$store.theme[a],";")}else{if(e==="init"&&i){b.push($[75],this.$$store.init[a],$[81])}}}}}}else{if(d.inheritable){b.push("var computed, old=this.",this.$$store.inherit[a],";")}else{b.push("var computed, old;")}b.push($[130],this.$$store.user[a],$[264]);if(e==="set"){if(!d.inheritable){b.push($[290],this.$$store.user[a],";")}b.push($[59],this.$$store.user[a],$[81])}else{if(e===$[140]){if(!d.inheritable){b.push($[290],this.$$store.user[a],";")}b.push($[148],this.$$store.user[a],";");b.push($[130],this.$$store.theme[a],$[178]);b.push($[59],this.$$store.theme[a],";");b.push($[226],this.$$store.init[a],$[264]);b.push($[59],this.$$store.init[a],";");b.push($[75],this.$$store.useinit[a],"=true;");b.push("}")}else{if(d.inheritable){b.push($[59],this.$$store.user[a],";")}else{b.push("old=computed=this.",this.$$store.user[a],";")}if(e===$[84]){b.push($[75],this.$$store.theme[a],$[81])}else{if(e===$[139]){b.push($[148],this.$$store.theme[a],";")}else{if(e==="init"&&i){b.push($[75],this.$$store.init[a],$[81])}}}}}b.push("}");if(d.themeable){b.push($[226],this.$$store.theme[a],$[264]);if(!d.inheritable){b.push($[290],this.$$store.theme[a],";")}if(e==="set"){b.push($[59],this.$$store.user[a],$[81])}else{if(e===$[84]){b.push($[59],this.$$store.theme[a],$[81])}else{if(e===$[139]){b.push($[148],this.$$store.theme[a],";");b.push($[130],this.$$store.init[a],$[264]);b.push($[59],this.$$store.init[a],";");b.push($[75],this.$$store.useinit[a],"=true;");b.push("}")}else{if(e==="init"){if(i){b.push($[75],this.$$store.init[a],$[81])}b.push($[59],this.$$store.theme[a],";")}else{if(e===$[172]){b.push($[59],this.$$store.theme[a],";")}}}}}b.push("}")}b.push($[226],this.$$store.useinit[a],"){");if(!d.inheritable){b.push($[290],this.$$store.init[a],";")}if(e==="init"){if(i){b.push($[59],this.$$store.init[a],$[81])}else{b.push($[59],this.$$store.init[a],";")}}else{if(e==="set"||e===$[84]||e===$[172]){b.push($[148],this.$$store.useinit[a],";");if(e==="set"){b.push($[59],this.$$store.user[a],$[81])}else{if(e===$[84]){b.push($[59],this.$$store.theme[a],$[81])}else{if(e===$[172]){b.push($[59],this.$$store.init[a],";")}}}}}b.push("}");if(e==="set"||e===$[84]||e==="init"){b.push("else{");if(e==="set"){b.push($[59],this.$$store.user[a],$[81])}else{if(e===$[84]){b.push($[59],this.$$store.theme[a],$[81])}else{if(e==="init"){if(i){b.push($[59],this.$$store.init[a],$[81])}else{b.push($[59],this.$$store.init[a],";")}b.push($[75],this.$$store.useinit[a],"=true;")}}}b.push("}")}}if(d.inheritable){b.push("if(computed===undefined||computed===inherit){");if(e===$[172]){b.push("computed=value;")}else{b.push("var pa=this.getParent();if(pa)computed=pa.",this.$$store.inherit[a],";")}b.push("if((computed===undefined||computed===inherit)&&");b.push($[75],this.$$store.init[a],"!==undefined&&");b.push($[75],this.$$store.init[a],"!==inherit){");b.push($[59],this.$$store.init[a],";");b.push($[75],this.$$store.useinit[a],"=true;");b.push("}else{");b.push($[148],this.$$store.useinit[a],";}");b.push("}");b.push($[411]);b.push("if(computed===inherit){");b.push("computed=undefined;delete this.",this.$$store.inherit[a],";");b.push("}");b.push("else if(computed===undefined)");b.push($[148],this.$$store.inherit[a],";");b.push("else this.",this.$$store.inherit[a],"=computed;");b.push("var backup=computed;");b.push($[485]);b.push($[425])}else{if(c){if(e!=="set"&&e!==$[84]){b.push($[485])}b.push($[411]);b.push($[425])}}if(c){if(d.apply){b.push($[75],d.apply,"(computed, old);")}if(d.event){b.push('this.createDispatchChangeEvent("',d.event,'", computed, old);')}if(d.inheritable&&f.getChildren){b.push("var a=this.getChildren();if(a)for(var i=0,l=a.length;i<l;i++){");b.push("if(a[i].",this.$$method.refresh[a],")a[i].",this.$$method.refresh[a],"(backup);");b.push("}")}}if(i){b.push("return value;")}return this.__unwrapFunctionFromCode(k,f,a,e,b,h)}},settings:{"qx.propertyDebugLevel":0}});
 qx.Class.define("qx.lang.String",{statics:{trim:function(a){return a.replace(/^\s+|\s+$/g,"")},pad:function(f,e,d,c){if(typeof d===$[8]){d="0"}var a="";for(var b=f.length;b<e;b++){a+=d}if(c==true){return f+a}else{return a+f}},toFirstUp:function(a){return a.charAt(0).toUpperCase()+a.substr(1)},contains:function(b,a){return b.indexOf(a)!=-1},format:function(c,a){var d=c;for(var b=0;b<a.length;b++){d=d.replace(new RegExp("%"+(b+1),"g"),a[b])}return d},escapeRegexpChars:function(a){return a.replace(/([\\\.\(\)\[\]\{\}\^\$\?\+\*])/g,"\\$1")}}});
-qx.Class.define($[470],{extend:Object,include:[qx.core.MUserData],construct:function(){this._hashCode=qx.core.Object.__availableHashCode++;if(this._autoDispose){this.__dbKey=qx.core.Object.__freeAvailableDbKeys.pop();if(!this.__dbKey){this.__dbKey=qx.core.Object.__db.length;qx.core.Object.__db.push(this)}else{qx.core.Object.__db[this.__dbKey]=this}}},statics:{__availableHashCode:0,__freeAvailableDbKeys:[],__db:[],__disposeAll:false,$$type:$[110],toHashCode:function(a){if(a._hashCode!=null){return a._hashCode}return a._hashCode=this.__availableHashCode++},getDb:function(){return this.__db},dispose:function(a){if(this.__disposed){return}this.__disposed=true;this.__unload=a||false;var c,d=this.__db;for(var b=d.length-1;b>=0;b--){c=d[b];if(c&&c.__disposed===false){c.dispose()}}},inGlobalDispose:function(){return this.__disposed||false},isPageUnload:function(){return this.__unload||false}},members:{_autoDispose:true,toHashCode:function(){return this._hashCode},toString:function(){if(this.classname){return"[object "+this.classname+"]"}return"[object Object]"},base:function(b,a){if(arguments.length===1){return b.callee.base.call(this)}else{return b.callee.base.apply(this,Array.prototype.slice.call(arguments,1))}},self:function(a){return a.callee.self},getDbKey:function(){return this.__dbKey},set:function(b,a){var d=qx.core.Property.$$method.set;if(typeof b===$[13]){if(qx.core.Variant.isSet($[7],"on")){if(!this[d[b]]){throw new Error($[261]+b);return}}return this[d[b]](a)}else{for(var c in b){if(qx.core.Variant.isSet($[7],"on")){if(!this[d[c]]){throw new Error($[261]+c);continue}}this[d[c]](b[c])}return this}},get:function(b){var a=qx.core.Property.$$method.get;if(qx.core.Variant.isSet($[7],"on")){if(!this[a[b]]){throw new Error($[261]+b);return}}return this[a[b]]()},reset:function(b){var a=qx.core.Property.$$method.reset;if(qx.core.Variant.isSet($[7],"on")){if(!this[a[b]]){throw new Error($[261]+b);return}}this[a[b]]()},__disposed:false,getDisposed:function(){return this.__disposed},isDisposed:function(){return this.__disposed},dispose:function(){if(this.__disposed){return}this.__disposed=true;var c=this.constructor;var b;while(c.superclass){if(c.$$destructor){c.$$destructor.call(this)}if(c.$$includes){b=c.$$flatIncludes;for(var d=0,a=b.length;d<a;d++){if(b[d].$$destructor){b[d].$$destructor.call(this)}}}c=c.superclass}},debug:qx.core.Variant.select($[7],{on:function(a){if(console&&typeof console.log===$[44]){console.log(a)}},"default":function(a){}}),info:function(a){this.debug("INFO: "+a)},warn:function(a){this.debug("WARN: "+a)},error:function(a){this.debug("ERROR: "+a)},printStackTrace:qx.core.Variant.select($[7],{on:function(){if(console&&typeof console.trace===$[44]){this.debug("Current stack trace:");console.trace()}},"default":function(){}}),_disposeFields:function(b){var c;for(var d=0,a=arguments.length;d<a;d++){var c=arguments[d];if(this[c]==null){continue}if(!this.hasOwnProperty(c)){continue}this[c]=null}},_disposeObjects:function(b){var c;for(var d=0,a=arguments.length;d<a;d++){var c=arguments[d];if(this[c]==null){continue}if(!this.hasOwnProperty(c)){continue}if(!this[c].dispose){throw new Error(this.classname+"."+c+" is not a qooxdoo object. Use _disposeFields instead of _disposeObjects.")}this[c].dispose();this[c]=null}},_disposeObjectDeep:function(b,a){var b;if(this[b]==null){return}if(!this.hasOwnProperty(b)){return}this.__disposeObjectsDeepRecurser(this[b],a||0);this[b]=null},__disposeObjectsDeepRecurser:function(f,b){if(f instanceof qx.core.Object){f.dispose()}else{if(f instanceof Array){for(var d=0,a=f.length;d<a;d++){var e=f[d];if(e==null){continue}if(typeof e==$[10]){if(b>0){this.__disposeObjectsDeepRecurser(e,b-1)}f[d]=null}else{if(typeof e==$[44]){f[d]=null}}}}else{if(f instanceof Object){for(var c in f){if(f[c]==null||!f.hasOwnProperty(c)){continue}var e=f[c];if(typeof e==$[10]){if(b>0){this.__disposeObjectsDeepRecurser(e,b-1)}f[c]=null}else{if(typeof e==$[44]){f[c]=null}}}}}}}},destruct:function(){var d=this.constructor;var f;var h=qx.core.Property.$$store;var i=h.user;var e=h.theme;var b=h.inherit;var g=h.useinit;var c=h.init;while(d){f=d.$$properties;if(f){for(var a in f){if(f[a].dispose){this[i[a]]=this[e[a]]=this[b[a]]=this[g[a]]=this[c[a]]=undefined}}}d=d.superclass}if(this.__dbKey!=null){if(qx.core.Object.__disposeAll){qx.core.Object.__db[this.__dbKey]=null}else{delete qx.core.Object.__db[this.__dbKey]}qx.core.Object.__freeAvailableDbKeys.push(this.__dbKey)}}});
+qx.Class.define($[483],{extend:Object,include:[qx.core.MUserData],construct:function(){this._hashCode=qx.core.Object.__availableHashCode++;if(this._autoDispose){this.__dbKey=qx.core.Object.__freeAvailableDbKeys.pop();if(!this.__dbKey){this.__dbKey=qx.core.Object.__db.length;qx.core.Object.__db.push(this)}else{qx.core.Object.__db[this.__dbKey]=this}}},statics:{__availableHashCode:0,__freeAvailableDbKeys:[],__db:[],__disposeAll:false,$$type:$[111],toHashCode:function(a){if(a._hashCode!=null){return a._hashCode}return a._hashCode=this.__availableHashCode++},getDb:function(){return this.__db},dispose:function(a){if(this.__disposed){return}this.__disposed=true;this.__unload=a||false;var c,d=this.__db;for(var b=d.length-1;b>=0;b--){c=d[b];if(c&&c.__disposed===false){c.dispose()}}},inGlobalDispose:function(){return this.__disposed||false},isPageUnload:function(){return this.__unload||false}},members:{_autoDispose:true,toHashCode:function(){return this._hashCode},toString:function(){if(this.classname){return"[object "+this.classname+"]"}return"[object Object]"},base:function(b,a){if(arguments.length===1){return b.callee.base.call(this)}else{return b.callee.base.apply(this,Array.prototype.slice.call(arguments,1))}},self:function(a){return a.callee.self},getDbKey:function(){return this.__dbKey},set:function(b,a){var d=qx.core.Property.$$method.set;if(typeof b===$[13]){if(qx.core.Variant.isSet($[7],"on")){if(!this[d[b]]){throw new Error($[269]+b);return}}return this[d[b]](a)}else{for(var c in b){if(qx.core.Variant.isSet($[7],"on")){if(!this[d[c]]){throw new Error($[269]+c);continue}}this[d[c]](b[c])}return this}},get:function(b){var a=qx.core.Property.$$method.get;if(qx.core.Variant.isSet($[7],"on")){if(!this[a[b]]){throw new Error($[269]+b);return}}return this[a[b]]()},reset:function(b){var a=qx.core.Property.$$method.reset;if(qx.core.Variant.isSet($[7],"on")){if(!this[a[b]]){throw new Error($[269]+b);return}}this[a[b]]()},__disposed:false,getDisposed:function(){return this.__disposed},isDisposed:function(){return this.__disposed},dispose:function(){if(this.__disposed){return}this.__disposed=true;var c=this.constructor;var b;while(c.superclass){if(c.$$destructor){c.$$destructor.call(this)}if(c.$$includes){b=c.$$flatIncludes;for(var d=0,a=b.length;d<a;d++){if(b[d].$$destructor){b[d].$$destructor.call(this)}}}c=c.superclass}},debug:qx.core.Variant.select($[7],{on:function(a){if(console&&typeof console.log===$[44]){console.log(a)}},"default":function(a){}}),info:function(a){this.debug("INFO: "+a)},warn:function(a){this.debug("WARN: "+a)},error:function(a){this.debug("ERROR: "+a)},printStackTrace:qx.core.Variant.select($[7],{on:function(){if(console&&typeof console.trace===$[44]){this.debug("Current stack trace:");console.trace()}},"default":function(){}}),_disposeFields:function(b){var c;for(var d=0,a=arguments.length;d<a;d++){var c=arguments[d];if(this[c]==null){continue}if(!this.hasOwnProperty(c)){continue}this[c]=null}},_disposeObjects:function(b){var c;for(var d=0,a=arguments.length;d<a;d++){var c=arguments[d];if(this[c]==null){continue}if(!this.hasOwnProperty(c)){continue}if(!this[c].dispose){throw new Error(this.classname+"."+c+" is not a qooxdoo object. Use _disposeFields instead of _disposeObjects.")}this[c].dispose();this[c]=null}},_disposeObjectDeep:function(b,a){var b;if(this[b]==null){return}if(!this.hasOwnProperty(b)){return}this.__disposeObjectsDeepRecurser(this[b],a||0);this[b]=null},__disposeObjectsDeepRecurser:function(f,b){if(f instanceof qx.core.Object){f.dispose()}else{if(f instanceof Array){for(var d=0,a=f.length;d<a;d++){var e=f[d];if(e==null){continue}if(typeof e==$[10]){if(b>0){this.__disposeObjectsDeepRecurser(e,b-1)}f[d]=null}else{if(typeof e==$[44]){f[d]=null}}}}else{if(f instanceof Object){for(var c in f){if(f[c]==null||!f.hasOwnProperty(c)){continue}var e=f[c];if(typeof e==$[10]){if(b>0){this.__disposeObjectsDeepRecurser(e,b-1)}f[c]=null}else{if(typeof e==$[44]){f[c]=null}}}}}}}},destruct:function(){var d=this.constructor;var f;var h=qx.core.Property.$$store;var i=h.user;var e=h.theme;var b=h.inherit;var g=h.useinit;var c=h.init;while(d){f=d.$$properties;if(f){for(var a in f){if(f[a].dispose){this[i[a]]=this[e[a]]=this[b[a]]=this[g[a]]=this[c[a]]=undefined}}}d=d.superclass}if(this.__dbKey!=null){if(qx.core.Object.__disposeAll){qx.core.Object.__db[this.__dbKey]=null}else{delete qx.core.Object.__db[this.__dbKey]}qx.core.Object.__freeAvailableDbKeys.push(this.__dbKey)}}});
 qx.Class.define("qx.lang.Function",{statics:{returnTrue:function(){return true},returnFalse:function(){return false},returnNull:function(){return null},returnThis:function(){return this},returnZero:function(){return 0},returnNegativeIndex:function(){return -1},bind:function(e,b,a){if(qx.core.Variant.isSet($[7],"on")){if(typeof e!==$[44]){throw new Error("First parameter to bind() needs to be of type function!")}if(typeof b!==$[10]){throw new Error("Second parameter to bind() needs to be of type object!")}}if(arguments.length>2){var c=Array.prototype.slice.call(arguments,2);var d=function(){e.context=b;var f=e.apply(b,c.concat(qx.lang.Array.fromArguments(arguments)));e.context=null;return f}}else{var d=function(){e.context=b;var f=e.apply(b,arguments);e.context=null;return f}}d.self=e.self?e.self.constructor:b;return d},bindEvent:function(c,a){if(qx.core.Variant.isSet($[7],"on")){if(typeof c!==$[44]){throw new Error("First parameter to bindEvent() needs to be of type function!")}if(typeof a!==$[10]){throw new Error("Second parameter to bindEvent() needs to be of type object!")}}var b=function(e){c.context=a;var d=c.call(a,e||window.event);c.context=null;return d};b.self=c.self?c.self.constructor:a;return b},getCaller:function(a){return a.caller?a.caller.callee:a.callee.caller}}});
-qx.Class.define("qx.bom.Viewport",{statics:{getWidth:qx.core.Variant.select($[0],{opera:function(a){return(a||window).document.body.clientWidth},webkit:function(a){return(a||window).innerWidth},"default":function(b){var a=(b||window).document;return a.compatMode===$[117]?a.documentElement.clientWidth:a.body.clientWidth}}),getHeight:qx.core.Variant.select($[0],{opera:function(a){return(a||window).document.body.clientHeight},webkit:function(a){return(a||window).innerHeight},"default":function(b){var a=(b||window).document;return a.compatMode===$[117]?a.documentElement.clientHeight:a.body.clientHeight}}),getScrollLeft:qx.core.Variant.select($[0],{mshtml:function(b){var a=(b||window).document;return a.documentElement.scrollLeft||a.body.scrollLeft},"default":function(a){return(a||window).pageXOffset}}),getScrollTop:qx.core.Variant.select($[0],{mshtml:function(b){var a=(b||window).document;return a.documentElement.scrollTop||a.body.scrollTop},"default":function(a){return(a||window).pageYOffset}})}});
-qx.Class.define("qx.Theme",{statics:{define:function(e,d){if(!d){var d={}}if(d.include&&!(d.include instanceof Array)){d.include=[d.include]}if(qx.core.Variant.isSet($[7],"on")){this.__validateConfig(e,d)}var g={$$type:$[125],name:e,title:d.title,toString:this.genericToString};if(d.extend){g.supertheme=d.extend}g.basename=qx.Class.createNamespace(e,g);this.__convert(g,d);this.__registry[e]=g;if(d.include){for(var f=0,c=d.include,b=c.length;f<b;f++){this.include(g,c[f])}}},getAll:function(){return this.__registry},getByName:function(a){return this.__registry[a]},isDefined:function(a){return this.getByName(a)!==undefined},getTotalNumber:function(){return qx.lang.Object.getLength(this.__registry)},genericToString:function(){return"[Theme "+this.name+"]"},__extractType:function(b){for(var c=0,d=this.__inheritableKeys,a=d.length;c<a;c++){if(b[d[c]]){return d[c]}}},__convert:function(f,b){var c=this.__extractType(b);if(b.extend&&!c){c=b.extend.type}f.type=c||"other";if(!c){return}var a=function(){};if(b.extend){a.prototype=new b.extend.$$clazz}var e=a.prototype;var d=b[c];for(var g in d){e[g]=d[g];if(e[g].base){if(qx.core.Variant.isSet($[7],"on")){if(!b.extend){throw new Error("Found base flag in entry '"+g+$[503]+b.name+"'. Base flags are not allowed for themes without a valid super theme!")}}e[g].base=b.extend}}f.$$clazz=a;f[c]=new a},__registry:{},__inheritableKeys:["colors","borders","fonts","icons","widgets",$[368],"meta"],__allowedKeys:qx.core.Variant.select($[7],{on:{title:$[13],type:$[13],extend:$[10],colors:$[10],borders:$[10],fonts:$[10],icons:$[10],widgets:$[10],appearances:$[10],meta:$[10],include:$[10]},"default":null}),__metaKeys:qx.core.Variant.select($[7],{on:{color:$[10],border:$[10],font:$[10],widget:$[10],icon:$[10],appearance:$[10]},"default":null}),__validateConfig:qx.core.Variant.select($[7],{on:function(b,c){var g=this.__allowedKeys;for(var j in c){if(g[j]===undefined){throw new Error($[286]+j+$[244]+b+$[191])}if(c[j]==null){throw new Error($[161]+j+$[244]+b+$[389])}if(g[j]!==null&&typeof c[j]!==g[j]){throw new Error($[275]+j+$[244]+b+$[287]+g[j]+'"!')}}if(c.title===undefined){throw new Error("Missing title definition in theme: "+b)}var f=["colors","borders","fonts","icons","widgets",$[368],"meta"];for(var e=0,d=f.length;e<d;e++){var j=f[e];if(c[j]!==undefined&&(c[j] instanceof Array||c[j] instanceof RegExp||c[j] instanceof Date||c[j].classname!==undefined)){throw new Error($[161]+j+$[244]+b+$[383])}}var a=0;for(var e=0,d=f.length;e<d;e++){var j=f[e];if(c[j]){a++}if(a>1){throw new Error("You can only define one theme category per file! Invalid theme: "+b)}}if(!c.extend&&a===0){throw new Error("You must define at least one entry in your theme configuration :"+b)}if(c.meta){var h;for(var j in c.meta){h=c.meta[j];if(this.__metaKeys[j]===undefined){throw new Error('The key "'+j+'" is not allowed inside a meta theme block.')}if(typeof h!==this.__metaKeys[j]){throw new Error('The type of the key "'+j+'" inside the meta block is wrong.')}if(!(typeof h===$[10]&&h!==null&&h.$$type===$[125])){throw new Error('The content of a meta theme must reference to other themes. The value for "'+j+$[244]+b+'" is invalid: '+h)}}}if(c.extend&&c.extend.$$type!==$[125]){throw new Error('Invalid extend in theme "'+b+'": '+c.extend)}},"default":function(){}}),patch:function(e,f){var b=this.__extractType(f);if(b!==this.__extractType(e)){throw new Error($[499]+e.name+$[419]+f.name+"'!")}var c=f[b];var d=e[b];for(var a in c){d[a]=c[a]}},include:function(e,f){var b=f.type;if(b!==e.type){throw new Error($[499]+e.name+$[419]+f.name+"'!")}var c=f[b];var d=e[b];for(var a in c){if(d[a]!==undefined){throw new Error("It is not allowed to overwrite the key '"+a+$[503]+e.name+"' by mixin theme '"+f.name+"'.")}d[a]=c[a]}}}});
-qx.Class.define("qx.core.Target",{extend:qx.core.Object,construct:function(){arguments.callee.base.call(this)},members:{addEventListener:function(b,c,d){if(this.getDisposed()){return}if(qx.core.Variant.isSet($[7],"on")){if(typeof b!==$[13]){throw new Error($[484]+b+"): '"+b+"' is not a string!")}if(typeof c!==$[44]){throw new Error($[484]+b+"): '"+c+$[413])}if(this.constructor.classname&&!qx.Class.supportsEvent(this.constructor,b)){throw new Error("Objects of class '"+this.constructor.classname+"' does not support the event '"+b+"'",new Error())}}if(this.__listeners===undefined){this.__listeners={}}if(this.__listeners[b]===undefined){this.__listeners[b]={}}var a="event"+qx.core.Object.toHashCode(c)+(d?"$"+qx.core.Object.toHashCode(d):"");this.__listeners[b][a]={handler:c,object:d}},removeEventListener:function(c,d,e){if(this.getDisposed()){return}var b=this.__listeners;if(!b||b[c]===undefined){return}if(typeof d!==$[44]){throw new Error("qx.core.Target: removeEventListener("+c+"): '"+d+$[413])}var a="event"+qx.core.Object.toHashCode(d)+(e?"$"+qx.core.Object.toHashCode(e):"");delete this.__listeners[c][a]},hasEventListeners:function(a){return this.__listeners&&this.__listeners[a]!==undefined&&!qx.lang.Object.isEmpty(this.__listeners[a])},createDispatchEvent:function(a){if(this.hasEventListeners(a)){this.dispatchEvent(new qx.event.type.Event(a),true)}},createDispatchDataEvent:function(a,b){if(this.hasEventListeners(a)){this.dispatchEvent(new qx.event.type.DataEvent(a,b),true)}},createDispatchChangeEvent:function(b,c,a){if(this.hasEventListeners(b)){this.dispatchEvent(new qx.event.type.ChangeEvent(b,c,a),true)}},dispatchEvent:function(a,c){if(this.getDisposed()){return}if(a.getTarget()==null){a.setTarget(this)}if(a.getCurrentTarget()==null){a.setCurrentTarget(this)}this._dispatchEvent(a,c);var b=a.getDefaultPrevented();c&&a.dispose();return !b},_dispatchEvent:function(b){var d=this.__listeners;if(d){b.setCurrentTarget(this);var a=d[b.getType()];if(a){var e,f;for(var g in a){e=a[g].handler;f=a[g].object||this;e.call(f,b)}}}if(b.getBubbles()&&!b.getPropagationStopped()&&typeof(this.getParent)==$[44]){var c=this.getParent();if(c&&!c.getDisposed()&&c.getEnabled()){c._dispatchEvent(b)}}}},destruct:function(){this._disposeObjectDeep("__listeners",2)}});
+qx.Class.define("qx.bom.Viewport",{statics:{getWidth:qx.core.Variant.select($[0],{opera:function(a){return(a||window).document.body.clientWidth},webkit:function(a){return(a||window).innerWidth},"default":function(b){var a=(b||window).document;return a.compatMode===$[121]?a.documentElement.clientWidth:a.body.clientWidth}}),getHeight:qx.core.Variant.select($[0],{opera:function(a){return(a||window).document.body.clientHeight},webkit:function(a){return(a||window).innerHeight},"default":function(b){var a=(b||window).document;return a.compatMode===$[121]?a.documentElement.clientHeight:a.body.clientHeight}}),getScrollLeft:qx.core.Variant.select($[0],{mshtml:function(b){var a=(b||window).document;return a.documentElement.scrollLeft||a.body.scrollLeft},"default":function(a){return(a||window).pageXOffset}}),getScrollTop:qx.core.Variant.select($[0],{mshtml:function(b){var a=(b||window).document;return a.documentElement.scrollTop||a.body.scrollTop},"default":function(a){return(a||window).pageYOffset}})}});
+qx.Class.define("qx.Theme",{statics:{define:function(e,d){if(!d){var d={}}if(d.include&&!(d.include instanceof Array)){d.include=[d.include]}if(qx.core.Variant.isSet($[7],"on")){this.__validateConfig(e,d)}var g={$$type:$[126],name:e,title:d.title,toString:this.genericToString};if(d.extend){g.supertheme=d.extend}g.basename=qx.Class.createNamespace(e,g);this.__convert(g,d);this.__registry[e]=g;if(d.include){for(var f=0,c=d.include,b=c.length;f<b;f++){this.include(g,c[f])}}},getAll:function(){return this.__registry},getByName:function(a){return this.__registry[a]},isDefined:function(a){return this.getByName(a)!==undefined},getTotalNumber:function(){return qx.lang.Object.getLength(this.__registry)},genericToString:function(){return"[Theme "+this.name+"]"},__extractType:function(b){for(var c=0,d=this.__inheritableKeys,a=d.length;c<a;c++){if(b[d[c]]){return d[c]}}},__convert:function(f,b){var c=this.__extractType(b);if(b.extend&&!c){c=b.extend.type}f.type=c||"other";if(!c){return}var a=function(){};if(b.extend){a.prototype=new b.extend.$$clazz}var e=a.prototype;var d=b[c];for(var g in d){e[g]=d[g];if(e[g].base){if(qx.core.Variant.isSet($[7],"on")){if(!b.extend){throw new Error("Found base flag in entry '"+g+$[541]+b.name+"'. Base flags are not allowed for themes without a valid super theme!")}}e[g].base=b.extend}}f.$$clazz=a;f[c]=new a},__registry:{},__inheritableKeys:["colors","borders","fonts","icons","widgets",$[395],"meta"],__allowedKeys:qx.core.Variant.select($[7],{on:{title:$[13],type:$[13],extend:$[10],colors:$[10],borders:$[10],fonts:$[10],icons:$[10],widgets:$[10],appearances:$[10],meta:$[10],include:$[10]},"default":null}),__metaKeys:qx.core.Variant.select($[7],{on:{color:$[10],border:$[10],font:$[10],widget:$[10],icon:$[10],appearance:$[10]},"default":null}),__validateConfig:qx.core.Variant.select($[7],{on:function(b,c){var g=this.__allowedKeys;for(var j in c){if(g[j]===undefined){throw new Error($[273]+j+$[239]+b+$[204])}if(c[j]==null){throw new Error($[166]+j+$[239]+b+$[397])}if(g[j]!==null&&typeof c[j]!==g[j]){throw new Error($[291]+j+$[239]+b+$[277]+g[j]+'"!')}}if(c.title===undefined){throw new Error("Missing title definition in theme: "+b)}var f=["colors","borders","fonts","icons","widgets",$[395],"meta"];for(var e=0,d=f.length;e<d;e++){var j=f[e];if(c[j]!==undefined&&(c[j] instanceof Array||c[j] instanceof RegExp||c[j] instanceof Date||c[j].classname!==undefined)){throw new Error($[166]+j+$[239]+b+$[401])}}var a=0;for(var e=0,d=f.length;e<d;e++){var j=f[e];if(c[j]){a++}if(a>1){throw new Error("You can only define one theme category per file! Invalid theme: "+b)}}if(!c.extend&&a===0){throw new Error("You must define at least one entry in your theme configuration :"+b)}if(c.meta){var h;for(var j in c.meta){h=c.meta[j];if(this.__metaKeys[j]===undefined){throw new Error('The key "'+j+'" is not allowed inside a meta theme block.')}if(typeof h!==this.__metaKeys[j]){throw new Error('The type of the key "'+j+'" inside the meta block is wrong.')}if(!(typeof h===$[10]&&h!==null&&h.$$type===$[126])){throw new Error('The content of a meta theme must reference to other themes. The value for "'+j+$[239]+b+'" is invalid: '+h)}}}if(c.extend&&c.extend.$$type!==$[126]){throw new Error('Invalid extend in theme "'+b+'": '+c.extend)}},"default":function(){}}),patch:function(e,f){var b=this.__extractType(f);if(b!==this.__extractType(e)){throw new Error($[551]+e.name+$[504]+f.name+"'!")}var c=f[b];var d=e[b];for(var a in c){d[a]=c[a]}},include:function(e,f){var b=f.type;if(b!==e.type){throw new Error($[551]+e.name+$[504]+f.name+"'!")}var c=f[b];var d=e[b];for(var a in c){if(d[a]!==undefined){throw new Error("It is not allowed to overwrite the key '"+a+$[541]+e.name+"' by mixin theme '"+f.name+"'.")}d[a]=c[a]}}}});
+qx.Class.define("qx.core.Target",{extend:qx.core.Object,construct:function(){arguments.callee.base.call(this)},members:{addEventListener:function(b,c,d){if(this.getDisposed()){return}if(qx.core.Variant.isSet($[7],"on")){if(typeof b!==$[13]){throw new Error($[569]+b+"): '"+b+"' is not a string!")}if(typeof c!==$[44]){throw new Error($[569]+b+"): '"+c+$[417])}if(this.constructor.classname&&!qx.Class.supportsEvent(this.constructor,b)){throw new Error("Objects of class '"+this.constructor.classname+"' does not support the event '"+b+"'",new Error())}}if(this.__listeners===undefined){this.__listeners={}}if(this.__listeners[b]===undefined){this.__listeners[b]={}}var a="event"+qx.core.Object.toHashCode(c)+(d?"$"+qx.core.Object.toHashCode(d):"");this.__listeners[b][a]={handler:c,object:d}},removeEventListener:function(c,d,e){if(this.getDisposed()){return}var b=this.__listeners;if(!b||b[c]===undefined){return}if(typeof d!==$[44]){throw new Error("qx.core.Target: removeEventListener("+c+"): '"+d+$[417])}var a="event"+qx.core.Object.toHashCode(d)+(e?"$"+qx.core.Object.toHashCode(e):"");delete this.__listeners[c][a]},hasEventListeners:function(a){return this.__listeners&&this.__listeners[a]!==undefined&&!qx.lang.Object.isEmpty(this.__listeners[a])},createDispatchEvent:function(a){if(this.hasEventListeners(a)){this.dispatchEvent(new qx.event.type.Event(a),true)}},createDispatchDataEvent:function(a,b){if(this.hasEventListeners(a)){this.dispatchEvent(new qx.event.type.DataEvent(a,b),true)}},createDispatchChangeEvent:function(b,c,a){if(this.hasEventListeners(b)){this.dispatchEvent(new qx.event.type.ChangeEvent(b,c,a),true)}},dispatchEvent:function(a,c){if(this.getDisposed()){return}if(a.getTarget()==null){a.setTarget(this)}if(a.getCurrentTarget()==null){a.setCurrentTarget(this)}this._dispatchEvent(a,c);var b=a.getDefaultPrevented();c&&a.dispose();return !b},_dispatchEvent:function(b){var d=this.__listeners;if(d){b.setCurrentTarget(this);var a=d[b.getType()];if(a){var e,f;for(var g in a){e=a[g].handler;f=a[g].object||this;e.call(f,b)}}}if(b.getBubbles()&&!b.getPropagationStopped()&&typeof(this.getParent)==$[44]){var c=this.getParent();if(c&&!c.getDisposed()&&c.getEnabled()){c._dispatchEvent(b)}}}},destruct:function(){this._disposeObjectDeep("__listeners",2)}});
 qx.Class.define($[11],{extend:qx.core.Object,construct:function(a){arguments.callee.base.call(this);this.setType(a)},properties:{type:{_fast:true,setOnlyOnce:true},originalTarget:{_fast:true,setOnlyOnce:true},target:{_fast:true,setOnlyOnce:true},relatedTarget:{_fast:true,setOnlyOnce:true},currentTarget:{_fast:true},bubbles:{_fast:true,defaultValue:false,noCompute:true},propagationStopped:{_fast:true,defaultValue:true,noCompute:true},defaultPrevented:{_fast:true,defaultValue:false,noCompute:true}},members:{_autoDispose:false,preventDefault:function(){this.setDefaultPrevented(true)},stopPropagation:function(){this.setPropagationStopped(true)}},destruct:function(){this._disposeFields("_valueOriginalTarget","_valueTarget","_valueRelatedTarget","_valueCurrentTarget")}});
-qx.Class.define($[70],{extend:qx.event.type.Event,construct:function(a,b){arguments.callee.base.call(this,a);this.setData(b)},properties:{propagationStopped:{_fast:true,defaultValue:false},data:{_fast:true}},destruct:function(){this._disposeFields("_valueData")}});
-qx.Class.define($[358],{extend:qx.event.type.Event,construct:function(b,c,a){arguments.callee.base.call(this,b);this.setValue(c);this.setOldValue(a)},properties:{value:{_fast:true},oldValue:{_fast:true}},members:{getData:function(){return this.getValue()}},destruct:function(){this._disposeFields("_valueValue","_valueOldValue")}});
-qx.Class.define("qx.client.Timer",{extend:qx.core.Target,construct:function(a){arguments.callee.base.call(this);this.setEnabled(false);if(a!=null){this.setInterval(a)}this.__oninterval=qx.lang.Function.bind(this._oninterval,this);this.__event=new qx.event.type.Event($[50])},events:{interval:$[11]},statics:{once:function(a,c,b){var d=new qx.client.Timer(b);d.addEventListener($[50],function(f){d.dispose();a.call(c,f);c=null},c);d.start()}},properties:{enabled:{init:true,check:$[3],apply:$[373]},interval:{check:$[22],init:1000,apply:"_applyInterval"}},members:{__intervalHandler:null,_applyInterval:function(b,a){if(this.getEnabled()){this.restart()}},_applyEnabled:function(b,a){if(a){window.clearInterval(this.__intervalHandler);this.__intervalHandler=null}else{if(b){this.__intervalHandler=window.setInterval(this.__oninterval,this.getInterval())}}},start:function(){this.setEnabled(true)},startWith:function(a){this.setInterval(a);this.start()},stop:function(){this.setEnabled(false)},restart:function(){this.stop();this.start()},restartWith:function(a){this.stop();this.startWith(a)},_oninterval:function(){try{if(this.getEnabled()&&this.hasEventListeners($[50])){this.dispatchEvent(this.__event,false)}}catch(a){org.eclipse.rwt.ErrorHandler.processJavaScriptError(a)}}},destruct:function(){if(this.__intervalHandler){window.clearInterval(this.__intervalHandler)}this._disposeFields("__intervalHandler","__oninterval","__event")}});
+qx.Class.define($[68],{extend:qx.event.type.Event,construct:function(a,b){arguments.callee.base.call(this,a);this.setData(b)},properties:{propagationStopped:{_fast:true,defaultValue:false},data:{_fast:true}},destruct:function(){this._disposeFields("_valueData")}});
+qx.Class.define($[399],{extend:qx.event.type.Event,construct:function(b,c,a){arguments.callee.base.call(this,b);this.setValue(c);this.setOldValue(a)},properties:{value:{_fast:true},oldValue:{_fast:true}},members:{getData:function(){return this.getValue()}},destruct:function(){this._disposeFields("_valueValue","_valueOldValue")}});
+qx.Class.define("qx.client.Timer",{extend:qx.core.Target,construct:function(a){arguments.callee.base.call(this);this.setEnabled(false);if(a!=null){this.setInterval(a)}this.__oninterval=qx.lang.Function.bind(this._oninterval,this);this.__event=new qx.event.type.Event($[49])},events:{interval:$[11]},statics:{once:function(a,c,b){var d=new qx.client.Timer(b);d.addEventListener($[49],function(f){d.dispose();a.call(c,f);c=null},c);d.start()}},properties:{enabled:{init:true,check:$[3],apply:$[396]},interval:{check:$[22],init:1000,apply:"_applyInterval"}},members:{__intervalHandler:null,_applyInterval:function(b,a){if(this.getEnabled()){this.restart()}},_applyEnabled:function(b,a){if(a){window.clearInterval(this.__intervalHandler);this.__intervalHandler=null}else{if(b){this.__intervalHandler=window.setInterval(this.__oninterval,this.getInterval())}}},start:function(){this.setEnabled(true)},startWith:function(a){this.setInterval(a);this.start()},stop:function(){this.setEnabled(false)},restart:function(){this.stop();this.start()},restartWith:function(a){this.stop();this.startWith(a)},_oninterval:function(){try{if(this.getEnabled()&&this.hasEventListeners($[49])){this.dispatchEvent(this.__event,false)}}catch(a){org.eclipse.rwt.ErrorHandler.processJavaScriptError(a)}}},destruct:function(){if(this.__intervalHandler){window.clearInterval(this.__intervalHandler)}this._disposeFields("__intervalHandler","__oninterval","__event")}});
 qx.Class.define("qx.html.String",{statics:{escape:function(a){return qx.dom.String.escapeEntities(a,qx.html.Entity.FROM_CHARCODE)},unescape:function(a){return qx.dom.String.unescapeEntities(a,qx.html.Entity.TO_CHARCODE)},fromText:function(a){return qx.html.String.escape(a).replace(/(  |\n)/g,function(b){var c={"  ":" &nbsp;","\n":"<br>"};return c[b]||b})},toText:function(a){return qx.html.String.unescape(a.replace(/\s+|<([^>])+>/gi,function(b){if(/\s+/.test(b)){return" "}else{if(/^<BR|^<br/gi.test(b)){return"\n"}else{return""}}}))}}});
 qx.Class.define("qx.dom.String",{statics:{escapeEntities:qx.core.Variant.select($[0],{mshtml:function(h,d){var c,a=[];for(var e=0,b=h.length;e<b;e++){var f=h.charAt(e);var g=f.charCodeAt(0);if(d[g]){c="&"+d[g]+";"}else{if(g>127){c="&#"+g+";"}else{c=f}}a[a.length]=c}return a.join("")},"default":function(h,d){var c,a="";for(var e=0,b=h.length;e<b;e++){var f=h.charAt(e);var g=f.charCodeAt(0);if(d[g]){c="&"+d[g]+";"}else{if(g>127){c="&#"+g+";"}else{c=f}}a+=c}return a}}),unescapeEntities:function(b,a){return b.replace(/&[#\w]+;/gi,function(c){var d=c;var c=c.substring(1,c.length-1);var e=a[c];if(e){d=String.fromCharCode(e)}else{if(c.charAt(0)=="#"){if(c.charAt(1).toUpperCase()=="X"){e=c.substring(2);if(e.match(/^[0-9A-Fa-f]+$/gi)){d=String.fromCharCode(parseInt("0x"+e))}}else{e=c.substring(1);if(e.match(/^\d+$/gi)){d=String.fromCharCode(parseInt(e))}}}}return d})},stripTags:function(a){return a.replace(/<\/?[^>]+>/gi,"")}}});
 qx.Class.define("qx.html.Entity",{statics:{TO_CHARCODE:{quot:34,amp:38,lt:60,gt:62,nbsp:160,iexcl:161,cent:162,pound:163,curren:164,yen:165,brvbar:166,sect:167,uml:168,copy:169,ordf:170,laquo:171,not:172,shy:173,reg:174,macr:175,deg:176,plusmn:177,sup2:178,sup3:179,acute:180,micro:181,para:182,middot:183,cedil:184,sup1:185,ordm:186,raquo:187,frac14:188,frac12:189,frac34:190,iquest:191,Agrave:192,Aacute:193,Acirc:194,Atilde:195,Auml:196,Aring:197,AElig:198,Ccedil:199,Egrave:200,Eacute:201,Ecirc:202,Euml:203,Igrave:204,Iacute:205,Icirc:206,Iuml:207,ETH:208,Ntilde:209,Ograve:210,Oacute:211,Ocirc:212,Otilde:213,Ouml:214,times:215,Oslash:216,Ugrave:217,Uacute:218,Ucirc:219,Uuml:220,Yacute:221,THORN:222,szlig:223,agrave:224,aacute:225,acirc:226,atilde:227,auml:228,aring:229,aelig:230,ccedil:231,egrave:232,eacute:233,ecirc:234,euml:235,igrave:236,iacute:237,icirc:238,iuml:239,eth:240,ntilde:241,ograve:242,oacute:243,ocirc:244,otilde:245,ouml:246,divide:247,oslash:248,ugrave:249,uacute:250,ucirc:251,uuml:252,yacute:253,thorn:254,yuml:255,fnof:402,Alpha:913,Beta:914,Gamma:915,Delta:916,Epsilon:917,Zeta:918,Eta:919,Theta:920,Iota:921,Kappa:922,Lambda:923,Mu:924,Nu:925,Xi:926,Omicron:927,Pi:928,Rho:929,Sigma:931,Tau:932,Upsilon:933,Phi:934,Chi:935,Psi:936,Omega:937,alpha:945,beta:946,gamma:947,delta:948,epsilon:949,zeta:950,eta:951,theta:952,iota:953,kappa:954,lambda:955,mu:956,nu:957,xi:958,omicron:959,pi:960,rho:961,sigmaf:962,sigma:963,tau:964,upsilon:965,phi:966,chi:967,psi:968,omega:969,thetasym:977,upsih:978,piv:982,bull:8226,hellip:8230,prime:8242,Prime:8243,oline:8254,frasl:8260,weierp:8472,image:8465,real:8476,trade:8482,alefsym:8501,larr:8592,uarr:8593,rarr:8594,darr:8595,harr:8596,crarr:8629,lArr:8656,uArr:8657,rArr:8658,dArr:8659,hArr:8660,forall:8704,part:8706,exist:8707,empty:8709,nabla:8711,isin:8712,notin:8713,ni:8715,prod:8719,sum:8721,minus:8722,lowast:8727,radic:8730,prop:8733,infin:8734,ang:8736,and:8743,or:8744,cap:8745,cup:8746,"int":8747,there4:8756,sim:8764,cong:8773,asymp:8776,ne:8800,equiv:8801,le:8804,ge:8805,sub:8834,sup:8835,sube:8838,supe:8839,oplus:8853,otimes:8855,perp:8869,sdot:8901,lceil:8968,rceil:8969,lfloor:8970,rfloor:8971,lang:9001,rang:9002,loz:9674,spades:9824,clubs:9827,hearts:9829,diams:9830,OElig:338,oelig:339,Scaron:352,scaron:353,Yuml:376,circ:710,tilde:732,ensp:8194,emsp:8195,thinsp:8201,zwnj:8204,zwj:8205,lrm:8206,rlm:8207,ndash:8211,mdash:8212,lsquo:8216,rsquo:8217,sbquo:8218,ldquo:8220,rdquo:8221,bdquo:8222,dagger:8224,Dagger:8225,permil:8240,lsaquo:8249,rsaquo:8250,euro:8364}},defer:function(c,a,b){c.FROM_CHARCODE=qx.lang.Object.invert(c.TO_CHARCODE)}});
 qx.Class.define("qx.html.EventRegistration",{statics:{addEventListener:qx.core.Variant.select($[0],{mshtml:function(a,b,c){a.attachEvent("on"+b,c)},"default":function(a,b,c){a.addEventListener(b,c,false)}}),removeEventListener:qx.core.Variant.select($[0],{mshtml:function(a,b,c){a.detachEvent("on"+b,c)},"default":function(a,b,c){a.removeEventListener(b,c,false)}})}});
-qx.Class.define("qx.core.Init",{type:$[33],extend:qx.core.Target,construct:function(){arguments.callee.base.call(this);this._onloadWrapped=qx.lang.Function.bind(this._onload,this);this._onbeforeunloadWrapped=qx.lang.Function.bind(this._onbeforeunload,this);this._onunloadWrapped=qx.lang.Function.bind(this._onunload,this);qx.html.EventRegistration.addEventListener(window,"load",this._onloadWrapped);qx.html.EventRegistration.addEventListener(window,$[332],this._onbeforeunloadWrapped);qx.html.EventRegistration.addEventListener(window,"unload",this._onunloadWrapped)},events:{load:$[11],beforeunload:$[11],unload:$[11]},properties:{application:{nullable:true,check:function(a){if(typeof a==$[44]){throw new Error("The application property takes an application instance as parameter and no longer a class/constructor. You may have to fix your 'index.html'.")}return a instanceof qx.application.Gui}}},members:{_autoDispose:false,_onload:function(c){if(this._onloadDone){return}this._onloadDone=true;this.createDispatchEvent("load");if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Variant.isSet($[0],$[18])){var a=org.eclipse.rwt.Client;if(!a.isInQuirksMode()){throw new Error("Wrong box sizing: Please modify the document's DOCTYPE!")}}}if(!this.getApplication()){var b=qx.Class.getByName(qx.core.Setting.get("qx.application"));if(b){this.setApplication(new b(this))}}if(!this.getApplication()){return}var d=new Date;this.getApplication().main()},_onbeforeunload:function(b){this.createDispatchEvent($[332]);if(this.getApplication()){var a=this.getApplication().close();if(a!=null){b.returnValue=a;return a}}},_onunload:function(a){this.createDispatchEvent("unload");if(this.getApplication()){this.getApplication().terminate()}qx.core.Object.dispose(true)}},settings:{"qx.application":$[541]},destruct:function(){qx.html.EventRegistration.removeEventListener(window,"load",this._onloadWrapped);qx.html.EventRegistration.removeEventListener(window,$[332],this._onbeforeunloadWrapped);qx.html.EventRegistration.removeEventListener(window,"unload",this._onunloadWrapped)},defer:function(c,b,a){c.getInstance()}});
+qx.Class.define("qx.core.Init",{type:$[33],extend:qx.core.Target,construct:function(){arguments.callee.base.call(this);this._onloadWrapped=qx.lang.Function.bind(this._onload,this);this._onbeforeunloadWrapped=qx.lang.Function.bind(this._onbeforeunload,this);this._onunloadWrapped=qx.lang.Function.bind(this._onunload,this);qx.html.EventRegistration.addEventListener(window,"load",this._onloadWrapped);qx.html.EventRegistration.addEventListener(window,$[393],this._onbeforeunloadWrapped);qx.html.EventRegistration.addEventListener(window,"unload",this._onunloadWrapped)},events:{load:$[11],beforeunload:$[11],unload:$[11]},properties:{application:{nullable:true,check:function(a){if(typeof a==$[44]){throw new Error("The application property takes an application instance as parameter and no longer a class/constructor. You may have to fix your 'index.html'.")}return a instanceof qx.application.Gui}}},members:{_autoDispose:false,_onload:function(c){if(this._onloadDone){return}this._onloadDone=true;this.createDispatchEvent("load");if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Variant.isSet($[0],$[18])){var a=org.eclipse.rwt.Client;if(!a.isInQuirksMode()){throw new Error("Wrong box sizing: Please modify the document's DOCTYPE!")}}}if(!this.getApplication()){var b=qx.Class.getByName(qx.core.Setting.get("qx.application"));if(b){this.setApplication(new b(this))}}if(!this.getApplication()){return}var d=new Date;this.getApplication().main()},_onbeforeunload:function(b){this.createDispatchEvent($[393]);if(this.getApplication()){var a=this.getApplication().close();if(a!=null){b.returnValue=a;return a}}},_onunload:function(a){this.createDispatchEvent("unload");if(this.getApplication()){this.getApplication().terminate()}qx.core.Object.dispose(true)}},settings:{"qx.application":$[510]},destruct:function(){qx.html.EventRegistration.removeEventListener(window,"load",this._onloadWrapped);qx.html.EventRegistration.removeEventListener(window,$[393],this._onbeforeunloadWrapped);qx.html.EventRegistration.removeEventListener(window,"unload",this._onunloadWrapped)},defer:function(c,b,a){c.getInstance()}});
 qx.Mixin.define("qx.util.manager.MConnectedObject",{members:{hasConnectionTo:function(a){if(!this._valueManager){this._valueManager={}}this._valueManager[a.toHashCode()]=a}},destruct:function(){for(var a in this._valueManager){var b=this._valueManager[a];b.disconnect(this)}this._disposeFields("_valueManager")}});
-qx.Class.define("org.eclipse.rwt.HtmlUtil",{statics:{BROWSER_PREFIX:qx.core.Variant.select($[0],{gecko:"-moz-",webkit:"-webkit-","default":""}),setBackgroundImage:(function(){var a;if(org.eclipse.rwt.Client.isMshtml()&&org.eclipse.rwt.Client.getVersion()<7){a=function(d,c,b){if(b!=null&&b<1){this.removeCssFilter(d);this._setCssBackgroundImage(d,c);this.setOpacity(d,b)}else{this._setCssBackgroundImage(d,null);this._setCssFilterImage(d,c)}}}else{a=function(d,c,b){this._setCssBackgroundImage(d,c);if(b!=null){this.setOpacity(d,b)}}}return a})(),setOpacity:qx.core.Variant.select($[0],{mshtml:function(c,b){if(b==null||b>=1||b<0){this.removeCssFilter(c)}else{var a=$[533]+Math.round(b*100)+")";this.setStyleProperty(c,$[134],a)}},"default":function(c,b){if(b==null||b>=1){if(qx.core.Variant.isSet($[0],$[40])){this.removeStyleProperty(c,$[320])}this.removeStyleProperty(c,$[42])}else{var a=qx.lang.Number.limit(b,0,1);if(qx.core.Variant.isSet($[0],$[40])){this.setStyleProperty(c,$[320],a)}this.setStyleProperty(c,$[42],a)}}}),setBackgroundGradient:qx.core.Variant.select($[0],{webkit:function(g,f){if(f){var d=["linear","left top"];if(f.horizontal===true){d.push("right top")}else{d.push("left bottom")}for(var e=0;e<f.length;e++){var a=f[e][0];var b=f[e][1];d.push("color-stop("+a+","+b+")")}var c=this.BROWSER_PREFIX+"gradient( "+d.join()+")";this.setStyleProperty(g,$[190],c)}else{this.removeStyleProperty(g,$[190])}},"default":function(g,f){if(f){var d=[f.horizontal===true?"0deg":"-90deg"];for(var e=0;e<f.length;e++){var a=(f[e][0]*100)+"%";var b=f[e][1];d.push(b+" "+a)}var c=this.BROWSER_PREFIX+"linear-gradient( "+d.join()+")";this.setStyleProperty(g,$[190],c)}else{this.removeStyleProperty(g,$[190])}}}),setBoxShadow:function(e,c){var d;if(org.eclipse.rwt.Client.isWebkit()){d=this.BROWSER_PREFIX+$[169]}else{d="boxShadow"}if(c){var a=c.slice(1,4).join("px ")+"px";var b=qx.util.ColorUtil.stringToRgb(c[5]);b.push(c[6]);a+=" rgba("+b.join()+")";this.setStyleProperty(e,d,a)}else{this.removeStyleProperty(e,d)}},setPointerEvents:function(e,d){var a=org.eclipse.rwt.Client.getVersion();var b=org.eclipse.rwt.Client.getEngine()===$[40]&&a>=1.9;var c=org.eclipse.rwt.Client.getBrowser()==="safari"&&a>=530;if(b||c){this.setStyleProperty(e,$[467],d);e.setAttribute($[467],d)}else{this._passEventsThrough(e,d)}},setStyleProperty:function(c,b,a){if(c instanceof qx.ui.core.Widget){c.setStyleProperty(b,a)}else{c.style[b]=a}},removeStyleProperty:function(b,a){if(b instanceof qx.ui.core.Widget){b.removeStyleProperty(a)}else{b.style[a]=""}},removeCssFilter:function(c){var a=null;if(c instanceof qx.ui.core.Widget){if(c.isCreated()){a=c.getElement()}else{c.removeStyleProperty($[134])}}else{a=c}if(a!==null){var b=a.style.cssText;b=b.replace(/FILTER:[^;]*(;|$)/,"");a.style.cssText=b}},_setCssBackgroundImage:function(c,b){var a=b?"URL("+b+")":"none";this.setStyleProperty(c,$[112],a);this.setStyleProperty(c,$[349],$[350]);this.setStyleProperty(c,$[374],$[38])},_setCssFilterImage:function(c,b){if(b){var a=$[442]+b+$[416];this.setStyleProperty(c,$[134],a)}else{this.removeCssFilter(c)}},_passEventsThrough:function(f,e){var a=qx.html.EventRegistration;var c=org.eclipse.rwt.EventHandler._mouseEventTypes;var d=this._passEventThroughHandler;if(e==="none"){this.setStyleProperty(f,$[34],$[39]);for(var b=0;b<c.length;b++){a.addEventListener(f,c[b],d)}}else{}},_passEventThroughHandler:function(){var a=org.eclipse.rwt.EventHandlerUtil;var c=a.getDomEvent(arguments);var d=a.getDomTarget(c);var b=c.type;d.style.display="none";var e=document.elementFromPoint(c.clientX,c.clientY);c.cancelBubble=true;a.stopDomEvent(c);if(e&&b!==$[45]&&b!==$[9]&&b!==$[14]){if(b===$[2]){org.eclipse.rwt.HtmlUtil._refireEvent(e,$[9],c)}org.eclipse.rwt.HtmlUtil._refireEvent(e,b,c);if(b===$[15]){org.eclipse.rwt.HtmlUtil._refireEvent(e,$[14],c)}}d.style.display=""},_refireEvent:qx.core.Variant.select($[0],{mshtml:function(d,b,a){var c=document.createEventObject(a);d.fireEvent("on"+b,c)},"default":function(d,b,a){var c=document.createEvent("MouseEvents");c.initMouseEvent(b,true,true,a.view,a.detail,a.screenX,a.screenY,a.clientX,a.clientY,a.ctrlKey,a.altKey,a.shiftKey,a.metaKey,a.button,a.relatedTarget);d.dispatchEvent(c)}})}});
-qx.Class.define($[136],{extend:qx.core.Target,include:qx.util.manager.MConnectedObject,type:$[102],construct:function(){arguments.callee.base.call(this);this._layoutChanges={};this.initHideFocus();this._usesComplexBorder=false},events:{beforeAppear:$[11],appear:$[11],beforeDisappear:$[11],disappear:$[11],insertDom:$[11],create:$[11],execute:$[11],flush:$[70],mouseover:$[91],mousemove:$[91],mouseout:$[91],mousedown:$[91],mouseup:$[91],mousewheel:$[91],click:$[91],dblclick:$[91],contextmenu:$[91],elementOver:$[91],elementOut:$[91],keydown:$[308],keypress:$[308],keyup:$[308],focusout:$[240],focusin:$[240],blur:$[240],focus:$[240],dragdrop:$[164],dragout:$[164],dragover:$[164],dragmove:$[164],dragstart:$[164],dragend:$[164]},statics:{_globalWidgetQueue:[],_globalElementQueue:[],_globalStateQueue:[],_globalJobQueue:[],_globalLayoutQueue:[],_fastGlobalDisplayQueue:[],_lazyGlobalDisplayQueues:{},_globalDisposeQueue:[],_autoFlushTimeout:null,_flushGlobalQueuesPhase:0,_FLUSH_PHASE_IDLE:0,_FLUSH_PHASE_WIDGET:1,_FLUSH_PHASE_STATE:2,_FLUSH_PHASE_ELEMENT:3,_FLUSH_PHASE_JOB:4,_FLUSH_PHASE_LAYOUT:5,_FLUSH_PHASE_DISPLAY:6,_FLUSH_PHASE_DISPOSE:7,_initAutoFlush:function(a){if(qx.ui.core.Widget._autoFlushTimeout==null){if(!qx.ui.core.Widget._inFlushGlobalQueues||a<qx.ui.core.Widget._flushGlobalQueuesPhase){qx.ui.core.Widget._autoFlushTimeout=window.setTimeout(qx.ui.core.Widget._autoFlushHelper,0)}}},_removeAutoFlush:function(){if(qx.ui.core.Widget._autoFlushTimeout!=null){window.clearTimeout(qx.ui.core.Widget._autoFlushTimeout);qx.ui.core.Widget._autoFlushTimeout=null}},_autoFlushHelper:function(){qx.ui.core.Widget._autoFlushTimeout=null;if(!qx.core.Object.inGlobalDispose()){qx.ui.core.Widget.flushGlobalQueues()}},flushGlobalQueues:function(){if(qx.ui.core.Widget._autoFlushTimeout!=null){qx.ui.core.Widget._removeAutoFlush()}if(qx.ui.core.Widget._inFlushGlobalQueues){return}var a=qx.core.Init.getInstance().getApplication();if(a.getUiReady&&!a.getUiReady()){return}qx.ui.core.Widget._inFlushGlobalQueues=true;qx.ui.core.Widget.flushGlobalWidgetQueue();qx.ui.core.Widget.flushGlobalStateQueue();qx.ui.core.Widget.flushGlobalElementQueue();qx.ui.core.Widget.flushGlobalJobQueue();qx.ui.core.Widget.flushGlobalLayoutQueue();qx.ui.core.Widget.flushGlobalDisplayQueue();qx.ui.core.Widget.flushGlobalDisposeQueue();qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_IDLE;delete qx.ui.core.Widget._inFlushGlobalQueues},addToGlobalWidgetQueue:function(a){if(!a._isInGlobalWidgetQueue&&a._isDisplayable){if(qx.ui.core.Widget._autoFlushTimeout==null){qx.ui.core.Widget._initAutoFlush(qx.ui.core.Widget._FLUSH_PHASE_WIDGET)}qx.ui.core.Widget._globalWidgetQueue.push(a);a._isInGlobalWidgetQueue=true}},removeFromGlobalWidgetQueue:function(a){if(a._isInGlobalWidgetQueue){qx.lang.Array.remove(qx.ui.core.Widget._globalWidgetQueue,a);delete a._isInGlobalWidgetQueue}},flushGlobalWidgetQueue:function(){qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_WIDGET;var a=qx.ui.core.Widget._globalWidgetQueue,c,d;while((c=a.length)>0){for(var b=0;b<c;b++){d=a[b];d.flushWidgetQueue();delete d._isInGlobalWidgetQueue}a.splice(0,c)}qx.ui.core.Widget._globalWidgetQueue=[]},addToGlobalElementQueue:function(a){if(!a._isInGlobalElementQueue&&a._isDisplayable){if(qx.ui.core.Widget._autoFlushTimeout==null){qx.ui.core.Widget._initAutoFlush(qx.ui.core.Widget._FLUSH_PHASE_ELEMENT)}qx.ui.core.Widget._globalElementQueue.push(a);a._isInGlobalElementQueue=true}},removeFromGlobalElementQueue:function(a){if(a._isInGlobalElementQueue){qx.lang.Array.remove(qx.ui.core.Widget._globalElementQueue,a);delete a._isInGlobalElementQueue}},flushGlobalElementQueue:function(){qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_ELEMENT;var a=qx.ui.core.Widget._globalElementQueue,c,d;while((c=a.length)>0){for(var b=0;b<c;b++){d=a[b];d._createElementImpl();delete d._isInGlobalElementQueue}a.splice(0,c)}qx.ui.core.Widget._globalElementQueue=[]},addToGlobalStateQueue:function(a){if(!a._isInGlobalStateQueue&&a._isDisplayable){if(qx.ui.core.Widget._autoFlushTimeout==null){qx.ui.core.Widget._initAutoFlush(qx.ui.core.Widget._FLUSH_PHASE_STATE)}qx.ui.core.Widget._globalStateQueue.push(a);a._isInGlobalStateQueue=true}},removeFromGlobalStateQueue:function(a){if(a._isInGlobalStateQueue){qx.lang.Array.remove(qx.ui.core.Widget._globalStateQueue,a);delete a._isInGlobalStateQueue}},flushGlobalStateQueue:function(){qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_STATE;var d=qx.ui.core.Widget;while(d._globalStateQueue.length>0){var a=qx.lang.Array.copy(d._globalStateQueue);d._globalStateQueue=[];for(var c=0,b=a.length;c<b;c++){var e=a[c];if(e._isInGlobalStateQueue){e._renderAppearance();delete e._isInGlobalStateQueue}}}},addToGlobalJobQueue:function(a){if(!a._isInGlobalJobQueue&&a._isDisplayable){if(qx.ui.core.Widget._autoFlushTimeout==null){qx.ui.core.Widget._initAutoFlush(qx.ui.core.Widget._FLUSH_PHASE_JOB)}qx.ui.core.Widget._globalJobQueue.push(a);a._isInGlobalJobQueue=true}},removeFromGlobalJobQueue:function(a){if(a._isInGlobalJobQueue){qx.lang.Array.remove(qx.ui.core.Widget._globalJobQueue,a);delete a._isInGlobalJobQueue}},flushGlobalJobQueue:function(){qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_JOB;var a=qx.ui.core.Widget._globalJobQueue,c,d;while((c=a.length)>0){for(var b=0;b<c;b++){d=a[b];d._flushJobQueue(d._jobQueue);delete d._isInGlobalJobQueue}a.splice(0,c)}qx.ui.core.Widget._globalJobQueue=[]},addToGlobalLayoutQueue:function(a){if(!a._isInGlobalLayoutQueue&&a._isDisplayable){if(qx.ui.core.Widget._autoFlushTimeout==null){qx.ui.core.Widget._initAutoFlush(qx.ui.core.Widget._FLUSH_PHASE_LAYOUT)}qx.ui.core.Widget._globalLayoutQueue.push(a);a._isInGlobalLayoutQueue=true}},removeFromGlobalLayoutQueue:function(a){if(a._isInGlobalLayoutQueue){qx.lang.Array.remove(qx.ui.core.Widget._globalLayoutQueue,a);delete a._isInGlobalLayoutQueue}},flushGlobalLayoutQueue:function(){qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_LAYOUT;var a=qx.ui.core.Widget._globalLayoutQueue,d,c;while((d=a.length)>0){for(var b=0;b<d;b++){c=a[b];c._flushChildrenQueue();delete c._isInGlobalLayoutQueue}a.splice(0,d)}qx.ui.core.Widget._globalLayoutQueue=[]},addToGlobalDisplayQueue:function(b){if(!b._isInGlobalDisplayQueue&&b._isDisplayable){if(qx.ui.core.Widget._autoFlushTimeout==null){qx.ui.core.Widget._initAutoFlush(qx.ui.core.Widget._FLUSH_PHASE_DISPLAY)}var a=b.getParent();if(a.isSeeable()){var c=a.toHashCode();if(qx.ui.core.Widget._lazyGlobalDisplayQueues[c]){qx.ui.core.Widget._lazyGlobalDisplayQueues[c].push(b)}else{qx.ui.core.Widget._lazyGlobalDisplayQueues[c]=[b]}}else{qx.ui.core.Widget._fastGlobalDisplayQueue.push(b)}b._isInGlobalDisplayQueue=true}},removeFromGlobalDisplayQueue:function(a){},flushGlobalDisplayQueue:function(){qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_DISPLAY;var e,h,d,g;var f=qx.ui.core.Widget._fastGlobalDisplayQueue;var c=qx.ui.core.Widget._lazyGlobalDisplayQueues;for(var b=0,a=f.length;b<a;b++){d=f[b];d.getParent()._getTargetNode().appendChild(d.getElement())}for(e in c){h=c[e];if(document.createDocumentFragment&&h.length>=3){g=document.createDocumentFragment();for(var b=0,a=h.length;b<a;b++){d=h[b];g.appendChild(d.getElement())}h[0].getParent()._getTargetNode().appendChild(g);for(var b=0,a=h.length;b<a;b++){d=h[b];d._afterInsertDom()}}else{for(var b=0,a=h.length;b<a;b++){d=h[b];d.getParent()._getTargetNode().appendChild(d.getElement());d._afterInsertDom()}}}for(e in c){h=c[e];for(var b=0,a=h.length;b<a;b++){d=h[b];if(d.getVisibility()){d._afterAppear()}delete d._isInGlobalDisplayQueue}delete c[e]}if(qx.lang.Object.isEmpty(c)){qx.ui.core.Widget._lazyGlobalDisplayQueues={}}for(var b=0,a=f.length;b<a;b++){delete f[b]._isInGlobalDisplayQueue}qx.ui.core.Widget._fastGlobalDisplayQueue=[]},addToGlobalDisposeQueue:function(a){if(!a._isInGlobalDisposeQueue&&!a.isDisposed()){if(qx.ui.core.Widget._autoFlushTimeout==null){qx.ui.core.Widget._initAutoFlush(qx.ui.core.Widget._FLUSH_PHASE_DISPOSE)}qx.ui.core.Widget._globalDisposeQueue.push(a);a._isInGlobalDisposeQueue=true}},removeFromGlobalDisposeQueue:function(a){if(a._isInGlobalDisposeQueue){qx.lang.Array.remove(qx.ui.core.Widget._globalDisposeQueue,a);delete a._isInGlobalDisposeQueue}},flushGlobalDisposeQueue:function(){qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_DISPOSE;var a=qx.ui.core.Widget._globalDisposeQueue,c,d;while((c=a.length)>0){for(var b=0;b<c;b++){d=a[b];d.dispose();delete d._isInGlobalDisposeQueue}a.splice(0,c)}qx.ui.core.Widget._globalDisposeQueue=[]},getActiveSiblingHelperIgnore:function(b,c){for(var a=0;a<b.length;a++){if(c instanceof b[a]){return true}}return false},getActiveSiblingHelper:function(c,d,b,a,h){if(!a){a=[]}var f=d.getChildren();var g=h==null?f.indexOf(c)+b:h==="first"?0:f.length-1;var e=f[g];while(e&&(!e.getEnabled()||qx.ui.core.Widget.getActiveSiblingHelperIgnore(a,e))){g+=b;e=f[g];if(!e){return null}}return e},TYPE_NULL:0,TYPE_PIXEL:1,TYPE_PERCENT:2,TYPE_AUTO:3,TYPE_FLEX:4,__initApplyMethods:function(d){var g="_renderRuntime";var k="_resetRuntime";var b="this._style.";var f="=((v==null)?0:v)+'px'";var m="v";var h=["left",$[23],"top",$[48],$[19],$[36],$[98],$[97],$[108],$[99]];var p=["Left",$[53],"Top","Bottom","Width","Height","MinWidth","MaxWidth","MinHeight","MaxHeight"];var n=g+"Margin";var j=k+"Margin";var l=b+$[96];for(var e=0;e<4;e++){d[n+p[e]]=new Function(m,l+p[e]+f);d[j+p[e]]=new Function(l+p[e]+"=''")}var o=g+"Padding";var a=k+"Padding";var c=b+$[37];for(var e=0;e<4;e++){d[o+p[e]]=new Function(m,"this.setStyleProperty('padding"+p[e]+"', ((v==null)?0:v)+'px')");d[a+p[e]]=new Function("this.removeStyleProperty('padding"+p[e]+"')")}for(var e=0;e<h.length;e++){d[g+p[e]]=new Function(m,b+h[e]+f);d[k+p[e]]=new Function(b+h[e]+"=''")}},layoutPropertyTypes:{},__initLayoutProperties:function(j){var e=[$[19],$[36],$[98],$[97],$[108],$[99],"left",$[23],"top",$[48]];for(var g=0,d=e.length,h,c,f;g<d;g++){h=e[g];c="_computed"+qx.lang.String.toFirstUp(h);f=c+"Type";j.layoutPropertyTypes[h]={dataType:f,dataParsed:c+"Parsed",dataValue:c+"Value",typePixel:f+"Pixel",typePercent:f+"Percent",typeAuto:f+"Auto",typeFlex:f+"Flex",typeNull:f+"Null"}}},disableScrolling:function(b){var a=b._getTargetNode();if(a){qx.html.Scroll.disableScrolling(a)}else{b.addEventListener($[31],this._blockScrollingOnAppear,this)}},enableScrolling:function(b){var a=b._getTargetNode();if(a){qx.html.Scroll.enableScrolling(a)}else{b.removeEventListener($[31],this._blockScrollingOnAppear,this)}},_blockScrollingOnAppear:function(a){var b=a.getTarget();b.removeEventListener($[31],this._blockScrollingOnAppear,this);this.disableScrolling(b)}},properties:{enabled:{init:$[133],check:$[3],inheritable:true,apply:$[373],event:$[132]},parent:{check:$[477],nullable:true,event:$[289],apply:"_applyParent"},element:{check:"Element",nullable:true,apply:"_applyElement",event:$[385]},visibility:{check:$[3],init:true,apply:$[570],event:$[205]},display:{check:$[3],init:true,apply:"_applyDisplay",event:"changeDisplay"},anonymous:{check:$[3],init:false,event:"changeAnonymous"},horizontalAlign:{check:["left",$[38],$[23]],themeable:true,nullable:true},verticalAlign:{check:["top",$[32],$[48]],themeable:true,nullable:true},allowStretchX:{check:$[3],init:true},allowStretchY:{check:$[3],init:true},zIndex:{check:$[73],apply:"_applyZIndex",event:$[509],themeable:true,nullable:true,init:null},backgroundColor:{nullable:true,init:null,check:"Color",apply:$[540],event:$[203],themeable:true},backgroundGradient:{check:"Array",nullable:true,init:null,apply:$[356],event:$[364],themeable:true},shadow:{check:"Array",nullable:true,init:null,apply:"_applyShadow",event:"changeShadow",themeable:true},textColor:{nullable:true,init:$[133],check:"Color",apply:"_applyTextColor",event:$[282],themeable:true,inheritable:true},border:{nullable:true,init:null,apply:"_applyBorder",event:"changeBorder",check:"Border",themeable:true},font:{nullable:true,init:$[133],apply:"_applyFont",check:"Font",event:$[84],themeable:true,inheritable:true},opacity:{check:$[73],apply:$[372],themeable:true,nullable:true,init:null},cursor:{check:$[25],apply:"_applyCursor",themeable:true,nullable:true,init:null},backgroundImage:{check:$[25],nullable:true,apply:"_applyBackgroundImage",themeable:true},backgroundRepeat:{check:$[25],nullable:true,apply:"_applyBackgroundRepeat",themeable:true},overflow:{check:[$[17],"auto",$[26],$[94],$[93]],nullable:true,apply:"_applyOverflow",event:"changeOverflow",themeable:true,init:null},containerOverflow:{check:$[3],nullable:false,apply:"_applyContainerOverflow",themeable:true,init:true},clipLeft:{check:$[22],apply:$[300],themeable:true,nullable:true},clipTop:{check:$[22],apply:$[300],themeable:true,nullable:true},clipWidth:{check:$[22],apply:$[300],themeable:true,nullable:true},clipHeight:{check:$[22],apply:$[300],themeable:true,nullable:true},tabIndex:{check:$[22],nullable:true,init:null,apply:"_applyTabIndex",event:"changeTabIndex"},hideFocus:{check:$[3],init:true,apply:"_applyHideFocus",themeable:true},enableElementFocus:{check:$[3],init:true},focused:{check:$[3],init:false,apply:"_applyFocused",event:$[370]},selectable:{check:$[3],init:null,nullable:true,apply:"_applySelectable"},toolTip:{check:$[268],nullable:true},contextMenu:{nullable:true},capture:{check:$[3],init:false,apply:"_applyCapture",event:"changeCapture"},dropDataTypes:{nullable:true,dispose:true},command:{check:"qx.client.Command",nullable:true,apply:"_applyCommand"},appearance:{check:$[25],init:"widget",apply:"_applyAppearance",event:"changeAppearance"},supportsDropMethod:{check:"Function",nullable:true,init:null},marginTop:{check:$[73],apply:"_applyMarginTop",nullable:true,themeable:true},marginRight:{check:$[73],apply:"_applyMarginRight",nullable:true,themeable:true},marginBottom:{check:$[73],apply:"_applyMarginBottom",nullable:true,themeable:true},marginLeft:{check:$[73],apply:"_applyMarginLeft",nullable:true,themeable:true},paddingTop:{check:$[73],apply:"_applyPaddingTop",nullable:true,themeable:true},paddingRight:{check:$[73],apply:"_applyPaddingRight",nullable:true,themeable:true},paddingBottom:{check:$[73],apply:"_applyPaddingBottom",nullable:true,themeable:true},paddingLeft:{check:$[73],apply:"_applyPaddingLeft",nullable:true,themeable:true},left:{apply:"_applyLeft",event:$[145],nullable:true,themeable:true,init:null},right:{apply:"_applyRight",event:"changeRight",nullable:true,themeable:true,init:null},width:{apply:"_applyWidth",event:$[57],nullable:true,themeable:true,init:null},minWidth:{apply:"_applyMinWidth",event:"changeMinWidth",nullable:true,themeable:true,init:null},maxWidth:{apply:"_applyMaxWidth",event:"changeMaxWidth",nullable:true,themeable:true,init:null},top:{apply:"_applyTop",event:$[302],nullable:true,themeable:true,init:null},bottom:{apply:"_applyBottom",event:"changeBottom",nullable:true,themeable:true,init:null},height:{apply:$[450],event:$[66],nullable:true,themeable:true,init:null},minHeight:{apply:"_applyMinHeight",event:"changeMinHeight",nullable:true,themeable:true,init:null},maxHeight:{apply:"_applyMaxHeight",event:"changeMaxHeight",nullable:true,themeable:true,init:null},location:{group:["left","top"],themeable:true},dimension:{group:[$[19],$[36]],themeable:true},space:{group:["left",$[19],"top",$[36]],themeable:true},edge:{group:["top",$[23],$[48],"left"],themeable:true,mode:$[253]},padding:{group:[$[209],$[220],$[234],$[239]],mode:$[253],themeable:true},margin:{group:[$[207],$[263],$[315],$[208]],mode:$[253],themeable:true},heights:{group:[$[108],$[36],$[99]],themeable:true},widths:{group:[$[98],$[19],$[97]],themeable:true},align:{group:["horizontalAlign","verticalAlign"],themeable:true},clipLocation:{group:["clipLeft","clipTop"]},clipDimension:{group:["clipWidth","clipHeight"]},clip:{group:["clipLeft","clipTop","clipWidth","clipHeight"]},innerWidth:{_cached:true,defaultValue:null},innerHeight:{_cached:true,defaultValue:null},boxWidth:{_cached:true,defaultValue:null},boxHeight:{_cached:true,defaultValue:null},outerWidth:{_cached:true,defaultValue:null},outerHeight:{_cached:true,defaultValue:null},frameWidth:{_cached:true,defaultValue:null,addToQueueRuntime:true},frameHeight:{_cached:true,defaultValue:null,addToQueueRuntime:true},preferredInnerWidth:{_cached:true,defaultValue:null,addToQueueRuntime:true},preferredInnerHeight:{_cached:true,defaultValue:null,addToQueueRuntime:true},preferredBoxWidth:{_cached:true,defaultValue:null},preferredBoxHeight:{_cached:true,defaultValue:null},hasPercentX:{_cached:true,defaultValue:false},hasPercentY:{_cached:true,defaultValue:false},hasAutoX:{_cached:true,defaultValue:false},hasAutoY:{_cached:true,defaultValue:false},hasFlexX:{_cached:true,defaultValue:false},hasFlexY:{_cached:true,defaultValue:false}},members:{_computedLeftValue:null,_computedLeftParsed:null,_computedLeftType:null,_computedLeftTypeNull:true,_computedLeftTypePixel:false,_computedLeftTypePercent:false,_computedLeftTypeAuto:false,_computedLeftTypeFlex:false,_computedRightValue:null,_computedRightParsed:null,_computedRightType:null,_computedRightTypeNull:true,_computedRightTypePixel:false,_computedRightTypePercent:false,_computedRightTypeAuto:false,_computedRightTypeFlex:false,_computedTopValue:null,_computedTopParsed:null,_computedTopType:null,_computedTopTypeNull:true,_computedTopTypePixel:false,_computedTopTypePercent:false,_computedTopTypeAuto:false,_computedTopTypeFlex:false,_computedBottomValue:null,_computedBottomParsed:null,_computedBottomType:null,_computedBottomTypeNull:true,_computedBottomTypePixel:false,_computedBottomTypePercent:false,_computedBottomTypeAuto:false,_computedBottomTypeFlex:false,_computedWidthValue:null,_computedWidthParsed:null,_computedWidthType:null,_computedWidthTypeNull:true,_computedWidthTypePixel:false,_computedWidthTypePercent:false,_computedWidthTypeAuto:false,_computedWidthTypeFlex:false,_computedMinWidthValue:null,_computedMinWidthParsed:null,_computedMinWidthType:null,_computedMinWidthTypeNull:true,_computedMinWidthTypePixel:false,_computedMinWidthTypePercent:false,_computedMinWidthTypeAuto:false,_computedMinWidthTypeFlex:false,_computedMaxWidthValue:null,_computedMaxWidthParsed:null,_computedMaxWidthType:null,_computedMaxWidthTypeNull:true,_computedMaxWidthTypePixel:false,_computedMaxWidthTypePercent:false,_computedMaxWidthTypeAuto:false,_computedMaxWidthTypeFlex:false,_computedHeightValue:null,_computedHeightParsed:null,_computedHeightType:null,_computedHeightTypeNull:true,_computedHeightTypePixel:false,_computedHeightTypePercent:false,_computedHeightTypeAuto:false,_computedHeightTypeFlex:false,_computedMinHeightValue:null,_computedMinHeightParsed:null,_computedMinHeightType:null,_computedMinHeightTypeNull:true,_computedMinHeightTypePixel:false,_computedMinHeightTypePercent:false,_computedMinHeightTypeAuto:false,_computedMinHeightTypeFlex:false,_computedMaxHeightValue:null,_computedMaxHeightParsed:null,_computedMaxHeightType:null,_computedMaxHeightTypeNull:true,_computedMaxHeightTypePixel:false,_computedMaxHeightTypePercent:false,_computedMaxHeightTypeAuto:false,_computedMaxHeightTypeFlex:false,_applyLeft:function(b,a){this._unitDetectionPixelPercent("left",b);this.addToQueue("left")},_applyRight:function(b,a){this._unitDetectionPixelPercent($[23],b);this.addToQueue($[23])},_applyTop:function(b,a){this._unitDetectionPixelPercent("top",b);this.addToQueue("top")},_applyBottom:function(b,a){this._unitDetectionPixelPercent($[48],b);this.addToQueue($[48])},_applyWidth:function(b,a){this._unitDetectionPixelPercentAutoFlex($[19],b);this.addToQueue($[19])},_applyMinWidth:function(b,a){this._unitDetectionPixelPercentAuto($[98],b);this.addToQueue($[98])},_applyMaxWidth:function(b,a){this._unitDetectionPixelPercentAuto($[97],b);this.addToQueue($[97])},_applyHeight:function(b,a){this._unitDetectionPixelPercentAutoFlex($[36],b);this.addToQueue($[36])},_applyMinHeight:function(b,a){this._unitDetectionPixelPercentAuto($[108],b);this.addToQueue($[108])},_applyMaxHeight:function(b,a){this._unitDetectionPixelPercentAuto($[99],b);this.addToQueue($[99])},getChildren:qx.lang.Function.returnNull,getChildrenLength:qx.lang.Function.returnZero,hasChildren:qx.lang.Function.returnFalse,isEmpty:qx.lang.Function.returnTrue,indexOf:qx.lang.Function.returnNegativeIndex,contains:qx.lang.Function.returnFalse,getVisibleChildren:qx.lang.Function.returnNull,getVisibleChildrenLength:qx.lang.Function.returnZero,hasVisibleChildren:qx.lang.Function.returnFalse,isVisibleEmpty:qx.lang.Function.returnTrue,_hasParent:false,_isDisplayable:false,isDisplayable:function(){return this._isDisplayable},_checkParent:function(b,a){if(this.contains(b)){throw new Error("Could not insert myself into a child "+b+"!")}return b},_applyParent:function(c,a){if(a){var b=a.getChildren().indexOf(this);this._computedWidthValue=null;this._computedMinWidthValue=null;this._computedMaxWidthValue=null;this._computedLeftValue=null;this._computedRightValue=null;this._computedHeightValue=null;this._computedMinHeightValue=null;this._computedMaxHeightValue=null;this._computedTopValue=null;this._computedBottomValue=null;this._cachedBoxWidth=null;this._cachedInnerWidth=null;this._cachedOuterWidth=null;this._cachedBoxHeight=null;this._cachedInnerHeight=null;this._cachedOuterHeight=null;qx.lang.Array.removeAt(a.getChildren(),b);a._invalidateVisibleChildren();a._removeChildFromChildrenQueue(this);a.getLayoutImpl().updateChildrenOnRemoveChild(this,b);a.addToJobQueue($[459]);a._invalidatePreferredInnerDimensions();this._oldParent=a}if(c){this._hasParent=true;if(typeof this._insertIndex==$[77]){qx.lang.Array.insertAt(c.getChildren(),this,this._insertIndex);delete this._insertIndex}else{c.getChildren().push(this)}}else{this._hasParent=false}qx.core.Property.refresh(this);return this._handleDisplayable("parent")},_applyDisplay:function(b,a){return this._handleDisplayable($[180])},_handleDisplayable:function(g){var f=this._computeDisplayable();if(this._isDisplayable==f&&!(f&&g=="parent")){return true}this._isDisplayable=f;var e=this.getParent();if(e){e._invalidateVisibleChildren();e._invalidatePreferredInnerDimensions()}if(g&&this._oldParent&&this._oldParent._initialLayoutDone){var d=this.getElement();if(d){if(this.getVisibility()){this._beforeDisappear()}try{this._oldParent._getTargetNode().removeChild(d)}catch(c){}this._afterRemoveDom();if(this.getVisibility()){this._afterDisappear()}}delete this._oldParent}if(f){if(e._initialLayoutDone){var b=e.getChildren().indexOf(this);e.getLayoutImpl().updateChildrenOnAddChild(this,b);e.addToJobQueue("addChild")}this.addToLayoutChanges("initial");this.addToCustomQueues(g);if(this.getVisibility()){this._beforeAppear()}if(!this._isCreated){qx.ui.core.Widget.addToGlobalElementQueue(this)}qx.ui.core.Widget.addToGlobalStateQueue(this);if(!qx.lang.Object.isEmpty(this._jobQueue)){qx.ui.core.Widget.addToGlobalJobQueue(this)}if(!qx.lang.Object.isEmpty(this._childrenQueue)){qx.ui.core.Widget.addToGlobalLayoutQueue(this)}}else{qx.ui.core.Widget.removeFromGlobalElementQueue(this);qx.ui.core.Widget.removeFromGlobalStateQueue(this);qx.ui.core.Widget.removeFromGlobalJobQueue(this);qx.ui.core.Widget.removeFromGlobalLayoutQueue(this);this.removeFromCustomQueues(g);if(e&&g){if(this.getVisibility()){this._beforeDisappear()}if(e._initialLayoutDone&&this._initialLayoutDone){var b=e.getChildren().indexOf(this);e.getLayoutImpl().updateChildrenOnRemoveChild(this,b);e.addToJobQueue($[459]);var a=this.getElement().parentNode;if(a){a.removeChild(this.getElement())}this._afterRemoveDom()}e._removeChildFromChildrenQueue(this);if(this.getVisibility()){this._afterDisappear()}}}this._handleDisplayableCustom(f,e,g);return true},addToCustomQueues:qx.lang.Function.returnTrue,removeFromCustomQueues:qx.lang.Function.returnTrue,_handleDisplayableCustom:qx.lang.Function.returnTrue,_computeDisplayable:function(){return this.getDisplay()&&this.getParent()&&this.getParent()._isDisplayable?true:false},_beforeAppear:function(){this.createDispatchEvent("beforeAppear")},_afterAppear:function(){this._isSeeable=true;this.createDispatchEvent($[31])},_beforeDisappear:function(){this.removeState("over");if(qx.Class.isDefined($[387])){this.removeState($[21]);this.removeState($[47])}this.createDispatchEvent("beforeDisappear")},_afterDisappear:function(){this._isSeeable=false;this.createDispatchEvent($[318])},_isSeeable:false,_isInDom:false,isSeeable:function(){return this._isSeeable},isInDom:function(){return this._isInDom},isAppearRelevant:function(){return this.getVisibility()&&this._isDisplayable},_afterInsertDom:function(){this._isInDom=true;this.createDispatchEvent($[216])},_afterRemoveDom:function(){this._isInDom=true},_applyVisibility:function(b,a){if(b){if(this._isDisplayable&&this._isCreated){this._beforeAppear()}this.removeStyleProperty($[180]);if(this._isDisplayable&&this._isCreated){this._afterAppear()}}else{if(this._isDisplayable&&this._isCreated){this._beforeDisappear()}this.setStyleProperty($[180],"none");if(this._isDisplayable&&this._isCreated){this._afterDisappear()}}},show:function(){this.setVisibility(true);this.setDisplay(true)},hide:function(){this.setVisibility(false)},destroy:function(){this.setParent(null);qx.ui.core.Widget.addToGlobalDisposeQueue(this)},_isCreated:false,_element:null,_targetNode:null,_style:null,_innerStyle:null,_getTargetNode:function(){return this._targetNode||this._element},addToDocument:function(){qx.ui.core.ClientDocument.getInstance().add(this)},isCreated:function(){return this._isCreated},_createElementImpl:function(){this.setElement(this.getTopLevelWidget().getDocumentElement().createElement("div"))},_applyElement:function(b,a){this._isCreated=b!=null;if(a){a.qx_Widget=null}if(b){b.qx_Widget=this;b.style.position=$[27];this._element=b;this._style=b.style;if(this._targetNodeEnabled){this.prepareEnhancedBorder()}this._applyStyleProperties(b);this._applyHtmlProperties(b);this._applyHtmlAttributes(b);this._applyElementData(b);this.createDispatchEvent($[105]);this.addToStateQueue()}else{this._element=this._style=null}},addToJobQueue:function(a){if(this._hasParent){qx.ui.core.Widget.addToGlobalJobQueue(this)}if(!this._jobQueue){this._jobQueue={}}this._jobQueue[a]=true;return true},_flushJobQueue:function(e){try{var k=this._jobQueue;var r=this.getParent();if(!r||qx.lang.Object.isEmpty(k)){return}var n=this instanceof qx.ui.core.Parent?this.getLayoutImpl():null;if(n){n.updateSelfOnJobQueueFlush(k)}}catch(o){throw new Error("Flushing job queue (prechecks#1) failed "+o)}try{var c=false;var g=k.marginLeft||k.marginRight;var h=k.marginTop||k.marginBottom;var b=k.frameWidth;var l=k.frameHeight;var f=(k.frameWidth||k.preferredInnerWidth)&&this._recomputePreferredBoxWidth();var p=(k.frameHeight||k.preferredInnerHeight)&&this._recomputePreferredBoxHeight();if(f){var d=this.getPreferredBoxWidth();if(this._computedWidthTypeAuto){this._computedWidthValue=d;k.width=true}if(this._computedMinWidthTypeAuto){this._computedMinWidthValue=d;k.minWidth=true}if(this._computedMaxWidthTypeAuto){this._computedMaxWidthValue=d;k.maxWidth=true}}if(p){var d=this.getPreferredBoxHeight();if(this._computedHeightTypeAuto){this._computedHeightValue=d;k.height=true}if(this._computedMinHeightTypeAuto){this._computedMinHeightValue=d;k.minHeight=true}if(this._computedMaxHeightTypeAuto){this._computedMaxHeightValue=d;k.maxHeight=true}}if((k.width||k.minWidth||k.maxWidth||k.left||k.right)&&this._recomputeBoxWidth()){g=b=true}if((k.height||k.minHeight||k.maxHeight||k.top||k.bottom)&&this._recomputeBoxHeight()){h=l=true}}catch(o){throw new Error("Flushing job queue (recompute#2) failed "+o)}try{if((g&&this._recomputeOuterWidth())||f){r._invalidatePreferredInnerWidth();r.getLayoutImpl().updateSelfOnChildOuterWidthChange(this);c=true}if((h&&this._recomputeOuterHeight())||p){r._invalidatePreferredInnerHeight();r.getLayoutImpl().updateSelfOnChildOuterHeightChange(this);c=true}if(c){r._flushJobQueue()}}catch(o){throw new Error("Flushing job queue (parentsignals#3) failed "+o)}try{r._addChildToChildrenQueue(this);for(var j in k){this._layoutChanges[j]=true}}catch(o){throw new Error("Flushing job queue (addjobs#4) failed "+o)}try{if(this instanceof qx.ui.core.Parent&&(k.paddingLeft||k.paddingRight||k.paddingTop||k.paddingBottom)){var a=this.getChildren(),m=a.length;if(k.paddingLeft){for(var j=0;j<m;j++){a[j].addToLayoutChanges("parentPaddingLeft")}}if(k.paddingRight){for(var j=0;j<m;j++){a[j].addToLayoutChanges("parentPaddingRight")}}if(k.paddingTop){for(var j=0;j<m;j++){a[j].addToLayoutChanges("parentPaddingTop")}}if(k.paddingBottom){for(var j=0;j<m;j++){a[j].addToLayoutChanges("parentPaddingBottom")}}}if(b){this._recomputeInnerWidth()}if(l){this._recomputeInnerHeight()}if(this._initialLayoutDone){if(n){n.updateChildrenOnJobQueueFlush(k)}}}catch(o){throw new Error("Flushing job queue (childrensignals#5) failed "+o)}delete this._jobQueue},_isWidthEssential:qx.lang.Function.returnTrue,_isHeightEssential:qx.lang.Function.returnTrue,_computeBoxWidthFallback:function(){return 0},_computeBoxHeightFallback:function(){return 0},_computeBoxWidth:function(){var a=this.getParent().getLayoutImpl();return Math.max(0,qx.lang.Number.limit(a.computeChildBoxWidth(this),this.getMinWidthValue(),this.getMaxWidthValue()))},_computeBoxHeight:function(){var a=this.getParent().getLayoutImpl();return Math.max(0,qx.lang.Number.limit(a.computeChildBoxHeight(this),this.getMinHeightValue(),this.getMaxHeightValue()))},_computeOuterWidth:function(){return Math.max(0,(this.getMarginLeft()+this.getBoxWidth()+this.getMarginRight()))},_computeOuterHeight:function(){return Math.max(0,(this.getMarginTop()+this.getBoxHeight()+this.getMarginBottom()))},_computeInnerWidth:function(){return Math.max(0,this.getBoxWidth()-this.getFrameWidth())},_computeInnerHeight:function(){return Math.max(0,this.getBoxHeight()-this.getFrameHeight())},getNeededWidth:function(){var a=this.getParent().getLayoutImpl();return Math.max(0,a.computeChildNeededWidth(this))},getNeededHeight:function(){var a=this.getParent().getLayoutImpl();return Math.max(0,a.computeChildNeededHeight(this))},_recomputeFlexX:function(){if(!this.getHasFlexX()){return false}if(this._computedWidthTypeFlex){this._computedWidthValue=null;this.addToLayoutChanges($[19])}return true},_recomputeFlexY:function(){if(!this.getHasFlexY()){return false}if(this._computedHeightTypeFlex){this._computedHeightValue=null;this.addToLayoutChanges($[36])}return true},_recomputePercentX:function(){if(!this.getHasPercentX()){return false}if(this._computedWidthTypePercent){this._computedWidthValue=null;this.addToLayoutChanges($[19])}if(this._computedMinWidthTypePercent){this._computedMinWidthValue=null;this.addToLayoutChanges($[98])}if(this._computedMaxWidthTypePercent){this._computedMaxWidthValue=null;this.addToLayoutChanges($[97])}if(this._computedLeftTypePercent){this._computedLeftValue=null;this.addToLayoutChanges("left")}if(this._computedRightTypePercent){this._computedRightValue=null;this.addToLayoutChanges($[23])}return true},_recomputePercentY:function(){if(!this.getHasPercentY()){return false}if(this._computedHeightTypePercent){this._computedHeightValue=null;this.addToLayoutChanges($[36])}if(this._computedMinHeightTypePercent){this._computedMinHeightValue=null;this.addToLayoutChanges($[108])}if(this._computedMaxHeightTypePercent){this._computedMaxHeightValue=null;this.addToLayoutChanges($[99])}if(this._computedTopTypePercent){this._computedTopValue=null;this.addToLayoutChanges("top")}if(this._computedBottomTypePercent){this._computedBottomValue=null;this.addToLayoutChanges($[48])}return true},_recomputeRangeX:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(){if(this._computedLeftTypeNull||this._computedRightTypeNull){return false}this.addToLayoutChanges($[19]);return true},"default":function(){return !(this._computedLeftTypeNull||this._computedRightTypeNull)}}),_recomputeRangeY:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(){if(this._computedTopTypeNull||this._computedBottomTypeNull){return false}this.addToLayoutChanges($[36]);return true},"default":function(){return !(this._computedTopTypeNull||this._computedBottomTypeNull)}}),_recomputeStretchingX:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(){if(this.getAllowStretchX()&&this._computedWidthTypeNull){this._computedWidthValue=null;this.addToLayoutChanges($[19]);return true}return false},"default":function(){if(this.getAllowStretchX()&&this._computedWidthTypeNull){return true}return false}}),_recomputeStretchingY:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(){if(this.getAllowStretchY()&&this._computedHeightTypeNull){this._computedHeightValue=null;this.addToLayoutChanges($[36]);return true}return false},"default":function(){if(this.getAllowStretchY()&&this._computedHeightTypeNull){return true}return false}}),_computeValuePixel:function(a){return Math.round(a)},_computeValuePixelLimit:function(a){return Math.max(0,this._computeValuePixel(a))},_computeValuePercentX:function(a){return Math.round(this.getParent().getInnerWidthForChild(this)*a*0.01)},_computeValuePercentXLimit:function(a){return Math.max(0,this._computeValuePercentX(a))},_computeValuePercentY:function(a){return Math.round(this.getParent().getInnerHeightForChild(this)*a*0.01)},_computeValuePercentYLimit:function(a){return Math.max(0,this._computeValuePercentY(a))},getWidthValue:function(){if(this._computedWidthValue!=null){return this._computedWidthValue}switch(this._computedWidthType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedWidthValue=this._computeValuePixelLimit(this._computedWidthParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedWidthValue=this._computeValuePercentXLimit(this._computedWidthParsed);case qx.ui.core.Widget.TYPE_AUTO:return this._computedWidthValue=this.getPreferredBoxWidth();case qx.ui.core.Widget.TYPE_FLEX:if(this.getParent().getLayoutImpl().computeChildrenFlexWidth===undefined){throw new Error("Widget "+this+": having horizontal flex size (width="+this.getWidth()+$[549]+this.getParent()+$[423])}this.getParent().getLayoutImpl().computeChildrenFlexWidth();return this._computedWidthValue=this._computedWidthFlexValue}return null},getMinWidthValue:function(){if(this._computedMinWidthValue!=null){return this._computedMinWidthValue}switch(this._computedMinWidthType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedWidthValue=this._computeValuePixelLimit(this._computedMinWidthParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedWidthValue=this._computeValuePercentXLimit(this._computedMinWidthParsed);case qx.ui.core.Widget.TYPE_AUTO:return this._computedMinWidthValue=this.getPreferredBoxWidth()}return null},getMaxWidthValue:function(){if(this._computedMaxWidthValue!=null){return this._computedMaxWidthValue}switch(this._computedMaxWidthType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedWidthValue=this._computeValuePixelLimit(this._computedMaxWidthParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedWidthValue=this._computeValuePercentXLimit(this._computedMaxWidthParsed);case qx.ui.core.Widget.TYPE_AUTO:return this._computedMaxWidthValue=this.getPreferredBoxWidth()}return null},getLeftValue:function(){if(this._computedLeftValue!=null){return this._computedLeftValue}switch(this._computedLeftType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedLeftValue=this._computeValuePixel(this._computedLeftParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedLeftValue=this._computeValuePercentX(this._computedLeftParsed)}return null},getRightValue:function(){if(this._computedRightValue!=null){return this._computedRightValue}switch(this._computedRightType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedRightValue=this._computeValuePixel(this._computedRightParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedRightValue=this._computeValuePercentX(this._computedRightParsed)}return null},getHeightValue:function(){if(this._computedHeightValue!=null){return this._computedHeightValue}switch(this._computedHeightType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedHeightValue=this._computeValuePixelLimit(this._computedHeightParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedHeightValue=this._computeValuePercentYLimit(this._computedHeightParsed);case qx.ui.core.Widget.TYPE_AUTO:return this._computedHeightValue=this.getPreferredBoxHeight();case qx.ui.core.Widget.TYPE_FLEX:if(this.getParent().getLayoutImpl().computeChildrenFlexHeight===undefined){throw new Error("Widget "+this+": having vertical flex size (height="+this.getHeight()+$[549]+this.getParent()+$[423])}this.getParent().getLayoutImpl().computeChildrenFlexHeight();return this._computedHeightValue=this._computedHeightFlexValue}return null},getMinHeightValue:function(){if(this._computedMinHeightValue!=null){return this._computedMinHeightValue}switch(this._computedMinHeightType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedMinHeightValue=this._computeValuePixelLimit(this._computedMinHeightParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedMinHeightValue=this._computeValuePercentYLimit(this._computedMinHeightParsed);case qx.ui.core.Widget.TYPE_AUTO:return this._computedMinHeightValue=this.getPreferredBoxHeight()}return null},getMaxHeightValue:function(){if(this._computedMaxHeightValue!=null){return this._computedMaxHeightValue}switch(this._computedMaxHeightType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedMaxHeightValue=this._computeValuePixelLimit(this._computedMaxHeightParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedMaxHeightValue=this._computeValuePercentYLimit(this._computedMaxHeightParsed);case qx.ui.core.Widget.TYPE_AUTO:return this._computedMaxHeightValue=this.getPreferredBoxHeight()}return null},getTopValue:function(){if(this._computedTopValue!=null){return this._computedTopValue}switch(this._computedTopType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedTopValue=this._computeValuePixel(this._computedTopParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedTopValue=this._computeValuePercentY(this._computedTopParsed)}return null},getBottomValue:function(){if(this._computedBottomValue!=null){return this._computedBottomValue}switch(this._computedBottomType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedBottomValue=this._computeValuePixel(this._computedBottomParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedBottomValue=this._computeValuePercentY(this._computedBottomParsed)}return null},_computeFrameWidth:function(){var a=this._cachedBorderLeft+this.getPaddingLeft()+this.getPaddingRight()+this._cachedBorderRight;switch(this.getOverflow()){case $[26]:case $[93]:a+=qx.ui.core.Widget.SCROLLBAR_SIZE;break;case"auto":break}return a},_computeFrameHeight:function(){var a=this._cachedBorderTop+this.getPaddingTop()+this.getPaddingBottom()+this._cachedBorderBottom;switch(this.getOverflow()){case $[26]:case $[94]:a+=qx.ui.core.Widget.SCROLLBAR_SIZE;break;case"auto":break}return a},_invalidateFrameDimensions:function(){this._invalidateFrameWidth();this._invalidateFrameHeight()},_invalidatePreferredInnerDimensions:function(){this._invalidatePreferredInnerWidth();this._invalidatePreferredInnerHeight()},_computePreferredBoxWidth:function(){try{return Math.max(0,this.getPreferredInnerWidth()+this.getFrameWidth())}catch(a){throw new Error("_computePreferredBoxWidth failed "+a)}},_computePreferredBoxHeight:function(){try{return Math.max(0,this.getPreferredInnerHeight()+this.getFrameHeight())}catch(a){throw new Error("_computePreferredBoxHeight failed "+a)}},_initialLayoutDone:false,addToLayoutChanges:function(a){if(this._isDisplayable){this.getParent()._addChildToChildrenQueue(this)}return this._layoutChanges[a]=true},addToQueue:function(a){this._initialLayoutDone?this.addToJobQueue(a):this.addToLayoutChanges(a)},addToQueueRuntime:function(a){return !this._initialLayoutDone||this.addToJobQueue(a)},_computeHasPercentX:function(){return(this._computedLeftTypePercent||this._computedWidthTypePercent||this._computedMinWidthTypePercent||this._computedMaxWidthTypePercent||this._computedRightTypePercent)},_computeHasPercentY:function(){return(this._computedTopTypePercent||this._computedHeightTypePercent||this._computedMinHeightTypePercent||this._computedMaxHeightTypePercent||this._computedBottomTypePercent)},_computeHasAutoX:function(){return(this._computedWidthTypeAuto||this._computedMinWidthTypeAuto||this._computedMaxWidthTypeAuto)},_computeHasAutoY:function(){return(this._computedHeightTypeAuto||this._computedMinHeightTypeAuto||this._computedMaxHeightTypeAuto)},_computeHasFlexX:function(){return this._computedWidthTypeFlex},_computeHasFlexY:function(){return this._computedHeightTypeFlex},_evalUnitsPixelPercentAutoFlex:function(a){switch(a){case"auto":return qx.ui.core.Widget.TYPE_AUTO;case Infinity:case -Infinity:return qx.ui.core.Widget.TYPE_NULL}switch(typeof a){case $[77]:return isNaN(a)?qx.ui.core.Widget.TYPE_NULL:qx.ui.core.Widget.TYPE_PIXEL;case $[13]:return a.indexOf("%")!=-1?qx.ui.core.Widget.TYPE_PERCENT:a.indexOf("*")!=-1?qx.ui.core.Widget.TYPE_FLEX:qx.ui.core.Widget.TYPE_NULL}return qx.ui.core.Widget.TYPE_NULL},_evalUnitsPixelPercentAuto:function(a){switch(a){case"auto":return qx.ui.core.Widget.TYPE_AUTO;case Infinity:case -Infinity:return qx.ui.core.Widget.TYPE_NULL}switch(typeof a){case $[77]:return isNaN(a)?qx.ui.core.Widget.TYPE_NULL:qx.ui.core.Widget.TYPE_PIXEL;case $[13]:return a.indexOf("%")!=-1?qx.ui.core.Widget.TYPE_PERCENT:qx.ui.core.Widget.TYPE_NULL}return qx.ui.core.Widget.TYPE_NULL},_evalUnitsPixelPercent:function(a){switch(a){case Infinity:case -Infinity:return qx.ui.core.Widget.TYPE_NULL}switch(typeof a){case $[77]:return isNaN(a)?qx.ui.core.Widget.TYPE_NULL:qx.ui.core.Widget.TYPE_PIXEL;case $[13]:return a.indexOf("%")!=-1?qx.ui.core.Widget.TYPE_PERCENT:qx.ui.core.Widget.TYPE_NULL}return qx.ui.core.Widget.TYPE_NULL},_unitDetectionPixelPercentAutoFlex:function(b,j){var a=qx.ui.core.Widget.layoutPropertyTypes[b];var n=a.dataType;var c=a.dataParsed;var m=a.dataValue;var l=a.typePixel;var k=a.typePercent;var i=a.typeAuto;var h=a.typeFlex;var g=a.typeNull;var e=this[k];var f=this[i];var d=this[h];switch(this[n]=this._evalUnitsPixelPercentAutoFlex(j)){case qx.ui.core.Widget.TYPE_PIXEL:this[l]=true;this[k]=this[i]=this[h]=this[g]=false;this[c]=this[m]=Math.round(j);break;case qx.ui.core.Widget.TYPE_PERCENT:this[k]=true;this[l]=this[i]=this[h]=this[g]=false;this[c]=parseFloat(j);this[m]=null;break;case qx.ui.core.Widget.TYPE_AUTO:this[i]=true;this[l]=this[k]=this[h]=this[g]=false;this[c]=this[m]=null;break;case qx.ui.core.Widget.TYPE_FLEX:this[h]=true;this[l]=this[k]=this[i]=this[g]=false;this[c]=parseFloat(j);this[m]=null;break;default:this[g]=true;this[l]=this[k]=this[i]=this[h]=false;this[c]=this[m]=null;break}if(e!=this[k]){switch(b){case $[98]:case $[97]:case $[19]:case"left":case $[23]:this._invalidateHasPercentX();break;case $[99]:case $[108]:case $[36]:case"top":case $[48]:this._invalidateHasPercentY();break}}if(f!=this[i]){switch(b){case $[98]:case $[97]:case $[19]:this._invalidateHasAutoX();break;case $[108]:case $[99]:case $[36]:this._invalidateHasAutoY();break}}if(d!=this[h]){switch(b){case $[19]:this._invalidateHasFlexX();break;case $[36]:this._invalidateHasFlexY();break}}},_unitDetectionPixelPercentAuto:function(b,h){var a=qx.ui.core.Widget.layoutPropertyTypes[b];var l=a.dataType;var c=a.dataParsed;var k=a.dataValue;var j=a.typePixel;var i=a.typePercent;var g=a.typeAuto;var f=a.typeNull;var d=this[i];var e=this[g];switch(this[l]=this._evalUnitsPixelPercentAuto(h)){case qx.ui.core.Widget.TYPE_PIXEL:this[j]=true;this[i]=this[g]=this[f]=false;this[c]=this[k]=Math.round(h);break;case qx.ui.core.Widget.TYPE_PERCENT:this[i]=true;this[j]=this[g]=this[f]=false;this[c]=parseFloat(h);this[k]=null;break;case qx.ui.core.Widget.TYPE_AUTO:this[g]=true;this[j]=this[i]=this[f]=false;this[c]=this[k]=null;break;default:this[f]=true;this[j]=this[i]=this[g]=false;this[c]=this[k]=null;break}if(d!=this[i]){switch(b){case $[98]:case $[97]:case $[19]:case"left":case $[23]:this._invalidateHasPercentX();break;case $[108]:case $[99]:case $[36]:case"top":case $[48]:this._invalidateHasPercentY();break}}if(e!=this[g]){switch(b){case $[98]:case $[97]:case $[19]:this._invalidateHasAutoX();break;case $[108]:case $[99]:case $[36]:this._invalidateHasAutoY();break}}},_unitDetectionPixelPercent:function(b,f){var a=qx.ui.core.Widget.layoutPropertyTypes[b];var j=a.dataType;var c=a.dataParsed;var i=a.dataValue;var h=a.typePixel;var g=a.typePercent;var e=a.typeNull;var d=this[g];switch(this[j]=this._evalUnitsPixelPercent(f)){case qx.ui.core.Widget.TYPE_PIXEL:this[h]=true;this[g]=this[e]=false;this[c]=this[i]=Math.round(f);break;case qx.ui.core.Widget.TYPE_PERCENT:this[g]=true;this[h]=this[e]=false;this[c]=parseFloat(f);this[i]=null;break;default:this[e]=true;this[h]=this[g]=false;this[c]=this[i]=null;break}if(d!=this[g]){switch(b){case $[98]:case $[97]:case $[19]:case"left":case $[23]:this._invalidateHasPercentX();break;case $[108]:case $[99]:case $[36]:case"top":case $[48]:this._invalidateHasPercentY();break}}},getTopLevelWidget:function(){return this._hasParent?this.getParent().getTopLevelWidget():null},moveSelfToBegin:function(){this.getParent().addAtBegin(this)},moveSelfToEnd:function(){this.getParent().addAtEnd(this)},getPreviousSibling:function(){var b=this.getParent();if(b==null){return null}var a=b.getChildren();return a[a.indexOf(this)-1]},getNextSibling:function(){var b=this.getParent();if(b==null){return null}var a=b.getChildren();return a[a.indexOf(this)+1]},getPreviousVisibleSibling:function(){if(!this._hasParent){return null}var a=this.getParent().getVisibleChildren();return a[a.indexOf(this)-1]},getNextVisibleSibling:function(){if(!this._hasParent){return null}var a=this.getParent().getVisibleChildren();return a[a.indexOf(this)+1]},getPreviousActiveSibling:function(a){var b=qx.ui.core.Widget.getActiveSiblingHelper(this,this.getParent(),-1,a,null);return b?b:this.getParent().getLastActiveChild()},getNextActiveSibling:function(a){var b=qx.ui.core.Widget.getActiveSiblingHelper(this,this.getParent(),1,a,null);return b?b:this.getParent().getFirstActiveChild()},isFirstChild:function(){return this._hasParent&&this.getParent().getFirstChild()==this},isLastChild:function(){return this._hasParent&&this.getParent().getLastChild()==this},isFirstVisibleChild:function(){return this._hasParent&&this.getParent().getFirstVisibleChild()==this},isLastVisibleChild:function(){return this._hasParent&&this.getParent().getLastVisibleChild()==this},hasState:function(a){return this.__states&&this.__states[a]?true:false},addState:function(a){if(!this.__states){this.__states={}}if(!this.__states[a]){this.__states[a]=true;if(this._hasParent){qx.ui.core.Widget.addToGlobalStateQueue(this)}}},removeState:function(a){if(this.__states&&this.__states[a]){delete this.__states[a];if(this._hasParent){qx.ui.core.Widget.addToGlobalStateQueue(this)}}},_styleFromMap:function(c){var b=qx.core.Property.$$method.style;var d=qx.core.Property.$$method.unstyle;var a;if(qx.core.Variant.isSet($[7],"on")){for(var e in c){if(!this[b[e]]){throw new Error(this.classname+$[456]+e+'"')}}}for(var e in c){a=c[e];a===$[8]?this[d[e]]():this[b[e]](a)}},_unstyleFromArray:function(c){var d=qx.core.Property.$$method.unstyle;if(qx.core.Variant.isSet($[7],"on")){for(var b=0,a=c.length;b<a;b++){if(!this[d[c[b]]]){throw new Error(this.classname+$[456]+c[b]+'"')}}}for(var b=0,a=c.length;b<a;b++){this[d[c[b]]]()}},_renderAppearance:function(){if(!this.__states){this.__states={}}this._applyStateStyleFocus(this.__states);var b=this.getAppearance();if(b){var a=qx.theme.manager.Appearance.getInstance().styleFrom(b,this.__states);if(a){this._styleFromMap(a)}}},_resetAppearanceThemeWrapper:function(a,e){var f=this.getAppearance();if(f){var c=qx.theme.manager.Appearance.getInstance();var d=c.styleFromTheme(e,f,this.__states);var b=c.styleFromTheme(a,f,this.__states);var g=[];for(var h in d){if(b[h]===undefined){g.push(h)}}this._unstyleFromArray(g);this._styleFromMap(b)}},_applyStateStyleFocus:qx.core.Variant.select($[0],{mshtml:function(a){},"default":function(a){if(a.focused){if(!qx.event.handler.FocusHandler.mouseFocus&&!this.getHideFocus()){this.setStyleProperty($[120],$[369])}}else{this.setStyleProperty($[120],"none")}}}),addToStateQueue:function(){qx.ui.core.Widget.addToGlobalStateQueue(this)},recursiveAddToStateQueue:function(){this.addToStateQueue()},_applyAppearance:function(e,a){if(!this.__states){this.__states={}}var c=qx.theme.manager.Appearance.getInstance();if(e){var b=c.styleFrom(e,this.__states)||{}}if(a){var d=c.styleFrom(a,this.__states)||{};var f=[];for(var g in d){if(!b||!(g in b)){f.push(g)}}}if(f){this._unstyleFromArray(f)}if(b){this._styleFromMap(b)}},_recursiveAppearanceThemeUpdate:function(a,c){try{this._resetAppearanceThemeWrapper(a,c)}catch(b){throw new Error("Failed to update appearance theme "+b)}},_applyElementData:function(a){},setHtmlProperty:function(b,a){if(!this._htmlProperties){this._htmlProperties={}}this._htmlProperties[b]=a;if(this._isCreated&&this.getElement()[b]!=a){this.getElement()[b]=a}return true},removeHtmlProperty:qx.core.Variant.select($[0],{mshtml:function(a){if(!this._htmlProperties){return}delete this._htmlProperties[a];if(this._isCreated){this.getElement().removeAttribute(a)}return true},"default":function(a){if(!this._htmlProperties){return}delete this._htmlProperties[a];if(this._isCreated){this.getElement().removeAttribute(a);delete this.getElement()[a]}return true}}),getHtmlProperty:function(a){if(!this._htmlProperties){return""}return this._htmlProperties[a]||""},_applyHtmlProperties:function(a){var c=this._htmlProperties;if(c){var b;for(b in c){a[b]=c[b]}}},setHtmlAttribute:function(b,a){if(!this._htmlAttributes){this._htmlAttributes={}}this._htmlAttributes[b]=a;if(this._isCreated){this.getElement().setAttribute(b,a)}return true},removeHtmlAttribute:function(a){if(!this._htmlAttributes){return}delete this._htmlAttributes[a];if(this._isCreated){this.getElement().removeAttribute(a)}return true},getHtmlAttribute:function(a){if(!this._htmlAttributes){return""}return this._htmlAttributes[a]||""},_applyHtmlAttributes:function(b){var a=this._htmlAttributes;if(a){var c;for(c in a){b.setAttribute(c,a[c])}}},getStyleProperty:function(a){if(!this._styleProperties){return""}return this._styleProperties[a]||""},__outerElementStyleProperties:{cursor:true,zIndex:true,filter:true,display:true,visibility:true,outline:true},setStyleProperty:function(c,b){if(!this._styleProperties){this._styleProperties={}}this._styleProperties[c]=b;if(this._isCreated){var a=this.__outerElementStyleProperties[c]?this.getElement():this._getTargetNode();if(a){a.style[c]=(b==null)?"":b}}},removeStyleProperty:function(b){if(!this._styleProperties){return}delete this._styleProperties[b];if(this._isCreated){var a=this.__outerElementStyleProperties[b]?this.getElement():this._getTargetNode();if(a){a.style[b]=""}}},_applyStyleProperties:function(b){var e=this._styleProperties;if(!e){return}var d;var f=b;var a=this._getTargetNode();var b;var c;for(d in e){b=this.__outerElementStyleProperties[d]?f:a;c=e[d];b.style[d]=(c==null)?"":c}},_applyEnabled:function(b,a){if(b===false){this.addState("disabled");this.removeState("over");if(qx.Class.isDefined($[387])){this.removeState($[47]);this.removeState($[21])}}else{this.removeState("disabled")}},isFocusable:function(){return this.getEnabled()&&this.isSeeable()&&this.getTabIndex()!=null},isFocusRoot:function(){return false},getFocusRoot:function(){if(this._hasParent){return this.getParent().getFocusRoot()}return null},getActiveChild:function(){var a=this.getFocusRoot();if(a){return a.getActiveChild()}return null},_ontabfocus:qx.lang.Function.returnTrue,_applyFocused:function(c,b){if(!this.isCreated()){return}var a=this.getFocusRoot();if(a){if(c){a.setFocusedChild(this);this._visualizeFocus()}else{if(a.getFocusedChild()==this){a.setFocusedChild(null)}this._visualizeBlur()}}},_applyHideFocus:qx.core.Variant.select($[0],{mshtml:function(b,a){this.setHtmlProperty("hideFocus",b)},"default":qx.lang.Function.returnTrue}),_visualizeBlur:function(){if(this.getEnableElementFocus()&&(!this.getFocusRoot().getFocusedChild()||(this.getFocusRoot().getFocusedChild()&&this.getFocusRoot().getFocusedChild().getEnableElementFocus()))){try{this.getElement().blur()}catch(a){}}this.removeState($[123])},_visualizeFocus:function(){if(!qx.event.handler.FocusHandler.mouseFocus&&this.getEnableElementFocus()){try{this.getElement().focus()}catch(a){}}this.addState($[123])},focus:function(){delete qx.event.handler.FocusHandler.mouseFocus;this.setFocused(true)},blur:function(){delete qx.event.handler.FocusHandler.mouseFocus;this.setFocused(false)},_applyCapture:function(c,b){var a=org.eclipse.rwt.EventHandler;if(b){a.setCaptureWidget(null)}if(c){a.setCaptureWidget(this)}},_applyZIndex:function(b,a){if(b==null){this.removeStyleProperty("zIndex")}else{this.setStyleProperty("zIndex",b)}},_applyTabIndex:qx.core.Variant.select($[0],{mshtml:function(b,a){this.setHtmlProperty("tabIndex",b<0?-1:1)},"default":function(b,a){this.setStyleProperty("userFocus",(b<0?"ignore":$[109]));this.setHtmlProperty("tabIndex",b<0?-1:1)}}),_applySelectable:qx.core.Variant.select($[0],{mshtml:function(b,a){},gecko:function(b,a){if(b){this.removeStyleProperty($[511])}else{this.setStyleProperty($[511],"none")}},webkit:function(b,a){if(b){this.removeStyleProperty($[491]);this.removeStyleProperty($[553])}else{this.setStyleProperty($[491],"none");this.setStyleProperty($[553],"none")}},"default":function(b,a){if(b){return this.removeStyleProperty("userSelect")}else{this.setStyleProperty("userSelect","none")}}}),_applyOpacity:function(b,a){org.eclipse.rwt.HtmlUtil.setOpacity(this,b)},__cursorMap:qx.core.Variant.select($[0],{mshtml:{"default":$[39],wait:"wait",crosshair:$[341],help:"help",move:"move",text:"text",pointer:$[149],"e-resize":$[160],"n-resize":$[198],"w-resize":$[231],"s-resize":$[376],"ne-resize":$[218],"se-resize":$[348],"nw-resize":$[219],"sw-resize":$[362],"col-resize":$[386],"row-resize":$[328],progress:$[267],"not-allowed":$[366],"no-drop":"no-drop",cursor:"hand","ew-resize":$[160],"ns-resize":$[198],"nesw-resize":$[218],"nwse-resize":$[219]},opera:{"default":$[39],wait:"wait",crosshair:$[341],help:"help",move:"move",text:"text",pointer:$[149],"e-resize":$[160],"n-resize":$[198],"w-resize":$[231],"s-resize":$[376],"ne-resize":$[218],"se-resize":$[348],"nw-resize":$[219],"sw-resize":$[362],progress:$[267],"not-allowed":$[366],"no-drop":"no-drop","col-resize":$[160],"row-resize":$[198],"ew-resize":$[160],"ns-resize":$[198],"nesw-resize":$[218],"nwse-resize":$[219]},"default":{"default":$[39],wait:"wait",crosshair:$[341],help:"help",move:"move",text:"text",pointer:$[149],"e-resize":$[160],"n-resize":$[198],"w-resize":$[231],"s-resize":$[376],"ne-resize":$[218],"se-resize":$[348],"nw-resize":$[219],"sw-resize":$[362],"col-resize":$[386],"row-resize":$[328],progress:$[267],"not-allowed":$[366],"no-drop":"no-drop"}}),_applyCursor:function(c,a){if(c){var b="url( "+qx.io.Alias.getInstance().resolve(c)+" ), default";this.setStyleProperty($[34],this.__cursorMap[c]||b)}else{this.removeStyleProperty($[34])}},_applyCommand:function(b,a){},_applyBackgroundImage:function(c,a){var b=qx.io.image.Manager.getInstance();var d=qx.io.Alias.getInstance();if(a){b.hide(a)}if(c){b.show(c)}d.connect(this._styleBackgroundImage,this,c)},_styleBackgroundImage:function(a){a?this.setStyleProperty($[112],"url("+a+")"):this.removeStyleProperty($[112])},_applyBackgroundRepeat:function(b,a){b?this.setStyleProperty($[349],b):this.removeStyleProperty($[349])},_applyClip:function(b,a){return this._compileClipString()},_compileClipString:function(){var f=this.getClipLeft();var b=this.getClipTop();var e=this.getClipWidth();var a=this.getClipHeight();var d,c;if(f==null){d=(e==null?"auto":e+"px");f="auto"}else{d=(e==null?"auto":f+e+"px");f=f+"px"}if(b==null){c=(a==null?"auto":a+"px");b="auto"}else{c=(a==null?"auto":b+a+"px");b=b+"px"}return this.setStyleProperty("clip",("rect("+b+","+d+","+c+","+f+")"))},_applyOverflow:qx.core.Variant.select($[0],{"default":function(g,c){var f=g;var d=$[72];switch(g){case $[94]:d=$[103];f=$[26];break;case $[93]:d=$[104];f=$[26];break}var b=[$[72],$[103],$[104]];for(var e=0;e<b.length;e++){if(b[e]!=d){this.removeStyleProperty(b[e])}}switch(g){case $[94]:this.setStyleProperty($[104],$[17]);break;case $[93]:this.setStyleProperty($[103],$[17]);break}this._renderOverflow(d,f,g,c);this.addToQueue($[72])},gecko:function(d,a){var c=d;var b=$[72];switch(c){case $[17]:c=$[285];break;case $[94]:c=$[316];break;case $[93]:c=$[259];break}this._renderOverflow(b,c,d,a);this.addToQueue($[72])},opera:function(g,c){var f=g;var d=$[72];if(org.eclipse.rwt.Client.getVersion()<9.8){switch(f){case $[94]:case $[93]:f=$[26];break}}else{switch(f){case $[94]:d=$[103];f=$[26];break;case $[93]:d=$[104];f=$[26];break}var b=[$[72],$[103],$[104]];for(var e=0;e<b.length;e++){if(b[e]!=d){this.removeStyleProperty(b[e])}}switch(g){case $[94]:this.setStyleProperty($[104],$[17]);break;case $[93]:this.setStyleProperty($[103],$[17]);break}}this._renderOverflow(d,f,g,c);this.addToQueue($[72])}}),_renderOverflow:function(b,c,d,a){this.setStyleProperty(b,c||"");this._invalidateFrameWidth();this._invalidateFrameHeight()},getOverflowX:function(){var a=this.getOverflow();return a==$[93]?$[17]:a},getOverflowY:function(){var a=this.getOverflow();return a==$[94]?$[17]:a},_applyContainerOverflow:function(b,a){if(this._innerStyle){this._style.overflow=b?"":$[17]}},_applyBackgroundColor:function(b,a){this._styleBackgroundColor(b)},_applyBackgroundGradient:function(b,a){org.eclipse.rwt.HtmlUtil.setBackgroundGradient(this,b);if(b===null){this.setStyleProperty($[112],this.getStyleProperty($[112]));this.setStyleProperty($[78],this.getStyleProperty($[78]))}},_applyShadow:function(b,a){org.eclipse.rwt.HtmlUtil.setBoxShadow(this,b)},_styleBackgroundColor:function(a){a?this.setStyleProperty($[78],a):this.removeStyleProperty($[78])},_applyTextColor:function(b,a){},_applyFont:function(b,a){},_cachedBorderTop:0,_cachedBorderRight:0,_cachedBorderBottom:0,_cachedBorderLeft:0,_usesComplexBorder:false,_targetNodeEnabled:false,_applyBorder:function(b,a){this._queueBorder(b)},_queueBorder:function(a){this.addToQueue($[4]);this.__reflowBorderX(a);this.__reflowBorderY(a);this.__borderObject=a},__reflowBorderX:function(b){var a=this._cachedBorderLeft;var c=this._cachedBorderRight;this._cachedBorderLeft=b?b.getWidthLeft():0;this._cachedBorderRight=b?b.getWidthRight():0;if((a+c)!=(this._cachedBorderLeft+this._cachedBorderRight)){this._invalidateFrameWidth()}},__reflowBorderY:function(c){var a=this._cachedBorderTop;var b=this._cachedBorderBottom;this._cachedBorderTop=c?c.getWidthTop():0;this._cachedBorderBottom=c?c.getWidthBottom():0;if((a+b)!=(this._cachedBorderTop+this._cachedBorderBottom)){this._invalidateFrameHeight()}},renderBorder:function(a){var b=this.__borderObject;if(b){b.render(this)}else{org.eclipse.rwt.Border.reset(this)}this._usesComplexBorder=this._computeUsesComplexBorder()},_computeUsesComplexBorder:function(){return this.__borderObject&&this.__borderObject.getStyle()===$[242]},prepareEnhancedBorder:function(){if(!this._innerStyle){this._targetNode=document.createElement("div");this._innerStyle=this._targetNode.style;this._targetNodeEnabled=true;if(qx.core.Variant.isSet($[0],$[18])){this.addToQueue($[19]);this.addToQueue($[36])}else{this._innerStyle.width="100%";this._innerStyle.height="100%"}this._innerStyle.position=$[27];for(var a in this._styleProperties){switch(a){case"zIndex":case $[134]:case $[42]:case $[320]:case $[180]:case $[34]:break;default:this._innerStyle[a]=this._styleProperties[a];this._style[a]=""}}this._style.outline="none";this._applyContainerOverflow(this.getContainerOverflow());for(var a in this._htmlProperties){switch(a){case $[408]:this._targetNode.unselectable=this._htmlProperties[a]}}while(this._element.firstChild){this._targetNode.appendChild(this._element.firstChild)}this._element.appendChild(this._targetNode);if(this.isInDom()){this._afterRemoveDom();this._afterInsertDom()}}},_applyPaddingTop:function(b,a){this.addToQueue($[209]);this._invalidateFrameHeight()},_applyPaddingRight:function(b,a){this.addToQueue($[220]);this._invalidateFrameWidth()},_applyPaddingBottom:function(b,a){this.addToQueue($[234]);this._invalidateFrameHeight()},_applyPaddingLeft:function(b,a){this.addToQueue($[239]);this._invalidateFrameWidth()},renderPadding:function(a){},_applyMarginLeft:function(b,a){this.addToQueue($[208])},_applyMarginRight:function(b,a){this.addToQueue($[263])},_applyMarginTop:function(b,a){this.addToQueue($[207])},_applyMarginBottom:function(b,a){this.addToQueue($[315])},execute:function(){var a=this.getCommand();if(a){a.execute(this)}this.createDispatchEvent($[137])},_visualPropertyCheck:function(){if(!this.isCreated()){throw new Error(this.classname+": Element must be created previously!")}},setScrollLeft:function(a){this._visualPropertyCheck();this._getTargetNode().scrollLeft=a},setScrollTop:function(a){this._visualPropertyCheck();this._getTargetNode().scrollTop=a},getOffsetLeft:function(){this._visualPropertyCheck();return qx.html.Offset.getLeft(this.getElement())},getOffsetTop:function(){this._visualPropertyCheck();return qx.html.Offset.getTop(this.getElement())},getScrollLeft:function(){this._visualPropertyCheck();return this._getTargetNode().scrollLeft},getScrollTop:function(){this._visualPropertyCheck();return this._getTargetNode().scrollTop},getClientWidth:function(){this._visualPropertyCheck();return this._getTargetNode().clientWidth},getClientHeight:function(){this._visualPropertyCheck();return this._getTargetNode().clientHeight},getOffsetWidth:function(){this._visualPropertyCheck();return this.getElement().offsetWidth},getOffsetHeight:function(){this._visualPropertyCheck();return this.getElement().offsetHeight},getScrollWidth:function(){this._visualPropertyCheck();return this._getTargetNode().scrollWidth},getScrollHeight:function(){this._visualPropertyCheck();return this._getTargetNode().scrollHeight},scrollIntoView:function(a){this.scrollIntoViewX(a);this.scrollIntoViewY(a)},scrollIntoViewX:function(a){if(!this._isCreated||!this._isDisplayable){return false}return qx.html.ScrollIntoView.scrollX(this.getElement(),a)},scrollIntoViewY:function(a){if(!this._isCreated||!this._isDisplayable){return false}return qx.html.ScrollIntoView.scrollY(this.getElement(),a)},supportsDrop:function(a){var b=this.getSupportsDropMethod();if(b!==null){return b.call(this,a)}return(this!=a.sourceWidget)},getAdapter:function(b){if(this._adapters===undefined){this._adapters={}}var c=b.classname;var a=this._adapters[c];if(a==null){new b(this);a=this._adapters[c]}return a}},settings:{"qx.widgetQueueDebugging":false,"qx.widgetDebugId":false},defer:function(b,a){b.__initApplyMethods(a);if(qx.core.Variant.isSet($[0],$[18])){a._renderRuntimeWidth=function(d){this._style.pixelWidth=(d==null)?0:d;if(this._targetNodeEnabled){var c=this._usesComplexBorder&&d!=null?d-2:d;this._innerStyle.pixelWidth=c==null?0:c}};a._renderRuntimeHeight=function(d){this._style.pixelHeight=(d==null)?0:d;if(this._targetNodeEnabled){var c=this._usesComplexBorder&&d!=null?d-2:d;this._innerStyle.pixelHeight=c==null?0:c}};a._resetRuntimeWidth=function(){this._style.width="";if(this._targetNodeEnabled){this._innerStyle.width=""}};a._resetRuntimeHeight=function(){this._style.height="";if(this._targetNodeEnabled){this._innerStyle.height=""}}}b.__initLayoutProperties(b)},destruct:function(){var a=this.getElement();if(a){a.qx_Widget=null}this._disposeObjectDeep("_adapters",1);this._disposeFields("_isCreated","_inlineEvents","_element","_style","_targetNode","_innerStyle","_oldParent","_styleProperties","_htmlProperties","_htmlAttributes","__states","_jobQueue","_layoutChanges","__borderObject")}});
-qx.Class.define("org.eclipse.rwt.WidgetRenderAdapter",{extend:qx.core.Target,construct:function(b){this._autoDispose=false;arguments.callee.base.call(this);this._widget=b;var a=this.classname;if(b._adapters[a]!=null){throw new Error("Never create WidgetRenderAdapter directly!")}b._adapters[a]=this},destruct:function(){this._widget=null},events:{visibility:$[70]},members:{addRenderListener:function(c,e,b){var a=this._renderFunctionNames[c];if(!this.hasEventListeners(c)){var d=this;this._widget[a]=function(h){var g=new qx.event.type.DataEvent(c,h);var f=d.dispatchEvent(g,true);if(f){this.constructor.prototype[a].call(this,h)}}}this.addEventListener(c,e,b)},removeRenderListener:function(c,d,b){this.removeEventListener(c,d,b);if(!this.hasEventListeners(c)){var a=this._renderFunctionNames[c];delete this._widget[a]}},forceRender:function(b,d){var a=this._renderFunctionNames[b];var c=this._widget.constructor.prototype;c[a].call(this._widget,d)},_renderFunctionNames:{visibility:$[570]}}});
-qx.Class.define("qx.html.Dimension",{statics:{getBoxWidth:function(a){return a.offsetWidth},getBoxHeight:function(a){return a.offsetHeight},getAreaWidth:qx.core.Variant.select($[0],{gecko:function(a){if(a.clientWidth!=0&&a.clientWidth!=(qx.html.Style.getBorderLeft(a)+qx.html.Style.getBorderRight(a))){return a.clientWidth}else{return qx.html.Dimension.getBoxWidth(a)-qx.html.Dimension.getInsetLeft(a)-qx.html.Dimension.getInsetRight(a)}},"default":function(a){return a.clientWidth!=0?a.clientWidth:(qx.html.Dimension.getBoxWidth(a)-qx.html.Dimension.getInsetLeft(a)-qx.html.Dimension.getInsetRight(a))}}),getAreaHeight:qx.core.Variant.select($[0],{gecko:function(a){if(a.clientHeight!=0&&a.clientHeight!=(qx.html.Style.getBorderTop(a)+qx.html.Style.getBorderBottom(a))){return a.clientHeight}else{return qx.html.Dimension.getBoxHeight(a)-qx.html.Dimension.getInsetTop(a)-qx.html.Dimension.getInsetBottom(a)}},"default":function(a){return a.clientHeight!=0?a.clientHeight:(qx.html.Dimension.getBoxHeight(a)-qx.html.Dimension.getInsetTop(a)-qx.html.Dimension.getInsetBottom(a))}}),getInsetLeft:qx.core.Variant.select($[0],{mshtml:function(a){return a.clientLeft},"default":function(a){return qx.html.Style.getBorderLeft(a)}}),getInsetTop:qx.core.Variant.select($[0],{mshtml:function(a){return a.clientTop},"default":function(a){return qx.html.Style.getBorderTop(a)}}),getInsetRight:qx.core.Variant.select($[0],{mshtml:function(a){if(qx.html.Style.getStyleProperty(a,$[104])==$[17]||a.clientWidth==0){return qx.html.Style.getBorderRight(a)}return Math.max(0,a.offsetWidth-a.clientLeft-a.clientWidth)},"default":function(c){if(c.clientWidth==0){var b=qx.html.Style.getStyleProperty(c,$[72]);var a=b==$[26]||b==$[259]?16:0;return Math.max(0,qx.html.Style.getBorderRight(c)+a)}return Math.max(0,c.offsetWidth-c.clientWidth-qx.html.Style.getBorderLeft(c))}}),getInsetBottom:qx.core.Variant.select($[0],{mshtml:function(a){if(qx.html.Style.getStyleProperty(a,$[103])==$[17]||a.clientHeight==0){return qx.html.Style.getBorderBottom(a)}return Math.max(0,a.offsetHeight-a.clientTop-a.clientHeight)},"default":function(c){if(c.clientHeight==0){var b=qx.html.Style.getStyleProperty(c,$[72]);var a=b==$[26]||b==$[316]?16:0;return Math.max(0,qx.html.Style.getBorderBottom(c)+a)}return Math.max(0,c.offsetHeight-c.clientHeight-qx.html.Style.getBorderTop(c))}}),getScrollBarSizeRight:function(a){return qx.html.Dimension.getInsetRight(a)-qx.html.Style.getBorderRight(a)},getScrollBarSizeBottom:function(a){return qx.html.Dimension.getInsetBottom(a)-qx.html.Style.getBorderBottom(a)}}});
-qx.Class.define("qx.html.Style",{statics:{getStylePropertySure:qx.lang.Object.select((document.defaultView&&document.defaultView.getComputedStyle)?$[431]:"noComputed",{hasComputed:function(a,b){return !a?null:a.ownerDocument?a.ownerDocument.defaultView.getComputedStyle(a,"")[b]:a.style[b]},noComputed:qx.core.Variant.select($[0],{mshtml:function(b,d){try{if(!b){return null}if(b.parentNode&&b.currentStyle){return b.currentStyle[d]}else{var c=b.runtimeStyle[d];if(c!=null&&typeof c!=$[8]&&c!=""){return c}return b.style[d]}}catch(a){throw new Error($[307]+b+"["+d+"]: "+a)}},"default":function(a,b){return !a?null:a.style[b]}})}),getStyleProperty:qx.lang.Object.select((document.defaultView&&document.defaultView.getComputedStyle)?$[431]:"noComputed",{hasComputed:function(b,c){try{return b.ownerDocument.defaultView.getComputedStyle(b,"")[c]}catch(a){throw new Error($[307]+b+"["+c+"]: "+a)}},noComputed:qx.core.Variant.select($[0],{mshtml:function(b,c){try{return b.currentStyle[c]}catch(a){throw new Error($[307]+b+"["+c+"]: "+a)}},"default":function(b,c){try{return b.style[c]}catch(a){throw new Error($[307]+b+"["+c+"]")}}})}),getStyleSize:function(a,b){return parseInt(qx.html.Style.getStyleProperty(a,b))||0},getMarginLeft:function(a){return qx.html.Style.getStyleSize(a,$[208])},getMarginTop:function(a){return qx.html.Style.getStyleSize(a,$[207])},getMarginRight:function(a){return qx.html.Style.getStyleSize(a,$[263])},getMarginBottom:function(a){return qx.html.Style.getStyleSize(a,$[315])},getPaddingLeft:function(a){return qx.html.Style.getStyleSize(a,$[239])},getPaddingTop:function(a){return qx.html.Style.getStyleSize(a,$[209])},getPaddingRight:function(a){return qx.html.Style.getStyleSize(a,$[220])},getPaddingBottom:function(a){return qx.html.Style.getStyleSize(a,$[234])},getBorderLeft:function(a){return qx.html.Style.getStyleProperty(a,$[460])=="none"?0:qx.html.Style.getStyleSize(a,$[87])},getBorderTop:function(a){return qx.html.Style.getStyleProperty(a,$[571])=="none"?0:qx.html.Style.getStyleSize(a,$[90])},getBorderRight:function(a){return qx.html.Style.getStyleProperty(a,$[547])=="none"?0:qx.html.Style.getStyleSize(a,$[299])},getBorderBottom:function(a){return qx.html.Style.getStyleProperty(a,$[434])=="none"?0:qx.html.Style.getStyleSize(a,$[297])}}});
+qx.Class.define("org.eclipse.rwt.HtmlUtil",{statics:{BROWSER_PREFIX:qx.core.Variant.select($[0],{gecko:"-moz-",webkit:"-webkit-","default":""}),setBackgroundImage:(function(){var a;if(org.eclipse.rwt.Client.isMshtml()&&org.eclipse.rwt.Client.getVersion()<7){a=function(d,c,b){if(b!=null&&b<1){this.removeCssFilter(d);this._setCssBackgroundImage(d,c);this.setOpacity(d,b)}else{this._setCssBackgroundImage(d,null);this._setCssFilterImage(d,c)}}}else{a=function(d,c,b){this._setCssBackgroundImage(d,c);if(b!=null){this.setOpacity(d,b)}}}return a})(),setOpacity:qx.core.Variant.select($[0],{mshtml:function(c,b){if(b==null||b>=1||b<0){this.removeCssFilter(c)}else{var a=$[571]+Math.round(b*100)+")";this.setStyleProperty(c,$[128],a)}},"default":function(c,b){if(b==null||b>=1){if(qx.core.Variant.isSet($[0],$[40])){this.removeStyleProperty(c,$[387])}this.removeStyleProperty(c,$[43])}else{var a=qx.lang.Number.limit(b,0,1);if(qx.core.Variant.isSet($[0],$[40])){this.setStyleProperty(c,$[387],a)}this.setStyleProperty(c,$[43],a)}}}),setBackgroundGradient:qx.core.Variant.select($[0],{webkit:function(g,f){if(f){var d=["linear","left top"];if(f.horizontal===true){d.push("right top")}else{d.push("left bottom")}for(var e=0;e<f.length;e++){var a=f[e][0];var b=f[e][1];d.push("color-stop("+a+","+b+")")}var c=this.BROWSER_PREFIX+"gradient( "+d.join()+")";this.setStyleProperty(g,$[189],c)}else{this.removeStyleProperty(g,$[189])}},"default":function(g,f){if(f){var d=[f.horizontal===true?"0deg":"-90deg"];for(var e=0;e<f.length;e++){var a=(f[e][0]*100)+"%";var b=f[e][1];d.push(b+" "+a)}var c=this.BROWSER_PREFIX+"linear-gradient( "+d.join()+")";this.setStyleProperty(g,$[189],c)}else{this.removeStyleProperty(g,$[189])}}}),setBoxShadow:function(e,c){var d;if(org.eclipse.rwt.Client.isWebkit()){d=this.BROWSER_PREFIX+$[158]}else{d="boxShadow"}if(c){var a=c.slice(1,4).join("px ")+"px";var b=qx.util.ColorUtil.stringToRgb(c[5]);b.push(c[6]);a+=" rgba("+b.join()+")";this.setStyleProperty(e,d,a)}else{this.removeStyleProperty(e,d)}},setPointerEvents:function(e,d){var a=org.eclipse.rwt.Client.getVersion();var b=org.eclipse.rwt.Client.getEngine()===$[40]&&a>=1.9;var c=org.eclipse.rwt.Client.getBrowser()==="safari"&&a>=530;if(b||c){this.setStyleProperty(e,$[567],d);e.setAttribute($[567],d)}else{this._passEventsThrough(e,d)}},setStyleProperty:function(c,b,a){if(c instanceof qx.ui.core.Widget){c.setStyleProperty(b,a)}else{c.style[b]=a}},removeStyleProperty:function(b,a){if(b instanceof qx.ui.core.Widget){b.removeStyleProperty(a)}else{b.style[a]=""}},removeCssFilter:function(c){var a=null;if(c instanceof qx.ui.core.Widget){if(c.isCreated()){a=c.getElement()}else{c.removeStyleProperty($[128])}}else{a=c}if(a!==null){var b=a.style.cssText;b=b.replace(/FILTER:[^;]*(;|$)/,"");a.style.cssText=b}},_setCssBackgroundImage:function(c,b){var a=b?"URL("+b+")":"none";this.setStyleProperty(c,$[114],a);this.setStyleProperty(c,$[343],$[378]);this.setStyleProperty(c,$[350],$[37])},_setCssFilterImage:function(c,b){if(b){var a=$[575]+b+$[534];this.setStyleProperty(c,$[128],a)}else{this.removeCssFilter(c)}},_passEventsThrough:function(f,e){var a=qx.html.EventRegistration;var c=org.eclipse.rwt.EventHandler._mouseEventTypes;var d=this._passEventThroughHandler;if(e==="none"){this.setStyleProperty(f,$[34],$[38]);for(var b=0;b<c.length;b++){a.addEventListener(f,c[b],d)}}else{}},_passEventThroughHandler:function(){var a=org.eclipse.rwt.EventHandlerUtil;var c=a.getDomEvent(arguments);var d=a.getDomTarget(c);var b=c.type;d.style.display="none";var e=document.elementFromPoint(c.clientX,c.clientY);c.cancelBubble=true;a.stopDomEvent(c);if(e&&b!==$[45]&&b!==$[9]&&b!==$[14]){if(b===$[2]){org.eclipse.rwt.HtmlUtil._refireEvent(e,$[9],c)}org.eclipse.rwt.HtmlUtil._refireEvent(e,b,c);if(b===$[15]){org.eclipse.rwt.HtmlUtil._refireEvent(e,$[14],c)}}d.style.display=""},_refireEvent:qx.core.Variant.select($[0],{mshtml:function(d,b,a){var c=document.createEventObject(a);d.fireEvent("on"+b,c)},"default":function(d,b,a){var c=document.createEvent("MouseEvents");c.initMouseEvent(b,true,true,a.view,a.detail,a.screenX,a.screenY,a.clientX,a.clientY,a.ctrlKey,a.altKey,a.shiftKey,a.metaKey,a.button,a.relatedTarget);d.dispatchEvent(c)}})}});
+qx.Class.define($[152],{extend:qx.core.Target,include:qx.util.manager.MConnectedObject,type:$[97],construct:function(){arguments.callee.base.call(this);this._layoutChanges={};this.initHideFocus();this._usesComplexBorder=false},events:{beforeAppear:$[11],appear:$[11],beforeDisappear:$[11],disappear:$[11],insertDom:$[11],create:$[11],execute:$[11],flush:$[68],mouseover:$[95],mousemove:$[95],mouseout:$[95],mousedown:$[95],mouseup:$[95],mousewheel:$[95],click:$[95],dblclick:$[95],contextmenu:$[95],elementOver:$[95],elementOut:$[95],keydown:$[286],keypress:$[286],keyup:$[286],focusout:$[234],focusin:$[234],blur:$[234],focus:$[234],dragdrop:$[165],dragout:$[165],dragover:$[165],dragmove:$[165],dragstart:$[165],dragend:$[165]},statics:{_globalWidgetQueue:[],_globalElementQueue:[],_globalStateQueue:[],_globalJobQueue:[],_globalLayoutQueue:[],_fastGlobalDisplayQueue:[],_lazyGlobalDisplayQueues:{},_globalDisposeQueue:[],_autoFlushTimeout:null,_flushGlobalQueuesPhase:0,_FLUSH_PHASE_IDLE:0,_FLUSH_PHASE_WIDGET:1,_FLUSH_PHASE_STATE:2,_FLUSH_PHASE_ELEMENT:3,_FLUSH_PHASE_JOB:4,_FLUSH_PHASE_LAYOUT:5,_FLUSH_PHASE_DISPLAY:6,_FLUSH_PHASE_DISPOSE:7,_initAutoFlush:function(a){if(qx.ui.core.Widget._autoFlushTimeout==null){if(!qx.ui.core.Widget._inFlushGlobalQueues||a<qx.ui.core.Widget._flushGlobalQueuesPhase){qx.ui.core.Widget._autoFlushTimeout=window.setTimeout(qx.ui.core.Widget._autoFlushHelper,0)}}},_removeAutoFlush:function(){if(qx.ui.core.Widget._autoFlushTimeout!=null){window.clearTimeout(qx.ui.core.Widget._autoFlushTimeout);qx.ui.core.Widget._autoFlushTimeout=null}},_autoFlushHelper:function(){qx.ui.core.Widget._autoFlushTimeout=null;if(!qx.core.Object.inGlobalDispose()){qx.ui.core.Widget.flushGlobalQueues()}},flushGlobalQueues:function(){if(qx.ui.core.Widget._autoFlushTimeout!=null){qx.ui.core.Widget._removeAutoFlush()}if(qx.ui.core.Widget._inFlushGlobalQueues){return}var a=qx.core.Init.getInstance().getApplication();if(a.getUiReady&&!a.getUiReady()){return}qx.ui.core.Widget._inFlushGlobalQueues=true;qx.ui.core.Widget.flushGlobalWidgetQueue();qx.ui.core.Widget.flushGlobalStateQueue();qx.ui.core.Widget.flushGlobalElementQueue();qx.ui.core.Widget.flushGlobalJobQueue();qx.ui.core.Widget.flushGlobalLayoutQueue();qx.ui.core.Widget.flushGlobalDisplayQueue();qx.ui.core.Widget.flushGlobalDisposeQueue();qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_IDLE;delete qx.ui.core.Widget._inFlushGlobalQueues},addToGlobalWidgetQueue:function(a){if(!a._isInGlobalWidgetQueue&&a._isDisplayable){if(qx.ui.core.Widget._autoFlushTimeout==null){qx.ui.core.Widget._initAutoFlush(qx.ui.core.Widget._FLUSH_PHASE_WIDGET)}qx.ui.core.Widget._globalWidgetQueue.push(a);a._isInGlobalWidgetQueue=true}},removeFromGlobalWidgetQueue:function(a){if(a._isInGlobalWidgetQueue){qx.lang.Array.remove(qx.ui.core.Widget._globalWidgetQueue,a);delete a._isInGlobalWidgetQueue}},flushGlobalWidgetQueue:function(){qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_WIDGET;var a=qx.ui.core.Widget._globalWidgetQueue,c,d;while((c=a.length)>0){for(var b=0;b<c;b++){d=a[b];d.flushWidgetQueue();delete d._isInGlobalWidgetQueue}a.splice(0,c)}qx.ui.core.Widget._globalWidgetQueue=[]},addToGlobalElementQueue:function(a){if(!a._isInGlobalElementQueue&&a._isDisplayable){if(qx.ui.core.Widget._autoFlushTimeout==null){qx.ui.core.Widget._initAutoFlush(qx.ui.core.Widget._FLUSH_PHASE_ELEMENT)}qx.ui.core.Widget._globalElementQueue.push(a);a._isInGlobalElementQueue=true}},removeFromGlobalElementQueue:function(a){if(a._isInGlobalElementQueue){qx.lang.Array.remove(qx.ui.core.Widget._globalElementQueue,a);delete a._isInGlobalElementQueue}},flushGlobalElementQueue:function(){qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_ELEMENT;var a=qx.ui.core.Widget._globalElementQueue,c,d;while((c=a.length)>0){for(var b=0;b<c;b++){d=a[b];d._createElementImpl();delete d._isInGlobalElementQueue}a.splice(0,c)}qx.ui.core.Widget._globalElementQueue=[]},addToGlobalStateQueue:function(a){if(!a._isInGlobalStateQueue&&a._isDisplayable){if(qx.ui.core.Widget._autoFlushTimeout==null){qx.ui.core.Widget._initAutoFlush(qx.ui.core.Widget._FLUSH_PHASE_STATE)}qx.ui.core.Widget._globalStateQueue.push(a);a._isInGlobalStateQueue=true}},removeFromGlobalStateQueue:function(a){if(a._isInGlobalStateQueue){qx.lang.Array.remove(qx.ui.core.Widget._globalStateQueue,a);delete a._isInGlobalStateQueue}},flushGlobalStateQueue:function(){qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_STATE;var d=qx.ui.core.Widget;while(d._globalStateQueue.length>0){var a=qx.lang.Array.copy(d._globalStateQueue);d._globalStateQueue=[];for(var c=0,b=a.length;c<b;c++){var e=a[c];if(e._isInGlobalStateQueue){e._renderAppearance();delete e._isInGlobalStateQueue}}}},addToGlobalJobQueue:function(a){if(!a._isInGlobalJobQueue&&a._isDisplayable){if(qx.ui.core.Widget._autoFlushTimeout==null){qx.ui.core.Widget._initAutoFlush(qx.ui.core.Widget._FLUSH_PHASE_JOB)}qx.ui.core.Widget._globalJobQueue.push(a);a._isInGlobalJobQueue=true}},removeFromGlobalJobQueue:function(a){if(a._isInGlobalJobQueue){qx.lang.Array.remove(qx.ui.core.Widget._globalJobQueue,a);delete a._isInGlobalJobQueue}},flushGlobalJobQueue:function(){qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_JOB;var a=qx.ui.core.Widget._globalJobQueue,c,d;while((c=a.length)>0){for(var b=0;b<c;b++){d=a[b];d._flushJobQueue(d._jobQueue);delete d._isInGlobalJobQueue}a.splice(0,c)}qx.ui.core.Widget._globalJobQueue=[]},addToGlobalLayoutQueue:function(a){if(!a._isInGlobalLayoutQueue&&a._isDisplayable){if(qx.ui.core.Widget._autoFlushTimeout==null){qx.ui.core.Widget._initAutoFlush(qx.ui.core.Widget._FLUSH_PHASE_LAYOUT)}qx.ui.core.Widget._globalLayoutQueue.push(a);a._isInGlobalLayoutQueue=true}},removeFromGlobalLayoutQueue:function(a){if(a._isInGlobalLayoutQueue){qx.lang.Array.remove(qx.ui.core.Widget._globalLayoutQueue,a);delete a._isInGlobalLayoutQueue}},flushGlobalLayoutQueue:function(){qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_LAYOUT;var a=qx.ui.core.Widget._globalLayoutQueue,d,c;while((d=a.length)>0){for(var b=0;b<d;b++){c=a[b];c._flushChildrenQueue();delete c._isInGlobalLayoutQueue}a.splice(0,d)}qx.ui.core.Widget._globalLayoutQueue=[]},addToGlobalDisplayQueue:function(b){if(!b._isInGlobalDisplayQueue&&b._isDisplayable){if(qx.ui.core.Widget._autoFlushTimeout==null){qx.ui.core.Widget._initAutoFlush(qx.ui.core.Widget._FLUSH_PHASE_DISPLAY)}var a=b.getParent();if(a.isSeeable()){var c=a.toHashCode();if(qx.ui.core.Widget._lazyGlobalDisplayQueues[c]){qx.ui.core.Widget._lazyGlobalDisplayQueues[c].push(b)}else{qx.ui.core.Widget._lazyGlobalDisplayQueues[c]=[b]}}else{qx.ui.core.Widget._fastGlobalDisplayQueue.push(b)}b._isInGlobalDisplayQueue=true}},removeFromGlobalDisplayQueue:function(a){},flushGlobalDisplayQueue:function(){qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_DISPLAY;var e,h,d,g;var f=qx.ui.core.Widget._fastGlobalDisplayQueue;var c=qx.ui.core.Widget._lazyGlobalDisplayQueues;for(var b=0,a=f.length;b<a;b++){d=f[b];d.getParent()._getTargetNode().appendChild(d.getElement())}for(e in c){h=c[e];if(document.createDocumentFragment&&h.length>=3){g=document.createDocumentFragment();for(var b=0,a=h.length;b<a;b++){d=h[b];g.appendChild(d.getElement())}h[0].getParent()._getTargetNode().appendChild(g);for(var b=0,a=h.length;b<a;b++){d=h[b];d._afterInsertDom()}}else{for(var b=0,a=h.length;b<a;b++){d=h[b];d.getParent()._getTargetNode().appendChild(d.getElement());d._afterInsertDom()}}}for(e in c){h=c[e];for(var b=0,a=h.length;b<a;b++){d=h[b];if(d.getVisibility()){d._afterAppear()}delete d._isInGlobalDisplayQueue}delete c[e]}if(qx.lang.Object.isEmpty(c)){qx.ui.core.Widget._lazyGlobalDisplayQueues={}}for(var b=0,a=f.length;b<a;b++){delete f[b]._isInGlobalDisplayQueue}qx.ui.core.Widget._fastGlobalDisplayQueue=[]},addToGlobalDisposeQueue:function(a){if(!a._isInGlobalDisposeQueue&&!a.isDisposed()){if(qx.ui.core.Widget._autoFlushTimeout==null){qx.ui.core.Widget._initAutoFlush(qx.ui.core.Widget._FLUSH_PHASE_DISPOSE)}qx.ui.core.Widget._globalDisposeQueue.push(a);a._isInGlobalDisposeQueue=true}},removeFromGlobalDisposeQueue:function(a){if(a._isInGlobalDisposeQueue){qx.lang.Array.remove(qx.ui.core.Widget._globalDisposeQueue,a);delete a._isInGlobalDisposeQueue}},flushGlobalDisposeQueue:function(){qx.ui.core.Widget._flushGlobalQueuesPhase=qx.ui.core.Widget._FLUSH_PHASE_DISPOSE;var a=qx.ui.core.Widget._globalDisposeQueue,c,d;while((c=a.length)>0){for(var b=0;b<c;b++){d=a[b];d.dispose();delete d._isInGlobalDisposeQueue}a.splice(0,c)}qx.ui.core.Widget._globalDisposeQueue=[]},getActiveSiblingHelperIgnore:function(b,c){for(var a=0;a<b.length;a++){if(c instanceof b[a]){return true}}return false},getActiveSiblingHelper:function(c,d,b,a,h){if(!a){a=[]}var f=d.getChildren();var g=h==null?f.indexOf(c)+b:h==="first"?0:f.length-1;var e=f[g];while(e&&(!e.getEnabled()||qx.ui.core.Widget.getActiveSiblingHelperIgnore(a,e))){g+=b;e=f[g];if(!e){return null}}return e},TYPE_NULL:0,TYPE_PIXEL:1,TYPE_PERCENT:2,TYPE_AUTO:3,TYPE_FLEX:4,__initApplyMethods:function(d){var g="_renderRuntime";var k="_resetRuntime";var b="this._style.";var f="=((v==null)?0:v)+'px'";var m="v";var h=["left",$[24],"top",$[50],$[19],$[39],$[101],$[106],$[100],$[104]];var p=["Left",$[51],"Top","Bottom","Width","Height","MinWidth","MaxWidth","MinHeight","MaxHeight"];var n=g+"Margin";var j=k+"Margin";var l=b+$[96];for(var e=0;e<4;e++){d[n+p[e]]=new Function(m,l+p[e]+f);d[j+p[e]]=new Function(l+p[e]+"=''")}var o=g+"Padding";var a=k+"Padding";var c=b+$[36];for(var e=0;e<4;e++){d[o+p[e]]=new Function(m,"this.setStyleProperty('padding"+p[e]+"', ((v==null)?0:v)+'px')");d[a+p[e]]=new Function("this.removeStyleProperty('padding"+p[e]+"')")}for(var e=0;e<h.length;e++){d[g+p[e]]=new Function(m,b+h[e]+f);d[k+p[e]]=new Function(b+h[e]+"=''")}},layoutPropertyTypes:{},__initLayoutProperties:function(j){var e=[$[19],$[39],$[101],$[106],$[100],$[104],"left",$[24],"top",$[50]];for(var g=0,d=e.length,h,c,f;g<d;g++){h=e[g];c="_computed"+qx.lang.String.toFirstUp(h);f=c+"Type";j.layoutPropertyTypes[h]={dataType:f,dataParsed:c+"Parsed",dataValue:c+"Value",typePixel:f+"Pixel",typePercent:f+"Percent",typeAuto:f+"Auto",typeFlex:f+"Flex",typeNull:f+"Null"}}},disableScrolling:function(b){var a=b._getTargetNode();if(a){qx.html.Scroll.disableScrolling(a)}else{b.addEventListener($[31],this._blockScrollingOnAppear,this)}},enableScrolling:function(b){var a=b._getTargetNode();if(a){qx.html.Scroll.enableScrolling(a)}else{b.removeEventListener($[31],this._blockScrollingOnAppear,this)}},_blockScrollingOnAppear:function(a){var b=a.getTarget();b.removeEventListener($[31],this._blockScrollingOnAppear,this);this.disableScrolling(b)}},properties:{enabled:{init:$[125],check:$[3],inheritable:true,apply:$[396],event:$[131]},parent:{check:$[433],nullable:true,event:$[299],apply:"_applyParent"},element:{check:"Element",nullable:true,apply:"_applyElement",event:$[354]},visibility:{check:$[3],init:true,apply:$[491],event:$[198]},display:{check:$[3],init:true,apply:"_applyDisplay",event:"changeDisplay"},anonymous:{check:$[3],init:false,event:"changeAnonymous"},horizontalAlign:{check:["left",$[37],$[24]],themeable:true,nullable:true},verticalAlign:{check:["top",$[32],$[50]],themeable:true,nullable:true},allowStretchX:{check:$[3],init:true},allowStretchY:{check:$[3],init:true},zIndex:{check:$[73],apply:"_applyZIndex",event:$[565],themeable:true,nullable:true,init:null},backgroundColor:{nullable:true,init:null,check:"Color",apply:$[554],event:$[194],themeable:true},backgroundGradient:{check:"Array",nullable:true,init:null,apply:$[381],event:$[360],themeable:true},shadow:{check:"Array",nullable:true,init:null,apply:"_applyShadow",event:"changeShadow",themeable:true},textColor:{nullable:true,init:$[125],check:"Color",apply:"_applyTextColor",event:$[268],themeable:true,inheritable:true},border:{nullable:true,init:null,apply:"_applyBorder",event:"changeBorder",check:"Border",themeable:true},font:{nullable:true,init:$[125],apply:"_applyFont",check:"Font",event:$[83],themeable:true,inheritable:true},opacity:{check:$[73],apply:$[370],themeable:true,nullable:true,init:null},cursor:{check:$[25],apply:"_applyCursor",themeable:true,nullable:true,init:null},backgroundImage:{check:$[25],nullable:true,apply:"_applyBackgroundImage",themeable:true},backgroundRepeat:{check:$[25],nullable:true,apply:"_applyBackgroundRepeat",themeable:true},overflow:{check:[$[17],"auto",$[26],$[94],$[93]],nullable:true,apply:"_applyOverflow",event:"changeOverflow",themeable:true,init:null},containerOverflow:{check:$[3],nullable:false,apply:"_applyContainerOverflow",themeable:true,init:true},clipLeft:{check:$[22],apply:$[266],themeable:true,nullable:true},clipTop:{check:$[22],apply:$[266],themeable:true,nullable:true},clipWidth:{check:$[22],apply:$[266],themeable:true,nullable:true},clipHeight:{check:$[22],apply:$[266],themeable:true,nullable:true},tabIndex:{check:$[22],nullable:true,init:null,apply:"_applyTabIndex",event:"changeTabIndex"},hideFocus:{check:$[3],init:true,apply:"_applyHideFocus",themeable:true},enableElementFocus:{check:$[3],init:true},focused:{check:$[3],init:false,apply:"_applyFocused",event:$[398]},selectable:{check:$[3],init:null,nullable:true,apply:"_applySelectable"},toolTip:{check:$[260],nullable:true},contextMenu:{nullable:true},capture:{check:$[3],init:false,apply:"_applyCapture",event:"changeCapture"},dropDataTypes:{nullable:true,dispose:true},command:{check:"qx.client.Command",nullable:true,apply:"_applyCommand"},appearance:{check:$[25],init:"widget",apply:"_applyAppearance",event:"changeAppearance"},supportsDropMethod:{check:"Function",nullable:true,init:null},marginTop:{check:$[73],apply:"_applyMarginTop",nullable:true,themeable:true},marginRight:{check:$[73],apply:"_applyMarginRight",nullable:true,themeable:true},marginBottom:{check:$[73],apply:"_applyMarginBottom",nullable:true,themeable:true},marginLeft:{check:$[73],apply:"_applyMarginLeft",nullable:true,themeable:true},paddingTop:{check:$[73],apply:"_applyPaddingTop",nullable:true,themeable:true},paddingRight:{check:$[73],apply:"_applyPaddingRight",nullable:true,themeable:true},paddingBottom:{check:$[73],apply:"_applyPaddingBottom",nullable:true,themeable:true},paddingLeft:{check:$[73],apply:"_applyPaddingLeft",nullable:true,themeable:true},left:{apply:"_applyLeft",event:$[149],nullable:true,themeable:true,init:null},right:{apply:"_applyRight",event:"changeRight",nullable:true,themeable:true,init:null},width:{apply:"_applyWidth",event:$[56],nullable:true,themeable:true,init:null},minWidth:{apply:"_applyMinWidth",event:"changeMinWidth",nullable:true,themeable:true,init:null},maxWidth:{apply:"_applyMaxWidth",event:"changeMaxWidth",nullable:true,themeable:true,init:null},top:{apply:"_applyTop",event:$[309],nullable:true,themeable:true,init:null},bottom:{apply:"_applyBottom",event:"changeBottom",nullable:true,themeable:true,init:null},height:{apply:$[498],event:$[76],nullable:true,themeable:true,init:null},minHeight:{apply:"_applyMinHeight",event:"changeMinHeight",nullable:true,themeable:true,init:null},maxHeight:{apply:"_applyMaxHeight",event:"changeMaxHeight",nullable:true,themeable:true,init:null},location:{group:["left","top"],themeable:true},dimension:{group:[$[19],$[39]],themeable:true},space:{group:["left",$[19],"top",$[39]],themeable:true},edge:{group:["top",$[24],$[50],"left"],themeable:true,mode:$[247]},padding:{group:[$[199],$[256],$[236],$[221]],mode:$[247],themeable:true},margin:{group:[$[214],$[298],$[263],$[192]],mode:$[247],themeable:true},heights:{group:[$[100],$[39],$[104]],themeable:true},widths:{group:[$[101],$[19],$[106]],themeable:true},align:{group:["horizontalAlign","verticalAlign"],themeable:true},clipLocation:{group:["clipLeft","clipTop"]},clipDimension:{group:["clipWidth","clipHeight"]},clip:{group:["clipLeft","clipTop","clipWidth","clipHeight"]},innerWidth:{_cached:true,defaultValue:null},innerHeight:{_cached:true,defaultValue:null},boxWidth:{_cached:true,defaultValue:null},boxHeight:{_cached:true,defaultValue:null},outerWidth:{_cached:true,defaultValue:null},outerHeight:{_cached:true,defaultValue:null},frameWidth:{_cached:true,defaultValue:null,addToQueueRuntime:true},frameHeight:{_cached:true,defaultValue:null,addToQueueRuntime:true},preferredInnerWidth:{_cached:true,defaultValue:null,addToQueueRuntime:true},preferredInnerHeight:{_cached:true,defaultValue:null,addToQueueRuntime:true},preferredBoxWidth:{_cached:true,defaultValue:null},preferredBoxHeight:{_cached:true,defaultValue:null},hasPercentX:{_cached:true,defaultValue:false},hasPercentY:{_cached:true,defaultValue:false},hasAutoX:{_cached:true,defaultValue:false},hasAutoY:{_cached:true,defaultValue:false},hasFlexX:{_cached:true,defaultValue:false},hasFlexY:{_cached:true,defaultValue:false}},members:{_computedLeftValue:null,_computedLeftParsed:null,_computedLeftType:null,_computedLeftTypeNull:true,_computedLeftTypePixel:false,_computedLeftTypePercent:false,_computedLeftTypeAuto:false,_computedLeftTypeFlex:false,_computedRightValue:null,_computedRightParsed:null,_computedRightType:null,_computedRightTypeNull:true,_computedRightTypePixel:false,_computedRightTypePercent:false,_computedRightTypeAuto:false,_computedRightTypeFlex:false,_computedTopValue:null,_computedTopParsed:null,_computedTopType:null,_computedTopTypeNull:true,_computedTopTypePixel:false,_computedTopTypePercent:false,_computedTopTypeAuto:false,_computedTopTypeFlex:false,_computedBottomValue:null,_computedBottomParsed:null,_computedBottomType:null,_computedBottomTypeNull:true,_computedBottomTypePixel:false,_computedBottomTypePercent:false,_computedBottomTypeAuto:false,_computedBottomTypeFlex:false,_computedWidthValue:null,_computedWidthParsed:null,_computedWidthType:null,_computedWidthTypeNull:true,_computedWidthTypePixel:false,_computedWidthTypePercent:false,_computedWidthTypeAuto:false,_computedWidthTypeFlex:false,_computedMinWidthValue:null,_computedMinWidthParsed:null,_computedMinWidthType:null,_computedMinWidthTypeNull:true,_computedMinWidthTypePixel:false,_computedMinWidthTypePercent:false,_computedMinWidthTypeAuto:false,_computedMinWidthTypeFlex:false,_computedMaxWidthValue:null,_computedMaxWidthParsed:null,_computedMaxWidthType:null,_computedMaxWidthTypeNull:true,_computedMaxWidthTypePixel:false,_computedMaxWidthTypePercent:false,_computedMaxWidthTypeAuto:false,_computedMaxWidthTypeFlex:false,_computedHeightValue:null,_computedHeightParsed:null,_computedHeightType:null,_computedHeightTypeNull:true,_computedHeightTypePixel:false,_computedHeightTypePercent:false,_computedHeightTypeAuto:false,_computedHeightTypeFlex:false,_computedMinHeightValue:null,_computedMinHeightParsed:null,_computedMinHeightType:null,_computedMinHeightTypeNull:true,_computedMinHeightTypePixel:false,_computedMinHeightTypePercent:false,_computedMinHeightTypeAuto:false,_computedMinHeightTypeFlex:false,_computedMaxHeightValue:null,_computedMaxHeightParsed:null,_computedMaxHeightType:null,_computedMaxHeightTypeNull:true,_computedMaxHeightTypePixel:false,_computedMaxHeightTypePercent:false,_computedMaxHeightTypeAuto:false,_computedMaxHeightTypeFlex:false,_applyLeft:function(b,a){this._unitDetectionPixelPercent("left",b);this.addToQueue("left")},_applyRight:function(b,a){this._unitDetectionPixelPercent($[24],b);this.addToQueue($[24])},_applyTop:function(b,a){this._unitDetectionPixelPercent("top",b);this.addToQueue("top")},_applyBottom:function(b,a){this._unitDetectionPixelPercent($[50],b);this.addToQueue($[50])},_applyWidth:function(b,a){this._unitDetectionPixelPercentAutoFlex($[19],b);this.addToQueue($[19])},_applyMinWidth:function(b,a){this._unitDetectionPixelPercentAuto($[101],b);this.addToQueue($[101])},_applyMaxWidth:function(b,a){this._unitDetectionPixelPercentAuto($[106],b);this.addToQueue($[106])},_applyHeight:function(b,a){this._unitDetectionPixelPercentAutoFlex($[39],b);this.addToQueue($[39])},_applyMinHeight:function(b,a){this._unitDetectionPixelPercentAuto($[100],b);this.addToQueue($[100])},_applyMaxHeight:function(b,a){this._unitDetectionPixelPercentAuto($[104],b);this.addToQueue($[104])},getChildren:qx.lang.Function.returnNull,getChildrenLength:qx.lang.Function.returnZero,hasChildren:qx.lang.Function.returnFalse,isEmpty:qx.lang.Function.returnTrue,indexOf:qx.lang.Function.returnNegativeIndex,contains:qx.lang.Function.returnFalse,getVisibleChildren:qx.lang.Function.returnNull,getVisibleChildrenLength:qx.lang.Function.returnZero,hasVisibleChildren:qx.lang.Function.returnFalse,isVisibleEmpty:qx.lang.Function.returnTrue,_hasParent:false,_isDisplayable:false,isDisplayable:function(){return this._isDisplayable},_checkParent:function(b,a){if(this.contains(b)){throw new Error("Could not insert myself into a child "+b+"!")}return b},_applyParent:function(c,a){if(a){var b=a.getChildren().indexOf(this);this._computedWidthValue=null;this._computedMinWidthValue=null;this._computedMaxWidthValue=null;this._computedLeftValue=null;this._computedRightValue=null;this._computedHeightValue=null;this._computedMinHeightValue=null;this._computedMaxHeightValue=null;this._computedTopValue=null;this._computedBottomValue=null;this._cachedBoxWidth=null;this._cachedInnerWidth=null;this._cachedOuterWidth=null;this._cachedBoxHeight=null;this._cachedInnerHeight=null;this._cachedOuterHeight=null;qx.lang.Array.removeAt(a.getChildren(),b);a._invalidateVisibleChildren();a._removeChildFromChildrenQueue(this);a.getLayoutImpl().updateChildrenOnRemoveChild(this,b);a.addToJobQueue($[414]);a._invalidatePreferredInnerDimensions();this._oldParent=a}if(c){this._hasParent=true;if(typeof this._insertIndex==$[78]){qx.lang.Array.insertAt(c.getChildren(),this,this._insertIndex);delete this._insertIndex}else{c.getChildren().push(this)}}else{this._hasParent=false}qx.core.Property.refresh(this);return this._handleDisplayable("parent")},_applyDisplay:function(b,a){return this._handleDisplayable($[183])},_handleDisplayable:function(g){var f=this._computeDisplayable();if(this._isDisplayable==f&&!(f&&g=="parent")){return true}this._isDisplayable=f;var e=this.getParent();if(e){e._invalidateVisibleChildren();e._invalidatePreferredInnerDimensions()}if(g&&this._oldParent&&this._oldParent._initialLayoutDone){var d=this.getElement();if(d){if(this.getVisibility()){this._beforeDisappear()}try{this._oldParent._getTargetNode().removeChild(d)}catch(c){}this._afterRemoveDom();if(this.getVisibility()){this._afterDisappear()}}delete this._oldParent}if(f){if(e._initialLayoutDone){var b=e.getChildren().indexOf(this);e.getLayoutImpl().updateChildrenOnAddChild(this,b);e.addToJobQueue("addChild")}this.addToLayoutChanges("initial");this.addToCustomQueues(g);if(this.getVisibility()){this._beforeAppear()}if(!this._isCreated){qx.ui.core.Widget.addToGlobalElementQueue(this)}qx.ui.core.Widget.addToGlobalStateQueue(this);if(!qx.lang.Object.isEmpty(this._jobQueue)){qx.ui.core.Widget.addToGlobalJobQueue(this)}if(!qx.lang.Object.isEmpty(this._childrenQueue)){qx.ui.core.Widget.addToGlobalLayoutQueue(this)}}else{qx.ui.core.Widget.removeFromGlobalElementQueue(this);qx.ui.core.Widget.removeFromGlobalStateQueue(this);qx.ui.core.Widget.removeFromGlobalJobQueue(this);qx.ui.core.Widget.removeFromGlobalLayoutQueue(this);this.removeFromCustomQueues(g);if(e&&g){if(this.getVisibility()){this._beforeDisappear()}if(e._initialLayoutDone&&this._initialLayoutDone){var b=e.getChildren().indexOf(this);e.getLayoutImpl().updateChildrenOnRemoveChild(this,b);e.addToJobQueue($[414]);var a=this.getElement().parentNode;if(a){a.removeChild(this.getElement())}this._afterRemoveDom()}e._removeChildFromChildrenQueue(this);if(this.getVisibility()){this._afterDisappear()}}}this._handleDisplayableCustom(f,e,g);return true},addToCustomQueues:qx.lang.Function.returnTrue,removeFromCustomQueues:qx.lang.Function.returnTrue,_handleDisplayableCustom:qx.lang.Function.returnTrue,_computeDisplayable:function(){return this.getDisplay()&&this.getParent()&&this.getParent()._isDisplayable?true:false},_beforeAppear:function(){this.createDispatchEvent("beforeAppear")},_afterAppear:function(){this._isSeeable=true;this.createDispatchEvent($[31])},_beforeDisappear:function(){this.removeState("over");if(qx.Class.isDefined($[402])){this.removeState($[21]);this.removeState($[46])}this.createDispatchEvent("beforeDisappear")},_afterDisappear:function(){this._isSeeable=false;this.createDispatchEvent($[312])},_isSeeable:false,_isInDom:false,isSeeable:function(){return this._isSeeable},isInDom:function(){return this._isInDom},isAppearRelevant:function(){return this.getVisibility()&&this._isDisplayable},_afterInsertDom:function(){this._isInDom=true;this.createDispatchEvent($[228])},_afterRemoveDom:function(){this._isInDom=true},_applyVisibility:function(b,a){if(b){if(this._isDisplayable&&this._isCreated){this._beforeAppear()}this.removeStyleProperty($[183]);if(this._isDisplayable&&this._isCreated){this._afterAppear()}}else{if(this._isDisplayable&&this._isCreated){this._beforeDisappear()}this.setStyleProperty($[183],"none");if(this._isDisplayable&&this._isCreated){this._afterDisappear()}}},show:function(){this.setVisibility(true);this.setDisplay(true)},hide:function(){this.setVisibility(false)},destroy:function(){this.setParent(null);qx.ui.core.Widget.addToGlobalDisposeQueue(this)},_isCreated:false,_element:null,_targetNode:null,_style:null,_innerStyle:null,_getTargetNode:function(){return this._targetNode||this._element},addToDocument:function(){qx.ui.core.ClientDocument.getInstance().add(this)},isCreated:function(){return this._isCreated},_createElementImpl:function(){this.setElement(this.getTopLevelWidget().getDocumentElement().createElement("div"))},_applyElement:function(b,a){this._isCreated=b!=null;if(a){a.qx_Widget=null}if(b){b.qx_Widget=this;b.style.position=$[28];this._element=b;this._style=b.style;if(this._targetNodeEnabled){this.prepareEnhancedBorder()}this._applyStyleProperties(b);this._applyHtmlProperties(b);this._applyHtmlAttributes(b);this._applyElementData(b);this.createDispatchEvent($[107]);this.addToStateQueue()}else{this._element=this._style=null}},addToJobQueue:function(a){if(this._hasParent){qx.ui.core.Widget.addToGlobalJobQueue(this)}if(!this._jobQueue){this._jobQueue={}}this._jobQueue[a]=true;return true},_flushJobQueue:function(e){try{var k=this._jobQueue;var r=this.getParent();if(!r||qx.lang.Object.isEmpty(k)){return}var n=this instanceof qx.ui.core.Parent?this.getLayoutImpl():null;if(n){n.updateSelfOnJobQueueFlush(k)}}catch(o){throw new Error("Flushing job queue (prechecks#1) failed "+o)}try{var c=false;var g=k.marginLeft||k.marginRight;var h=k.marginTop||k.marginBottom;var b=k.frameWidth;var l=k.frameHeight;var f=(k.frameWidth||k.preferredInnerWidth)&&this._recomputePreferredBoxWidth();var p=(k.frameHeight||k.preferredInnerHeight)&&this._recomputePreferredBoxHeight();if(f){var d=this.getPreferredBoxWidth();if(this._computedWidthTypeAuto){this._computedWidthValue=d;k.width=true}if(this._computedMinWidthTypeAuto){this._computedMinWidthValue=d;k.minWidth=true}if(this._computedMaxWidthTypeAuto){this._computedMaxWidthValue=d;k.maxWidth=true}}if(p){var d=this.getPreferredBoxHeight();if(this._computedHeightTypeAuto){this._computedHeightValue=d;k.height=true}if(this._computedMinHeightTypeAuto){this._computedMinHeightValue=d;k.minHeight=true}if(this._computedMaxHeightTypeAuto){this._computedMaxHeightValue=d;k.maxHeight=true}}if((k.width||k.minWidth||k.maxWidth||k.left||k.right)&&this._recomputeBoxWidth()){g=b=true}if((k.height||k.minHeight||k.maxHeight||k.top||k.bottom)&&this._recomputeBoxHeight()){h=l=true}}catch(o){throw new Error("Flushing job queue (recompute#2) failed "+o)}try{if((g&&this._recomputeOuterWidth())||f){r._invalidatePreferredInnerWidth();r.getLayoutImpl().updateSelfOnChildOuterWidthChange(this);c=true}if((h&&this._recomputeOuterHeight())||p){r._invalidatePreferredInnerHeight();r.getLayoutImpl().updateSelfOnChildOuterHeightChange(this);c=true}if(c){r._flushJobQueue()}}catch(o){throw new Error("Flushing job queue (parentsignals#3) failed "+o)}try{r._addChildToChildrenQueue(this);for(var j in k){this._layoutChanges[j]=true}}catch(o){throw new Error("Flushing job queue (addjobs#4) failed "+o)}try{if(this instanceof qx.ui.core.Parent&&(k.paddingLeft||k.paddingRight||k.paddingTop||k.paddingBottom)){var a=this.getChildren(),m=a.length;if(k.paddingLeft){for(var j=0;j<m;j++){a[j].addToLayoutChanges("parentPaddingLeft")}}if(k.paddingRight){for(var j=0;j<m;j++){a[j].addToLayoutChanges("parentPaddingRight")}}if(k.paddingTop){for(var j=0;j<m;j++){a[j].addToLayoutChanges("parentPaddingTop")}}if(k.paddingBottom){for(var j=0;j<m;j++){a[j].addToLayoutChanges("parentPaddingBottom")}}}if(b){this._recomputeInnerWidth()}if(l){this._recomputeInnerHeight()}if(this._initialLayoutDone){if(n){n.updateChildrenOnJobQueueFlush(k)}}}catch(o){throw new Error("Flushing job queue (childrensignals#5) failed "+o)}delete this._jobQueue},_isWidthEssential:qx.lang.Function.returnTrue,_isHeightEssential:qx.lang.Function.returnTrue,_computeBoxWidthFallback:function(){return 0},_computeBoxHeightFallback:function(){return 0},_computeBoxWidth:function(){var a=this.getParent().getLayoutImpl();return Math.max(0,qx.lang.Number.limit(a.computeChildBoxWidth(this),this.getMinWidthValue(),this.getMaxWidthValue()))},_computeBoxHeight:function(){var a=this.getParent().getLayoutImpl();return Math.max(0,qx.lang.Number.limit(a.computeChildBoxHeight(this),this.getMinHeightValue(),this.getMaxHeightValue()))},_computeOuterWidth:function(){return Math.max(0,(this.getMarginLeft()+this.getBoxWidth()+this.getMarginRight()))},_computeOuterHeight:function(){return Math.max(0,(this.getMarginTop()+this.getBoxHeight()+this.getMarginBottom()))},_computeInnerWidth:function(){return Math.max(0,this.getBoxWidth()-this.getFrameWidth())},_computeInnerHeight:function(){return Math.max(0,this.getBoxHeight()-this.getFrameHeight())},getNeededWidth:function(){var a=this.getParent().getLayoutImpl();return Math.max(0,a.computeChildNeededWidth(this))},getNeededHeight:function(){var a=this.getParent().getLayoutImpl();return Math.max(0,a.computeChildNeededHeight(this))},_recomputeFlexX:function(){if(!this.getHasFlexX()){return false}if(this._computedWidthTypeFlex){this._computedWidthValue=null;this.addToLayoutChanges($[19])}return true},_recomputeFlexY:function(){if(!this.getHasFlexY()){return false}if(this._computedHeightTypeFlex){this._computedHeightValue=null;this.addToLayoutChanges($[39])}return true},_recomputePercentX:function(){if(!this.getHasPercentX()){return false}if(this._computedWidthTypePercent){this._computedWidthValue=null;this.addToLayoutChanges($[19])}if(this._computedMinWidthTypePercent){this._computedMinWidthValue=null;this.addToLayoutChanges($[101])}if(this._computedMaxWidthTypePercent){this._computedMaxWidthValue=null;this.addToLayoutChanges($[106])}if(this._computedLeftTypePercent){this._computedLeftValue=null;this.addToLayoutChanges("left")}if(this._computedRightTypePercent){this._computedRightValue=null;this.addToLayoutChanges($[24])}return true},_recomputePercentY:function(){if(!this.getHasPercentY()){return false}if(this._computedHeightTypePercent){this._computedHeightValue=null;this.addToLayoutChanges($[39])}if(this._computedMinHeightTypePercent){this._computedMinHeightValue=null;this.addToLayoutChanges($[100])}if(this._computedMaxHeightTypePercent){this._computedMaxHeightValue=null;this.addToLayoutChanges($[104])}if(this._computedTopTypePercent){this._computedTopValue=null;this.addToLayoutChanges("top")}if(this._computedBottomTypePercent){this._computedBottomValue=null;this.addToLayoutChanges($[50])}return true},_recomputeRangeX:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(){if(this._computedLeftTypeNull||this._computedRightTypeNull){return false}this.addToLayoutChanges($[19]);return true},"default":function(){return !(this._computedLeftTypeNull||this._computedRightTypeNull)}}),_recomputeRangeY:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(){if(this._computedTopTypeNull||this._computedBottomTypeNull){return false}this.addToLayoutChanges($[39]);return true},"default":function(){return !(this._computedTopTypeNull||this._computedBottomTypeNull)}}),_recomputeStretchingX:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(){if(this.getAllowStretchX()&&this._computedWidthTypeNull){this._computedWidthValue=null;this.addToLayoutChanges($[19]);return true}return false},"default":function(){if(this.getAllowStretchX()&&this._computedWidthTypeNull){return true}return false}}),_recomputeStretchingY:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(){if(this.getAllowStretchY()&&this._computedHeightTypeNull){this._computedHeightValue=null;this.addToLayoutChanges($[39]);return true}return false},"default":function(){if(this.getAllowStretchY()&&this._computedHeightTypeNull){return true}return false}}),_computeValuePixel:function(a){return Math.round(a)},_computeValuePixelLimit:function(a){return Math.max(0,this._computeValuePixel(a))},_computeValuePercentX:function(a){return Math.round(this.getParent().getInnerWidthForChild(this)*a*0.01)},_computeValuePercentXLimit:function(a){return Math.max(0,this._computeValuePercentX(a))},_computeValuePercentY:function(a){return Math.round(this.getParent().getInnerHeightForChild(this)*a*0.01)},_computeValuePercentYLimit:function(a){return Math.max(0,this._computeValuePercentY(a))},getWidthValue:function(){if(this._computedWidthValue!=null){return this._computedWidthValue}switch(this._computedWidthType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedWidthValue=this._computeValuePixelLimit(this._computedWidthParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedWidthValue=this._computeValuePercentXLimit(this._computedWidthParsed);case qx.ui.core.Widget.TYPE_AUTO:return this._computedWidthValue=this.getPreferredBoxWidth();case qx.ui.core.Widget.TYPE_FLEX:if(this.getParent().getLayoutImpl().computeChildrenFlexWidth===undefined){throw new Error("Widget "+this+": having horizontal flex size (width="+this.getWidth()+$[441]+this.getParent()+$[489])}this.getParent().getLayoutImpl().computeChildrenFlexWidth();return this._computedWidthValue=this._computedWidthFlexValue}return null},getMinWidthValue:function(){if(this._computedMinWidthValue!=null){return this._computedMinWidthValue}switch(this._computedMinWidthType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedWidthValue=this._computeValuePixelLimit(this._computedMinWidthParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedWidthValue=this._computeValuePercentXLimit(this._computedMinWidthParsed);case qx.ui.core.Widget.TYPE_AUTO:return this._computedMinWidthValue=this.getPreferredBoxWidth()}return null},getMaxWidthValue:function(){if(this._computedMaxWidthValue!=null){return this._computedMaxWidthValue}switch(this._computedMaxWidthType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedWidthValue=this._computeValuePixelLimit(this._computedMaxWidthParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedWidthValue=this._computeValuePercentXLimit(this._computedMaxWidthParsed);case qx.ui.core.Widget.TYPE_AUTO:return this._computedMaxWidthValue=this.getPreferredBoxWidth()}return null},getLeftValue:function(){if(this._computedLeftValue!=null){return this._computedLeftValue}switch(this._computedLeftType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedLeftValue=this._computeValuePixel(this._computedLeftParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedLeftValue=this._computeValuePercentX(this._computedLeftParsed)}return null},getRightValue:function(){if(this._computedRightValue!=null){return this._computedRightValue}switch(this._computedRightType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedRightValue=this._computeValuePixel(this._computedRightParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedRightValue=this._computeValuePercentX(this._computedRightParsed)}return null},getHeightValue:function(){if(this._computedHeightValue!=null){return this._computedHeightValue}switch(this._computedHeightType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedHeightValue=this._computeValuePixelLimit(this._computedHeightParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedHeightValue=this._computeValuePercentYLimit(this._computedHeightParsed);case qx.ui.core.Widget.TYPE_AUTO:return this._computedHeightValue=this.getPreferredBoxHeight();case qx.ui.core.Widget.TYPE_FLEX:if(this.getParent().getLayoutImpl().computeChildrenFlexHeight===undefined){throw new Error("Widget "+this+": having vertical flex size (height="+this.getHeight()+$[441]+this.getParent()+$[489])}this.getParent().getLayoutImpl().computeChildrenFlexHeight();return this._computedHeightValue=this._computedHeightFlexValue}return null},getMinHeightValue:function(){if(this._computedMinHeightValue!=null){return this._computedMinHeightValue}switch(this._computedMinHeightType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedMinHeightValue=this._computeValuePixelLimit(this._computedMinHeightParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedMinHeightValue=this._computeValuePercentYLimit(this._computedMinHeightParsed);case qx.ui.core.Widget.TYPE_AUTO:return this._computedMinHeightValue=this.getPreferredBoxHeight()}return null},getMaxHeightValue:function(){if(this._computedMaxHeightValue!=null){return this._computedMaxHeightValue}switch(this._computedMaxHeightType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedMaxHeightValue=this._computeValuePixelLimit(this._computedMaxHeightParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedMaxHeightValue=this._computeValuePercentYLimit(this._computedMaxHeightParsed);case qx.ui.core.Widget.TYPE_AUTO:return this._computedMaxHeightValue=this.getPreferredBoxHeight()}return null},getTopValue:function(){if(this._computedTopValue!=null){return this._computedTopValue}switch(this._computedTopType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedTopValue=this._computeValuePixel(this._computedTopParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedTopValue=this._computeValuePercentY(this._computedTopParsed)}return null},getBottomValue:function(){if(this._computedBottomValue!=null){return this._computedBottomValue}switch(this._computedBottomType){case qx.ui.core.Widget.TYPE_PIXEL:return this._computedBottomValue=this._computeValuePixel(this._computedBottomParsed);case qx.ui.core.Widget.TYPE_PERCENT:return this._computedBottomValue=this._computeValuePercentY(this._computedBottomParsed)}return null},_computeFrameWidth:function(){var a=this._cachedBorderLeft+this.getPaddingLeft()+this.getPaddingRight()+this._cachedBorderRight;switch(this.getOverflow()){case $[26]:case $[93]:a+=qx.ui.core.Widget.SCROLLBAR_SIZE;break;case"auto":break}return a},_computeFrameHeight:function(){var a=this._cachedBorderTop+this.getPaddingTop()+this.getPaddingBottom()+this._cachedBorderBottom;switch(this.getOverflow()){case $[26]:case $[94]:a+=qx.ui.core.Widget.SCROLLBAR_SIZE;break;case"auto":break}return a},_invalidateFrameDimensions:function(){this._invalidateFrameWidth();this._invalidateFrameHeight()},_invalidatePreferredInnerDimensions:function(){this._invalidatePreferredInnerWidth();this._invalidatePreferredInnerHeight()},_computePreferredBoxWidth:function(){try{return Math.max(0,this.getPreferredInnerWidth()+this.getFrameWidth())}catch(a){throw new Error("_computePreferredBoxWidth failed "+a)}},_computePreferredBoxHeight:function(){try{return Math.max(0,this.getPreferredInnerHeight()+this.getFrameHeight())}catch(a){throw new Error("_computePreferredBoxHeight failed "+a)}},_initialLayoutDone:false,addToLayoutChanges:function(a){if(this._isDisplayable){this.getParent()._addChildToChildrenQueue(this)}return this._layoutChanges[a]=true},addToQueue:function(a){this._initialLayoutDone?this.addToJobQueue(a):this.addToLayoutChanges(a)},addToQueueRuntime:function(a){return !this._initialLayoutDone||this.addToJobQueue(a)},_computeHasPercentX:function(){return(this._computedLeftTypePercent||this._computedWidthTypePercent||this._computedMinWidthTypePercent||this._computedMaxWidthTypePercent||this._computedRightTypePercent)},_computeHasPercentY:function(){return(this._computedTopTypePercent||this._computedHeightTypePercent||this._computedMinHeightTypePercent||this._computedMaxHeightTypePercent||this._computedBottomTypePercent)},_computeHasAutoX:function(){return(this._computedWidthTypeAuto||this._computedMinWidthTypeAuto||this._computedMaxWidthTypeAuto)},_computeHasAutoY:function(){return(this._computedHeightTypeAuto||this._computedMinHeightTypeAuto||this._computedMaxHeightTypeAuto)},_computeHasFlexX:function(){return this._computedWidthTypeFlex},_computeHasFlexY:function(){return this._computedHeightTypeFlex},_evalUnitsPixelPercentAutoFlex:function(a){switch(a){case"auto":return qx.ui.core.Widget.TYPE_AUTO;case Infinity:case -Infinity:return qx.ui.core.Widget.TYPE_NULL}switch(typeof a){case $[78]:return isNaN(a)?qx.ui.core.Widget.TYPE_NULL:qx.ui.core.Widget.TYPE_PIXEL;case $[13]:return a.indexOf("%")!=-1?qx.ui.core.Widget.TYPE_PERCENT:a.indexOf("*")!=-1?qx.ui.core.Widget.TYPE_FLEX:qx.ui.core.Widget.TYPE_NULL}return qx.ui.core.Widget.TYPE_NULL},_evalUnitsPixelPercentAuto:function(a){switch(a){case"auto":return qx.ui.core.Widget.TYPE_AUTO;case Infinity:case -Infinity:return qx.ui.core.Widget.TYPE_NULL}switch(typeof a){case $[78]:return isNaN(a)?qx.ui.core.Widget.TYPE_NULL:qx.ui.core.Widget.TYPE_PIXEL;case $[13]:return a.indexOf("%")!=-1?qx.ui.core.Widget.TYPE_PERCENT:qx.ui.core.Widget.TYPE_NULL}return qx.ui.core.Widget.TYPE_NULL},_evalUnitsPixelPercent:function(a){switch(a){case Infinity:case -Infinity:return qx.ui.core.Widget.TYPE_NULL}switch(typeof a){case $[78]:return isNaN(a)?qx.ui.core.Widget.TYPE_NULL:qx.ui.core.Widget.TYPE_PIXEL;case $[13]:return a.indexOf("%")!=-1?qx.ui.core.Widget.TYPE_PERCENT:qx.ui.core.Widget.TYPE_NULL}return qx.ui.core.Widget.TYPE_NULL},_unitDetectionPixelPercentAutoFlex:function(b,j){var a=qx.ui.core.Widget.layoutPropertyTypes[b];var n=a.dataType;var c=a.dataParsed;var m=a.dataValue;var l=a.typePixel;var k=a.typePercent;var i=a.typeAuto;var h=a.typeFlex;var g=a.typeNull;var e=this[k];var f=this[i];var d=this[h];switch(this[n]=this._evalUnitsPixelPercentAutoFlex(j)){case qx.ui.core.Widget.TYPE_PIXEL:this[l]=true;this[k]=this[i]=this[h]=this[g]=false;this[c]=this[m]=Math.round(j);break;case qx.ui.core.Widget.TYPE_PERCENT:this[k]=true;this[l]=this[i]=this[h]=this[g]=false;this[c]=parseFloat(j);this[m]=null;break;case qx.ui.core.Widget.TYPE_AUTO:this[i]=true;this[l]=this[k]=this[h]=this[g]=false;this[c]=this[m]=null;break;case qx.ui.core.Widget.TYPE_FLEX:this[h]=true;this[l]=this[k]=this[i]=this[g]=false;this[c]=parseFloat(j);this[m]=null;break;default:this[g]=true;this[l]=this[k]=this[i]=this[h]=false;this[c]=this[m]=null;break}if(e!=this[k]){switch(b){case $[101]:case $[106]:case $[19]:case"left":case $[24]:this._invalidateHasPercentX();break;case $[104]:case $[100]:case $[39]:case"top":case $[50]:this._invalidateHasPercentY();break}}if(f!=this[i]){switch(b){case $[101]:case $[106]:case $[19]:this._invalidateHasAutoX();break;case $[100]:case $[104]:case $[39]:this._invalidateHasAutoY();break}}if(d!=this[h]){switch(b){case $[19]:this._invalidateHasFlexX();break;case $[39]:this._invalidateHasFlexY();break}}},_unitDetectionPixelPercentAuto:function(b,h){var a=qx.ui.core.Widget.layoutPropertyTypes[b];var l=a.dataType;var c=a.dataParsed;var k=a.dataValue;var j=a.typePixel;var i=a.typePercent;var g=a.typeAuto;var f=a.typeNull;var d=this[i];var e=this[g];switch(this[l]=this._evalUnitsPixelPercentAuto(h)){case qx.ui.core.Widget.TYPE_PIXEL:this[j]=true;this[i]=this[g]=this[f]=false;this[c]=this[k]=Math.round(h);break;case qx.ui.core.Widget.TYPE_PERCENT:this[i]=true;this[j]=this[g]=this[f]=false;this[c]=parseFloat(h);this[k]=null;break;case qx.ui.core.Widget.TYPE_AUTO:this[g]=true;this[j]=this[i]=this[f]=false;this[c]=this[k]=null;break;default:this[f]=true;this[j]=this[i]=this[g]=false;this[c]=this[k]=null;break}if(d!=this[i]){switch(b){case $[101]:case $[106]:case $[19]:case"left":case $[24]:this._invalidateHasPercentX();break;case $[100]:case $[104]:case $[39]:case"top":case $[50]:this._invalidateHasPercentY();break}}if(e!=this[g]){switch(b){case $[101]:case $[106]:case $[19]:this._invalidateHasAutoX();break;case $[100]:case $[104]:case $[39]:this._invalidateHasAutoY();break}}},_unitDetectionPixelPercent:function(b,f){var a=qx.ui.core.Widget.layoutPropertyTypes[b];var j=a.dataType;var c=a.dataParsed;var i=a.dataValue;var h=a.typePixel;var g=a.typePercent;var e=a.typeNull;var d=this[g];switch(this[j]=this._evalUnitsPixelPercent(f)){case qx.ui.core.Widget.TYPE_PIXEL:this[h]=true;this[g]=this[e]=false;this[c]=this[i]=Math.round(f);break;case qx.ui.core.Widget.TYPE_PERCENT:this[g]=true;this[h]=this[e]=false;this[c]=parseFloat(f);this[i]=null;break;default:this[e]=true;this[h]=this[g]=false;this[c]=this[i]=null;break}if(d!=this[g]){switch(b){case $[101]:case $[106]:case $[19]:case"left":case $[24]:this._invalidateHasPercentX();break;case $[100]:case $[104]:case $[39]:case"top":case $[50]:this._invalidateHasPercentY();break}}},getTopLevelWidget:function(){return this._hasParent?this.getParent().getTopLevelWidget():null},moveSelfToBegin:function(){this.getParent().addAtBegin(this)},moveSelfToEnd:function(){this.getParent().addAtEnd(this)},getPreviousSibling:function(){var b=this.getParent();if(b==null){return null}var a=b.getChildren();return a[a.indexOf(this)-1]},getNextSibling:function(){var b=this.getParent();if(b==null){return null}var a=b.getChildren();return a[a.indexOf(this)+1]},getPreviousVisibleSibling:function(){if(!this._hasParent){return null}var a=this.getParent().getVisibleChildren();return a[a.indexOf(this)-1]},getNextVisibleSibling:function(){if(!this._hasParent){return null}var a=this.getParent().getVisibleChildren();return a[a.indexOf(this)+1]},getPreviousActiveSibling:function(a){var b=qx.ui.core.Widget.getActiveSiblingHelper(this,this.getParent(),-1,a,null);return b?b:this.getParent().getLastActiveChild()},getNextActiveSibling:function(a){var b=qx.ui.core.Widget.getActiveSiblingHelper(this,this.getParent(),1,a,null);return b?b:this.getParent().getFirstActiveChild()},isFirstChild:function(){return this._hasParent&&this.getParent().getFirstChild()==this},isLastChild:function(){return this._hasParent&&this.getParent().getLastChild()==this},isFirstVisibleChild:function(){return this._hasParent&&this.getParent().getFirstVisibleChild()==this},isLastVisibleChild:function(){return this._hasParent&&this.getParent().getLastVisibleChild()==this},hasState:function(a){return this.__states&&this.__states[a]?true:false},addState:function(a){if(!this.__states){this.__states={}}if(!this.__states[a]){this.__states[a]=true;if(this._hasParent){qx.ui.core.Widget.addToGlobalStateQueue(this)}}},removeState:function(a){if(this.__states&&this.__states[a]){delete this.__states[a];if(this._hasParent){qx.ui.core.Widget.addToGlobalStateQueue(this)}}},_styleFromMap:function(c){var b=qx.core.Property.$$method.style;var d=qx.core.Property.$$method.unstyle;var a;if(qx.core.Variant.isSet($[7],"on")){for(var e in c){if(!this[b[e]]){throw new Error(this.classname+$[431]+e+'"')}}}for(var e in c){a=c[e];a===$[8]?this[d[e]]():this[b[e]](a)}},_unstyleFromArray:function(c){var d=qx.core.Property.$$method.unstyle;if(qx.core.Variant.isSet($[7],"on")){for(var b=0,a=c.length;b<a;b++){if(!this[d[c[b]]]){throw new Error(this.classname+$[431]+c[b]+'"')}}}for(var b=0,a=c.length;b<a;b++){this[d[c[b]]]()}},_renderAppearance:function(){if(!this.__states){this.__states={}}this._applyStateStyleFocus(this.__states);var b=this.getAppearance();if(b){var a=qx.theme.manager.Appearance.getInstance().styleFrom(b,this.__states);if(a){this._styleFromMap(a)}}},_resetAppearanceThemeWrapper:function(a,e){var f=this.getAppearance();if(f){var c=qx.theme.manager.Appearance.getInstance();var d=c.styleFromTheme(e,f,this.__states);var b=c.styleFromTheme(a,f,this.__states);var g=[];for(var h in d){if(b[h]===undefined){g.push(h)}}this._unstyleFromArray(g);this._styleFromMap(b)}},_applyStateStyleFocus:qx.core.Variant.select($[0],{mshtml:function(a){},"default":function(a){if(a.focused){if(!qx.event.handler.FocusHandler.mouseFocus&&!this.getHideFocus()){this.setStyleProperty($[115],$[372])}}else{this.setStyleProperty($[115],"none")}}}),addToStateQueue:function(){qx.ui.core.Widget.addToGlobalStateQueue(this)},recursiveAddToStateQueue:function(){this.addToStateQueue()},_applyAppearance:function(e,a){if(!this.__states){this.__states={}}var c=qx.theme.manager.Appearance.getInstance();if(e){var b=c.styleFrom(e,this.__states)||{}}if(a){var d=c.styleFrom(a,this.__states)||{};var f=[];for(var g in d){if(!b||!(g in b)){f.push(g)}}}if(f){this._unstyleFromArray(f)}if(b){this._styleFromMap(b)}},_recursiveAppearanceThemeUpdate:function(a,c){try{this._resetAppearanceThemeWrapper(a,c)}catch(b){throw new Error("Failed to update appearance theme "+b)}},_applyElementData:function(a){},setHtmlProperty:function(b,a){if(!this._htmlProperties){this._htmlProperties={}}this._htmlProperties[b]=a;if(this._isCreated&&this.getElement()[b]!=a){this.getElement()[b]=a}return true},removeHtmlProperty:qx.core.Variant.select($[0],{mshtml:function(a){if(!this._htmlProperties){return}delete this._htmlProperties[a];if(this._isCreated){this.getElement().removeAttribute(a)}return true},"default":function(a){if(!this._htmlProperties){return}delete this._htmlProperties[a];if(this._isCreated){this.getElement().removeAttribute(a);delete this.getElement()[a]}return true}}),getHtmlProperty:function(a){if(!this._htmlProperties){return""}return this._htmlProperties[a]||""},_applyHtmlProperties:function(a){var c=this._htmlProperties;if(c){var b;for(b in c){a[b]=c[b]}}},setHtmlAttribute:function(b,a){if(!this._htmlAttributes){this._htmlAttributes={}}this._htmlAttributes[b]=a;if(this._isCreated){this.getElement().setAttribute(b,a)}return true},removeHtmlAttribute:function(a){if(!this._htmlAttributes){return}delete this._htmlAttributes[a];if(this._isCreated){this.getElement().removeAttribute(a)}return true},getHtmlAttribute:function(a){if(!this._htmlAttributes){return""}return this._htmlAttributes[a]||""},_applyHtmlAttributes:function(b){var a=this._htmlAttributes;if(a){var c;for(c in a){b.setAttribute(c,a[c])}}},getStyleProperty:function(a){if(!this._styleProperties){return""}return this._styleProperties[a]||""},__outerElementStyleProperties:{cursor:true,zIndex:true,filter:true,display:true,visibility:true,outline:true},setStyleProperty:function(c,b){if(!this._styleProperties){this._styleProperties={}}this._styleProperties[c]=b;if(this._isCreated){var a=this.__outerElementStyleProperties[c]?this.getElement():this._getTargetNode();if(a){a.style[c]=(b==null)?"":b}}},removeStyleProperty:function(b){if(!this._styleProperties){return}delete this._styleProperties[b];if(this._isCreated){var a=this.__outerElementStyleProperties[b]?this.getElement():this._getTargetNode();if(a){a.style[b]=""}}},_applyStyleProperties:function(b){var e=this._styleProperties;if(!e){return}var d;var f=b;var a=this._getTargetNode();var b;var c;for(d in e){b=this.__outerElementStyleProperties[d]?f:a;c=e[d];b.style[d]=(c==null)?"":c}},_applyEnabled:function(b,a){if(b===false){this.addState("disabled");this.removeState("over");if(qx.Class.isDefined($[402])){this.removeState($[46]);this.removeState($[21])}}else{this.removeState("disabled")}},isFocusable:function(){return this.getEnabled()&&this.isSeeable()&&this.getTabIndex()!=null},isFocusRoot:function(){return false},getFocusRoot:function(){if(this._hasParent){return this.getParent().getFocusRoot()}return null},getActiveChild:function(){var a=this.getFocusRoot();if(a){return a.getActiveChild()}return null},_ontabfocus:qx.lang.Function.returnTrue,_applyFocused:function(c,b){if(!this.isCreated()){return}var a=this.getFocusRoot();if(a){if(c){a.setFocusedChild(this);this._visualizeFocus()}else{if(a.getFocusedChild()==this){a.setFocusedChild(null)}this._visualizeBlur()}}},_applyHideFocus:qx.core.Variant.select($[0],{mshtml:function(b,a){this.setHtmlProperty("hideFocus",b)},"default":qx.lang.Function.returnTrue}),_visualizeBlur:function(){if(this.getEnableElementFocus()&&(!this.getFocusRoot().getFocusedChild()||(this.getFocusRoot().getFocusedChild()&&this.getFocusRoot().getFocusedChild().getEnableElementFocus()))){try{this.getElement().blur()}catch(a){}}this.removeState($[133])},_visualizeFocus:function(){if(!qx.event.handler.FocusHandler.mouseFocus&&this.getEnableElementFocus()){try{this.getElement().focus()}catch(a){}}this.addState($[133])},focus:function(){delete qx.event.handler.FocusHandler.mouseFocus;this.setFocused(true)},blur:function(){delete qx.event.handler.FocusHandler.mouseFocus;this.setFocused(false)},_applyCapture:function(c,b){var a=org.eclipse.rwt.EventHandler;if(b){a.setCaptureWidget(null)}if(c){a.setCaptureWidget(this)}},_applyZIndex:function(b,a){if(b==null){this.removeStyleProperty("zIndex")}else{this.setStyleProperty("zIndex",b)}},_applyTabIndex:qx.core.Variant.select($[0],{mshtml:function(b,a){this.setHtmlProperty("tabIndex",b<0?-1:1)},"default":function(b,a){this.setStyleProperty("userFocus",(b<0?"ignore":$[108]));this.setHtmlProperty("tabIndex",b<0?-1:1)}}),_applySelectable:qx.core.Variant.select($[0],{mshtml:function(b,a){},gecko:function(b,a){if(b){this.removeStyleProperty($[454])}else{this.setStyleProperty($[454],"none")}},webkit:function(b,a){if(b){this.removeStyleProperty($[549]);this.removeStyleProperty($[471])}else{this.setStyleProperty($[549],"none");this.setStyleProperty($[471],"none")}},"default":function(b,a){if(b){return this.removeStyleProperty("userSelect")}else{this.setStyleProperty("userSelect","none")}}}),_applyOpacity:function(b,a){org.eclipse.rwt.HtmlUtil.setOpacity(this,b)},__cursorMap:qx.core.Variant.select($[0],{mshtml:{"default":$[38],wait:"wait",crosshair:$[340],help:"help",move:"move",text:"text",pointer:$[144],"e-resize":$[167],"n-resize":$[191],"w-resize":$[232],"s-resize":$[320],"ne-resize":$[238],"se-resize":$[392],"nw-resize":$[237],"sw-resize":$[364],"col-resize":$[369],"row-resize":$[322],progress:$[262],"not-allowed":$[356],"no-drop":"no-drop",cursor:"hand","ew-resize":$[167],"ns-resize":$[191],"nesw-resize":$[238],"nwse-resize":$[237]},opera:{"default":$[38],wait:"wait",crosshair:$[340],help:"help",move:"move",text:"text",pointer:$[144],"e-resize":$[167],"n-resize":$[191],"w-resize":$[232],"s-resize":$[320],"ne-resize":$[238],"se-resize":$[392],"nw-resize":$[237],"sw-resize":$[364],progress:$[262],"not-allowed":$[356],"no-drop":"no-drop","col-resize":$[167],"row-resize":$[191],"ew-resize":$[167],"ns-resize":$[191],"nesw-resize":$[238],"nwse-resize":$[237]},"default":{"default":$[38],wait:"wait",crosshair:$[340],help:"help",move:"move",text:"text",pointer:$[144],"e-resize":$[167],"n-resize":$[191],"w-resize":$[232],"s-resize":$[320],"ne-resize":$[238],"se-resize":$[392],"nw-resize":$[237],"sw-resize":$[364],"col-resize":$[369],"row-resize":$[322],progress:$[262],"not-allowed":$[356],"no-drop":"no-drop"}}),_applyCursor:function(c,a){if(c){var b="url( "+qx.io.Alias.getInstance().resolve(c)+" ), default";this.setStyleProperty($[34],this.__cursorMap[c]||b)}else{this.removeStyleProperty($[34])}},_applyCommand:function(b,a){},_applyBackgroundImage:function(c,a){var b=qx.io.image.Manager.getInstance();var d=qx.io.Alias.getInstance();if(a){b.hide(a)}if(c){b.show(c)}d.connect(this._styleBackgroundImage,this,c)},_styleBackgroundImage:function(a){a?this.setStyleProperty($[114],"url("+a+")"):this.removeStyleProperty($[114])},_applyBackgroundRepeat:function(b,a){b?this.setStyleProperty($[343],b):this.removeStyleProperty($[343])},_applyClip:function(b,a){return this._compileClipString()},_compileClipString:function(){var f=this.getClipLeft();var b=this.getClipTop();var e=this.getClipWidth();var a=this.getClipHeight();var d,c;if(f==null){d=(e==null?"auto":e+"px");f="auto"}else{d=(e==null?"auto":f+e+"px");f=f+"px"}if(b==null){c=(a==null?"auto":a+"px");b="auto"}else{c=(a==null?"auto":b+a+"px");b=b+"px"}return this.setStyleProperty("clip",("rect("+b+","+d+","+c+","+f+")"))},_applyOverflow:qx.core.Variant.select($[0],{"default":function(g,c){var f=g;var d=$[70];switch(g){case $[94]:d=$[105];f=$[26];break;case $[93]:d=$[98];f=$[26];break}var b=[$[70],$[105],$[98]];for(var e=0;e<b.length;e++){if(b[e]!=d){this.removeStyleProperty(b[e])}}switch(g){case $[94]:this.setStyleProperty($[98],$[17]);break;case $[93]:this.setStyleProperty($[105],$[17]);break}this._renderOverflow(d,f,g,c);this.addToQueue($[70])},gecko:function(d,a){var c=d;var b=$[70];switch(c){case $[17]:c=$[282];break;case $[94]:c=$[283];break;case $[93]:c=$[306];break}this._renderOverflow(b,c,d,a);this.addToQueue($[70])},opera:function(g,c){var f=g;var d=$[70];if(org.eclipse.rwt.Client.getVersion()<9.8){switch(f){case $[94]:case $[93]:f=$[26];break}}else{switch(f){case $[94]:d=$[105];f=$[26];break;case $[93]:d=$[98];f=$[26];break}var b=[$[70],$[105],$[98]];for(var e=0;e<b.length;e++){if(b[e]!=d){this.removeStyleProperty(b[e])}}switch(g){case $[94]:this.setStyleProperty($[98],$[17]);break;case $[93]:this.setStyleProperty($[105],$[17]);break}}this._renderOverflow(d,f,g,c);this.addToQueue($[70])}}),_renderOverflow:function(b,c,d,a){this.setStyleProperty(b,c||"");this._invalidateFrameWidth();this._invalidateFrameHeight()},getOverflowX:function(){var a=this.getOverflow();return a==$[93]?$[17]:a},getOverflowY:function(){var a=this.getOverflow();return a==$[94]?$[17]:a},_applyContainerOverflow:function(b,a){if(this._innerStyle){this._style.overflow=b?"":$[17]}},_applyBackgroundColor:function(b,a){this._styleBackgroundColor(b)},_applyBackgroundGradient:function(b,a){org.eclipse.rwt.HtmlUtil.setBackgroundGradient(this,b);if(b===null){this.setStyleProperty($[114],this.getStyleProperty($[114]));this.setStyleProperty($[77],this.getStyleProperty($[77]))}},_applyShadow:function(b,a){org.eclipse.rwt.HtmlUtil.setBoxShadow(this,b)},_styleBackgroundColor:function(a){a?this.setStyleProperty($[77],a):this.removeStyleProperty($[77])},_applyTextColor:function(b,a){},_applyFont:function(b,a){},_cachedBorderTop:0,_cachedBorderRight:0,_cachedBorderBottom:0,_cachedBorderLeft:0,_usesComplexBorder:false,_targetNodeEnabled:false,_applyBorder:function(b,a){this._queueBorder(b)},_queueBorder:function(a){this.addToQueue($[4]);this.__reflowBorderX(a);this.__reflowBorderY(a);this.__borderObject=a},__reflowBorderX:function(b){var a=this._cachedBorderLeft;var c=this._cachedBorderRight;this._cachedBorderLeft=b?b.getWidthLeft():0;this._cachedBorderRight=b?b.getWidthRight():0;if((a+c)!=(this._cachedBorderLeft+this._cachedBorderRight)){this._invalidateFrameWidth()}},__reflowBorderY:function(c){var a=this._cachedBorderTop;var b=this._cachedBorderBottom;this._cachedBorderTop=c?c.getWidthTop():0;this._cachedBorderBottom=c?c.getWidthBottom():0;if((a+b)!=(this._cachedBorderTop+this._cachedBorderBottom)){this._invalidateFrameHeight()}},renderBorder:function(a){var b=this.__borderObject;if(b){b.render(this)}else{org.eclipse.rwt.Border.reset(this)}this._usesComplexBorder=this._computeUsesComplexBorder()},_computeUsesComplexBorder:function(){return this.__borderObject&&this.__borderObject.getStyle()===$[225]},prepareEnhancedBorder:function(){if(!this._innerStyle){this._targetNode=document.createElement("div");this._innerStyle=this._targetNode.style;this._targetNodeEnabled=true;if(qx.core.Variant.isSet($[0],$[18])){this.addToQueue($[19]);this.addToQueue($[39])}else{this._innerStyle.width="100%";this._innerStyle.height="100%"}this._innerStyle.position=$[28];for(var a in this._styleProperties){switch(a){case"zIndex":case $[128]:case $[43]:case $[387]:case $[183]:case $[34]:break;default:this._innerStyle[a]=this._styleProperties[a];this._style[a]=""}}this._style.outline="none";this._applyContainerOverflow(this.getContainerOverflow());for(var a in this._htmlProperties){switch(a){case $[479]:this._targetNode.unselectable=this._htmlProperties[a]}}while(this._element.firstChild){this._targetNode.appendChild(this._element.firstChild)}this._element.appendChild(this._targetNode);if(this.isInDom()){this._afterRemoveDom();this._afterInsertDom()}}},_applyPaddingTop:function(b,a){this.addToQueue($[199]);this._invalidateFrameHeight()},_applyPaddingRight:function(b,a){this.addToQueue($[256]);this._invalidateFrameWidth()},_applyPaddingBottom:function(b,a){this.addToQueue($[236]);this._invalidateFrameHeight()},_applyPaddingLeft:function(b,a){this.addToQueue($[221]);this._invalidateFrameWidth()},renderPadding:function(a){},_applyMarginLeft:function(b,a){this.addToQueue($[192])},_applyMarginRight:function(b,a){this.addToQueue($[298])},_applyMarginTop:function(b,a){this.addToQueue($[214])},_applyMarginBottom:function(b,a){this.addToQueue($[263])},execute:function(){var a=this.getCommand();if(a){a.execute(this)}this.createDispatchEvent($[137])},_visualPropertyCheck:function(){if(!this.isCreated()){throw new Error(this.classname+": Element must be created previously!")}},setScrollLeft:function(a){this._visualPropertyCheck();this._getTargetNode().scrollLeft=a},setScrollTop:function(a){this._visualPropertyCheck();this._getTargetNode().scrollTop=a},getOffsetLeft:function(){this._visualPropertyCheck();return qx.html.Offset.getLeft(this.getElement())},getOffsetTop:function(){this._visualPropertyCheck();return qx.html.Offset.getTop(this.getElement())},getScrollLeft:function(){this._visualPropertyCheck();return this._getTargetNode().scrollLeft},getScrollTop:function(){this._visualPropertyCheck();return this._getTargetNode().scrollTop},getClientWidth:function(){this._visualPropertyCheck();return this._getTargetNode().clientWidth},getClientHeight:function(){this._visualPropertyCheck();return this._getTargetNode().clientHeight},getOffsetWidth:function(){this._visualPropertyCheck();return this.getElement().offsetWidth},getOffsetHeight:function(){this._visualPropertyCheck();return this.getElement().offsetHeight},getScrollWidth:function(){this._visualPropertyCheck();return this._getTargetNode().scrollWidth},getScrollHeight:function(){this._visualPropertyCheck();return this._getTargetNode().scrollHeight},scrollIntoView:function(a){this.scrollIntoViewX(a);this.scrollIntoViewY(a)},scrollIntoViewX:function(a){if(!this._isCreated||!this._isDisplayable){return false}return qx.html.ScrollIntoView.scrollX(this.getElement(),a)},scrollIntoViewY:function(a){if(!this._isCreated||!this._isDisplayable){return false}return qx.html.ScrollIntoView.scrollY(this.getElement(),a)},supportsDrop:function(a){var b=this.getSupportsDropMethod();if(b!==null){return b.call(this,a)}return(this!=a.sourceWidget)},getAdapter:function(b){if(this._adapters===undefined){this._adapters={}}var c=b.classname;var a=this._adapters[c];if(a==null){new b(this);a=this._adapters[c]}return a}},settings:{"qx.widgetQueueDebugging":false,"qx.widgetDebugId":false},defer:function(b,a){b.__initApplyMethods(a);if(qx.core.Variant.isSet($[0],$[18])){a._renderRuntimeWidth=function(d){this._style.pixelWidth=(d==null)?0:d;if(this._targetNodeEnabled){var c=this._usesComplexBorder&&d!=null?d-2:d;this._innerStyle.pixelWidth=c==null?0:c}};a._renderRuntimeHeight=function(d){this._style.pixelHeight=(d==null)?0:d;if(this._targetNodeEnabled){var c=this._usesComplexBorder&&d!=null?d-2:d;this._innerStyle.pixelHeight=c==null?0:c}};a._resetRuntimeWidth=function(){this._style.width="";if(this._targetNodeEnabled){this._innerStyle.width=""}};a._resetRuntimeHeight=function(){this._style.height="";if(this._targetNodeEnabled){this._innerStyle.height=""}}}b.__initLayoutProperties(b)},destruct:function(){var a=this.getElement();if(a){a.qx_Widget=null}this._disposeObjectDeep("_adapters",1);this._disposeFields("_isCreated","_inlineEvents","_element","_style","_targetNode","_innerStyle","_oldParent","_styleProperties","_htmlProperties","_htmlAttributes","__states","_jobQueue","_layoutChanges","__borderObject")}});
+qx.Class.define("org.eclipse.rwt.WidgetRenderAdapter",{extend:qx.core.Target,construct:function(b){this._autoDispose=false;arguments.callee.base.call(this);this._widget=b;var a=this.classname;if(b._adapters[a]!=null){throw new Error("Never create WidgetRenderAdapter directly!")}b._adapters[a]=this},destruct:function(){this._widget=null},events:{visibility:$[68]},members:{addRenderListener:function(c,e,b){var a=this._renderFunctionNames[c];if(!this.hasEventListeners(c)){var d=this;this._widget[a]=function(h){var g=new qx.event.type.DataEvent(c,h);var f=d.dispatchEvent(g,true);if(f){this.constructor.prototype[a].call(this,h)}}}this.addEventListener(c,e,b)},removeRenderListener:function(c,d,b){this.removeEventListener(c,d,b);if(!this.hasEventListeners(c)){var a=this._renderFunctionNames[c];delete this._widget[a]}},forceRender:function(b,d){var a=this._renderFunctionNames[b];var c=this._widget.constructor.prototype;c[a].call(this._widget,d)},_renderFunctionNames:{visibility:$[491]}}});
+qx.Class.define("qx.html.Dimension",{statics:{getBoxWidth:function(a){return a.offsetWidth},getBoxHeight:function(a){return a.offsetHeight},getAreaWidth:qx.core.Variant.select($[0],{gecko:function(a){if(a.clientWidth!=0&&a.clientWidth!=(qx.html.Style.getBorderLeft(a)+qx.html.Style.getBorderRight(a))){return a.clientWidth}else{return qx.html.Dimension.getBoxWidth(a)-qx.html.Dimension.getInsetLeft(a)-qx.html.Dimension.getInsetRight(a)}},"default":function(a){return a.clientWidth!=0?a.clientWidth:(qx.html.Dimension.getBoxWidth(a)-qx.html.Dimension.getInsetLeft(a)-qx.html.Dimension.getInsetRight(a))}}),getAreaHeight:qx.core.Variant.select($[0],{gecko:function(a){if(a.clientHeight!=0&&a.clientHeight!=(qx.html.Style.getBorderTop(a)+qx.html.Style.getBorderBottom(a))){return a.clientHeight}else{return qx.html.Dimension.getBoxHeight(a)-qx.html.Dimension.getInsetTop(a)-qx.html.Dimension.getInsetBottom(a)}},"default":function(a){return a.clientHeight!=0?a.clientHeight:(qx.html.Dimension.getBoxHeight(a)-qx.html.Dimension.getInsetTop(a)-qx.html.Dimension.getInsetBottom(a))}}),getInsetLeft:qx.core.Variant.select($[0],{mshtml:function(a){return a.clientLeft},"default":function(a){return qx.html.Style.getBorderLeft(a)}}),getInsetTop:qx.core.Variant.select($[0],{mshtml:function(a){return a.clientTop},"default":function(a){return qx.html.Style.getBorderTop(a)}}),getInsetRight:qx.core.Variant.select($[0],{mshtml:function(a){if(qx.html.Style.getStyleProperty(a,$[98])==$[17]||a.clientWidth==0){return qx.html.Style.getBorderRight(a)}return Math.max(0,a.offsetWidth-a.clientLeft-a.clientWidth)},"default":function(c){if(c.clientWidth==0){var b=qx.html.Style.getStyleProperty(c,$[70]);var a=b==$[26]||b==$[306]?16:0;return Math.max(0,qx.html.Style.getBorderRight(c)+a)}return Math.max(0,c.offsetWidth-c.clientWidth-qx.html.Style.getBorderLeft(c))}}),getInsetBottom:qx.core.Variant.select($[0],{mshtml:function(a){if(qx.html.Style.getStyleProperty(a,$[105])==$[17]||a.clientHeight==0){return qx.html.Style.getBorderBottom(a)}return Math.max(0,a.offsetHeight-a.clientTop-a.clientHeight)},"default":function(c){if(c.clientHeight==0){var b=qx.html.Style.getStyleProperty(c,$[70]);var a=b==$[26]||b==$[283]?16:0;return Math.max(0,qx.html.Style.getBorderBottom(c)+a)}return Math.max(0,c.offsetHeight-c.clientHeight-qx.html.Style.getBorderTop(c))}}),getScrollBarSizeRight:function(a){return qx.html.Dimension.getInsetRight(a)-qx.html.Style.getBorderRight(a)},getScrollBarSizeBottom:function(a){return qx.html.Dimension.getInsetBottom(a)-qx.html.Style.getBorderBottom(a)}}});
+qx.Class.define("qx.html.Style",{statics:{getStylePropertySure:qx.lang.Object.select((document.defaultView&&document.defaultView.getComputedStyle)?$[562]:"noComputed",{hasComputed:function(a,b){return !a?null:a.ownerDocument?a.ownerDocument.defaultView.getComputedStyle(a,"")[b]:a.style[b]},noComputed:qx.core.Variant.select($[0],{mshtml:function(b,d){try{if(!b){return null}if(b.parentNode&&b.currentStyle){return b.currentStyle[d]}else{var c=b.runtimeStyle[d];if(c!=null&&typeof c!=$[8]&&c!=""){return c}return b.style[d]}}catch(a){throw new Error($[259]+b+"["+d+"]: "+a)}},"default":function(a,b){return !a?null:a.style[b]}})}),getStyleProperty:qx.lang.Object.select((document.defaultView&&document.defaultView.getComputedStyle)?$[562]:"noComputed",{hasComputed:function(b,c){try{return b.ownerDocument.defaultView.getComputedStyle(b,"")[c]}catch(a){throw new Error($[259]+b+"["+c+"]: "+a)}},noComputed:qx.core.Variant.select($[0],{mshtml:function(b,c){try{return b.currentStyle[c]}catch(a){throw new Error($[259]+b+"["+c+"]: "+a)}},"default":function(b,c){try{return b.style[c]}catch(a){throw new Error($[259]+b+"["+c+"]")}}})}),getStyleSize:function(a,b){return parseInt(qx.html.Style.getStyleProperty(a,b))||0},getMarginLeft:function(a){return qx.html.Style.getStyleSize(a,$[192])},getMarginTop:function(a){return qx.html.Style.getStyleSize(a,$[214])},getMarginRight:function(a){return qx.html.Style.getStyleSize(a,$[298])},getMarginBottom:function(a){return qx.html.Style.getStyleSize(a,$[263])},getPaddingLeft:function(a){return qx.html.Style.getStyleSize(a,$[221])},getPaddingTop:function(a){return qx.html.Style.getStyleSize(a,$[199])},getPaddingRight:function(a){return qx.html.Style.getStyleSize(a,$[256])},getPaddingBottom:function(a){return qx.html.Style.getStyleSize(a,$[236])},getBorderLeft:function(a){return qx.html.Style.getStyleProperty(a,$[418])=="none"?0:qx.html.Style.getStyleSize(a,$[88])},getBorderTop:function(a){return qx.html.Style.getStyleProperty(a,$[472])=="none"?0:qx.html.Style.getStyleSize(a,$[89])},getBorderRight:function(a){return qx.html.Style.getStyleProperty(a,$[570])=="none"?0:qx.html.Style.getStyleSize(a,$[310])},getBorderBottom:function(a){return qx.html.Style.getStyleProperty(a,$[447])=="none"?0:qx.html.Style.getStyleSize(a,$[318])}}});
 qx.Class.define("qx.html.Scroll",{statics:{disableScrolling:function(a){this.enableScrolling(a);a.scrollLeft=0;a.scrollTop=0;qx.html.EventRegistration.addEventListener(a,$[26],this._onscroll)},enableScrolling:function(a){qx.html.EventRegistration.removeEventListener(a,$[26],this._onscroll)},_onscroll:function(b){var a=null;if(b.target){a=(b.target==b.currentTarget)?b.target:null}else{if(b.srcElement){a=b.srcElement}}if(a&&(b.scrollLeft!=0||b.scrollTop!=0)){a.scrollLeft=0;a.scrollTop=0}}}});
-qx.Class.define("qx.html.StyleSheet",{statics:{createElement:qx.lang.Object.select(document.createStyleSheet?"ie4+":"other",{"ie4+":function(a){var b=document.createStyleSheet();if(a){b.cssText=a}return b},other:function(b){var a=document.createElement($[83]);a.type="text/css";a.appendChild(document.createTextNode(b||"body {}"));document.getElementsByTagName("head")[0].appendChild(a);if(a.sheet){return a.sheet}else{var d=document.styleSheets;for(var c=d.length-1;c>=0;c--){if(d[c].ownerNode==a){return d[c]}}}throw"Error: Could not get a reference to the sheet object"}}),addRule:qx.lang.Object.select(document.createStyleSheet?"ie4+":"other",{"ie4+":function(a,c,b){a.addRule(c,b)},other:function(a,c,b){a.insertRule(c+"{"+b+"}",a.cssRules.length)}}),removeRule:qx.lang.Object.select(document.createStyleSheet?"ie4+":"other",{"ie4+":function(b,e){var d=b.rules;var c=d.length;for(var a=c-1;a>=0;a--){if(d[a].selectorText==e){b.removeRule(a)}}},other:function(b,e){var d=b.cssRules;var c=d.length;for(var a=c-1;a>=0;a--){if(d[a].selectorText==e){b.deleteRule(a)}}}}),removeAllRules:qx.lang.Object.select(document.createStyleSheet?"ie4+":"other",{"ie4+":function(b){var d=b.rules;var c=d.length;for(var a=c-1;a>=0;a--){b.removeRule(a)}},other:function(b){var d=b.cssRules;var c=d.length;for(var a=c-1;a>=0;a--){b.deleteRule(a)}}})}});
-qx.Class.define($[477],{extend:qx.ui.core.Widget,type:$[102],construct:function(){arguments.callee.base.call(this);this._children=[];this._layoutImpl=this._createLayoutImpl()},properties:{focusHandler:{check:$[486],apply:"_applyFocusHandler",nullable:true},activeChild:{check:$[136],event:$[398],nullable:true},focusedChild:{check:$[136],apply:"_applyFocusedChild",event:$[222],nullable:true},visibleChildren:{_cached:true,defaultValue:null}},members:{isFocusRoot:function(){return this.getFocusHandler()!=null},getFocusRoot:function(){if(this.isFocusRoot()){return this}if(this._hasParent){return this.getParent().getFocusRoot()}return null},activateFocusRoot:function(){if(this._focusHandler){return}this._focusHandler=new qx.event.handler.FocusHandler(this);this.setFocusHandler(this._focusHandler)},_onfocuskeyevent:function(a){this.getFocusHandler()._onkeyevent(this,a)},_applyFocusHandler:function(b,a){if(b){this.addEventListener($[12],this._onfocuskeyevent);if(this.getTabIndex()<1){this.setTabIndex(1)}this.setHideFocus(true);this.setActiveChild(this)}else{this.removeEventListener($[24],this._onfocuskeyevent);this.removeEventListener($[12],this._onfocuskeyevent);this.setTabIndex(null);this.setHideFocus(false)}},_applyFocusedChild:function(f,c){var d=f!=null;var a=c!=null;if(qx.Class.isDefined($[329])&&d){var b=qx.ui.popup.PopupManager.getInstance();if(b){b.update(f)}}if(a){if(c.hasEventListeners($[176])){var e=new qx.event.type.FocusEvent($[176],c);if(d){e.setRelatedTarget(f)}c.dispatchEvent(e);e.dispose()}}if(d){if(f.hasEventListeners($[217])){var e=new qx.event.type.FocusEvent($[217],f);if(a){e.setRelatedTarget(c)}f.dispatchEvent(e);e.dispose()}}if(a){if(this.getActiveChild()==c&&!d){this.setActiveChild(null)}c.setFocused(false);var e=new qx.event.type.FocusEvent("blur",c);if(d){e.setRelatedTarget(f)}c.dispatchEvent(e);var b=qx.ui.popup.ToolTipManager.getInstance();if(b){b.handleBlur(e)}e.dispose()}if(d){this.setActiveChild(f);f.setFocused(true);org.eclipse.rwt.EventHandler.setFocusRoot(this);var e=new qx.event.type.FocusEvent($[74],f);if(a){e.setRelatedTarget(c)}f.dispatchEvent(e);var b=qx.ui.popup.ToolTipManager.getInstance();if(b){b.handleFocus(e)}e.dispose()}},_layoutImpl:null,_createLayoutImpl:function(){return null},getLayoutImpl:function(){return this._layoutImpl},getChildren:function(){return this._children},getChildrenLength:function(){return this.getChildren().length},hasChildren:function(){return this.getChildrenLength()>0},isEmpty:function(){return this.getChildrenLength()==0},indexOf:function(a){return this.getChildren().indexOf(a)},contains:function(a){switch(a){case null:return false;case this:return true;default:return this.contains(a.getParent())}},_computeVisibleChildren:function(){var c=[];var a=this.getChildren();if(!a){return 0}var d=a.length;for(var b=0;b<d;b++){var e=a[b];if(e._isDisplayable){c.push(e)}}return c},getVisibleChildrenLength:function(){return this.getVisibleChildren().length},hasVisibleChildren:function(){return this.getVisibleChildrenLength()>0},isVisibleEmpty:function(){return this.getVisibleChildrenLength()==0},add:function(b){var d;for(var c=0,a=arguments.length;c<a;c++){d=arguments[c];if(!(d instanceof qx.ui.core.Parent)&&!(d instanceof qx.ui.basic.Terminator)){throw new Error($[542]+d)}else{d.setParent(this)}}return this},addAt:function(d,b){if(b==null||b<0){throw new Error("Not a valid index for addAt(): "+b)}if(d.getParent()==this){var a=this.getChildren();var c=a.indexOf(d);if(c!=b){if(c!=-1){qx.lang.Array.removeAt(a,c)}qx.lang.Array.insertAt(a,d,b);if(this._initialLayoutDone){this._invalidateVisibleChildren();this.getLayoutImpl().updateChildrenOnMoveChild(d,b,c)}}}else{d._insertIndex=b;d.setParent(this)}},addAtBegin:function(a){return this.addAt(a,0)},addAtEnd:function(b){var a=this.getChildrenLength();return this.addAt(b,b.getParent()==this?a-1:a)},addBefore:function(e,d){var a=this.getChildren();var c=a.indexOf(d);if(c==-1){throw new Error("Child to add before: "+d+$[466])}var b=a.indexOf(e);if(b==-1||b>c){c++}return this.addAt(e,Math.max(0,c-1))},addAfter:function(e,d){var a=this.getChildren();var c=a.indexOf(d);if(c==-1){throw new Error("Child to add after: "+d+$[466])}var b=a.indexOf(e);if(b!=-1&&b<c){c--}return this.addAt(e,Math.min(a.length,c+1))},remove:function(b){var d;for(var c=0,a=arguments.length;c<a;c++){d=arguments[c];if(!(d instanceof qx.ui.core.Parent)&&!(d instanceof qx.ui.basic.Terminator)){throw new Error($[542]+d)}else{if(d.getParent()==this){d.setParent(null)}}}},removeAt:function(a){var b=this.getChildren()[a];if(b){delete b._insertIndex;b.setParent(null)}},removeAll:function(){var a=this.getChildren();var b=a[0];while(b){this.remove(b);b=a[0]}},getFirstChild:function(){return qx.lang.Array.getFirst(this.getChildren())||null},getFirstVisibleChild:function(){return qx.lang.Array.getFirst(this.getVisibleChildren())||null},getFirstActiveChild:function(a){return qx.ui.core.Widget.getActiveSiblingHelper(null,this,1,a,"first")||null},getLastChild:function(){return qx.lang.Array.getLast(this.getChildren())||null},getLastVisibleChild:function(){return qx.lang.Array.getLast(this.getVisibleChildren())||null},getLastActiveChild:function(a){return qx.ui.core.Widget.getActiveSiblingHelper(null,this,-1,a,"last")||null},forEachChild:function(c){var b=this.getChildren(),d,a=-1;if(!b){return}while(d=b[++a]){c.call(d,a)}},forEachVisibleChild:function(c){var b=this.getVisibleChildren(),d,a=-1;if(!b){return}while(d=b[++a]){c.call(d,a)}},_beforeAppear:function(){arguments.callee.base.call(this);this.forEachVisibleChild(function(){if(this.isAppearRelevant()){this._beforeAppear()}})},_afterAppear:function(){arguments.callee.base.call(this);this.forEachVisibleChild(function(){if(this.isAppearRelevant()){this._afterAppear()}})},_beforeDisappear:function(){arguments.callee.base.call(this);this.forEachVisibleChild(function(){if(this.isAppearRelevant()){this._beforeDisappear()}})},_afterDisappear:function(){arguments.callee.base.call(this);this.forEachVisibleChild(function(){if(this.isAppearRelevant()){this._afterDisappear()}})},_afterInsertDom:function(){arguments.callee.base.call(this);this.forEachVisibleChild(function(){this._afterInsertDom()})},_afterRemoveDom:function(){arguments.callee.base.call(this);this.forEachVisibleChild(function(){this._afterRemoveDom()})},_handleDisplayableCustom:function(c,a,b){this.forEachChild(function(){this._handleDisplayable()})},_addChildrenToStateQueue:function(){this.forEachVisibleChild(function(){this.addToStateQueue()})},recursiveAddToStateQueue:function(){this.addToStateQueue();this.forEachVisibleChild(function(){this.recursiveAddToStateQueue()})},_recursiveAppearanceThemeUpdate:function(a,b){arguments.callee.base.call(this,a,b);this.forEachVisibleChild(function(){this._recursiveAppearanceThemeUpdate(a,b)})},_addChildToChildrenQueue:function(a){if(!a._isInParentChildrenQueue&&a._isDisplayable){qx.ui.core.Widget.addToGlobalLayoutQueue(this);if(!this._childrenQueue){this._childrenQueue={}}this._childrenQueue[a.toHashCode()]=a}},_removeChildFromChildrenQueue:function(a){if(this._childrenQueue&&a._isInParentChildrenQueue){delete this._childrenQueue[a.toHashCode()];if(qx.lang.Object.isEmpty(this._childrenQueue)){this._childrenQueue={};qx.ui.core.Widget.removeFromGlobalLayoutQueue(this)}}},_flushChildrenQueue:function(){if(!qx.lang.Object.isEmpty(this._childrenQueue)){this.getLayoutImpl().flushChildrenQueue(this._childrenQueue);delete this._childrenQueue}},_addChildrenToLayoutQueue:function(a){this.forEachChild(function(){this.addToLayoutChanges(a)})},_layoutChild:function(c){if(!c._isDisplayable){return}var a=c._layoutChanges;try{if(c.renderBorder&&a.border){c.renderBorder(a)}}catch(b){throw new Error("Could not apply border to child "+c+" "+b)}try{if(c.renderPadding){if(a.paddingLeft||a.paddingRight||a.paddingTop||a.paddingBottom){c.renderPadding(a)}}}catch(b){throw new Error("Could not apply padding to child "+c+" "+b)}try{this.getLayoutImpl().layoutChild(c,a)}catch(b){throw new Error("Could not layout child "+c+" through layout handler "+b)}try{c._layoutPost(a)}catch(b){throw new Error("Could not post layout child "+c+" "+b)}try{if(a.initial){c._initialLayoutDone=true;qx.ui.core.Widget.addToGlobalDisplayQueue(c)}}catch(b){throw new Error("Could not handle display updates from layout flush for child "+c+" "+b)}c._layoutChanges={};delete c._isInParentLayoutQueue;delete this._childrenQueue[c.toHashCode()]},_layoutPost:function(a){this.createDispatchDataEvent("flush",a)},_computePreferredInnerWidth:function(){return this.getLayoutImpl().computeChildrenNeededWidth()},_computePreferredInnerHeight:function(){return this.getLayoutImpl().computeChildrenNeededHeight()},_changeInnerWidth:function(c,a){var b=this.getLayoutImpl();if(b.invalidateChildrenFlexWidth){b.invalidateChildrenFlexWidth()}this.forEachVisibleChild(function(){if(b.updateChildOnInnerWidthChange(this)&&this._recomputeBoxWidth()){this._recomputeOuterWidth();this._recomputeInnerWidth()}})},_changeInnerHeight:function(c,a){var b=this.getLayoutImpl();if(b.invalidateChildrenFlexHeight){b.invalidateChildrenFlexHeight()}this.forEachVisibleChild(function(){if(b.updateChildOnInnerHeightChange(this)&&this._recomputeBoxHeight()){this._recomputeOuterHeight();this._recomputeInnerHeight()}})},getInnerWidthForChild:function(a){return this.getInnerWidth()},getInnerHeightForChild:function(a){return this.getInnerHeight()},_remappingChildTable:["add",$[247],"addAt","addAtBegin","addAtEnd","removeAt","addBefore","addAfter","removeAll"],_remapStart:"return this._remappingChildTarget.",_remapStop:".apply(this._remappingChildTarget, arguments)",remapChildrenHandlingTo:function(e){var c=this._remappingChildTable;this._remappingChildTarget=e;for(var b=0,a=c.length,d;b<a;b++){d=c[b];this[d]=new Function(qx.ui.core.Parent.prototype._remapStart+d+qx.ui.core.Parent.prototype._remapStop)}}},defer:function(c,a,b){if(qx.core.Variant.isSet($[0],$[121])){a._layoutChildOrig=a._layoutChild;a._layoutChild=function(g){if(!g._initialLayoutDone||!g._layoutChanges.border){return this._layoutChildOrig(g)}var d=g.getElement().style;var f=d.display;d.display="none";var e=this._layoutChildOrig(g);d.display=f;return e}}},destruct:function(){this._disposeObjectDeep("_children",1);this._disposeObjects("_layoutImpl","_focusHandler");this._disposeFields($[545],$[545],"_remappingChildTable","_remappingChildTarget","_cachedVisibleChildren")}});
-qx.Class.define($[240],{extend:qx.event.type.Event,construct:function(a,b){arguments.callee.base.call(this,a);this.setTarget(b);switch(a){case $[217]:case $[176]:this.setBubbles(true);this.setPropagationStopped(false)}}});
-qx.Class.define("org.eclipse.rwt.EventHandler",{type:$[118],statics:{_filter:{},_allowContextMenu:qx.lang.Function.returnFalse,_captureWidget:null,_focusRoot:null,_menuManager:null,_focused:false,_lastMouseEventType:null,_lastMouseDown:false,_lastMouseEventDate:0,_mouseIsDown:false,init:function(){var a=qx.lang.Function;this.__onmouseevent=a.bind(this._onmouseevent,this);this.__ondragevent=a.bind(this._ondragevent,this);this.__onselectevent=a.bind(this._onselectevent,this);this.__onwindowblur=a.bind(this._onwindowblur,this);this.__onwindowfocus=a.bind(this._onwindowfocus,this);this.__onwindowresize=a.bind(this._onwindowresize,this);this.__onKeyEvent=qx.lang.Function.bind(this._onKeyEvent,this)},cleanUp:function(){delete this.__onmouseevent;delete this.__ondragevent;delete this.__onselectevent;delete this.__onwindowblur;delete this.__onwindowfocus;delete this.__onwindowresize;delete this.__onKeyEvent;delete this._lastMouseEventType;delete this._lastMouseDown;delete this._lastMouseEventDate;delete this._lastMouseDownDomTarget;delete this._lastMouseDownDispatchTarget;org.eclipse.rwt.EventHandlerUtil.cleanUp()},attachEvents:function(){var a=qx.html.EventRegistration;this.attachEventTypes(this._mouseEventTypes,this.__onmouseevent);this.attachEventTypes(this._dragEventTypes,this.__ondragevent);this.attachEventTypes(this._keyEventTypes,this.__onKeyEvent);a.addEventListener(window,"blur",this.__onwindowblur);a.addEventListener(window,$[74],this.__onwindowfocus);a.addEventListener(window,"resize",this.__onwindowresize);document.body.onselect=this.__onselectevent;document.onselectstart=this.__onselectevent;document.onselectionchange=this.__onselectevent},detachEvents:function(){var a=qx.html.EventRegistration;this.detachEventTypes(this._mouseEventTypes,this.__onmouseevent);this.detachEventTypes(this._dragEventTypes,this.__ondragevent);this.detachEventTypes(this._keyEventTypes,this.__onKeyEvent);a.removeEventListener(window,"blur",this.__onwindowblur);a.removeEventListener(window,$[74],this.__onwindowfocus);a.removeEventListener(window,"resize",this.__onwindowresize);document.body.onselect=null;document.onselectstart=null;document.onselectionchange=null},setCaptureWidget:function(a){if(this._captureWidget!==a){if(this._captureWidget!==null){this._captureWidget.setCapture(false)}this._captureWidget=a;if(a!=null){a.setCapture(true)}}},getCaptureWidget:function(){return this._captureWidget},setFocusRoot:function(a){if(a!==this._focusRoot){if(this._focusRoot!==null){this._focusRoot.setFocusedChild(null)}this._focusRoot=a;if(a!==null&&a.getFocusedChild()===null){a.setFocusedChild(a)}}},getFocusRoot:function(){return this._focusRoot},setAllowContextMenu:function(a){this._allowContextMenu=a},setMenuManager:function(a){this._menuManager=a},getMenuManager:function(a){return this._menuManager},setMouseEventFilter:function(b,a){this._filter[$[260]]=[b,a]},setKeyEventFilter:function(b,a){this._filter[$[257]]=[b,a]},_onKeyEvent:function(){try{var b=org.eclipse.rwt.EventHandlerUtil;var e=b.getDomEvent(arguments);var f=b.getKeyCode(e);var a=b.getCharCode(e);var g=b.getEventPseudoTypes(e,f,a);for(var d=0;d<g.length;d++){this._onkeyevent_post(e,g[d],f,a)}b.saveData(e,f,a)}catch(c){org.eclipse.rwt.ErrorHandler.processJavaScriptError(c)}},_onkeyevent_post:function(a,d,c,f){var e=true;if(typeof this._filter[$[257]]!==$[8]){var b=this._filter[$[257]][1];e=this._filter[$[257]][0].call(b,d,c,f,a)}if(e){this._processKeyEvent(a,d,c,f)}},_processKeyEvent:function(a,g,d,f){var b=org.eclipse.rwt.EventHandlerUtil;var c;if(!isNaN(d)&&d!==0){c=b.keyCodeToIdentifier(d)}else{c=b.charCodeToIdentifier(f)}var i=b.getDomTarget(a);var e=this._getKeyEventTarget();var h=new qx.event.type.KeyEvent(g,a,i,e,null,d,f,c);if(e!=null&&e.getEnabled()){switch(c){case $[116]:case"Tab":if(this._menuManager!=null){this._menuManager.update(e,g)}break}if(a.ctrlKey&&c=="A"){switch(i.tagName.toLowerCase()){case $[85]:case $[167]:case"iframe":break;default:b.stopDomEvent(a);break}}e.dispatchEvent(h);if(qx.Class.isDefined($[279])){qx.event.handler.DragAndDropHandler.getInstance().handleKeyEvent(h)}}h.dispose()},_onmouseevent:function(c){try{var d=true;if(typeof this._filter[$[260]]!==$[8]){var b=this._filter[$[260]][1];d=this._filter[$[260]][0].call(b,c)}if(d){this._processMouseEvent(c)}}catch(a){org.eclipse.rwt.ErrorHandler.processJavaScriptError(a)}},_processMouseEvent:qx.core.Variant.select($[0],{mshtml:function(){var a=org.eclipse.rwt.EventHandlerUtil;var b=a.getDomEvent(arguments);var c=a.getDomTarget(b);var d=b.type;if(d==$[45]){if(this._mouseIsDown&&b.button==0){this._onmouseevent_post(b,$[15],c);this._mouseIsDown=false}}else{if(d==$[2]){this._mouseIsDown=true}else{if(d==$[15]){this._mouseIsDown=false}}if(d==$[15]&&!this._lastMouseDown&&((new Date()).valueOf()-this._lastMouseEventDate)<250){this._onmouseevent_post(b,$[2],c)}else{if(d==$[61]&&this._lastMouseEventType==$[15]&&((new Date).valueOf()-this._lastMouseEventDate)<250){this._onmouseevent_post(b,$[29],c)}}switch(d){case $[2]:case $[15]:case $[29]:case $[61]:case $[41]:this._lastMouseEventType=d;this._lastMouseEventDate=(new Date()).valueOf();this._lastMouseDown=d==$[2];break}}this._onmouseevent_post(b,d,c)},"default":function(b){var a=org.eclipse.rwt.EventHandlerUtil;var c=a.getDomTarget(b);var d=b.type;switch(d){case $[439]:d=$[56];break;case $[29]:case $[61]:if(b.which!==1){return}}this._onmouseevent_post(b,d,c)}}),_onmouseevent_post:function(d,k,m){var f=org.eclipse.rwt.EventHandlerUtil;var j=this.getCaptureWidget();var b=f.getOriginalTargetObject(m);var i=f.getTargetObject(null,b,true);if(!i){return}var g=j?j:i;var o=this._onmouseevent_click_fix(m,k,g);if(k==$[41]&&!this._allowContextMenu(b,m)){f.stopDomEvent(d)}if(g.getEnabled()&&k==$[2]){qx.event.handler.FocusHandler.mouseFocus=true;var l=g.getFocusRoot();if(l){this.setFocusRoot(l);var h=g;while(!h.isFocusable()&&h!=l){h=h.getParent()}l.setFocusedChild(h);l.setActiveChild(g)}}if(k==$[9]||k==$[14]){var c=f.getRelatedTargetObjectFromEvent(d);var n=k==$[9]?$[264]:"elementOut";this._fireElementHoverEvents(n,d,m,i,b,c,g);if(c==i){return}}var a=new qx.event.type.MouseEvent(k,d,m,i,b,c);qx.event.type.MouseEvent.storeEventState(a);if(g.getEnabled()){g.dispatchEvent(a);this._onmouseevent_special_post(k,i,b,g,a,d)}else{if(k==$[9]){var e=qx.ui.popup.ToolTipManager.getInstance();e.handleMouseEvent(a)}}a.dispose();qx.ui.core.Widget.flushGlobalQueues();if(o){this._onmouseevent_post(d,$[29],this._lastMouseDownDomTarget);this._lastMouseDownDomTarget=null;this._lastMouseDownDispatchTarget=null}},_fireElementHoverEvents:function(e,d,f,g,c,b,h){if(h.getEnabled()){var a=new qx.event.type.MouseEvent(e,d,f,g,c,b);h.dispatchEvent(a)}},_onmouseevent_special_post:function(d,f,b,c,e,a){switch(d){case $[2]:qx.ui.popup.PopupManager.getInstance().update(f);if(this._menuManager!=null){this._menuManager.update(f,d)}qx.ui.embed.IframeManager.getInstance().handleMouseDown(e);break;case $[15]:if(this._menuManager!=null){this._menuManager.update(f,d)}if(qx.Class.isDefined($[510])){qx.ui.embed.IframeManager.getInstance().handleMouseUp(e)}break}qx.ui.popup.ToolTipManager.getInstance().handleMouseEvent(e);this._ignoreWindowBlur=d===$[2];if(qx.Class.isDefined($[279])&&f){qx.event.handler.DragAndDropHandler.getInstance().handleMouseEvent(e)}},_ondragevent:function(c){try{var a=org.eclipse.rwt.EventHandlerUtil;if(!c){c=window.event}a.stopDomEvent(c)}catch(b){org.eclipse.rwt.ErrorHandler.processJavaScriptError(b)}},_onselectevent:function(){try{var a=org.eclipse.rwt.EventHandlerUtil;var d=a.getDomEvent(arguments);var c=a.getOriginalTargetObjectFromEvent(d);while(c){if(c.getSelectable()!=null){if(!c.getSelectable()){a.stopDomEvent(d)}break}c=c.getParent()}}catch(b){org.eclipse.rwt.ErrorHandler.processJavaScriptError(b)}},_onwindowblur:function(b){try{if(!this._focused||this._ignoreWindowBlur||b.originalTarget!=window){return}this._focused=false;this.setCaptureWidget(null);if(qx.Class.isDefined($[329])){qx.ui.popup.PopupManager.getInstance().update()}if(this._menuManager){this._menuManager.update()}if(qx.Class.isDefined($[279])){qx.event.handler.DragAndDropHandler.getInstance().globalCancelDrag()}qx.ui.core.ClientDocument.getInstance().createDispatchEvent($[249])}catch(a){org.eclipse.rwt.ErrorHandler.processJavaScriptError(a)}},_onwindowfocus:function(b){try{if(this._focused){return}this._focused=true;qx.ui.core.ClientDocument.getInstance().createDispatchEvent("windowfocus")}catch(a){org.eclipse.rwt.ErrorHandler.processJavaScriptError(a)}},_onwindowresize:function(g){try{var f=qx.ui.core.ClientDocument.getInstance();var b=f.getInnerWidth();var h=f.getInnerHeight();var d=f._computeInnerWidth();var a=f._computeInnerHeight();if(d!==b||a!==h){qx.ui.core.ClientDocument.getInstance().createDispatchEvent($[271])}}catch(c){org.eclipse.rwt.ErrorHandler.processJavaScriptError(c)}},_mouseEventTypes:[$[9],$[45],$[14],$[2],$[15],$[29],$[61],$[41],qx.core.Variant.isSet($[0],$[40])?$[439]:$[56]],_keyEventTypes:[$[24],$[12],$[60]],_dragEventTypes:qx.core.Variant.select($[0],{gecko:[$[226],$[152],$[319],"dragexit",$[535]],mshtml:[$[292],$[152],$[75],"drag",$[319],"dragleave"],"default":[$[75],$[226],$[152],"drag","dragleave",$[319],"dragexit",$[535]]}),_getKeyEventTarget:function(){var a=this.getFocusRoot();return this.getCaptureWidget()||(a==null?null:a.getActiveChild())},attachEventTypes:function(f,e){try{var d=qx.core.Variant.isSet($[0],$[40])?window:document.body;for(var c=0,a=f.length;c<a;c++){qx.html.EventRegistration.addEventListener(d,f[c],e)}}catch(b){throw new Error("EventHandler: Failed to attach window event types: "+f+": "+b)}},detachEventTypes:function(f,e){try{var d=qx.core.Variant.isSet($[0],$[40])?window:document.body;for(var c=0,a=f.length;c<a;c++){qx.html.EventRegistration.removeEventListener(d,f[c],e)}}catch(b){throw new Error("EventHandler: Failed to detach window event types: "+f+": "+b)}},_onmouseevent_click_fix:qx.core.Variant.select($[0],{gecko:function(a,d,c){var b=false;switch(d){case $[2]:this._lastMouseDownDomTarget=a;this._lastMouseDownDispatchTarget=c;break;case $[15]:if(this._lastMouseDownDispatchTarget===c&&a!==this._lastMouseDownDomTarget){b=true}else{this._lastMouseDownDomTarget=null;this._lastMouseDownDispatchTarget=null}break}return b},"default":function(){return false}})}});
+qx.Class.define("qx.html.StyleSheet",{statics:{createElement:qx.lang.Object.select(document.createStyleSheet?"ie4+":"other",{"ie4+":function(a){var b=document.createStyleSheet();if(a){b.cssText=a}return b},other:function(b){var a=document.createElement($[84]);a.type="text/css";a.appendChild(document.createTextNode(b||"body {}"));document.getElementsByTagName("head")[0].appendChild(a);if(a.sheet){return a.sheet}else{var d=document.styleSheets;for(var c=d.length-1;c>=0;c--){if(d[c].ownerNode==a){return d[c]}}}throw"Error: Could not get a reference to the sheet object"}}),addRule:qx.lang.Object.select(document.createStyleSheet?"ie4+":"other",{"ie4+":function(a,c,b){a.addRule(c,b)},other:function(a,c,b){a.insertRule(c+"{"+b+"}",a.cssRules.length)}}),removeRule:qx.lang.Object.select(document.createStyleSheet?"ie4+":"other",{"ie4+":function(b,e){var d=b.rules;var c=d.length;for(var a=c-1;a>=0;a--){if(d[a].selectorText==e){b.removeRule(a)}}},other:function(b,e){var d=b.cssRules;var c=d.length;for(var a=c-1;a>=0;a--){if(d[a].selectorText==e){b.deleteRule(a)}}}}),removeAllRules:qx.lang.Object.select(document.createStyleSheet?"ie4+":"other",{"ie4+":function(b){var d=b.rules;var c=d.length;for(var a=c-1;a>=0;a--){b.removeRule(a)}},other:function(b){var d=b.cssRules;var c=d.length;for(var a=c-1;a>=0;a--){b.deleteRule(a)}}})}});
+qx.Class.define($[433],{extend:qx.ui.core.Widget,type:$[97],construct:function(){arguments.callee.base.call(this);this._children=[];this._layoutImpl=this._createLayoutImpl()},properties:{focusHandler:{check:$[502],apply:"_applyFocusHandler",nullable:true},activeChild:{check:$[152],event:$[355],nullable:true},focusedChild:{check:$[152],apply:"_applyFocusedChild",event:$[220],nullable:true},visibleChildren:{_cached:true,defaultValue:null}},members:{isFocusRoot:function(){return this.getFocusHandler()!=null},getFocusRoot:function(){if(this.isFocusRoot()){return this}if(this._hasParent){return this.getParent().getFocusRoot()}return null},activateFocusRoot:function(){if(this._focusHandler){return}this._focusHandler=new qx.event.handler.FocusHandler(this);this.setFocusHandler(this._focusHandler)},_onfocuskeyevent:function(a){this.getFocusHandler()._onkeyevent(this,a)},_applyFocusHandler:function(b,a){if(b){this.addEventListener($[12],this._onfocuskeyevent);if(this.getTabIndex()<1){this.setTabIndex(1)}this.setHideFocus(true);this.setActiveChild(this)}else{this.removeEventListener($[23],this._onfocuskeyevent);this.removeEventListener($[12],this._onfocuskeyevent);this.setTabIndex(null);this.setHideFocus(false)}},_applyFocusedChild:function(f,c){var d=f!=null;var a=c!=null;if(qx.Class.isDefined($[330])&&d){var b=qx.ui.popup.PopupManager.getInstance();if(b){b.update(f)}}if(a){if(c.hasEventListeners($[177])){var e=new qx.event.type.FocusEvent($[177],c);if(d){e.setRelatedTarget(f)}c.dispatchEvent(e);e.dispose()}}if(d){if(f.hasEventListeners($[230])){var e=new qx.event.type.FocusEvent($[230],f);if(a){e.setRelatedTarget(c)}f.dispatchEvent(e);e.dispose()}}if(a){if(this.getActiveChild()==c&&!d){this.setActiveChild(null)}c.setFocused(false);var e=new qx.event.type.FocusEvent("blur",c);if(d){e.setRelatedTarget(f)}c.dispatchEvent(e);var b=qx.ui.popup.ToolTipManager.getInstance();if(b){b.handleBlur(e)}e.dispose()}if(d){this.setActiveChild(f);f.setFocused(true);org.eclipse.rwt.EventHandler.setFocusRoot(this);var e=new qx.event.type.FocusEvent($[66],f);if(a){e.setRelatedTarget(c)}f.dispatchEvent(e);var b=qx.ui.popup.ToolTipManager.getInstance();if(b){b.handleFocus(e)}e.dispose()}},_layoutImpl:null,_createLayoutImpl:function(){return null},getLayoutImpl:function(){return this._layoutImpl},getChildren:function(){return this._children},getChildrenLength:function(){return this.getChildren().length},hasChildren:function(){return this.getChildrenLength()>0},isEmpty:function(){return this.getChildrenLength()==0},indexOf:function(a){return this.getChildren().indexOf(a)},contains:function(a){switch(a){case null:return false;case this:return true;default:return this.contains(a.getParent())}},_computeVisibleChildren:function(){var c=[];var a=this.getChildren();if(!a){return 0}var d=a.length;for(var b=0;b<d;b++){var e=a[b];if(e._isDisplayable){c.push(e)}}return c},getVisibleChildrenLength:function(){return this.getVisibleChildren().length},hasVisibleChildren:function(){return this.getVisibleChildrenLength()>0},isVisibleEmpty:function(){return this.getVisibleChildrenLength()==0},add:function(b){var d;for(var c=0,a=arguments.length;c<a;c++){d=arguments[c];if(!(d instanceof qx.ui.core.Parent)&&!(d instanceof qx.ui.basic.Terminator)){throw new Error($[477]+d)}else{d.setParent(this)}}return this},addAt:function(d,b){if(b==null||b<0){throw new Error("Not a valid index for addAt(): "+b)}if(d.getParent()==this){var a=this.getChildren();var c=a.indexOf(d);if(c!=b){if(c!=-1){qx.lang.Array.removeAt(a,c)}qx.lang.Array.insertAt(a,d,b);if(this._initialLayoutDone){this._invalidateVisibleChildren();this.getLayoutImpl().updateChildrenOnMoveChild(d,b,c)}}}else{d._insertIndex=b;d.setParent(this)}},addAtBegin:function(a){return this.addAt(a,0)},addAtEnd:function(b){var a=this.getChildrenLength();return this.addAt(b,b.getParent()==this?a-1:a)},addBefore:function(e,d){var a=this.getChildren();var c=a.indexOf(d);if(c==-1){throw new Error("Child to add before: "+d+$[527])}var b=a.indexOf(e);if(b==-1||b>c){c++}return this.addAt(e,Math.max(0,c-1))},addAfter:function(e,d){var a=this.getChildren();var c=a.indexOf(d);if(c==-1){throw new Error("Child to add after: "+d+$[527])}var b=a.indexOf(e);if(b!=-1&&b<c){c--}return this.addAt(e,Math.min(a.length,c+1))},remove:function(b){var d;for(var c=0,a=arguments.length;c<a;c++){d=arguments[c];if(!(d instanceof qx.ui.core.Parent)&&!(d instanceof qx.ui.basic.Terminator)){throw new Error($[477]+d)}else{if(d.getParent()==this){d.setParent(null)}}}},removeAt:function(a){var b=this.getChildren()[a];if(b){delete b._insertIndex;b.setParent(null)}},removeAll:function(){var a=this.getChildren();var b=a[0];while(b){this.remove(b);b=a[0]}},getFirstChild:function(){return qx.lang.Array.getFirst(this.getChildren())||null},getFirstVisibleChild:function(){return qx.lang.Array.getFirst(this.getVisibleChildren())||null},getFirstActiveChild:function(a){return qx.ui.core.Widget.getActiveSiblingHelper(null,this,1,a,"first")||null},getLastChild:function(){return qx.lang.Array.getLast(this.getChildren())||null},getLastVisibleChild:function(){return qx.lang.Array.getLast(this.getVisibleChildren())||null},getLastActiveChild:function(a){return qx.ui.core.Widget.getActiveSiblingHelper(null,this,-1,a,"last")||null},forEachChild:function(c){var b=this.getChildren(),d,a=-1;if(!b){return}while(d=b[++a]){c.call(d,a)}},forEachVisibleChild:function(c){var b=this.getVisibleChildren(),d,a=-1;if(!b){return}while(d=b[++a]){c.call(d,a)}},_beforeAppear:function(){arguments.callee.base.call(this);this.forEachVisibleChild(function(){if(this.isAppearRelevant()){this._beforeAppear()}})},_afterAppear:function(){arguments.callee.base.call(this);this.forEachVisibleChild(function(){if(this.isAppearRelevant()){this._afterAppear()}})},_beforeDisappear:function(){arguments.callee.base.call(this);this.forEachVisibleChild(function(){if(this.isAppearRelevant()){this._beforeDisappear()}})},_afterDisappear:function(){arguments.callee.base.call(this);this.forEachVisibleChild(function(){if(this.isAppearRelevant()){this._afterDisappear()}})},_afterInsertDom:function(){arguments.callee.base.call(this);this.forEachVisibleChild(function(){this._afterInsertDom()})},_afterRemoveDom:function(){arguments.callee.base.call(this);this.forEachVisibleChild(function(){this._afterRemoveDom()})},_handleDisplayableCustom:function(c,a,b){this.forEachChild(function(){this._handleDisplayable()})},_addChildrenToStateQueue:function(){this.forEachVisibleChild(function(){this.addToStateQueue()})},recursiveAddToStateQueue:function(){this.addToStateQueue();this.forEachVisibleChild(function(){this.recursiveAddToStateQueue()})},_recursiveAppearanceThemeUpdate:function(a,b){arguments.callee.base.call(this,a,b);this.forEachVisibleChild(function(){this._recursiveAppearanceThemeUpdate(a,b)})},_addChildToChildrenQueue:function(a){if(!a._isInParentChildrenQueue&&a._isDisplayable){qx.ui.core.Widget.addToGlobalLayoutQueue(this);if(!this._childrenQueue){this._childrenQueue={}}this._childrenQueue[a.toHashCode()]=a}},_removeChildFromChildrenQueue:function(a){if(this._childrenQueue&&a._isInParentChildrenQueue){delete this._childrenQueue[a.toHashCode()];if(qx.lang.Object.isEmpty(this._childrenQueue)){this._childrenQueue={};qx.ui.core.Widget.removeFromGlobalLayoutQueue(this)}}},_flushChildrenQueue:function(){if(!qx.lang.Object.isEmpty(this._childrenQueue)){this.getLayoutImpl().flushChildrenQueue(this._childrenQueue);delete this._childrenQueue}},_addChildrenToLayoutQueue:function(a){this.forEachChild(function(){this.addToLayoutChanges(a)})},_layoutChild:function(c){if(!c._isDisplayable){return}var a=c._layoutChanges;try{if(c.renderBorder&&a.border){c.renderBorder(a)}}catch(b){throw new Error("Could not apply border to child "+c+" "+b)}try{if(c.renderPadding){if(a.paddingLeft||a.paddingRight||a.paddingTop||a.paddingBottom){c.renderPadding(a)}}}catch(b){throw new Error("Could not apply padding to child "+c+" "+b)}try{this.getLayoutImpl().layoutChild(c,a)}catch(b){throw new Error("Could not layout child "+c+" through layout handler "+b)}try{c._layoutPost(a)}catch(b){throw new Error("Could not post layout child "+c+" "+b)}try{if(a.initial){c._initialLayoutDone=true;qx.ui.core.Widget.addToGlobalDisplayQueue(c)}}catch(b){throw new Error("Could not handle display updates from layout flush for child "+c+" "+b)}c._layoutChanges={};delete c._isInParentLayoutQueue;delete this._childrenQueue[c.toHashCode()]},_layoutPost:function(a){this.createDispatchDataEvent("flush",a)},_computePreferredInnerWidth:function(){return this.getLayoutImpl().computeChildrenNeededWidth()},_computePreferredInnerHeight:function(){return this.getLayoutImpl().computeChildrenNeededHeight()},_changeInnerWidth:function(c,a){var b=this.getLayoutImpl();if(b.invalidateChildrenFlexWidth){b.invalidateChildrenFlexWidth()}this.forEachVisibleChild(function(){if(b.updateChildOnInnerWidthChange(this)&&this._recomputeBoxWidth()){this._recomputeOuterWidth();this._recomputeInnerWidth()}})},_changeInnerHeight:function(c,a){var b=this.getLayoutImpl();if(b.invalidateChildrenFlexHeight){b.invalidateChildrenFlexHeight()}this.forEachVisibleChild(function(){if(b.updateChildOnInnerHeightChange(this)&&this._recomputeBoxHeight()){this._recomputeOuterHeight();this._recomputeInnerHeight()}})},getInnerWidthForChild:function(a){return this.getInnerWidth()},getInnerHeightForChild:function(a){return this.getInnerHeight()},_remappingChildTable:["add",$[246],"addAt","addAtBegin","addAtEnd","removeAt","addBefore","addAfter","removeAll"],_remapStart:"return this._remappingChildTarget.",_remapStop:".apply(this._remappingChildTarget, arguments)",remapChildrenHandlingTo:function(e){var c=this._remappingChildTable;this._remappingChildTarget=e;for(var b=0,a=c.length,d;b<a;b++){d=c[b];this[d]=new Function(qx.ui.core.Parent.prototype._remapStart+d+qx.ui.core.Parent.prototype._remapStop)}}},defer:function(c,a,b){if(qx.core.Variant.isSet($[0],$[122])){a._layoutChildOrig=a._layoutChild;a._layoutChild=function(g){if(!g._initialLayoutDone||!g._layoutChanges.border){return this._layoutChildOrig(g)}var d=g.getElement().style;var f=d.display;d.display="none";var e=this._layoutChildOrig(g);d.display=f;return e}}},destruct:function(){this._disposeObjectDeep("_children",1);this._disposeObjects("_layoutImpl","_focusHandler");this._disposeFields($[505],$[505],"_remappingChildTable","_remappingChildTarget","_cachedVisibleChildren")}});
+qx.Class.define($[234],{extend:qx.event.type.Event,construct:function(a,b){arguments.callee.base.call(this,a);this.setTarget(b);switch(a){case $[230]:case $[177]:this.setBubbles(true);this.setPropagationStopped(false)}}});
+qx.Class.define("org.eclipse.rwt.EventHandler",{type:$[119],statics:{_filter:{},_allowContextMenu:qx.lang.Function.returnFalse,_captureWidget:null,_focusRoot:null,_menuManager:null,_focused:false,_lastMouseEventType:null,_lastMouseDown:false,_lastMouseEventDate:0,_mouseIsDown:false,init:function(){var a=qx.lang.Function;this.__onmouseevent=a.bind(this._onmouseevent,this);this.__ondragevent=a.bind(this._ondragevent,this);this.__onselectevent=a.bind(this._onselectevent,this);this.__onwindowblur=a.bind(this._onwindowblur,this);this.__onwindowfocus=a.bind(this._onwindowfocus,this);this.__onwindowresize=a.bind(this._onwindowresize,this);this.__onKeyEvent=qx.lang.Function.bind(this._onKeyEvent,this)},cleanUp:function(){delete this.__onmouseevent;delete this.__ondragevent;delete this.__onselectevent;delete this.__onwindowblur;delete this.__onwindowfocus;delete this.__onwindowresize;delete this.__onKeyEvent;delete this._lastMouseEventType;delete this._lastMouseDown;delete this._lastMouseEventDate;delete this._lastMouseDownDomTarget;delete this._lastMouseDownDispatchTarget;org.eclipse.rwt.EventHandlerUtil.cleanUp()},attachEvents:function(){var a=qx.html.EventRegistration;this.attachEventTypes(this._mouseEventTypes,this.__onmouseevent);this.attachEventTypes(this._dragEventTypes,this.__ondragevent);this.attachEventTypes(this._keyEventTypes,this.__onKeyEvent);a.addEventListener(window,"blur",this.__onwindowblur);a.addEventListener(window,$[66],this.__onwindowfocus);a.addEventListener(window,"resize",this.__onwindowresize);document.body.onselect=this.__onselectevent;document.onselectstart=this.__onselectevent;document.onselectionchange=this.__onselectevent},detachEvents:function(){var a=qx.html.EventRegistration;this.detachEventTypes(this._mouseEventTypes,this.__onmouseevent);this.detachEventTypes(this._dragEventTypes,this.__ondragevent);this.detachEventTypes(this._keyEventTypes,this.__onKeyEvent);a.removeEventListener(window,"blur",this.__onwindowblur);a.removeEventListener(window,$[66],this.__onwindowfocus);a.removeEventListener(window,"resize",this.__onwindowresize);document.body.onselect=null;document.onselectstart=null;document.onselectionchange=null},setCaptureWidget:function(a){if(this._captureWidget!==a){if(this._captureWidget!==null){this._captureWidget.setCapture(false)}this._captureWidget=a;if(a!=null){a.setCapture(true)}}},getCaptureWidget:function(){return this._captureWidget},setFocusRoot:function(a){if(a!==this._focusRoot){if(this._focusRoot!==null){this._focusRoot.setFocusedChild(null)}this._focusRoot=a;if(a!==null&&a.getFocusedChild()===null){a.setFocusedChild(a)}}},getFocusRoot:function(){return this._focusRoot},setAllowContextMenu:function(a){this._allowContextMenu=a},setMenuManager:function(a){this._menuManager=a},getMenuManager:function(a){return this._menuManager},setMouseEventFilter:function(b,a){this._filter[$[276]]=[b,a]},setKeyEventFilter:function(b,a){this._filter[$[285]]=[b,a]},_onKeyEvent:function(){try{var b=org.eclipse.rwt.EventHandlerUtil;var e=b.getDomEvent(arguments);var f=b.getKeyCode(e);var a=b.getCharCode(e);var g=b.getEventPseudoTypes(e,f,a);for(var d=0;d<g.length;d++){this._onkeyevent_post(e,g[d],f,a)}b.saveData(e,f,a)}catch(c){org.eclipse.rwt.ErrorHandler.processJavaScriptError(c)}},_onkeyevent_post:function(a,d,c,f){var e=true;if(typeof this._filter[$[285]]!==$[8]){var b=this._filter[$[285]][1];e=this._filter[$[285]][0].call(b,d,c,f,a)}if(e){this._processKeyEvent(a,d,c,f)}},_processKeyEvent:function(a,g,d,f){var b=org.eclipse.rwt.EventHandlerUtil;var c;if(!isNaN(d)&&d!==0){c=b.keyCodeToIdentifier(d)}else{c=b.charCodeToIdentifier(f)}var i=b.getDomTarget(a);var e=this._getKeyEventTarget();var h=new qx.event.type.KeyEvent(g,a,i,e,null,d,f,c);if(e!=null&&e.getEnabled()){switch(c){case $[118]:case"Tab":if(this._menuManager!=null){this._menuManager.update(e,g)}break}if(a.ctrlKey&&c=="A"){switch(i.tagName.toLowerCase()){case $[82]:case $[174]:case"iframe":break;default:b.stopDomEvent(a);break}}e.dispatchEvent(h);if(qx.Class.isDefined($[304])){qx.event.handler.DragAndDropHandler.getInstance().handleKeyEvent(h)}}h.dispose()},_onmouseevent:function(c){try{var d=true;if(typeof this._filter[$[276]]!==$[8]){var b=this._filter[$[276]][1];d=this._filter[$[276]][0].call(b,c)}if(d){this._processMouseEvent(c)}}catch(a){org.eclipse.rwt.ErrorHandler.processJavaScriptError(a)}},_processMouseEvent:qx.core.Variant.select($[0],{mshtml:function(){var a=org.eclipse.rwt.EventHandlerUtil;var b=a.getDomEvent(arguments);var c=a.getDomTarget(b);var d=b.type;if(d==$[45]){if(this._mouseIsDown&&b.button==0){this._onmouseevent_post(b,$[15],c);this._mouseIsDown=false}}else{if(d==$[2]){this._mouseIsDown=true}else{if(d==$[15]){this._mouseIsDown=false}}if(d==$[15]&&!this._lastMouseDown&&((new Date()).valueOf()-this._lastMouseEventDate)<250){this._onmouseevent_post(b,$[2],c)}else{if(d==$[62]&&this._lastMouseEventType==$[15]&&((new Date).valueOf()-this._lastMouseEventDate)<250){this._onmouseevent_post(b,$[29],c)}}switch(d){case $[2]:case $[15]:case $[29]:case $[62]:case $[41]:this._lastMouseEventType=d;this._lastMouseEventDate=(new Date()).valueOf();this._lastMouseDown=d==$[2];break}}this._onmouseevent_post(b,d,c)},"default":function(b){var a=org.eclipse.rwt.EventHandlerUtil;var c=a.getDomTarget(b);var d=b.type;switch(d){case $[430]:d=$[55];break;case $[29]:case $[62]:if(b.which!==1){return}}this._onmouseevent_post(b,d,c)}}),_onmouseevent_post:function(d,k,m){var f=org.eclipse.rwt.EventHandlerUtil;var j=this.getCaptureWidget();var b=f.getOriginalTargetObject(m);var i=f.getTargetObject(null,b,true);if(!i){return}var g=j?j:i;var o=this._onmouseevent_click_fix(m,k,g);if(k==$[41]&&!this._allowContextMenu(b,m)){f.stopDomEvent(d)}if(g.getEnabled()&&k==$[2]){qx.event.handler.FocusHandler.mouseFocus=true;var l=g.getFocusRoot();if(l){this.setFocusRoot(l);var h=g;while(!h.isFocusable()&&h!=l){h=h.getParent()}l.setFocusedChild(h);l.setActiveChild(g)}}if(k==$[9]||k==$[14]){var c=f.getRelatedTargetObjectFromEvent(d);var n=k==$[9]?$[307]:"elementOut";this._fireElementHoverEvents(n,d,m,i,b,c,g);if(c==i){return}}var a=new qx.event.type.MouseEvent(k,d,m,i,b,c);qx.event.type.MouseEvent.storeEventState(a);if(g.getEnabled()){g.dispatchEvent(a);this._onmouseevent_special_post(k,i,b,g,a,d)}else{if(k==$[9]){var e=qx.ui.popup.ToolTipManager.getInstance();e.handleMouseEvent(a)}}a.dispose();qx.ui.core.Widget.flushGlobalQueues();if(o){this._onmouseevent_post(d,$[29],this._lastMouseDownDomTarget);this._lastMouseDownDomTarget=null;this._lastMouseDownDispatchTarget=null}},_fireElementHoverEvents:function(e,d,f,g,c,b,h){if(h.getEnabled()){var a=new qx.event.type.MouseEvent(e,d,f,g,c,b);h.dispatchEvent(a)}},_onmouseevent_special_post:function(d,f,b,c,e,a){switch(d){case $[2]:qx.ui.popup.PopupManager.getInstance().update(f);if(this._menuManager!=null){this._menuManager.update(f,d)}qx.ui.embed.IframeManager.getInstance().handleMouseDown(e);break;case $[15]:if(this._menuManager!=null){this._menuManager.update(f,d)}if(qx.Class.isDefined($[506])){qx.ui.embed.IframeManager.getInstance().handleMouseUp(e)}break}qx.ui.popup.ToolTipManager.getInstance().handleMouseEvent(e);this._ignoreWindowBlur=d===$[2];if(qx.Class.isDefined($[304])&&f){qx.event.handler.DragAndDropHandler.getInstance().handleMouseEvent(e)}},_ondragevent:function(c){try{var a=org.eclipse.rwt.EventHandlerUtil;if(!c){c=window.event}a.stopDomEvent(c)}catch(b){org.eclipse.rwt.ErrorHandler.processJavaScriptError(b)}},_onselectevent:function(){try{var a=org.eclipse.rwt.EventHandlerUtil;var d=a.getDomEvent(arguments);var c=a.getOriginalTargetObjectFromEvent(d);while(c){if(c.getSelectable()!=null){if(!c.getSelectable()){a.stopDomEvent(d)}break}c=c.getParent()}}catch(b){org.eclipse.rwt.ErrorHandler.processJavaScriptError(b)}},_onwindowblur:function(b){try{if(!this._focused||this._ignoreWindowBlur||b.originalTarget!=window){return}this._focused=false;this.setCaptureWidget(null);if(qx.Class.isDefined($[330])){qx.ui.popup.PopupManager.getInstance().update()}if(this._menuManager){this._menuManager.update()}if(qx.Class.isDefined($[304])){qx.event.handler.DragAndDropHandler.getInstance().globalCancelDrag()}qx.ui.core.ClientDocument.getInstance().createDispatchEvent($[243])}catch(a){org.eclipse.rwt.ErrorHandler.processJavaScriptError(a)}},_onwindowfocus:function(b){try{if(this._focused){return}this._focused=true;qx.ui.core.ClientDocument.getInstance().createDispatchEvent("windowfocus")}catch(a){org.eclipse.rwt.ErrorHandler.processJavaScriptError(a)}},_onwindowresize:function(g){try{var f=qx.ui.core.ClientDocument.getInstance();var b=f.getInnerWidth();var h=f.getInnerHeight();var d=f._computeInnerWidth();var a=f._computeInnerHeight();if(d!==b||a!==h){qx.ui.core.ClientDocument.getInstance().createDispatchEvent($[316])}}catch(c){org.eclipse.rwt.ErrorHandler.processJavaScriptError(c)}},_mouseEventTypes:[$[9],$[45],$[14],$[2],$[15],$[29],$[62],$[41],qx.core.Variant.isSet($[0],$[40])?$[430]:$[55]],_keyEventTypes:[$[23],$[12],$[60]],_dragEventTypes:qx.core.Variant.select($[0],{gecko:[$[244],$[138],$[342],"dragexit",$[453]],mshtml:[$[289],$[138],$[72],"drag",$[342],"dragleave"],"default":[$[72],$[244],$[138],"drag","dragleave",$[342],"dragexit",$[453]]}),_getKeyEventTarget:function(){var a=this.getFocusRoot();return this.getCaptureWidget()||(a==null?null:a.getActiveChild())},attachEventTypes:function(f,e){try{var d=qx.core.Variant.isSet($[0],$[40])?window:document.body;for(var c=0,a=f.length;c<a;c++){qx.html.EventRegistration.addEventListener(d,f[c],e)}}catch(b){throw new Error("EventHandler: Failed to attach window event types: "+f+": "+b)}},detachEventTypes:function(f,e){try{var d=qx.core.Variant.isSet($[0],$[40])?window:document.body;for(var c=0,a=f.length;c<a;c++){qx.html.EventRegistration.removeEventListener(d,f[c],e)}}catch(b){throw new Error("EventHandler: Failed to detach window event types: "+f+": "+b)}},_onmouseevent_click_fix:qx.core.Variant.select($[0],{gecko:function(a,d,c){var b=false;switch(d){case $[2]:this._lastMouseDownDomTarget=a;this._lastMouseDownDispatchTarget=c;break;case $[15]:if(this._lastMouseDownDispatchTarget===c&&a!==this._lastMouseDownDomTarget){b=true}else{this._lastMouseDownDomTarget=null;this._lastMouseDownDispatchTarget=null}break}return b},"default":function(){return false}})}});
 qx.Class.define("qx.dom.Node",{statics:{ELEMENT:1,ATTRIBUTE:2,TEXT:3,CDATA_SECTION:4,ENTITY_REFERENCE:5,ENTITY:6,PROCESSING_INSTRUCTION:7,COMMENT:8,DOCUMENT:9,DOCUMENT_TYPE:10,DOCUMENT_FRAGMENT:11,NOTATION:12,isDocument:function(a){return !!(a&&a.nodeType===qx.dom.Node.DOCUMENT)},getDocument:function(a){if(this.isDocument(a)){return a}return a.ownerDocument||a.document||null},getWindow:qx.core.Variant.select($[0],{mshtml:function(a){return this.getDocument(a).parentWindow},"default":function(a){return this.getDocument(a).defaultView}})}});
-qx.Class.define("org.eclipse.rwt.EventHandlerUtil",{type:$[118],statics:{_lastUpDownType:{},_lastKeyCode:null,cleanUp:function(){delete this.__onKeyEvent;delete this._lastUpDownType;delete this._lastKeyCode},getDomEvent:qx.core.Variant.select($[0],{mshtml:function(a){return a.length>0?a[0]:window.event},"default":function(a){return a[0]}}),getDomTarget:qx.core.Variant.select($[0],{mshtml:function(a){return a.target||a.srcElement},webkit:function(a){var b=a.target||a.srcElement;if(b&&(b.nodeType==qx.dom.Node.TEXT)){b=b.parentNode}return b},"default":function(a){return a.target}}),stopDomEvent:function(a){if(a.preventDefault){a.preventDefault()}try{a.keyCode=0}catch(b){}a.returnValue=false},getOriginalTargetObject:function(b){if(b==document.documentElement){b=document.body}try{while(b!=null&&b.qx_Widget==null){b=b.parentNode}}catch(a){b=null}return b?b.qx_Widget:null},getOriginalTargetObjectFromEvent:function(a,c){var b=this.getDomTarget(a);if(c){var d=c.document;if(b==c||b==d||b==d.documentElement||b==d.body){return d.body.qx_Widget}}return this.getOriginalTargetObject(b)},getRelatedTargetObjectFromEvent:function(b){var a=org.eclipse.rwt.EventHandlerUtil;var c=b.relatedTarget;if(!c){if(b.type==$[9]){c=b.fromElement}else{c=b.toElement}}return a.getTargetObject(c)},getTargetObject:function(b,a,c){if(!a){var a=this.getOriginalTargetObject(b);if(!a){return null}}while(a){if(!c&&!a.getEnabled()){return null}if(!a.getAnonymous()){break}a=a.getParent()}return a},getKeyCode:qx.core.Variant.select($[0],{gecko:function(a){return a.keyCode},opera:function(b){var a;if(b.type===$[12]){if(this._lastKeyCode===b.keyCode){a=b.keyCode}else{a=0}}else{a=b.keyCode}return a},"default":function(b){var a=b.type!==$[12]||b.keyCode===13;return a?b.keyCode:0}}),getCharCode:qx.core.Variant.select($[0],{"default":function(a){var b=a.type===$[12]&&a.keyCode!==13;return b?a.charCode:0},mshtml:function(a){var b=a.type===$[12]&&a.keyCode!==13;return b?a.keyCode:0},opera:function(b){var a;if(b.type===$[12]){if(this._lastKeyCode!==b.keyCode){a=b.keyCode}else{a=0}}else{a=0}return a}}),_isFirstKeyDown:function(a){return this._lastUpDownType[a]!==$[24]},getEventPseudoTypes:qx.core.Variant.select($[0],{"default":function(c,d,b){var a;if(c.type===$[24]){var e=!this._isNonPrintableKeyCode(d);if(this._isFirstKeyDown(d)){a=e?[$[24]]:[$[24],$[12]]}else{a=e?[]:[$[12]]}}else{a=[c.type]}return a},gecko:function(c,d,b){var a;if(c.type===$[24]&&!this._isFirstKeyDown(d)){a=[]}else{a=[c.type]}return a},opera:function(b,c,a){return[b.type]}}),saveData:function(b,c,a){if(b.type!==$[12]){this._lastUpDownType[c]=b.type;this._lastKeyCode=c}},keyCodeToIdentifier:function(b){var a="Unidentified";if(this._numpadToCharCode[b]!==undefined){a=String.fromCharCode(this._numpadToCharCode[b])}else{if(this._keyCodeToIdentifierMap[b]!==undefined){a=this._keyCodeToIdentifierMap[b]}else{if(this._specialCharCodeMap[b]!==undefined){a=this._specialCharCodeMap[b]}else{if(this._isAlphaNumericKeyCode(b)){a=String.fromCharCode(b)}}}}return a},charCodeToIdentifier:function(b){var a;if(this._specialCharCodeMap[b]!==undefined){a=this._specialCharCodeMap[b]}else{a=String.fromCharCode(b).toUpperCase()}return a},_isNonPrintableKeyCode:function(a){return this._keyCodeToIdentifierMap[a]?true:false},_isAlphaNumericKeyCode:function(b){var a=false;if((b>=this._charCodeA&&b<=this._charCodeZ)||(b>=this._charCode0&&b<=this._charCode9)){a=true}return a},_specialCharCodeMap:{13:$[68],27:$[116],32:$[92]},_keyCodeToIdentifierMap:{8:$[351],9:"Tab",16:"Shift",17:$[266],18:"Alt",20:"CapsLock",224:"Meta",37:"Left",38:"Up",39:$[53],40:"Down",33:$[58],34:$[55],35:"End",36:"Home",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",44:"PrintScreen",145:"Scroll",19:"Pause",91:"Win",93:"Apps"},_numpadToCharCode:{96:"0".charCodeAt(0),97:"1".charCodeAt(0),98:"2".charCodeAt(0),99:"3".charCodeAt(0),100:"4".charCodeAt(0),101:"5".charCodeAt(0),102:"6".charCodeAt(0),103:"7".charCodeAt(0),104:"8".charCodeAt(0),105:"9".charCodeAt(0),106:"*".charCodeAt(0),107:"+".charCodeAt(0),109:"-".charCodeAt(0),110:",".charCodeAt(0),111:"/".charCodeAt(0)},_charCodeA:"A".charCodeAt(0),_charCodeZ:"Z".charCodeAt(0),_charCode0:"0".charCodeAt(0),_charCode9:"9".charCodeAt(0)}});
-qx.Class.define("qx.event.type.DomEvent",{extend:qx.event.type.Event,construct:function(d,b,c,e,a){arguments.callee.base.call(this,d);this.setDomEvent(b);this.setDomTarget(c);this.setTarget(e);this.setOriginalTarget(a)},statics:{SHIFT_MASK:1,CTRL_MASK:2,ALT_MASK:4,META_MASK:8},properties:{bubbles:{_fast:true,defaultValue:true,noCompute:true},propagationStopped:{_fast:true,defaultValue:false,noCompute:true},domEvent:{_fast:true,setOnlyOnce:true,noCompute:true},domTarget:{_fast:true,setOnlyOnce:true,noCompute:true},modifiers:{_cached:true,defaultValue:null}},members:{_computeModifiers:function(){var b=0;var a=this.getDomEvent();if(a.shiftKey){b|=qx.event.type.DomEvent.SHIFT_MASK}if(a.ctrlKey){b|=qx.event.type.DomEvent.CTRL_MASK}if(a.altKey){b|=qx.event.type.DomEvent.ALT_MASK}if(a.metaKey){b|=qx.event.type.DomEvent.META_MASK}return b},isCtrlPressed:function(){return this.getDomEvent().ctrlKey},isShiftPressed:function(){return this.getDomEvent().shiftKey},isAltPressed:function(){return this.getDomEvent().altKey},isMetaPressed:function(){return this.getDomEvent().metaKey},isCtrlOrCommandPressed:function(){if(org.eclipse.rwt.Client.getPlatform()==="mac"){return this.getDomEvent().metaKey}else{return this.getDomEvent().ctrlKey}},setDefaultPrevented:qx.core.Variant.select($[0],{mshtml:function(a){if(!a){throw new Error($[557])}this.getDomEvent().returnValue=false;arguments.callee.base.call(this,a)},"default":function(a){if(!a){throw new Error($[557])}this.getDomEvent().preventDefault();this.getDomEvent().returnValue=false;arguments.callee.base.call(this,a)}})},destruct:function(){this._disposeFields("_valueDomEvent","_valueDomTarget")}});
-qx.Class.define($[308],{extend:qx.event.type.DomEvent,construct:function(f,c,d,g,b,e,h,a){arguments.callee.base.call(this,f,c,d,g,b);this._keyCode=e;this.setCharCode(h);this.setKeyIdentifier(a)},statics:{keys:{esc:27,enter:13,tab:9,space:32,up:38,down:40,left:37,right:39,shift:16,ctrl:17,alt:18,f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123,print:124,del:46,backspace:8,insert:45,home:36,end:35,pageup:33,pagedown:34,numlock:144,numpad_0:96,numpad_1:97,numpad_2:98,numpad_3:99,numpad_4:100,numpad_5:101,numpad_6:102,numpad_7:103,numpad_8:104,numpad_9:105,numpad_divide:111,numpad_multiply:106,numpad_minus:109,numpad_plus:107},codes:{}},properties:{charCode:{_fast:true,setOnlyOnce:true,noCompute:true},keyIdentifier:{_fast:true,setOnlyOnce:true,noCompute:true}},members:{getKeyCode:function(){return this._keyCode}},defer:function(b){for(var a in b.keys){b.codes[b.keys[a]]=a}}});
-qx.Class.define($[91],{extend:qx.event.type.DomEvent,construct:function(e,b,d,f,a,c){arguments.callee.base.call(this,e,b,d,f,a);if(c){this.setRelatedTarget(c)}},statics:{C_BUTTON_LEFT:"left",C_BUTTON_MIDDLE:$[32],C_BUTTON_RIGHT:$[23],C_BUTTON_NONE:"none",_screenX:0,_screenY:0,_clientX:0,_clientY:0,_pageX:0,_pageY:0,_button:null,buttons:qx.core.Variant.select($[0],{mshtml:{left:1,right:2,middle:4},"default":{left:0,right:2,middle:1}}),storeEventState:function(a){this._screenX=a.getScreenX();this._screenY=a.getScreenY();this._clientX=a.getClientX();this._clientY=a.getClientY();this._pageX=a.getPageX();this._pageY=a.getPageY();this._button=a.getButton()},getScreenX:function(){return this._screenX},getScreenY:function(){return this._screenY},getClientX:function(){return this._clientX},getClientY:function(){return this._clientY},getPageX:function(){return this._pageX},getPageY:function(){return this._pageY},getButton:function(){return this._button}},properties:{button:{_fast:true,readOnly:true},wheelDelta:{_fast:true,readOnly:true}},members:{getPageX:qx.core.Variant.select($[0],{mshtml:function(){return this.getDomEvent().clientX+qx.bom.Viewport.getScrollLeft(window)},"default":function(){return this.getDomEvent().pageX}}),getPageY:qx.core.Variant.select($[0],{mshtml:function(){return this.getDomEvent().clientY+qx.bom.Viewport.getScrollTop(window)},"default":function(){return this.getDomEvent().pageY}}),getClientX:function(){return this.getDomEvent().clientX},getClientY:function(){return this.getDomEvent().clientY},getScreenX:function(){return this.getDomEvent().screenX},getScreenY:function(){return this.getDomEvent().screenY},isLeftButtonPressed:qx.core.Variant.select($[0],{mshtml:function(){if(this.getType()==$[29]){return true}else{return this.getButton()===qx.event.type.MouseEvent.C_BUTTON_LEFT}},"default":function(){return this.getButton()===qx.event.type.MouseEvent.C_BUTTON_LEFT}}),isMiddleButtonPressed:function(){return this.getButton()===qx.event.type.MouseEvent.C_BUTTON_MIDDLE},isRightButtonPressed:function(){return this.getButton()===qx.event.type.MouseEvent.C_BUTTON_RIGHT},__buttons:qx.core.Variant.select($[0],{mshtml:{1:"left",2:$[23],4:$[32]},"default":{0:"left",2:$[23],1:$[32]}}),_computeButton:function(){switch(this.getDomEvent().type){case $[29]:case $[61]:return"left";case $[41]:return $[23];default:return this.__buttons[this.getDomEvent().button]||"none"}},_computeWheelDelta:qx.core.Variant.select($[0],{"default":function(){return this.getDomEvent().wheelDelta/120},gecko:function(){return -(this.getDomEvent().detail/3)}})}});
+qx.Class.define("org.eclipse.rwt.EventHandlerUtil",{type:$[119],statics:{_lastUpDownType:{},_lastKeyCode:null,cleanUp:function(){delete this.__onKeyEvent;delete this._lastUpDownType;delete this._lastKeyCode},getDomEvent:qx.core.Variant.select($[0],{mshtml:function(a){return a.length>0?a[0]:window.event},"default":function(a){return a[0]}}),getDomTarget:qx.core.Variant.select($[0],{mshtml:function(a){return a.target||a.srcElement},webkit:function(a){var b=a.target||a.srcElement;if(b&&(b.nodeType==qx.dom.Node.TEXT)){b=b.parentNode}return b},"default":function(a){return a.target}}),stopDomEvent:function(a){if(a.preventDefault){a.preventDefault()}try{a.keyCode=0}catch(b){}a.returnValue=false},getOriginalTargetObject:function(b){if(b==document.documentElement){b=document.body}try{while(b!=null&&b.qx_Widget==null){b=b.parentNode}}catch(a){b=null}return b?b.qx_Widget:null},getOriginalTargetObjectFromEvent:function(a,c){var b=this.getDomTarget(a);if(c){var d=c.document;if(b==c||b==d||b==d.documentElement||b==d.body){return d.body.qx_Widget}}return this.getOriginalTargetObject(b)},getRelatedTargetObjectFromEvent:function(b){var a=org.eclipse.rwt.EventHandlerUtil;var c=b.relatedTarget;if(!c){if(b.type==$[9]){c=b.fromElement}else{c=b.toElement}}return a.getTargetObject(c)},getTargetObject:function(b,a,c){if(!a){var a=this.getOriginalTargetObject(b);if(!a){return null}}while(a){if(!c&&!a.getEnabled()){return null}if(!a.getAnonymous()){break}a=a.getParent()}return a},getKeyCode:qx.core.Variant.select($[0],{gecko:function(a){return a.keyCode},opera:function(b){var a;if(b.type===$[12]){if(this._lastKeyCode===b.keyCode){a=b.keyCode}else{a=0}}else{a=b.keyCode}return a},"default":function(b){var a=b.type!==$[12]||b.keyCode===13;return a?b.keyCode:0}}),getCharCode:qx.core.Variant.select($[0],{"default":function(a){var b=a.type===$[12]&&a.keyCode!==13;return b?a.charCode:0},mshtml:function(a){var b=a.type===$[12]&&a.keyCode!==13;return b?a.keyCode:0},opera:function(b){var a;if(b.type===$[12]){if(this._lastKeyCode!==b.keyCode){a=b.keyCode}else{a=0}}else{a=0}return a}}),_isFirstKeyDown:function(a){return this._lastUpDownType[a]!==$[23]},getEventPseudoTypes:qx.core.Variant.select($[0],{"default":function(c,d,b){var a;if(c.type===$[23]){var e=!this._isNonPrintableKeyCode(d);if(this._isFirstKeyDown(d)){a=e?[$[23]]:[$[23],$[12]]}else{a=e?[]:[$[12]]}}else{a=[c.type]}return a},gecko:function(c,d,b){var a;if(c.type===$[23]&&!this._isFirstKeyDown(d)){a=[]}else{a=[c.type]}return a},opera:function(b,c,a){return[b.type]}}),saveData:function(b,c,a){if(b.type!==$[12]){this._lastUpDownType[c]=b.type;this._lastKeyCode=c}},keyCodeToIdentifier:function(b){var a="Unidentified";if(this._numpadToCharCode[b]!==undefined){a=String.fromCharCode(this._numpadToCharCode[b])}else{if(this._keyCodeToIdentifierMap[b]!==undefined){a=this._keyCodeToIdentifierMap[b]}else{if(this._specialCharCodeMap[b]!==undefined){a=this._specialCharCodeMap[b]}else{if(this._isAlphaNumericKeyCode(b)){a=String.fromCharCode(b)}}}}return a},charCodeToIdentifier:function(b){var a;if(this._specialCharCodeMap[b]!==undefined){a=this._specialCharCodeMap[b]}else{a=String.fromCharCode(b).toUpperCase()}return a},_isNonPrintableKeyCode:function(a){return this._keyCodeToIdentifierMap[a]?true:false},_isAlphaNumericKeyCode:function(b){var a=false;if((b>=this._charCodeA&&b<=this._charCodeZ)||(b>=this._charCode0&&b<=this._charCode9)){a=true}return a},_specialCharCodeMap:{13:$[71],27:$[118],32:$[91]},_keyCodeToIdentifierMap:{8:$[352],9:"Tab",16:"Shift",17:$[317],18:"Alt",20:"CapsLock",224:"Meta",37:"Left",38:"Up",39:$[51],40:"Down",33:$[57],34:$[58],35:"End",36:"Home",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",44:"PrintScreen",145:"Scroll",19:"Pause",91:"Win",93:"Apps"},_numpadToCharCode:{96:"0".charCodeAt(0),97:"1".charCodeAt(0),98:"2".charCodeAt(0),99:"3".charCodeAt(0),100:"4".charCodeAt(0),101:"5".charCodeAt(0),102:"6".charCodeAt(0),103:"7".charCodeAt(0),104:"8".charCodeAt(0),105:"9".charCodeAt(0),106:"*".charCodeAt(0),107:"+".charCodeAt(0),109:"-".charCodeAt(0),110:",".charCodeAt(0),111:"/".charCodeAt(0)},_charCodeA:"A".charCodeAt(0),_charCodeZ:"Z".charCodeAt(0),_charCode0:"0".charCodeAt(0),_charCode9:"9".charCodeAt(0)}});
+qx.Class.define("qx.event.type.DomEvent",{extend:qx.event.type.Event,construct:function(d,b,c,e,a){arguments.callee.base.call(this,d);this.setDomEvent(b);this.setDomTarget(c);this.setTarget(e);this.setOriginalTarget(a)},statics:{SHIFT_MASK:1,CTRL_MASK:2,ALT_MASK:4,META_MASK:8},properties:{bubbles:{_fast:true,defaultValue:true,noCompute:true},propagationStopped:{_fast:true,defaultValue:false,noCompute:true},domEvent:{_fast:true,setOnlyOnce:true,noCompute:true},domTarget:{_fast:true,setOnlyOnce:true,noCompute:true},modifiers:{_cached:true,defaultValue:null}},members:{_computeModifiers:function(){var b=0;var a=this.getDomEvent();if(a.shiftKey){b|=qx.event.type.DomEvent.SHIFT_MASK}if(a.ctrlKey){b|=qx.event.type.DomEvent.CTRL_MASK}if(a.altKey){b|=qx.event.type.DomEvent.ALT_MASK}if(a.metaKey){b|=qx.event.type.DomEvent.META_MASK}return b},isCtrlPressed:function(){return this.getDomEvent().ctrlKey},isShiftPressed:function(){return this.getDomEvent().shiftKey},isAltPressed:function(){return this.getDomEvent().altKey},isMetaPressed:function(){return this.getDomEvent().metaKey},isCtrlOrCommandPressed:function(){if(org.eclipse.rwt.Client.getPlatform()==="mac"){return this.getDomEvent().metaKey}else{return this.getDomEvent().ctrlKey}},setDefaultPrevented:qx.core.Variant.select($[0],{mshtml:function(a){if(!a){throw new Error($[496])}this.getDomEvent().returnValue=false;arguments.callee.base.call(this,a)},"default":function(a){if(!a){throw new Error($[496])}this.getDomEvent().preventDefault();this.getDomEvent().returnValue=false;arguments.callee.base.call(this,a)}})},destruct:function(){this._disposeFields("_valueDomEvent","_valueDomTarget")}});
+qx.Class.define($[286],{extend:qx.event.type.DomEvent,construct:function(f,c,d,g,b,e,h,a){arguments.callee.base.call(this,f,c,d,g,b);this._keyCode=e;this.setCharCode(h);this.setKeyIdentifier(a)},statics:{keys:{esc:27,enter:13,tab:9,space:32,up:38,down:40,left:37,right:39,shift:16,ctrl:17,alt:18,f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123,print:124,del:46,backspace:8,insert:45,home:36,end:35,pageup:33,pagedown:34,numlock:144,numpad_0:96,numpad_1:97,numpad_2:98,numpad_3:99,numpad_4:100,numpad_5:101,numpad_6:102,numpad_7:103,numpad_8:104,numpad_9:105,numpad_divide:111,numpad_multiply:106,numpad_minus:109,numpad_plus:107},codes:{}},properties:{charCode:{_fast:true,setOnlyOnce:true,noCompute:true},keyIdentifier:{_fast:true,setOnlyOnce:true,noCompute:true}},members:{getKeyCode:function(){return this._keyCode}},defer:function(b){for(var a in b.keys){b.codes[b.keys[a]]=a}}});
+qx.Class.define($[95],{extend:qx.event.type.DomEvent,construct:function(e,b,d,f,a,c){arguments.callee.base.call(this,e,b,d,f,a);if(c){this.setRelatedTarget(c)}},statics:{C_BUTTON_LEFT:"left",C_BUTTON_MIDDLE:$[32],C_BUTTON_RIGHT:$[24],C_BUTTON_NONE:"none",_screenX:0,_screenY:0,_clientX:0,_clientY:0,_pageX:0,_pageY:0,_button:null,buttons:qx.core.Variant.select($[0],{mshtml:{left:1,right:2,middle:4},"default":{left:0,right:2,middle:1}}),storeEventState:function(a){this._screenX=a.getScreenX();this._screenY=a.getScreenY();this._clientX=a.getClientX();this._clientY=a.getClientY();this._pageX=a.getPageX();this._pageY=a.getPageY();this._button=a.getButton()},getScreenX:function(){return this._screenX},getScreenY:function(){return this._screenY},getClientX:function(){return this._clientX},getClientY:function(){return this._clientY},getPageX:function(){return this._pageX},getPageY:function(){return this._pageY},getButton:function(){return this._button}},properties:{button:{_fast:true,readOnly:true},wheelDelta:{_fast:true,readOnly:true}},members:{getPageX:qx.core.Variant.select($[0],{mshtml:function(){return this.getDomEvent().clientX+qx.bom.Viewport.getScrollLeft(window)},"default":function(){return this.getDomEvent().pageX}}),getPageY:qx.core.Variant.select($[0],{mshtml:function(){return this.getDomEvent().clientY+qx.bom.Viewport.getScrollTop(window)},"default":function(){return this.getDomEvent().pageY}}),getClientX:function(){return this.getDomEvent().clientX},getClientY:function(){return this.getDomEvent().clientY},getScreenX:function(){return this.getDomEvent().screenX},getScreenY:function(){return this.getDomEvent().screenY},isLeftButtonPressed:qx.core.Variant.select($[0],{mshtml:function(){if(this.getType()==$[29]){return true}else{return this.getButton()===qx.event.type.MouseEvent.C_BUTTON_LEFT}},"default":function(){return this.getButton()===qx.event.type.MouseEvent.C_BUTTON_LEFT}}),isMiddleButtonPressed:function(){return this.getButton()===qx.event.type.MouseEvent.C_BUTTON_MIDDLE},isRightButtonPressed:function(){return this.getButton()===qx.event.type.MouseEvent.C_BUTTON_RIGHT},__buttons:qx.core.Variant.select($[0],{mshtml:{1:"left",2:$[24],4:$[32]},"default":{0:"left",2:$[24],1:$[32]}}),_computeButton:function(){switch(this.getDomEvent().type){case $[29]:case $[62]:return"left";case $[41]:return $[24];default:return this.__buttons[this.getDomEvent().button]||"none"}},_computeWheelDelta:qx.core.Variant.select($[0],{"default":function(){return this.getDomEvent().wheelDelta/120},gecko:function(){return -(this.getDomEvent().detail/3)}})}});
 qx.Class.define("qx.util.manager.Object",{extend:qx.core.Target,construct:function(){arguments.callee.base.call(this);this._objects={}},members:{add:function(a){if(this.getDisposed()){return}this._objects[a.toHashCode()]=a},remove:function(a){if(this.getDisposed()){return false}delete this._objects[a.toHashCode()]},has:function(a){return this._objects[a.toHashCode()]!=null},get:function(a){return this._objects[a.toHashCode()]},getAll:function(){return this._objects},enableAll:function(){for(var a in this._objects){this._objects[a].setEnabled(true)}},disableAll:function(){for(var a in this._objects){this._objects[a].setEnabled(false)}}},destruct:function(){this._disposeObjectDeep("_objects")}});
-qx.Class.define($[510],{type:$[33],extend:qx.util.manager.Object,construct:function(){arguments.callee.base.call(this);this._blocked={}},members:{handleMouseDown:function(a){var c=this._blockData=qx.lang.Object.copy(this.getAll());for(var b in c){c[b].block()}},handleMouseUp:function(a){var c=this._blockData;for(var b in c){c[b].release()}}},destruct:function(){this._disposeFields("_blocked","_blockData")}});
+qx.Class.define($[506],{type:$[33],extend:qx.util.manager.Object,construct:function(){arguments.callee.base.call(this);this._blocked={}},members:{handleMouseDown:function(a){var c=this._blockData=qx.lang.Object.copy(this.getAll());for(var b in c){c[b].block()}},handleMouseUp:function(a){var c=this._blockData;for(var b in c){c[b].release()}}},destruct:function(){this._disposeFields("_blocked","_blockData")}});
 qx.Class.define("qx.ui.layout.CanvasLayout",{extend:qx.ui.core.Parent,construct:function(){arguments.callee.base.call(this)},members:{_createLayoutImpl:function(){return new qx.ui.layout.impl.CanvasLayoutImpl(this)}}});
 qx.Class.define("qx.ui.layout.impl.LayoutImpl",{extend:qx.core.Object,construct:function(a){arguments.callee.base.call(this);this._widget=a},members:{getWidget:function(){return this._widget},computeChildBoxWidth:function(a){return a.getWidthValue()||a._computeBoxWidthFallback()},computeChildBoxHeight:function(a){return a.getHeightValue()||a._computeBoxHeightFallback()},computeChildNeededWidth:function(d){var c=d._computedMinWidthTypePercent?null:d.getMinWidthValue();var b=d._computedMaxWidthTypePercent?null:d.getMaxWidthValue();var a=(d._computedWidthTypePercent||d._computedWidthTypeFlex?null:d.getWidthValue())||d.getPreferredBoxWidth()||0;return qx.lang.Number.limit(a,c,b)+d.getMarginLeft()+d.getMarginRight()},computeChildNeededHeight:function(d){var c=d._computedMinHeightTypePercent?null:d.getMinHeightValue();var b=d._computedMaxHeightTypePercent?null:d.getMaxHeightValue();var a=(d._computedHeightTypePercent||d._computedHeightTypeFlex?null:d.getHeightValue())||d.getPreferredBoxHeight()||0;return qx.lang.Number.limit(a,c,b)+d.getMarginTop()+d.getMarginBottom()},computeChildrenNeededWidth_max:function(){for(var c=0,d=this.getWidget().getVisibleChildren(),b=d.length,a=0;c<b;c++){a=Math.max(a,d[c].getNeededWidth())}return a},computeChildrenNeededHeight_max:function(){for(var c=0,d=this.getWidget().getVisibleChildren(),b=d.length,a=0;c<b;c++){a=Math.max(a,d[c].getNeededHeight())}return a},computeChildrenNeededWidth_sum:function(){for(var c=0,d=this.getWidget().getVisibleChildren(),a=d.length,b=0;c<a;c++){b+=d[c].getNeededWidth()}return b},computeChildrenNeededHeight_sum:function(){for(var c=0,d=this.getWidget().getVisibleChildren(),a=d.length,b=0;c<a;c++){b+=d[c].getNeededHeight()}return b},computeChildrenNeededWidth:null,computeChildrenNeededHeight:null,updateSelfOnChildOuterWidthChange:function(a){},updateSelfOnChildOuterHeightChange:function(a){},updateChildOnInnerWidthChange:function(a){},updateChildOnInnerHeightChange:function(a){},updateSelfOnJobQueueFlush:function(a){},updateChildrenOnJobQueueFlush:function(a){},updateChildrenOnAddChild:function(b,a){},updateChildrenOnRemoveChild:function(b,a){},updateChildrenOnMoveChild:function(c,a,b){},flushChildrenQueue:function(a){var b=this.getWidget();for(var c in a){b._layoutChild(a[c])}},layoutChild:function(b,a){},layoutChild_sizeLimitX:qx.core.Variant.select($[0],{mshtml:qx.lang.Function.returnTrue,"default":function(b,a){if(a.minWidth){b._computedMinWidthTypeNull?b._resetRuntimeMinWidth():b._renderRuntimeMinWidth(b.getMinWidthValue())}else{if(a.initial&&!b._computedMinWidthTypeNull){b._renderRuntimeMinWidth(b.getMinWidthValue())}}if(a.maxWidth){b._computedMaxWidthTypeNull?b._resetRuntimeMaxWidth():b._renderRuntimeMaxWidth(b.getMaxWidthValue())}else{if(a.initial&&!b._computedMaxWidthTypeNull){b._renderRuntimeMaxWidth(b.getMaxWidthValue())}}}}),layoutChild_sizeLimitY:qx.core.Variant.select($[0],{mshtml:qx.lang.Function.returnTrue,"default":function(b,a){if(a.minHeight){b._computedMinHeightTypeNull?b._resetRuntimeMinHeight():b._renderRuntimeMinHeight(b.getMinHeightValue())}else{if(a.initial&&!b._computedMinHeightTypeNull){b._renderRuntimeMinHeight(b.getMinHeightValue())}}if(a.maxHeight){b._computedMaxHeightTypeNull?b._resetRuntimeMaxHeight():b._renderRuntimeMaxHeight(b.getMaxHeightValue())}else{if(a.initial&&!b._computedMaxHeightTypeNull){b._renderRuntimeMaxHeight(b.getMaxHeightValue())}}}}),layoutChild_marginX:function(d,a){if(a.marginLeft||a.initial){var c=d.getMarginLeft();c!=null?d._renderRuntimeMarginLeft(c):d._resetRuntimeMarginLeft()}if(a.marginRight||a.initial){var b=d.getMarginRight();b!=null?d._renderRuntimeMarginRight(b):d._resetRuntimeMarginRight()}},layoutChild_marginY:function(d,a){if(a.marginTop||a.initial){var c=d.getMarginTop();c!=null?d._renderRuntimeMarginTop(c):d._resetRuntimeMarginTop()}if(a.marginBottom||a.initial){var b=d.getMarginBottom();b!=null?d._renderRuntimeMarginBottom(b):d._resetRuntimeMarginBottom()}},layoutChild_sizeX_essentialWrapper:function(b,a){return b._isWidthEssential()?this.layoutChild_sizeX(b,a):b._resetRuntimeWidth()},layoutChild_sizeY_essentialWrapper:function(b,a){return b._isHeightEssential()?this.layoutChild_sizeY(b,a):b._resetRuntimeHeight()}},defer:function(b,a){a.computeChildrenNeededWidth=a.computeChildrenNeededWidth_max;a.computeChildrenNeededHeight=a.computeChildrenNeededHeight_max},destruct:function(){this._disposeFields("_widget")}});
-qx.Class.define("qx.lang.Number",{statics:{isInRange:function(b,a,c){return b>=a&&b<=c},isBetweenRange:function(b,a,c){return b>a&&b<c},limit:function(b,a,c){if(typeof c===$[77]&&b>c){return c}else{if(typeof a===$[77]&&b<a){return a}else{return b}}}}});
+qx.Class.define("qx.lang.Number",{statics:{isInRange:function(b,a,c){return b>=a&&b<=c},isBetweenRange:function(b,a,c){return b>a&&b<c},limit:function(b,a,c){if(typeof c===$[78]&&b>c){return c}else{if(typeof a===$[78]&&b<a){return a}else{return b}}}}});
 qx.Class.define("qx.ui.layout.impl.CanvasLayoutImpl",{extend:qx.ui.layout.impl.LayoutImpl,construct:function(a){arguments.callee.base.call(this,a)},members:{computeChildBoxWidth:function(b){var a=null;if(b._computedLeftTypeNull||b._computedRightTypeNull){a=b.getWidthValue()}else{if(b._hasParent){a=this.getWidget().getInnerWidth()-b.getLeftValue()-b.getRightValue()}}return a||b._computeBoxWidthFallback()},computeChildBoxHeight:function(b){var a=null;if(b._computedTopTypeNull||b._computedBottomTypeNull){a=b.getHeightValue()}else{if(b._hasParent){a=this.getWidget().getInnerHeight()-b.getTopValue()-b.getBottomValue()}}return a||b._computeBoxHeightFallback()},computeChildNeededWidth:function(f){var e=f._computedLeftTypePercent?null:f.getLeftValue();var b=f._computedRightTypePercent?null:f.getRightValue();var d=f._computedMinWidthTypePercent?null:f.getMinWidthValue();var c=f._computedMaxWidthTypePercent?null:f.getMaxWidthValue();if(e!=null&&b!=null){var a=f.getPreferredBoxWidth()||0}else{var a=(f._computedWidthTypePercent?null:f.getWidthValue())||f.getPreferredBoxWidth()||0}return qx.lang.Number.limit(a,d,c)+e+b+f.getMarginLeft()+f.getMarginRight()},computeChildNeededHeight:function(f){var b=f._computedTopTypePercent?null:f.getTopValue();var c=f._computedBottomTypePercent?null:f.getBottomValue();var e=f._computedMinHeightTypePercent?null:f.getMinHeightValue();var d=f._computedMaxHeightTypePercent?null:f.getMaxHeightValue();if(b!=null&&c!=null){var a=f.getPreferredBoxHeight()||0}else{var a=(f._computedHeightTypePercent?null:f.getHeightValue())||f.getPreferredBoxHeight()||0}return qx.lang.Number.limit(a,e,d)+b+c+f.getMarginTop()+f.getMarginBottom()},updateChildOnInnerWidthChange:function(c){var a=c._recomputePercentX();var b=c._recomputeRangeX();return a||b},updateChildOnInnerHeightChange:function(c){var a=c._recomputePercentY();var b=c._recomputeRangeY();return a||b},layoutChild:function(b,a){this.layoutChild_sizeX_essentialWrapper(b,a);this.layoutChild_sizeY_essentialWrapper(b,a);this.layoutChild_sizeLimitX(b,a);this.layoutChild_sizeLimitY(b,a);this.layoutChild_locationX(b,a);this.layoutChild_locationY(b,a);this.layoutChild_marginX(b,a);this.layoutChild_marginY(b,a)},layoutChild_sizeX:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(b,a){if(a.initial||a.width||a.minWidth||a.maxWidth||a.left||a.right){if(b._computedMinWidthTypeNull&&b._computedWidthTypeNull&&b._computedMaxWidthTypeNull&&!(!b._computedLeftTypeNull&&!b._computedRightTypeNull)){b._resetRuntimeWidth()}else{b._renderRuntimeWidth(b.getBoxWidth())}}},"default":function(b,a){if(a.initial||a.width){b._computedWidthTypeNull?b._resetRuntimeWidth():b._renderRuntimeWidth(b.getWidthValue())}}}),layoutChild_sizeY:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(b,a){if(a.initial||a.height||a.minHeight||a.maxHeight||a.top||a.bottom){if(b._computedMinHeightTypeNull&&b._computedHeightTypeNull&&b._computedMaxHeightTypeNull&&!(!b._computedTopTypeNull&&!b._computedBottomTypeNull)){b._resetRuntimeHeight()}else{b._renderRuntimeHeight(b.getBoxHeight())}}},"default":function(b,a){if(a.initial||a.height){b._computedHeightTypeNull?b._resetRuntimeHeight():b._renderRuntimeHeight(b.getHeightValue())}}}),layoutChild_locationX:function(c,a){var b=this.getWidget();if(a.initial||a.left||a.parentPaddingLeft){c._computedLeftTypeNull?c._computedRightTypeNull&&b.getPaddingLeft()>0?c._renderRuntimeLeft(b.getPaddingLeft()):c._resetRuntimeLeft():c._renderRuntimeLeft(c.getLeftValue()+b.getPaddingLeft())}if(a.initial||a.right||a.parentPaddingRight){c._computedRightTypeNull?c._computedLeftTypeNull&&b.getPaddingRight()>0?c._renderRuntimeRight(b.getPaddingRight()):c._resetRuntimeRight():c._renderRuntimeRight(c.getRightValue()+b.getPaddingRight())}},layoutChild_locationY:function(c,a){var b=this.getWidget();if(a.initial||a.top||a.parentPaddingTop){c._computedTopTypeNull?c._computedBottomTypeNull&&b.getPaddingTop()>0?c._renderRuntimeTop(b.getPaddingTop()):c._resetRuntimeTop():c._renderRuntimeTop(c.getTopValue()+b.getPaddingTop())}if(a.initial||a.bottom||a.parentPaddingBottom){c._computedBottomTypeNull?c._computedTopTypeNull&&b.getPaddingBottom()>0?c._renderRuntimeBottom(b.getPaddingBottom()):c._resetRuntimeBottom():c._renderRuntimeBottom(c.getBottomValue()+b.getPaddingBottom())}}}});
-qx.Class.define("qx.ui.core.ClientDocument",{type:$[33],extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this._window=window;this._document=window.document;this.setElement(this._document.body);this._document.body.style.position="";if(qx.core.Variant.isSet($[0],$[18])&&(org.eclipse.rwt.Client.getMajor()<7)){try{document.execCommand("BackgroundImageCache",false,true)}catch(a){}}this._cachedInnerWidth=this._document.body.offsetWidth;this._cachedInnerHeight=this._document.body.offsetHeight;this.addEventListener($[271],this._onwindowresize);this._modalWidgets=[];this._modalNativeWindow=null;this.activateFocusRoot();this.initHideFocus();this.initSelectable();org.eclipse.rwt.EventHandler.setFocusRoot(this)},events:{focus:$[11],windowblur:$[11],windowfocus:$[11],windowresize:$[11]},properties:{appearance:{refine:true,init:"client-document"},enableElementFocus:{refine:true,init:false},enabled:{refine:true,init:true},selectable:{refine:true,init:false},hideFocus:{refine:true,init:true},globalCursor:{check:$[25],nullable:true,themeable:true,apply:"_applyGlobalCursor",event:"changeGlobalCursor"}},members:{_applyParent:qx.lang.Function.returnTrue,getTopLevelWidget:qx.lang.Function.returnThis,getWindowElement:function(){return this._window},getDocumentElement:function(){return this._document},getParent:qx.lang.Function.returnNull,getToolTip:qx.lang.Function.returnNull,isSeeable:qx.lang.Function.returnTrue,_isDisplayable:true,_hasParent:false,_initialLayoutDone:true,_getBlocker:function(){if(!this._blocker){this._blocker=new qx.ui.core.ClientDocumentBlocker;this._blocker.addEventListener($[2],this.blockHelper,this);this._blocker.addEventListener($[15],this.blockHelper,this);this.add(this._blocker)}return this._blocker},blockHelper:function(a){if(this._modalNativeWindow){if(!this._modalNativeWindow.isClosed()){this._modalNativeWindow.focus()}else{this.release(this._modalNativeWindow)}}},block:function(a){this._getBlocker().show();if(qx.Class.isDefined($[429])&&a instanceof qx.ui.window.Window){this._modalWidgets.push(a);var b=a.getZIndex();this._getBlocker().setZIndex(b);a.setZIndex(b+1)}else{if(qx.Class.isDefined($[410])&&a instanceof qx.client.NativeWindow){this._modalNativeWindow=a;this._getBlocker().setZIndex(10000000)}}},release:function(b){if(b){if(qx.Class.isDefined($[410])&&b instanceof qx.client.NativeWindow){this._modalNativeWindow=null}else{qx.lang.Array.remove(this._modalWidgets,b)}}var a=this._modalWidgets.length;if(a==0){this._getBlocker().hide()}else{var c=this._modalWidgets[a-1];var d=c.getZIndex();this._getBlocker().setZIndex(d);c.setZIndex(d+1)}},createStyleElement:function(a){return qx.html.StyleSheet.createElement(a)},addCssRule:function(a,c,b){return qx.html.StyleSheet.addRule(a,c,b)},removeCssRule:function(a,b){return qx.html.StyleSheet.removeRule(a,b)},removeAllCssRules:function(a){return qx.html.StyleSheet.removeAllRules(a)},_applyGlobalCursor:qx.core.Variant.select($[0],{mshtml:function(g,b){if(g==$[149]){g="hand"}if(b==$[149]){b="hand"}var e,h;var f=this._cursorElements;if(f){for(var c=0,a=f.length;c<a;c++){e=f[c];if(e.style.cursor==b){e.style.cursor=e._oldCursor;e._oldCursor=null}}}var d=document.all;var f=this._cursorElements=[];if(g!=null&&g!=""&&g!="auto"){for(var c=0,a=d.length;c<a;c++){e=d[c];h=e.style.cursor;if(h!=null&&h!=""&&h!="auto"){e._oldCursor=h;e.style.cursor=g;f.push(e)}}document.body.style.cursor=g}else{document.body.style.cursor=""}},"default":function(b,a){if(!this._globalCursorStyleSheet){this._globalCursorStyleSheet=this.createStyleElement()}this.removeCssRule(this._globalCursorStyleSheet,"*");if(b){this.addCssRule(this._globalCursorStyleSheet,"*","cursor:"+b+" !important")}}}),_onwindowresize:function(a){qx.ui.popup.PopupManager.getInstance().update();this._recomputeInnerWidth();this._recomputeInnerHeight();qx.ui.core.Widget.flushGlobalQueues()},_computeInnerWidth:function(){return this._document.body.offsetWidth},_computeInnerHeight:function(){return this._document.body.offsetHeight}},settings:{"qx.enableApplicationLayout":true,"qx.boxModelCorrection":true},defer:function(){if(qx.core.Setting.get("qx.boxModelCorrection")){var b=org.eclipse.rwt.Client.getEngineBoxSizingAttributes();var a=b.join($[468])+$[468];var c=b.join($[425])+$[425];qx.html.StyleSheet.createElement("html,body { margin:0;border:0;padding:0; } html { border:0 none; } *{"+a+"} img{"+c+"}")}if(qx.core.Setting.get("qx.enableApplicationLayout")){qx.html.StyleSheet.createElement("html,body{width:100%;height:100%;overflow:hidden;}")}},destruct:function(){this._disposeObjects("_blocker");this._disposeFields("_window","_document","_modalWidgets","_modalNativeWindow","_globalCursorStyleSheet")}});
+qx.Class.define("qx.ui.core.ClientDocument",{type:$[33],extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this._window=window;this._document=window.document;this.setElement(this._document.body);this._document.body.style.position="";if(qx.core.Variant.isSet($[0],$[18])&&(org.eclipse.rwt.Client.getMajor()<7)){try{document.execCommand("BackgroundImageCache",false,true)}catch(a){}}this._cachedInnerWidth=this._document.body.offsetWidth;this._cachedInnerHeight=this._document.body.offsetHeight;this.addEventListener($[316],this._onwindowresize);this._modalWidgets=[];this._modalNativeWindow=null;this.activateFocusRoot();this.initHideFocus();this.initSelectable();org.eclipse.rwt.EventHandler.setFocusRoot(this)},events:{focus:$[11],windowblur:$[11],windowfocus:$[11],windowresize:$[11]},properties:{appearance:{refine:true,init:"client-document"},enableElementFocus:{refine:true,init:false},enabled:{refine:true,init:true},selectable:{refine:true,init:false},hideFocus:{refine:true,init:true},globalCursor:{check:$[25],nullable:true,themeable:true,apply:"_applyGlobalCursor",event:"changeGlobalCursor"}},members:{_applyParent:qx.lang.Function.returnTrue,getTopLevelWidget:qx.lang.Function.returnThis,getWindowElement:function(){return this._window},getDocumentElement:function(){return this._document},getParent:qx.lang.Function.returnNull,getToolTip:qx.lang.Function.returnNull,isSeeable:qx.lang.Function.returnTrue,_isDisplayable:true,_hasParent:false,_initialLayoutDone:true,_getBlocker:function(){if(!this._blocker){this._blocker=new qx.ui.core.ClientDocumentBlocker;this._blocker.addEventListener($[2],this.blockHelper,this);this._blocker.addEventListener($[15],this.blockHelper,this);this.add(this._blocker)}return this._blocker},blockHelper:function(a){if(this._modalNativeWindow){if(!this._modalNativeWindow.isClosed()){this._modalNativeWindow.focus()}else{this.release(this._modalNativeWindow)}}},block:function(a){this._getBlocker().show();if(qx.Class.isDefined($[544])&&a instanceof qx.ui.window.Window){this._modalWidgets.push(a);var b=a.getZIndex();this._getBlocker().setZIndex(b);a.setZIndex(b+1)}else{if(qx.Class.isDefined($[460])&&a instanceof qx.client.NativeWindow){this._modalNativeWindow=a;this._getBlocker().setZIndex(10000000)}}},release:function(b){if(b){if(qx.Class.isDefined($[460])&&b instanceof qx.client.NativeWindow){this._modalNativeWindow=null}else{qx.lang.Array.remove(this._modalWidgets,b)}}var a=this._modalWidgets.length;if(a==0){this._getBlocker().hide()}else{var c=this._modalWidgets[a-1];var d=c.getZIndex();this._getBlocker().setZIndex(d);c.setZIndex(d+1)}},createStyleElement:function(a){return qx.html.StyleSheet.createElement(a)},addCssRule:function(a,c,b){return qx.html.StyleSheet.addRule(a,c,b)},removeCssRule:function(a,b){return qx.html.StyleSheet.removeRule(a,b)},removeAllCssRules:function(a){return qx.html.StyleSheet.removeAllRules(a)},_applyGlobalCursor:qx.core.Variant.select($[0],{mshtml:function(g,b){if(g==$[144]){g="hand"}if(b==$[144]){b="hand"}var e,h;var f=this._cursorElements;if(f){for(var c=0,a=f.length;c<a;c++){e=f[c];if(e.style.cursor==b){e.style.cursor=e._oldCursor;e._oldCursor=null}}}var d=document.all;var f=this._cursorElements=[];if(g!=null&&g!=""&&g!="auto"){for(var c=0,a=d.length;c<a;c++){e=d[c];h=e.style.cursor;if(h!=null&&h!=""&&h!="auto"){e._oldCursor=h;e.style.cursor=g;f.push(e)}}document.body.style.cursor=g}else{document.body.style.cursor=""}},"default":function(b,a){if(!this._globalCursorStyleSheet){this._globalCursorStyleSheet=this.createStyleElement()}this.removeCssRule(this._globalCursorStyleSheet,"*");if(b){this.addCssRule(this._globalCursorStyleSheet,"*","cursor:"+b+" !important")}}}),_onwindowresize:function(a){qx.ui.popup.PopupManager.getInstance().update();this._recomputeInnerWidth();this._recomputeInnerHeight();qx.ui.core.Widget.flushGlobalQueues()},_computeInnerWidth:function(){return this._document.body.offsetWidth},_computeInnerHeight:function(){return this._document.body.offsetHeight}},settings:{"qx.enableApplicationLayout":true,"qx.boxModelCorrection":true},defer:function(){if(qx.core.Setting.get("qx.boxModelCorrection")){var b=org.eclipse.rwt.Client.getEngineBoxSizingAttributes();var a=b.join($[517])+$[517];var c=b.join($[522])+$[522];qx.html.StyleSheet.createElement("html,body { margin:0;border:0;padding:0; } html { border:0 none; } *{"+a+"} img{"+c+"}")}if(qx.core.Setting.get("qx.enableApplicationLayout")){qx.html.StyleSheet.createElement("html,body{width:100%;height:100%;overflow:hidden;}")}},destruct:function(){this._disposeObjects("_blocker");this._disposeFields("_window","_document","_modalWidgets","_modalNativeWindow","_globalCursorStyleSheet")}});
 qx.Class.define("qx.ui.basic.Terminator",{extend:qx.ui.core.Widget,members:{renderPadding:function(a){if(a.paddingLeft){this._renderRuntimePaddingLeft(this.getPaddingLeft())}if(a.paddingRight){this._renderRuntimePaddingRight(this.getPaddingRight())}if(a.paddingTop){this._renderRuntimePaddingTop(this.getPaddingTop())}if(a.paddingBottom){this._renderRuntimePaddingBottom(this.getPaddingBottom())}},_renderContent:function(){if(this._computedWidthTypePixel){this._cachedPreferredInnerWidth=null}else{this._invalidatePreferredInnerWidth()}if(this._computedHeightTypePixel){this._cachedPreferredInnerHeight=null}else{this._invalidatePreferredInnerHeight()}if(this._initialLayoutDone){this.addToJobQueue("load")}},_layoutPost:function(a){if(a.initial||a.load||a.width||a.height){this._postApply()}this.createDispatchDataEvent("flush",a)},_postApply:qx.lang.Function.returnTrue,_computeBoxWidthFallback:function(){return this.getPreferredBoxWidth()},_computeBoxHeightFallback:function(){return this.getPreferredBoxHeight()},_computePreferredInnerWidth:qx.lang.Function.returnZero,_computePreferredInnerHeight:qx.lang.Function.returnZero,_isWidthEssential:function(){if(!this._computedLeftTypeNull&&!this._computedRightTypeNull){return true}if(!this._computedWidthTypeNull&&!this._computedWidthTypeAuto){return true}if(!this._computedMinWidthTypeNull&&!this._computedMinWidthTypeAuto){return true}if(!this._computedMaxWidthTypeNull&&!this._computedMaxWidthTypeAuto){return true}if(this._targetNode){return true}return false},_isHeightEssential:function(){if(!this._computedTopTypeNull&&!this._computedBottomTypeNull){return true}if(!this._computedHeightTypeNull&&!this._computedHeightTypeAuto){return true}if(!this._computedMinHeightTypeNull&&!this._computedMinHeightTypeAuto){return true}if(!this._computedMaxHeightTypeNull&&!this._computedMaxHeightTypeAuto){return true}if(this._targetNode){return true}return false}}});
-qx.Class.define("qx.ui.core.ClientDocumentBlocker",{extend:qx.ui.basic.Terminator,construct:function(){arguments.callee.base.call(this);this.initTop();this.initLeft();this.initWidth();this.initHeight();this.initZIndex()},properties:{appearance:{refine:true,init:$[516]},zIndex:{refine:true,init:100000000},top:{refine:true,init:0},left:{refine:true,init:0},width:{refine:true,init:"100%"},height:{refine:true,init:"100%"},display:{refine:true,init:false}},members:{getFocusRoot:function(){return null}}});
-qx.Class.define("qx.theme.manager.Appearance",{type:$[33],extend:qx.util.manager.Object,construct:function(){arguments.callee.base.call(this);this.__cache={};this.__stateMap={};this.__stateMapLength=1},properties:{appearanceTheme:{check:$[125],nullable:true,apply:"_applyAppearanceTheme",event:"changeAppearanceTheme"}},members:{_applyAppearanceTheme:function(b,a){this._currentTheme=b;this._oldTheme=a;if(qx.theme.manager.Meta.getInstance().getAutoSync()){this.syncAppearanceTheme()}},syncAppearanceTheme:function(){if(!this._currentTheme&&!this._oldTheme){return}if(this._currentTheme){this.__cache[this._currentTheme.name]={}}var a=qx.core.Init.getInstance().getApplication();if(a&&a.getUiReady()){qx.ui.core.ClientDocument.getInstance()._recursiveAppearanceThemeUpdate(this._currentTheme,this._oldTheme)}if(this._oldTheme){delete this.__cache[this._oldTheme.name]}delete this._currentTheme;delete this._oldTheme},styleFrom:function(c,a){var b=this.getAppearanceTheme();if(!b){return}return this.styleFromTheme(b,c,a)},styleFromTheme:function(i,e,m){var k=i.appearances[e];if(!k){if(qx.core.Variant.isSet($[7],"on")){throw new Error("Missing appearance entry: "+e)}return null}if(!k.style){if(k.include){return this.styleFromTheme(i,k.include,m)}else{return null}}var b=this.__stateMap;var f=[e];for(var c in m){if(!b[c]){b[c]=this.__stateMapLength++}f[b[c]]=true}var h=f.join();var a=this.__cache[i.name];if(a&&a[h]!==undefined){return a[h]}var n;if(k.include||k.base){var j=k.style(m);var g;if(k.include){g=this.styleFromTheme(i,k.include,m)}n={};if(k.base){var d=this.styleFromTheme(k.base,e,m);if(k.include){for(var l in d){if(g[l]===undefined&&j[l]===undefined){n[l]=d[l]}}}else{for(var l in d){if(j[l]===undefined){n[l]=d[l]}}}}if(k.include){for(var l in g){if(j[l]===undefined){n[l]=g[l]}}}for(var l in j){n[l]=j[l]}}else{n=k.style(m)}if(a){a[h]=n||null}return n||null}},destruct:function(){this._disposeFields("__cache","__stateMap")}});
-qx.Class.define("qx.theme.manager.Meta",{type:$[33],extend:qx.core.Target,properties:{theme:{check:$[125],nullable:true,apply:"_applyTheme",event:"changeTheme"},autoSync:{check:$[3],init:true,apply:"_applyAutoSync"}},members:{_applyTheme:function(k,c){var f=null;var e=null;var b=null;var h=null;var j=null;var i=null;if(k){f=k.meta.color||null;e=k.meta.border||null;b=k.meta.font||null;h=k.meta.widget||null;j=k.meta.icon||null;i=k.meta.appearance||null}if(c){this.setAutoSync(false)}var a=qx.theme.manager.Color.getInstance();var g=qx.theme.manager.Font.getInstance();var l=qx.theme.manager.Icon.getInstance();var d=qx.theme.manager.Widget.getInstance();var m=qx.theme.manager.Appearance.getInstance();a.setColorTheme(f);g.setFontTheme(b);d.setWidgetTheme(h);l.setIconTheme(j);m.setAppearanceTheme(i);if(c){this.setAutoSync(true)}},_applyAutoSync:function(b,a){if(b){qx.theme.manager.Appearance.getInstance().syncAppearanceTheme();qx.theme.manager.Icon.getInstance().syncIconTheme();qx.theme.manager.Widget.getInstance().syncWidgetTheme();qx.theme.manager.Font.getInstance().syncFontTheme();qx.theme.manager.Color.getInstance().syncColorTheme()}},initialize:function(){var a=qx.core.Setting;var c,b;c=a.get("qx.theme");if(c){b=qx.Theme.getByName(c);if(!b){throw new Error("The meta theme to use is not available: "+c)}this.setTheme(b)}c=a.get("qx.colorTheme");if(c){b=qx.Theme.getByName(c);if(!b){throw new Error("The color theme to use is not available: "+c)}qx.theme.manager.Color.getInstance().setColorTheme(b)}c=a.get("qx.fontTheme");if(c){b=qx.Theme.getByName(c);if(!b){throw new Error("The font theme to use is not available: "+c)}qx.theme.manager.Font.getInstance().setFontTheme(b)}c=a.get("qx.widgetTheme");if(c){b=qx.Theme.getByName(c);if(!b){throw new Error("The widget theme to use is not available: "+c)}qx.theme.manager.Widget.getInstance().setWidgetTheme(b)}c=a.get("qx.iconTheme");if(c){b=qx.Theme.getByName(c);if(!b){throw new Error("The icon theme to use is not available: "+c)}qx.theme.manager.Icon.getInstance().setIconTheme(b)}c=a.get("qx.appearanceTheme");if(c){b=qx.Theme.getByName(c);if(!b){throw new Error("The appearance theme to use is not available: "+c)}qx.theme.manager.Appearance.getInstance().setAppearanceTheme(b)}},__queryThemes:function(b){var c=qx.Theme.getAll();var e;var d=[];for(var a in c){e=c[a];if(e[b]){d.push(e)}}return d},getMetaThemes:function(){return this.__queryThemes("meta")},getColorThemes:function(){return this.__queryThemes("colors")},getBorderThemes:function(){return this.__queryThemes("borders")},getFontThemes:function(){return this.__queryThemes("fonts")},getWidgetThemes:function(){return this.__queryThemes("widgets")},getIconThemes:function(){return this.__queryThemes("icons")},getAppearanceThemes:function(){return this.__queryThemes($[368])}},settings:{"qx.theme":"qx.theme.ClassicRoyale","qx.colorTheme":null,"qx.borderTheme":null,"qx.fontTheme":null,"qx.widgetTheme":null,"qx.appearanceTheme":null,"qx.iconTheme":null}});
-qx.Class.define("qx.util.manager.Value",{type:$[102],extend:qx.core.Target,construct:function(){arguments.callee.base.call(this);this._registry={};this._dynamic={};this._connectedObjects={}},members:{disconnect:function(e){if(this.isDisposed()){return}var c=e.toHashCode();var b=this._connectedObjects;var d=this._registry;if(qx.core.Variant.isSet($[7],"on")){if(!e){throw new Error("Can not disconnect from an empty object")}if(!b[c]){throw new Error("disconnect: themed value "+this+" has no connection to object: "+e)}}var a=b[c];while(a.length){delete d[a.pop()]}delete b[c]},connect:function(f,e,d){if(qx.core.Variant.isSet($[7],"on")){if(!f){throw new Error("Can not connect to invalid callback: "+f)}if(!e){throw new Error("Can not connect to invalid object: "+e)}if(typeof e.hasConnectionTo!=$[44]){throw new Error("The Connected object '"+e+"' must include the mixin 'qx.util.manager.MConnectedObject'!")}if(d===undefined){throw new Error("Undefined values are not allowed for connect: "+f+"["+e+"]")}if(typeof d===$[124]){throw new Error("Boolean values are not allowed for connect: "+f+"["+e+"]")}}var b=e.toHashCode();var a="v"+b+"$"+qx.core.Object.toHashCode(f);var c=this._registry;if(d!==null&&this._preprocess){d=this._preprocess(d)}if(this.isDynamic(d)){c[a]={callback:f,object:e,value:d};if(!this._connectedObjects[b]){this._connectedObjects[b]=[]}this._connectedObjects[b].push(a);e.hasConnectionTo(this)}else{if(c[a]){delete c[a]}}f.call(e,this.resolveDynamic(d)||d)},resolveDynamic:function(a){return this._dynamic[a]},isDynamic:function(a){return this._dynamic[a]!==undefined},_updateObjects:function(){var b=this._registry;var c;for(var a in b){c=b[a];c.callback.call(c.object,this.resolveDynamic(c.value))}}},destruct:function(){this._disposeFields("_registry","_dynamic","_connectedObjects")}});
-qx.Class.define("qx.theme.manager.Color",{type:$[33],extend:qx.util.manager.Value,properties:{colorTheme:{check:$[125],nullable:true,apply:"_applyColorTheme",event:"changeColorTheme"}},members:{_applyColorTheme:function(f){var c=this._dynamic={};if(f){var e=f.colors;var a=qx.util.ColorUtil;var b;for(var d in e){b=e[d];if(typeof b===$[13]){if(!a.isCssString(b)){throw new Error($[288]+b)}}else{if(b instanceof Array){b=a.rgbToRgbString(b)}else{throw new Error($[288]+b)}}c[d]=b}}if(qx.theme.manager.Meta.getInstance().getAutoSync()){this.syncColorTheme()}},syncColorTheme:function(){this._updateObjects()}}});
-qx.Class.define("qx.util.ColorUtil",{statics:{REGEXP:{hex3:/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,rgb:/^rgb\(\s*([0-9]{1,3}\.{0,1}[0-9]*)\s*,\s*([0-9]{1,3}\.{0,1}[0-9]*)\s*,\s*([0-9]{1,3}\.{0,1}[0-9]*)\s*\)$/},SYSTEM:{activeborder:true,activecaption:true,appworkspace:true,background:true,buttonface:true,buttonhighlight:true,buttonshadow:true,buttontext:true,captiontext:true,graytext:true,highlight:true,highlighttext:true,inactiveborder:true,inactivecaption:true,inactivecaptiontext:true,infobackground:true,infotext:true,menu:true,menutext:true,scrollbar:true,threeddarkshadow:true,threedface:true,threedhighlight:true,threedlightshadow:true,threedshadow:true,window:true,windowframe:true,windowtext:true},NAMED:{black:[0,0,0],silver:[192,192,192],gray:[128,128,128],white:[255,255,255],maroon:[128,0,0],red:[255,0,0],purple:[128,0,128],fuchsia:[255,0,255],green:[0,128,0],lime:[0,255,0],olive:[128,128,0],yellow:[255,255,0],navy:[0,0,128],blue:[0,0,255],teal:[0,128,128],aqua:[0,255,255],transparent:[-1,-1,-1],grey:[128,128,128],magenta:[255,0,255],orange:[255,165,0],brown:[165,42,42]},isNamedColor:function(a){return this.NAMED[a]!==undefined},isSystemColor:function(a){return this.SYSTEM[a]!==undefined},isThemedColor:function(a){return qx.theme.manager.Color.getInstance().isDynamic(a)},stringToRgb:function(a){if(this.isThemedColor(a)){var a=qx.theme.manager.Color.getInstance().resolveDynamic(a)}if(this.isNamedColor(a)){return this.NAMED[a]}else{if(this.isSystemColor(a)){throw new Error($[531]+a)}else{if(this.isRgbString(a)){return this.__rgbStringToRgb()}else{if(this.isHex3String(a)){return this.__hex3StringToRgb()}else{if(this.isHex6String(a)){return this.__hex6StringToRgb()}}}}}throw new Error($[288]+a)},cssStringToRgb:function(a){if(this.isNamedColor(a)){return this.NAMED[a]}else{if(this.isSystemColor(a)){throw new Error($[531]+a)}else{if(this.isRgbString(a)){return this.__rgbStringToRgb()}else{if(this.isHex3String(a)){return this.__hex3StringToRgb()}else{if(this.isHex6String(a)){return this.__hex6StringToRgb()}}}}}throw new Error($[288]+a)},stringToRgbString:function(a){return this.rgbToRgbString(this.stringToRgb(a))},rgbToRgbString:function(a){return"rgb("+a[0]+","+a[1]+","+a[2]+")"},rgbToHexString:function(a){return(qx.lang.String.pad(a[0].toString(16).toUpperCase(),2)+qx.lang.String.pad(a[1].toString(16).toUpperCase(),2)+qx.lang.String.pad(a[2].toString(16).toUpperCase(),2))},isValid:function(a){return this.isThemedColor(a)||this.isCssString(a)},isCssString:function(a){return this.isSystemColor(a)||this.isNamedColor(a)||this.isHex3String(a)||this.isHex6String(a)||this.isRgbString(a)},isHex3String:function(a){return this.REGEXP.hex3.test(a)},isHex6String:function(a){return this.REGEXP.hex6.test(a)},isRgbString:function(a){return this.REGEXP.rgb.test(a)},__rgbStringToRgb:function(){var c=parseInt(RegExp.$1);var b=parseInt(RegExp.$2);var a=parseInt(RegExp.$3);return[c,b,a]},__hex3StringToRgb:function(){var c=parseInt(RegExp.$1,16)*17;var b=parseInt(RegExp.$2,16)*17;var a=parseInt(RegExp.$3,16)*17;return[c,b,a]},__hex6StringToRgb:function(){var c=(parseInt(RegExp.$1,16)*16)+parseInt(RegExp.$2,16);var b=(parseInt(RegExp.$3,16)*16)+parseInt(RegExp.$4,16);var a=(parseInt(RegExp.$5,16)*16)+parseInt(RegExp.$6,16);return[c,b,a]},hex3StringToRgb:function(a){if(this.isHex3String(a)){return this.__hex3StringToRgb(a)}throw new Error("Invalid hex3 value: "+a)},hex6StringToRgb:function(a){if(this.isHex6String(a)){return this.__hex6StringToRgb(a)}throw new Error("Invalid hex6 value: "+a)},hexStringToRgb:function(a){if(this.isHex3String(a)){return this.__hex3StringToRgb(a)}if(this.isHex6String(a)){return this.__hex6StringToRgb(a)}throw new Error("Invalid hex value: "+a)}}});
-qx.Class.define("org.eclipse.rwt.Border",{extend:qx.core.Object,construct:function(c,b,a,d){arguments.callee.base.call(this);this._colors=null;this._widths=null;this._styles=null;this._innerColors=[null,null,null,null];this._radii=[null,null,null,null];this._singleColor=null;this._singleStyle=null;this._setWidth(c);this._setStyle(b?b:"none");this._setColor(a?a:"");if(b===$[242]){if(d===undefined){throw new Error("Missing innerColors")}this._setInnerColor(d)}else{if(b===$[114]){if(d===undefined||this.getColor()===null){throw new Error("Invalid arguments for border style rounded")}this._setRadii(d)}else{if(d!==undefined){throw new Error("colorsOrRadii set for style "+this.getStyle())}}}},statics:{_EDGEWIDTH:[$[90],$[299],$[297],$[87]],_EDGECOLOR:["borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"],_EDGESTYLE:[$[571],$[547],$[434],$[460]],_EDGEMOZCOLORS:["MozBorderTopColors","MozBorderRightColors","MozBorderBottomColors","MozBorderLeftColors"],_BORDERRADII:qx.core.Variant.select($[0],{webkit:["-webkit-border-top-left-radius","-webkit-border-top-right-radius","-webkit-border-bottom-right-radius","-webkit-border-bottom-left-radius"],gecko:["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],"default":[]}),reset:function(c){c._style.border="";if(c._innerStyle){c._innerStyle.border=""}try{for(var b=0;b<4;b++){c._style[this._BORDERRADII[b]]=""}}catch(a){}this._resetComplexBorder(c)},_resetComplexBorder:qx.core.Variant.select($[0],{gecko:function(c){var d=org.eclipse.rwt.Border;var b=c._style;for(var a=0;a<4;a++){b[d._EDGEMOZCOLORS[a]]=""}},"default":function(c){var d=org.eclipse.rwt.Border;var a=c._innerStyle;if(a){for(var b=0;b<4;b++){a[d._EDGEWIDTH[b]]="";a[d._EDGESTYLE[b]]="";a[d._EDGECOLOR[b]]=""}}}})},members:{_setColor:function(a){if(typeof a===$[13]){this._singleColor=a}this._colors=this._normalizeValue(a)},_setWidth:function(a){this._widths=this._normalizeValue(a)},_setStyle:function(a){if(typeof a===$[13]){this._singleStyle=a;if(a===$[242]||a===$[114]){this._styles=this._normalizeValue($[20])}else{this._styles=this._normalizeValue(a)}}else{this._styles=this._normalizeValue(a)}},_setInnerColor:function(a){this._innerColors=this._normalizeValue(a)},_setRadii:function(a){this._radii=this._normalizeValue(a)},getRadii:function(){return this._radii.concat()},getColor:function(){return this._singleColor},getColors:function(){return this._colors.concat()},getColorTop:function(){return this._colors[0]},getColorRight:function(){return this._colors[1]},getColorBottom:function(){return this._colors[2]},getColorLeft:function(){return this._colors[3]},getInnerColors:function(){return this._innerColors.concat()},getColorInnerTop:function(){return this._innerColors[0]},getColorInnerRight:function(){return this._innerColors[1]},getColorInnerBottom:function(){return this._innerColors[2]},getColorInnerLeft:function(){return this._innerColors[3]},getStyle:function(){return this._singleStyle},getStyles:function(){return this._styles.concat()},getStyleTop:function(){return this._styles[0]},getStyleRight:function(){return this._styles[1]},getStyleBottom:function(){return this._styles[2]},getStyleLeft:function(){return this._styles[3]},getWidths:function(){return this._widths.concat()},getWidthTop:function(){return this._widths[0]},getWidthRight:function(){return this._widths[1]},getWidthBottom:function(){return this._widths[2]},getWidthLeft:function(){return this._widths[3]},_normalizeValue:function(b){var a;if(b instanceof Array){a=b}else{a=[b,b,b,b]}return a},render:function(a){if(this.getStyle()===$[242]){this._renderComplexBorder(a)}else{if(this.getStyle()===$[114]){this._renderRoundedBorder(a)}else{this._renderSimpleBorder(a)}}},_renderSimpleBorder:function(c){org.eclipse.rwt.Border._resetComplexBorder(c);var b=c._style;var d=org.eclipse.rwt.Border;for(var a=0;a<4;a++){b[d._EDGEWIDTH[a]]=(this._widths[a]||0)+"px";b[d._EDGESTYLE[a]]=this._styles[a]||"none";b[d._EDGECOLOR[a]]=this._colors[a]||""}},_renderComplexBorder:qx.core.Variant.select($[0],{gecko:function(c){var d=org.eclipse.rwt.Border;var b=c._style;for(var a=0;a<4;a++){b[d._EDGEWIDTH[a]]=(this._widths[a]||0)+"px";b[d._EDGECOLOR[a]]=this._colors[a]||"";if(this._widths[a]===2){b[d._EDGESTYLE[a]]=$[20];b[d._EDGEMOZCOLORS[a]]=this._colors[a]+" "+this._innerColors[a]}else{b[d._EDGESTYLE[a]]=this._styles[a]||"none";b[d._EDGEMOZCOLORS[a]]=""}}},"default":function(d){var e=org.eclipse.rwt.Border;var c=d._style;var a=d._innerStyle;for(var b=0;b<4;b++){if(this._widths[b]===2){if(!a){d.prepareEnhancedBorder();a=d._innerStyle}c[e._EDGEWIDTH[b]]="1px";c[e._EDGESTYLE[b]]=$[20];c[e._EDGECOLOR[b]]=this._colors[b]||"";a[e._EDGEWIDTH[b]]="1px";a[e._EDGESTYLE[b]]=$[20];a[e._EDGECOLOR[b]]=this._innerColors[b]}else{c[e._EDGEWIDTH[b]]=(this._widths[b]||0)+"px";c[e._EDGESTYLE[b]]=this._styles[b]||"none";c[e._EDGECOLOR[b]]=this._colors[b]||"";if(a){a[e._EDGEWIDTH[b]]="";a[e._EDGESTYLE[b]]="";a[e._EDGECOLOR[b]]=""}}}}}),_renderRoundedBorder:function(c){var d=org.eclipse.rwt.Border;this._renderSimpleBorder(c);var b=c._style;for(var a=0;a<4;a++){b[d._BORDERRADII[a]]=this._radii[a]+"px"}}}});
-qx.Class.define("qx.theme.manager.Font",{type:$[33],extend:qx.util.manager.Value,properties:{fontTheme:{check:$[125],nullable:true,apply:"_applyFontTheme",event:"changeFontTheme"}},members:{resolveDynamic:function(a){return a instanceof qx.ui.core.Font?a:this._dynamic[a]},isDynamic:function(a){return a&&(a instanceof qx.ui.core.Font||this._dynamic[a]!==undefined)},syncFontTheme:function(){this._updateObjects()},_applyFontTheme:function(e){var b=this._dynamic;for(var c in b){if(b[c].themed){b[c].dispose();delete b[c]}}if(e){var d=e.fonts;var a=qx.ui.core.Font;for(var c in d){b[c]=(new a).set(d[c]);b[c].themed=true}}if(qx.theme.manager.Meta.getInstance().getAutoSync()){this.syncFontTheme()}}}});
-qx.Class.define("qx.ui.core.Font",{extend:qx.core.Object,construct:function(a,b){arguments.callee.base.call(this);if(a!==undefined){this.setSize(a)}if(b!==undefined){this.setFamily(b)}},statics:{fromString:function(g){var b=new qx.ui.core.Font;var f=g.split(/\s+/);var d=[];var c;for(var e=0;e<f.length;e++){switch(c=f[e]){case"bold":b.setBold(true);break;case"italic":b.setItalic(true);break;case $[335]:b.setDecoration($[335]);break;default:var a=parseInt(c);if(a==c||qx.lang.String.contains(c,"px")){b.setSize(a)}else{d.push(c)}break}}if(d.length>0){b.setFamily(d)}return b},fromConfig:function(b){var a=new qx.ui.core.Font;a.set(b);return a},reset:function(a){a.removeStyleProperty("fontFamily");a.removeStyleProperty($[194]);a.removeStyleProperty("fontWeight");a.removeStyleProperty("fontStyle");a.removeStyleProperty($[379])},resetElement:function(a){var b=a.style;b.fontFamily="";b.fontSize="";b.fontWeight="";b.fontStyle="";b.textDecoration=""},resetStyle:function(a){a.fontFamily="";a.fontSize="";a.fontWeight="";a.fontStyle="";a.textDecoration=""}},properties:{size:{check:$[22],nullable:true,apply:"_applySize"},family:{check:"Array",nullable:true,apply:"_applyFamily"},bold:{check:$[3],nullable:true,apply:"_applyBold"},italic:{check:$[3],nullable:true,apply:"_applyItalic"},decoration:{check:[$[335],"line-through","overline"],nullable:true,apply:"_applyDecoration"}},members:{__size:null,__family:null,__bold:null,__italic:null,__decoration:null,_applySize:function(b,a){this.__size=b===null?null:b+"px"},_applyFamily:function(e,b){var d="";for(var c=0,a=e.length;c<a;c++){if(e[c].indexOf(" ")>0){d+='"'+e[c]+'"'}else{d+=e[c]}if(c!=a-1){d+=","}}this.__family=d},_applyBold:function(b,a){this.__bold=b===null?null:b?"bold":$[109]},_applyItalic:function(b,a){this.__italic=b===null?null:b?"italic":$[109]},_applyDecoration:function(b,a){this.__decoration=b===null?null:b},render:function(a){a.setStyleProperty("fontFamily",this.__family);a.setStyleProperty($[194],this.__size);a.setStyleProperty("fontWeight",this.__bold);a.setStyleProperty("fontStyle",this.__italic);a.setStyleProperty($[379],this.__decoration)},renderStyle:function(a){a.fontFamily=this.__family||"";a.fontSize=this.__size||"";a.fontWeight=this.__bold||"";a.fontStyle=this.__italic||"";a.textDecoration=this.__decoration||""},renderElement:function(a){var b=a.style;b.fontFamily=this.__family||"";b.fontSize=this.__size||"";b.fontWeight=this.__bold||"";b.fontStyle=this.__italic||"";b.textDecoration=this.__decoration||""},generateStyle:function(){return(this.__family?"font-family:"+this.__family.replace(/\"/g,"'")+";":"")+(this.__size?"font-size:"+this.__size+";":"")+(this.__weight?"font-weight:"+this.__weight+";":"")+(this.__style?"font-style:"+this.__style+";":"")+(this.__decoration?"text-decoration:"+this.__decoration+";":"")}}});
-qx.Class.define("qx.theme.manager.Icon",{type:$[33],extend:qx.core.Target,properties:{iconTheme:{check:$[125],nullable:true,apply:"_applyIconTheme",event:"changeIconTheme"}},members:{_applyIconTheme:function(b,a){if(qx.theme.manager.Meta.getInstance().getAutoSync()){this.syncIconTheme()}},syncIconTheme:function(){var b=this.getIconTheme();var a=qx.io.Alias.getInstance();b?a.add("icon",b.icons.uri):a.remove("icon")}}});
-qx.Class.define("qx.io.Alias",{type:$[33],extend:qx.util.manager.Value,construct:function(){arguments.callee.base.call(this);this._aliases={};this._addStatic()},members:{_addStatic:function(){this.add($[118],qx.core.Setting.isSet($[550])?qx.core.Setting.get($[550]):qx.core.Setting.get($[565])+"/static")},_preprocess:function(f){var d=this._dynamic;if(d[f]===false){return f}else{if(d[f]===undefined){if(f.indexOf("http://")===0||f.indexOf("https://")===0||f.indexOf("file://")===0){d[f]=false;return f}var e=f.substring(0,f.indexOf("/"));var c=this._aliases[e];if(c===undefined){if(qx.core.Variant.isSet($[0],$[18])){if(window.location.protocol==="https:"){var b=f.match(/^[\.\/]/);var a=f.match(/^\w/);if(b!=null||a!=null){if(a!=null&&b==null){f="./"+f}return this.__rewriteUrl(f)}}}return f}else{if(qx.core.Variant.isSet($[0],$[18])){if(window.location.protocol==="https:"){c=this.__rewriteUrl(c)}}d[f]=c+f.substring(e.length)}}}return f},__rewriteUrl:function(b){var a="";if(b.match(/^\/\//)!=null){a=window.location.protocol}else{if(b.match(/^\.\//)!=null&&qx.core.Setting.get($[529])){b=b.substring(1);a=document.URL.substring(0,document.URL.lastIndexOf("/"))}else{if(b.match(/^\//)){a=window.location.protocol+"//"+window.location.host}else{if(b.match(/^http/)!=null){}else{a=window.location.href.substring(0,window.location.href.lastIndexOf("/")+1)}}}}return a+b},add:function(c,f){this._aliases[c]=f;var a=this._dynamic;var d=this._registry;var e;var h={};for(var g in a){if(g.substring(0,g.indexOf("/"))===c){a[g]=f+g.substring(c.length);h[g]=true}}for(var b in d){e=d[b];if(h[e.value]){e.callback.call(e.object,a[e.value])}}},remove:function(a){delete this._aliases[a]},resolve:function(a){if(a!==null){a=this._preprocess(a)}return this._dynamic[a]||a}},destruct:function(){this._disposeFields("_aliases")}});
-qx.Class.define("qx.theme.manager.Widget",{type:$[33],extend:qx.core.Target,properties:{widgetTheme:{check:$[125],nullable:true,apply:"_applyWidgetTheme",event:"changeWidgetTheme"}},members:{_applyWidgetTheme:function(b,a){if(qx.theme.manager.Meta.getInstance().getAutoSync()){this.syncWidgetTheme()}},syncWidgetTheme:function(){var b=this.getWidgetTheme();var a=qx.io.Alias.getInstance();b?a.add("widget",b.widgets.uri):a.remove("widget")}}});
-qx.Class.define($[486],{extend:qx.core.Target,construct:function(a){arguments.callee.base.call(this);if(a!=null){this._attachedWidget=a}},statics:{mouseFocus:false},members:{getAttachedWidget:function(){return this._attachedWidget},_onkeyevent:function(a,d){if(d.getKeyIdentifier()!="Tab"){return}d.stopPropagation();d.preventDefault();qx.event.handler.FocusHandler.mouseFocus=false;var c=this.getAttachedWidget().getFocusedChild();if(!d.isShiftPressed()){var b=c?this.getWidgetAfter(a,c):this.getFirstWidget(a)}else{var b=c?this.getWidgetBefore(a,c):this.getLastWidget(a)}if(b){b.setFocused(true);b._ontabfocus()}},compareTabOrder:function(f,d){if(f==d){return 0}var h=f.getTabIndex();var g=d.getTabIndex();if(h!=g){return h-g}var j=qx.bom.element.Location.getTop(f.getElement());var i=qx.bom.element.Location.getTop(d.getElement());if(j!=i){return j-i}var b=qx.bom.element.Location.getLeft(f.getElement());var a=qx.bom.element.Location.getLeft(d.getElement());if(b!=a){return b-a}var e=f.getZIndex();var c=d.getZIndex();if(e!=c){return e-c}return 0},getFirstWidget:function(a){return this._getFirst(a,null)},getLastWidget:function(a){return this._getLast(a,null)},getWidgetAfter:function(b,a){if(b==a){return this.getFirstWidget(b)}if(a.getAnonymous()){a=a.getParent()}if(a==null){return[]}var c=[];this._getAllAfter(b,a,c);c.sort(this.compareTabOrder);return c.length>0?c[0]:this.getFirstWidget(b)},getWidgetBefore:function(c,b){if(c==b){return this.getLastWidget(c)}if(b.getAnonymous()){b=b.getParent()}if(b==null){return[]}var d=[];this._getAllBefore(c,b,d);d.sort(this.compareTabOrder);var a=d.length;return a>0?d[a-1]:this.getLastWidget(c)},_getAllAfter:function(e,f,b){var d=e.getChildren();var g;var a=d.length||0;for(var c=0;c<a;c++){g=d[c];if(g.isDisposed()||!(g instanceof qx.ui.core.Parent)&&!(g instanceof qx.ui.basic.Terminator)){continue}if(g.isFocusable()&&g.getTabIndex()>0&&this.compareTabOrder(f,g)<0){b.push(d[c])}if(!g.isFocusRoot()&&g instanceof qx.ui.core.Parent){this._getAllAfter(g,f,b)}}},_getAllBefore:function(e,f,b){var d=e.getChildren();var g;var a=d.length;for(var c=0;c<a;c++){g=d[c];if(!(g instanceof qx.ui.core.Parent)&&!(g instanceof qx.ui.basic.Terminator)){continue}if(g.isFocusable()&&g.getTabIndex()>0&&this.compareTabOrder(f,g)>0){b.push(g)}if(!g.isFocusRoot()&&g instanceof qx.ui.core.Parent){this._getAllBefore(g,f,b)}}},_getFirst:function(d,f){var c=d.getChildren();var e;var a=c.length;for(var b=0;b<a;b++){e=c[b];if(!(e instanceof qx.ui.core.Parent)&&!(e instanceof qx.ui.basic.Terminator)){continue}if(e.isFocusable()&&e.getTabIndex()>0){if(f==null||this.compareTabOrder(e,f)<0){f=e}}if(!e.isFocusRoot()&&e instanceof qx.ui.core.Parent){f=this._getFirst(e,f)}}return f},_getLast:function(e,b){var d=e.getChildren();var f;var a=d.length;for(var c=0;c<a;c++){f=d[c];if(!(f instanceof qx.ui.core.Parent)&&!(f instanceof qx.ui.basic.Terminator)){continue}if(f.isFocusable()&&f.getTabIndex()>0){if(b==null||this.compareTabOrder(f,b)>0){b=f}}if(!f.isFocusRoot()&&f instanceof qx.ui.core.Parent){b=this._getLast(f,b)}}return b}},destruct:function(){this._disposeFields("_attachedWidget")}});
-qx.Class.define("qx.bom.element.Location",{statics:{__style:function(b,a){return qx.bom.element.Style.get(b,a,qx.bom.element.Style.COMPUTED_MODE,false)},__num:function(b,a){return parseInt(qx.bom.element.Style.get(b,a,qx.bom.element.Style.COMPUTED_MODE,false),10)||0},__computeScroll:function(b){var e=0,d=0;if(b.getBoundingClientRect){var c=qx.dom.Node.getWindow(b);if(!org.eclipse.rwt.Client.isMobileSafari()){e-=qx.bom.Viewport.getScrollLeft(c);d-=qx.bom.Viewport.getScrollTop(c)}}else{var a=qx.dom.Node.getDocument(b).body;b=b.parentNode;while(b&&b!=a){e+=b.scrollLeft;d+=b.scrollTop;b=b.parentNode}}return{left:Math.ceil(e),top:Math.ceil(d)}},__computeBody:qx.core.Variant.select($[0],{mshtml:function(b){var e=qx.dom.Node.getDocument(b);var a=e.body;var d=a.offsetLeft;var c=a.offsetTop;d-=this.__num(a,$[87]);c-=this.__num(a,$[90]);if(e.compatMode===$[117]){d+=this.__num(a,$[208]);c+=this.__num(a,$[207])}return{left:Math.ceil(d),top:Math.ceil(c)}},webkit:function(b){var e=qx.dom.Node.getDocument(b);var a=e.body;var d=a.offsetLeft;var c=a.offsetTop;d+=this.__num(a,$[87]);c+=this.__num(a,$[90]);if(e.compatMode===$[117]){d+=this.__num(a,$[208]);c+=this.__num(a,$[207])}return{left:Math.ceil(d),top:Math.ceil(c)}},gecko:function(b){var a=qx.dom.Node.getDocument(b).body;var d=a.offsetLeft;var c=a.offsetTop;if(qx.bom.element.BoxSizing.get(a)!==$[272]){d+=this.__num(a,$[87]);c+=this.__num(a,$[90]);if(!b.getBoundingClientRect){var e;while(b){if(this.__style(b,$[146])===$[27]||this.__style(b,$[146])===$[151]){e=true;break}b=b.offsetParent}if(!e){d+=this.__num(a,$[87]);c+=this.__num(a,$[90])}}}return{left:Math.ceil(d),top:Math.ceil(c)}},"default":function(b){var a=qx.dom.Node.getDocument(b).body;var d=a.offsetLeft;var c=a.offsetTop;return{left:Math.ceil(d),top:Math.ceil(c)}}}),__computeOffset:qx.core.Variant.select($[0],{"mshtml|webkit":function(c){var f=qx.dom.Node.getDocument(c);if(c.getBoundingClientRect){var b=c.getBoundingClientRect();var e=b.left;var d=b.top;if(f.compatMode===$[117]){e-=this.__num(c,$[87]);d-=this.__num(c,$[90])}}else{var e=c.offsetLeft;var d=c.offsetTop;c=c.offsetParent;var a=f.body;while(c&&c!=a){e+=c.offsetLeft;d+=c.offsetTop;e+=this.__num(c,$[87]);d+=this.__num(c,$[90]);c=c.offsetParent}}return{left:Math.ceil(e),top:Math.ceil(d)}},gecko:function(d){if(d.getBoundingClientRect){var c=d.getBoundingClientRect();var f=Math.round(c.left);var e=Math.round(c.top)}else{var f=0;var e=0;var a=qx.dom.Node.getDocument(d).body;var b=qx.bom.element.BoxSizing;if(b.get(d)!==$[272]){f-=this.__num(d,$[87]);e-=this.__num(d,$[90])}while(d&&d!==a){f+=d.offsetLeft;e+=d.offsetTop;if(b.get(d)!==$[272]){f+=this.__num(d,$[87]);e+=this.__num(d,$[90])}if(d.parentNode&&this.__style(d.parentNode,$[72])!="visible"){f+=this.__num(d.parentNode,$[87]);e+=this.__num(d.parentNode,$[90])}d=d.offsetParent}}return{left:Math.ceil(f),top:Math.ceil(e)}},"default":function(b){var d=0;var c=0;var a=qx.dom.Node.getDocument(b).body;while(b&&b!==a){d+=b.offsetLeft;c+=b.offsetTop;b=b.offsetParent}return{left:Math.ceil(d),top:Math.ceil(c)}}}),get:function(d,f){var g=this.__computeBody(d);if(d.tagName=="BODY"){var c=g.left;var h=g.top}else{var e=this.__computeOffset(d);var i=this.__computeScroll(d);var c=e.left+g.left-i.left;var h=e.top+g.top-i.top}var j=c+d.offsetWidth;var b=h+d.offsetHeight;if(f){if(f==$[37]||f==$[26]){var a=qx.bom.element.Overflow.getX(d);if(a==$[26]||a=="auto"){j+=d.scrollWidth-d.offsetWidth+this.__num(d,$[87])+this.__num(d,$[299])}var k=qx.bom.element.Overflow.getY(d);if(k==$[26]||k=="auto"){b+=d.scrollHeight-d.offsetHeight+this.__num(d,$[90])+this.__num(d,$[297])}}switch(f){case $[37]:c+=this.__num(d,$[239]);h+=this.__num(d,$[209]);j-=this.__num(d,$[220]);b-=this.__num(d,$[234]);case $[26]:c-=d.scrollLeft;h-=d.scrollTop;j-=d.scrollLeft;b-=d.scrollTop;case $[4]:c+=this.__num(d,$[87]);h+=this.__num(d,$[90]);j-=this.__num(d,$[299]);b-=this.__num(d,$[297]);break;case $[96]:c-=this.__num(d,$[208]);h-=this.__num(d,$[207]);j+=this.__num(d,$[263]);b+=this.__num(d,$[315]);break}}return{left:c,top:h,right:j,bottom:b}},getLeft:function(a,b){return this.get(a,b).left},getTop:function(a,b){return this.get(a,b).top},getRight:function(a,b){return this.get(a,b).right},getBottom:function(a,b){return this.get(a,b).bottom},getRelative:function(b,a,f,d){var e=this.get(b,f);var c=this.get(a,d);return{left:e.left-c.left,top:e.top-c.top,right:e.right-c.right,bottom:e.bottom-c.bottom}}}});
-qx.Class.define("qx.bom.element.Style",{statics:{__hints:{names:{"float":qx.core.Variant.isSet($[0],$[18])?"styleFloat":"cssFloat",boxSizing:qx.core.Variant.isSet($[0],$[40])?"mozBoxSizing":$[281]},mshtmlPixel:{width:"pixelWidth",height:"pixelHeight",left:"pixelLeft",right:"pixelRight",top:"pixelTop",bottom:"pixelBottom"}},COMPUTED_MODE:1,CASCADED_MODE:2,LOCAL_MODE:3,get:qx.core.Variant.select($[0],{mshtml:function(f,a,g,i){var b=this.__hints;a=b.names[a]||a;switch(g){case this.LOCAL_MODE:return f.style[a]||"";case this.CASCADED_MODE:return f.currentStyle[a];default:var c=f.currentStyle[a];if(/^-?[\.\d]+(px)?$/i.test(c)){return c}var d=b.mshtmlPixel[a];if(d){var e=f.style[a];f.style[a]=c||0;var h=f.style[d]+"px";f.style[a]=e;return h}if(/^-?[\.\d]+(em|pt|%)?$/i.test(c)){throw new Error("Untranslated computed property value: "+a+". Only pixel values work well across different clients.")}return c}},"default":function(b,a,g,f){var d=this.__hints;a=d.names[a]||a;switch(g){case this.LOCAL_MODE:return b.style[a];case this.CASCADED_MODE:if(b.currentStyle){return b.currentStyle[a]}throw new Error("Cascaded styles are not supported in this browser!");default:var e=qx.dom.Node.getDocument(b);var c=e.defaultView.getComputedStyle(b,null);return c?c[a]:null}}})}});
-qx.Class.define("qx.bom.element.BoxSizing",{statics:{__styleProperties:qx.core.Variant.select($[0],{mshtml:null,webkit:[$[281],"KhtmlBoxSizing","WebkitBoxSizing"],gecko:["MozBoxSizing",$[281]],opera:[$[281]]}),__nativeBorderBox:{tags:{button:true,select:true},types:{search:true,button:true,submit:true,reset:true,checkbox:true,radio:true}},__usesNativeBorderBox:function(a){var b=this.__nativeBorderBox;return b.tags[a.tagName.toLowerCase()]||b.types[a.type]},get:qx.core.Variant.select($[0],{mshtml:function(a){if(qx.bom.Document.isStandardMode(qx.dom.Node.getDocument(a))){if(!this.__usesNativeBorderBox(a)){return"content-box"}}return $[272]},"default":function(c){var d=this.__styleProperties;var e;if(d){for(var b=0,a=d.length;b<a;b++){e=qx.bom.element.Style.get(c,d[b],null,false);if(e!=null&&e!==""){return e}}}}})}});
-qx.Class.define("qx.bom.Document",{statics:{isQuirksMode:function(a){return(a||window).document.compatMode!==$[117]},isStandardMode:function(a){return(a||window).document.compatMode===$[117]},getWidth:function(d){var c=(d||window).document;var b=qx.bom.Viewport.getWidth(d);var a=c.compatMode===$[117]?c.documentElement.scrollWidth:c.body.scrollWidth;return Math.max(a,b)},getHeight:function(d){var c=(d||window).document;var b=qx.bom.Viewport.getHeight(d);var a=c.compatMode===$[117]?c.documentElement.scrollHeight:c.body.scrollHeight;return Math.max(a,b)}}});
-qx.Class.define("qx.bom.element.Overflow",{statics:{getX:qx.core.Variant.select($[0],{gecko:org.eclipse.rwt.Client.getVersion()<1.8?function(a,b){var c=qx.bom.element.Style.get(a,$[72],b,false);if(c===$[285]){c=$[17]}return c}:function(a,b){return qx.bom.element.Style.get(a,$[103],b,false)},opera:org.eclipse.rwt.Client.getVersion()<9.5?function(a,b){return qx.bom.element.Style.get(a,$[72],b,false)}:function(a,b){return qx.bom.element.Style.get(a,$[103],b,false)},"default":function(a,b){return qx.bom.element.Style.get(a,$[103],b,false)}}),getY:qx.core.Variant.select($[0],{gecko:org.eclipse.rwt.Client.getVersion()<1.8?function(a,b){var c=qx.bom.element.Style.get(a,$[72],b,false);if(c===$[285]){c=$[17]}return c}:function(a,b){return qx.bom.element.Style.get(a,$[104],b,false)},opera:org.eclipse.rwt.Client.getVersion()<9.5?function(a,b){return qx.bom.element.Style.get(a,$[72],b,false)}:function(a,b){return qx.bom.element.Style.get(a,$[104],b,false)},"default":function(a,b){return qx.bom.element.Style.get(a,$[104],b,false)}})}});
+qx.Class.define("qx.ui.core.ClientDocumentBlocker",{extend:qx.ui.basic.Terminator,construct:function(){arguments.callee.base.call(this);this.initTop();this.initLeft();this.initWidth();this.initHeight();this.initZIndex()},properties:{appearance:{refine:true,init:$[546]},zIndex:{refine:true,init:100000000},top:{refine:true,init:0},left:{refine:true,init:0},width:{refine:true,init:"100%"},height:{refine:true,init:"100%"},display:{refine:true,init:false}},members:{getFocusRoot:function(){return null}}});
+qx.Class.define("qx.theme.manager.Appearance",{type:$[33],extend:qx.util.manager.Object,construct:function(){arguments.callee.base.call(this);this.__cache={};this.__stateMap={};this.__stateMapLength=1},properties:{appearanceTheme:{check:$[126],nullable:true,apply:"_applyAppearanceTheme",event:"changeAppearanceTheme"}},members:{_applyAppearanceTheme:function(b,a){this._currentTheme=b;this._oldTheme=a;if(qx.theme.manager.Meta.getInstance().getAutoSync()){this.syncAppearanceTheme()}},syncAppearanceTheme:function(){if(!this._currentTheme&&!this._oldTheme){return}if(this._currentTheme){this.__cache[this._currentTheme.name]={}}var a=qx.core.Init.getInstance().getApplication();if(a&&a.getUiReady()){qx.ui.core.ClientDocument.getInstance()._recursiveAppearanceThemeUpdate(this._currentTheme,this._oldTheme)}if(this._oldTheme){delete this.__cache[this._oldTheme.name]}delete this._currentTheme;delete this._oldTheme},styleFrom:function(c,a){var b=this.getAppearanceTheme();if(!b){return}return this.styleFromTheme(b,c,a)},styleFromTheme:function(i,e,m){var k=i.appearances[e];if(!k){if(qx.core.Variant.isSet($[7],"on")){throw new Error("Missing appearance entry: "+e)}return null}if(!k.style){if(k.include){return this.styleFromTheme(i,k.include,m)}else{return null}}var b=this.__stateMap;var f=[e];for(var c in m){if(!b[c]){b[c]=this.__stateMapLength++}f[b[c]]=true}var h=f.join();var a=this.__cache[i.name];if(a&&a[h]!==undefined){return a[h]}var n;if(k.include||k.base){var j=k.style(m);var g;if(k.include){g=this.styleFromTheme(i,k.include,m)}n={};if(k.base){var d=this.styleFromTheme(k.base,e,m);if(k.include){for(var l in d){if(g[l]===undefined&&j[l]===undefined){n[l]=d[l]}}}else{for(var l in d){if(j[l]===undefined){n[l]=d[l]}}}}if(k.include){for(var l in g){if(j[l]===undefined){n[l]=g[l]}}}for(var l in j){n[l]=j[l]}}else{n=k.style(m)}if(a){a[h]=n||null}return n||null}},destruct:function(){this._disposeFields("__cache","__stateMap")}});
+qx.Class.define("qx.theme.manager.Meta",{type:$[33],extend:qx.core.Target,properties:{theme:{check:$[126],nullable:true,apply:"_applyTheme",event:"changeTheme"},autoSync:{check:$[3],init:true,apply:"_applyAutoSync"}},members:{_applyTheme:function(k,c){var f=null;var e=null;var b=null;var h=null;var j=null;var i=null;if(k){f=k.meta.color||null;e=k.meta.border||null;b=k.meta.font||null;h=k.meta.widget||null;j=k.meta.icon||null;i=k.meta.appearance||null}if(c){this.setAutoSync(false)}var a=qx.theme.manager.Color.getInstance();var g=qx.theme.manager.Font.getInstance();var l=qx.theme.manager.Icon.getInstance();var d=qx.theme.manager.Widget.getInstance();var m=qx.theme.manager.Appearance.getInstance();a.setColorTheme(f);g.setFontTheme(b);d.setWidgetTheme(h);l.setIconTheme(j);m.setAppearanceTheme(i);if(c){this.setAutoSync(true)}},_applyAutoSync:function(b,a){if(b){qx.theme.manager.Appearance.getInstance().syncAppearanceTheme();qx.theme.manager.Icon.getInstance().syncIconTheme();qx.theme.manager.Widget.getInstance().syncWidgetTheme();qx.theme.manager.Font.getInstance().syncFontTheme();qx.theme.manager.Color.getInstance().syncColorTheme()}},initialize:function(){var a=qx.core.Setting;var c,b;c=a.get("qx.theme");if(c){b=qx.Theme.getByName(c);if(!b){throw new Error("The meta theme to use is not available: "+c)}this.setTheme(b)}c=a.get("qx.colorTheme");if(c){b=qx.Theme.getByName(c);if(!b){throw new Error("The color theme to use is not available: "+c)}qx.theme.manager.Color.getInstance().setColorTheme(b)}c=a.get("qx.fontTheme");if(c){b=qx.Theme.getByName(c);if(!b){throw new Error("The font theme to use is not available: "+c)}qx.theme.manager.Font.getInstance().setFontTheme(b)}c=a.get("qx.widgetTheme");if(c){b=qx.Theme.getByName(c);if(!b){throw new Error("The widget theme to use is not available: "+c)}qx.theme.manager.Widget.getInstance().setWidgetTheme(b)}c=a.get("qx.iconTheme");if(c){b=qx.Theme.getByName(c);if(!b){throw new Error("The icon theme to use is not available: "+c)}qx.theme.manager.Icon.getInstance().setIconTheme(b)}c=a.get("qx.appearanceTheme");if(c){b=qx.Theme.getByName(c);if(!b){throw new Error("The appearance theme to use is not available: "+c)}qx.theme.manager.Appearance.getInstance().setAppearanceTheme(b)}},__queryThemes:function(b){var c=qx.Theme.getAll();var e;var d=[];for(var a in c){e=c[a];if(e[b]){d.push(e)}}return d},getMetaThemes:function(){return this.__queryThemes("meta")},getColorThemes:function(){return this.__queryThemes("colors")},getBorderThemes:function(){return this.__queryThemes("borders")},getFontThemes:function(){return this.__queryThemes("fonts")},getWidgetThemes:function(){return this.__queryThemes("widgets")},getIconThemes:function(){return this.__queryThemes("icons")},getAppearanceThemes:function(){return this.__queryThemes($[395])}},settings:{"qx.theme":"qx.theme.ClassicRoyale","qx.colorTheme":null,"qx.borderTheme":null,"qx.fontTheme":null,"qx.widgetTheme":null,"qx.appearanceTheme":null,"qx.iconTheme":null}});
+qx.Class.define("qx.util.manager.Value",{type:$[97],extend:qx.core.Target,construct:function(){arguments.callee.base.call(this);this._registry={};this._dynamic={};this._connectedObjects={}},members:{disconnect:function(e){if(this.isDisposed()){return}var c=e.toHashCode();var b=this._connectedObjects;var d=this._registry;if(qx.core.Variant.isSet($[7],"on")){if(!e){throw new Error("Can not disconnect from an empty object")}if(!b[c]){throw new Error("disconnect: themed value "+this+" has no connection to object: "+e)}}var a=b[c];while(a.length){delete d[a.pop()]}delete b[c]},connect:function(f,e,d){if(qx.core.Variant.isSet($[7],"on")){if(!f){throw new Error("Can not connect to invalid callback: "+f)}if(!e){throw new Error("Can not connect to invalid object: "+e)}if(typeof e.hasConnectionTo!=$[44]){throw new Error("The Connected object '"+e+"' must include the mixin 'qx.util.manager.MConnectedObject'!")}if(d===undefined){throw new Error("Undefined values are not allowed for connect: "+f+"["+e+"]")}if(typeof d===$[132]){throw new Error("Boolean values are not allowed for connect: "+f+"["+e+"]")}}var b=e.toHashCode();var a="v"+b+"$"+qx.core.Object.toHashCode(f);var c=this._registry;if(d!==null&&this._preprocess){d=this._preprocess(d)}if(this.isDynamic(d)){c[a]={callback:f,object:e,value:d};if(!this._connectedObjects[b]){this._connectedObjects[b]=[]}this._connectedObjects[b].push(a);e.hasConnectionTo(this)}else{if(c[a]){delete c[a]}}f.call(e,this.resolveDynamic(d)||d)},resolveDynamic:function(a){return this._dynamic[a]},isDynamic:function(a){return this._dynamic[a]!==undefined},_updateObjects:function(){var b=this._registry;var c;for(var a in b){c=b[a];c.callback.call(c.object,this.resolveDynamic(c.value))}}},destruct:function(){this._disposeFields("_registry","_dynamic","_connectedObjects")}});
+qx.Class.define("qx.theme.manager.Color",{type:$[33],extend:qx.util.manager.Value,properties:{colorTheme:{check:$[126],nullable:true,apply:"_applyColorTheme",event:"changeColorTheme"}},members:{_applyColorTheme:function(f){var c=this._dynamic={};if(f){var e=f.colors;var a=qx.util.ColorUtil;var b;for(var d in e){b=e[d];if(typeof b===$[13]){if(!a.isCssString(b)){throw new Error($[265]+b)}}else{if(b instanceof Array){b=a.rgbToRgbString(b)}else{throw new Error($[265]+b)}}c[d]=b}}if(qx.theme.manager.Meta.getInstance().getAutoSync()){this.syncColorTheme()}},syncColorTheme:function(){this._updateObjects()}}});
+qx.Class.define("qx.util.ColorUtil",{statics:{REGEXP:{hex3:/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,rgb:/^rgb\(\s*([0-9]{1,3}\.{0,1}[0-9]*)\s*,\s*([0-9]{1,3}\.{0,1}[0-9]*)\s*,\s*([0-9]{1,3}\.{0,1}[0-9]*)\s*\)$/},SYSTEM:{activeborder:true,activecaption:true,appworkspace:true,background:true,buttonface:true,buttonhighlight:true,buttonshadow:true,buttontext:true,captiontext:true,graytext:true,highlight:true,highlighttext:true,inactiveborder:true,inactivecaption:true,inactivecaptiontext:true,infobackground:true,infotext:true,menu:true,menutext:true,scrollbar:true,threeddarkshadow:true,threedface:true,threedhighlight:true,threedlightshadow:true,threedshadow:true,window:true,windowframe:true,windowtext:true},NAMED:{black:[0,0,0],silver:[192,192,192],gray:[128,128,128],white:[255,255,255],maroon:[128,0,0],red:[255,0,0],purple:[128,0,128],fuchsia:[255,0,255],green:[0,128,0],lime:[0,255,0],olive:[128,128,0],yellow:[255,255,0],navy:[0,0,128],blue:[0,0,255],teal:[0,128,128],aqua:[0,255,255],transparent:[-1,-1,-1],grey:[128,128,128],magenta:[255,0,255],orange:[255,165,0],brown:[165,42,42]},isNamedColor:function(a){return this.NAMED[a]!==undefined},isSystemColor:function(a){return this.SYSTEM[a]!==undefined},isThemedColor:function(a){return qx.theme.manager.Color.getInstance().isDynamic(a)},stringToRgb:function(a){if(this.isThemedColor(a)){var a=qx.theme.manager.Color.getInstance().resolveDynamic(a)}if(this.isNamedColor(a)){return this.NAMED[a]}else{if(this.isSystemColor(a)){throw new Error($[547]+a)}else{if(this.isRgbString(a)){return this.__rgbStringToRgb()}else{if(this.isHex3String(a)){return this.__hex3StringToRgb()}else{if(this.isHex6String(a)){return this.__hex6StringToRgb()}}}}}throw new Error($[265]+a)},cssStringToRgb:function(a){if(this.isNamedColor(a)){return this.NAMED[a]}else{if(this.isSystemColor(a)){throw new Error($[547]+a)}else{if(this.isRgbString(a)){return this.__rgbStringToRgb()}else{if(this.isHex3String(a)){return this.__hex3StringToRgb()}else{if(this.isHex6String(a)){return this.__hex6StringToRgb()}}}}}throw new Error($[265]+a)},stringToRgbString:function(a){return this.rgbToRgbString(this.stringToRgb(a))},rgbToRgbString:function(a){return"rgb("+a[0]+","+a[1]+","+a[2]+")"},rgbToHexString:function(a){return(qx.lang.String.pad(a[0].toString(16).toUpperCase(),2)+qx.lang.String.pad(a[1].toString(16).toUpperCase(),2)+qx.lang.String.pad(a[2].toString(16).toUpperCase(),2))},isValid:function(a){return this.isThemedColor(a)||this.isCssString(a)},isCssString:function(a){return this.isSystemColor(a)||this.isNamedColor(a)||this.isHex3String(a)||this.isHex6String(a)||this.isRgbString(a)},isHex3String:function(a){return this.REGEXP.hex3.test(a)},isHex6String:function(a){return this.REGEXP.hex6.test(a)},isRgbString:function(a){return this.REGEXP.rgb.test(a)},__rgbStringToRgb:function(){var c=parseInt(RegExp.$1);var b=parseInt(RegExp.$2);var a=parseInt(RegExp.$3);return[c,b,a]},__hex3StringToRgb:function(){var c=parseInt(RegExp.$1,16)*17;var b=parseInt(RegExp.$2,16)*17;var a=parseInt(RegExp.$3,16)*17;return[c,b,a]},__hex6StringToRgb:function(){var c=(parseInt(RegExp.$1,16)*16)+parseInt(RegExp.$2,16);var b=(parseInt(RegExp.$3,16)*16)+parseInt(RegExp.$4,16);var a=(parseInt(RegExp.$5,16)*16)+parseInt(RegExp.$6,16);return[c,b,a]},hex3StringToRgb:function(a){if(this.isHex3String(a)){return this.__hex3StringToRgb(a)}throw new Error("Invalid hex3 value: "+a)},hex6StringToRgb:function(a){if(this.isHex6String(a)){return this.__hex6StringToRgb(a)}throw new Error("Invalid hex6 value: "+a)},hexStringToRgb:function(a){if(this.isHex3String(a)){return this.__hex3StringToRgb(a)}if(this.isHex6String(a)){return this.__hex6StringToRgb(a)}throw new Error("Invalid hex value: "+a)}}});
+qx.Class.define("org.eclipse.rwt.Border",{extend:qx.core.Object,construct:function(c,b,a,d){arguments.callee.base.call(this);this._colors=null;this._widths=null;this._styles=null;this._innerColors=[null,null,null,null];this._radii=[null,null,null,null];this._singleColor=null;this._singleStyle=null;this._setWidth(c);this._setStyle(b?b:"none");this._setColor(a?a:"");if(b===$[225]){if(d===undefined){throw new Error("Missing innerColors")}this._setInnerColor(d)}else{if(b===$[120]){if(d===undefined||this.getColor()===null){throw new Error("Invalid arguments for border style rounded")}this._setRadii(d)}else{if(d!==undefined){throw new Error("colorsOrRadii set for style "+this.getStyle())}}}},statics:{_EDGEWIDTH:[$[89],$[310],$[318],$[88]],_EDGECOLOR:["borderTopColor","borderRightColor","borderBottomColor","borderLeftColor"],_EDGESTYLE:[$[472],$[570],$[447],$[418]],_EDGEMOZCOLORS:["MozBorderTopColors","MozBorderRightColors","MozBorderBottomColors","MozBorderLeftColors"],_BORDERRADII:qx.core.Variant.select($[0],{webkit:["-webkit-border-top-left-radius","-webkit-border-top-right-radius","-webkit-border-bottom-right-radius","-webkit-border-bottom-left-radius"],gecko:["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],"default":[]}),reset:function(c){c._style.border="";if(c._innerStyle){c._innerStyle.border=""}try{for(var b=0;b<4;b++){c._style[this._BORDERRADII[b]]=""}}catch(a){}this._resetComplexBorder(c)},_resetComplexBorder:qx.core.Variant.select($[0],{gecko:function(c){var d=org.eclipse.rwt.Border;var b=c._style;for(var a=0;a<4;a++){b[d._EDGEMOZCOLORS[a]]=""}},"default":function(c){var d=org.eclipse.rwt.Border;var a=c._innerStyle;if(a){for(var b=0;b<4;b++){a[d._EDGEWIDTH[b]]="";a[d._EDGESTYLE[b]]="";a[d._EDGECOLOR[b]]=""}}}})},members:{_setColor:function(a){if(typeof a===$[13]){this._singleColor=a}this._colors=this._normalizeValue(a)},_setWidth:function(a){this._widths=this._normalizeValue(a)},_setStyle:function(a){if(typeof a===$[13]){this._singleStyle=a;if(a===$[225]||a===$[120]){this._styles=this._normalizeValue($[20])}else{this._styles=this._normalizeValue(a)}}else{this._styles=this._normalizeValue(a)}},_setInnerColor:function(a){this._innerColors=this._normalizeValue(a)},_setRadii:function(a){this._radii=this._normalizeValue(a)},getRadii:function(){return this._radii.concat()},getColor:function(){return this._singleColor},getColors:function(){return this._colors.concat()},getColorTop:function(){return this._colors[0]},getColorRight:function(){return this._colors[1]},getColorBottom:function(){return this._colors[2]},getColorLeft:function(){return this._colors[3]},getInnerColors:function(){return this._innerColors.concat()},getColorInnerTop:function(){return this._innerColors[0]},getColorInnerRight:function(){return this._innerColors[1]},getColorInnerBottom:function(){return this._innerColors[2]},getColorInnerLeft:function(){return this._innerColors[3]},getStyle:function(){return this._singleStyle},getStyles:function(){return this._styles.concat()},getStyleTop:function(){return this._styles[0]},getStyleRight:function(){return this._styles[1]},getStyleBottom:function(){return this._styles[2]},getStyleLeft:function(){return this._styles[3]},getWidths:function(){return this._widths.concat()},getWidthTop:function(){return this._widths[0]},getWidthRight:function(){return this._widths[1]},getWidthBottom:function(){return this._widths[2]},getWidthLeft:function(){return this._widths[3]},_normalizeValue:function(b){var a;if(b instanceof Array){a=b}else{a=[b,b,b,b]}return a},render:function(a){if(this.getStyle()===$[225]){this._renderComplexBorder(a)}else{if(this.getStyle()===$[120]){this._renderRoundedBorder(a)}else{this._renderSimpleBorder(a)}}},_renderSimpleBorder:function(c){org.eclipse.rwt.Border._resetComplexBorder(c);var b=c._style;var d=org.eclipse.rwt.Border;for(var a=0;a<4;a++){b[d._EDGEWIDTH[a]]=(this._widths[a]||0)+"px";b[d._EDGESTYLE[a]]=this._styles[a]||"none";b[d._EDGECOLOR[a]]=this._colors[a]||""}},_renderComplexBorder:qx.core.Variant.select($[0],{gecko:function(c){var d=org.eclipse.rwt.Border;var b=c._style;for(var a=0;a<4;a++){b[d._EDGEWIDTH[a]]=(this._widths[a]||0)+"px";b[d._EDGECOLOR[a]]=this._colors[a]||"";if(this._widths[a]===2){b[d._EDGESTYLE[a]]=$[20];b[d._EDGEMOZCOLORS[a]]=this._colors[a]+" "+this._innerColors[a]}else{b[d._EDGESTYLE[a]]=this._styles[a]||"none";b[d._EDGEMOZCOLORS[a]]=""}}},"default":function(d){var e=org.eclipse.rwt.Border;var c=d._style;var a=d._innerStyle;for(var b=0;b<4;b++){if(this._widths[b]===2){if(!a){d.prepareEnhancedBorder();a=d._innerStyle}c[e._EDGEWIDTH[b]]="1px";c[e._EDGESTYLE[b]]=$[20];c[e._EDGECOLOR[b]]=this._colors[b]||"";a[e._EDGEWIDTH[b]]="1px";a[e._EDGESTYLE[b]]=$[20];a[e._EDGECOLOR[b]]=this._innerColors[b]}else{c[e._EDGEWIDTH[b]]=(this._widths[b]||0)+"px";c[e._EDGESTYLE[b]]=this._styles[b]||"none";c[e._EDGECOLOR[b]]=this._colors[b]||"";if(a){a[e._EDGEWIDTH[b]]="";a[e._EDGESTYLE[b]]="";a[e._EDGECOLOR[b]]=""}}}}}),_renderRoundedBorder:function(c){var d=org.eclipse.rwt.Border;this._renderSimpleBorder(c);var b=c._style;for(var a=0;a<4;a++){b[d._BORDERRADII[a]]=this._radii[a]+"px"}}}});
+qx.Class.define("qx.theme.manager.Font",{type:$[33],extend:qx.util.manager.Value,properties:{fontTheme:{check:$[126],nullable:true,apply:"_applyFontTheme",event:"changeFontTheme"}},members:{resolveDynamic:function(a){return a instanceof qx.ui.core.Font?a:this._dynamic[a]},isDynamic:function(a){return a&&(a instanceof qx.ui.core.Font||this._dynamic[a]!==undefined)},syncFontTheme:function(){this._updateObjects()},_applyFontTheme:function(e){var b=this._dynamic;for(var c in b){if(b[c].themed){b[c].dispose();delete b[c]}}if(e){var d=e.fonts;var a=qx.ui.core.Font;for(var c in d){b[c]=(new a).set(d[c]);b[c].themed=true}}if(qx.theme.manager.Meta.getInstance().getAutoSync()){this.syncFontTheme()}}}});
+qx.Class.define("qx.ui.core.Font",{extend:qx.core.Object,construct:function(a,b){arguments.callee.base.call(this);if(a!==undefined){this.setSize(a)}if(b!==undefined){this.setFamily(b)}},statics:{fromString:function(g){var b=new qx.ui.core.Font;var f=g.split(/\s+/);var d=[];var c;for(var e=0;e<f.length;e++){switch(c=f[e]){case"bold":b.setBold(true);break;case"italic":b.setItalic(true);break;case $[377]:b.setDecoration($[377]);break;default:var a=parseInt(c);if(a==c||qx.lang.String.contains(c,"px")){b.setSize(a)}else{d.push(c)}break}}if(d.length>0){b.setFamily(d)}return b},fromConfig:function(b){var a=new qx.ui.core.Font;a.set(b);return a},reset:function(a){a.removeStyleProperty("fontFamily");a.removeStyleProperty($[211]);a.removeStyleProperty("fontWeight");a.removeStyleProperty("fontStyle");a.removeStyleProperty($[331])},resetElement:function(a){var b=a.style;b.fontFamily="";b.fontSize="";b.fontWeight="";b.fontStyle="";b.textDecoration=""},resetStyle:function(a){a.fontFamily="";a.fontSize="";a.fontWeight="";a.fontStyle="";a.textDecoration=""}},properties:{size:{check:$[22],nullable:true,apply:"_applySize"},family:{check:"Array",nullable:true,apply:"_applyFamily"},bold:{check:$[3],nullable:true,apply:"_applyBold"},italic:{check:$[3],nullable:true,apply:"_applyItalic"},decoration:{check:[$[377],"line-through","overline"],nullable:true,apply:"_applyDecoration"}},members:{__size:null,__family:null,__bold:null,__italic:null,__decoration:null,_applySize:function(b,a){this.__size=b===null?null:b+"px"},_applyFamily:function(e,b){var d="";for(var c=0,a=e.length;c<a;c++){if(e[c].indexOf(" ")>0){d+='"'+e[c]+'"'}else{d+=e[c]}if(c!=a-1){d+=","}}this.__family=d},_applyBold:function(b,a){this.__bold=b===null?null:b?"bold":$[108]},_applyItalic:function(b,a){this.__italic=b===null?null:b?"italic":$[108]},_applyDecoration:function(b,a){this.__decoration=b===null?null:b},render:function(a){a.setStyleProperty("fontFamily",this.__family);a.setStyleProperty($[211],this.__size);a.setStyleProperty("fontWeight",this.__bold);a.setStyleProperty("fontStyle",this.__italic);a.setStyleProperty($[331],this.__decoration)},renderStyle:function(a){a.fontFamily=this.__family||"";a.fontSize=this.__size||"";a.fontWeight=this.__bold||"";a.fontStyle=this.__italic||"";a.textDecoration=this.__decoration||""},renderElement:function(a){var b=a.style;b.fontFamily=this.__family||"";b.fontSize=this.__size||"";b.fontWeight=this.__bold||"";b.fontStyle=this.__italic||"";b.textDecoration=this.__decoration||""},generateStyle:function(){return(this.__family?"font-family:"+this.__family.replace(/\"/g,"'")+";":"")+(this.__size?"font-size:"+this.__size+";":"")+(this.__weight?"font-weight:"+this.__weight+";":"")+(this.__style?"font-style:"+this.__style+";":"")+(this.__decoration?"text-decoration:"+this.__decoration+";":"")}}});
+qx.Class.define("qx.theme.manager.Icon",{type:$[33],extend:qx.core.Target,properties:{iconTheme:{check:$[126],nullable:true,apply:"_applyIconTheme",event:"changeIconTheme"}},members:{_applyIconTheme:function(b,a){if(qx.theme.manager.Meta.getInstance().getAutoSync()){this.syncIconTheme()}},syncIconTheme:function(){var b=this.getIconTheme();var a=qx.io.Alias.getInstance();b?a.add("icon",b.icons.uri):a.remove("icon")}}});
+qx.Class.define("qx.io.Alias",{type:$[33],extend:qx.util.manager.Value,construct:function(){arguments.callee.base.call(this);this._aliases={};this._addStatic()},members:{_addStatic:function(){this.add($[119],qx.core.Setting.isSet($[557])?qx.core.Setting.get($[557]):qx.core.Setting.get($[512])+"/static")},_preprocess:function(f){var d=this._dynamic;if(d[f]===false){return f}else{if(d[f]===undefined){if(f.indexOf("http://")===0||f.indexOf("https://")===0||f.indexOf("file://")===0){d[f]=false;return f}var e=f.substring(0,f.indexOf("/"));var c=this._aliases[e];if(c===undefined){if(qx.core.Variant.isSet($[0],$[18])){if(window.location.protocol==="https:"){var b=f.match(/^[\.\/]/);var a=f.match(/^\w/);if(b!=null||a!=null){if(a!=null&&b==null){f="./"+f}return this.__rewriteUrl(f)}}}return f}else{if(qx.core.Variant.isSet($[0],$[18])){if(window.location.protocol==="https:"){c=this.__rewriteUrl(c)}}d[f]=c+f.substring(e.length)}}}return f},__rewriteUrl:function(b){var a="";if(b.match(/^\/\//)!=null){a=window.location.protocol}else{if(b.match(/^\.\//)!=null&&qx.core.Setting.get($[478])){b=b.substring(1);a=document.URL.substring(0,document.URL.lastIndexOf("/"))}else{if(b.match(/^\//)){a=window.location.protocol+"//"+window.location.host}else{if(b.match(/^http/)!=null){}else{a=window.location.href.substring(0,window.location.href.lastIndexOf("/")+1)}}}}return a+b},add:function(c,f){this._aliases[c]=f;var a=this._dynamic;var d=this._registry;var e;var h={};for(var g in a){if(g.substring(0,g.indexOf("/"))===c){a[g]=f+g.substring(c.length);h[g]=true}}for(var b in d){e=d[b];if(h[e.value]){e.callback.call(e.object,a[e.value])}}},remove:function(a){delete this._aliases[a]},resolve:function(a){if(a!==null){a=this._preprocess(a)}return this._dynamic[a]||a}},destruct:function(){this._disposeFields("_aliases")}});
+qx.Class.define("qx.theme.manager.Widget",{type:$[33],extend:qx.core.Target,properties:{widgetTheme:{check:$[126],nullable:true,apply:"_applyWidgetTheme",event:"changeWidgetTheme"}},members:{_applyWidgetTheme:function(b,a){if(qx.theme.manager.Meta.getInstance().getAutoSync()){this.syncWidgetTheme()}},syncWidgetTheme:function(){var b=this.getWidgetTheme();var a=qx.io.Alias.getInstance();b?a.add("widget",b.widgets.uri):a.remove("widget")}}});
+qx.Class.define($[502],{extend:qx.core.Target,construct:function(a){arguments.callee.base.call(this);if(a!=null){this._attachedWidget=a}},statics:{mouseFocus:false},members:{getAttachedWidget:function(){return this._attachedWidget},_onkeyevent:function(a,d){if(d.getKeyIdentifier()!="Tab"){return}d.stopPropagation();d.preventDefault();qx.event.handler.FocusHandler.mouseFocus=false;var c=this.getAttachedWidget().getFocusedChild();if(!d.isShiftPressed()){var b=c?this.getWidgetAfter(a,c):this.getFirstWidget(a)}else{var b=c?this.getWidgetBefore(a,c):this.getLastWidget(a)}if(b){b.setFocused(true);b._ontabfocus()}},compareTabOrder:function(f,d){if(f==d){return 0}var h=f.getTabIndex();var g=d.getTabIndex();if(h!=g){return h-g}var j=qx.bom.element.Location.getTop(f.getElement());var i=qx.bom.element.Location.getTop(d.getElement());if(j!=i){return j-i}var b=qx.bom.element.Location.getLeft(f.getElement());var a=qx.bom.element.Location.getLeft(d.getElement());if(b!=a){return b-a}var e=f.getZIndex();var c=d.getZIndex();if(e!=c){return e-c}return 0},getFirstWidget:function(a){return this._getFirst(a,null)},getLastWidget:function(a){return this._getLast(a,null)},getWidgetAfter:function(b,a){if(b==a){return this.getFirstWidget(b)}if(a.getAnonymous()){a=a.getParent()}if(a==null){return[]}var c=[];this._getAllAfter(b,a,c);c.sort(this.compareTabOrder);return c.length>0?c[0]:this.getFirstWidget(b)},getWidgetBefore:function(c,b){if(c==b){return this.getLastWidget(c)}if(b.getAnonymous()){b=b.getParent()}if(b==null){return[]}var d=[];this._getAllBefore(c,b,d);d.sort(this.compareTabOrder);var a=d.length;return a>0?d[a-1]:this.getLastWidget(c)},_getAllAfter:function(e,f,b){var d=e.getChildren();var g;var a=d.length||0;for(var c=0;c<a;c++){g=d[c];if(g.isDisposed()||!(g instanceof qx.ui.core.Parent)&&!(g instanceof qx.ui.basic.Terminator)){continue}if(g.isFocusable()&&g.getTabIndex()>0&&this.compareTabOrder(f,g)<0){b.push(d[c])}if(!g.isFocusRoot()&&g instanceof qx.ui.core.Parent){this._getAllAfter(g,f,b)}}},_getAllBefore:function(e,f,b){var d=e.getChildren();var g;var a=d.length;for(var c=0;c<a;c++){g=d[c];if(!(g instanceof qx.ui.core.Parent)&&!(g instanceof qx.ui.basic.Terminator)){continue}if(g.isFocusable()&&g.getTabIndex()>0&&this.compareTabOrder(f,g)>0){b.push(g)}if(!g.isFocusRoot()&&g instanceof qx.ui.core.Parent){this._getAllBefore(g,f,b)}}},_getFirst:function(d,f){var c=d.getChildren();var e;var a=c.length;for(var b=0;b<a;b++){e=c[b];if(!(e instanceof qx.ui.core.Parent)&&!(e instanceof qx.ui.basic.Terminator)){continue}if(e.isFocusable()&&e.getTabIndex()>0){if(f==null||this.compareTabOrder(e,f)<0){f=e}}if(!e.isFocusRoot()&&e instanceof qx.ui.core.Parent){f=this._getFirst(e,f)}}return f},_getLast:function(e,b){var d=e.getChildren();var f;var a=d.length;for(var c=0;c<a;c++){f=d[c];if(!(f instanceof qx.ui.core.Parent)&&!(f instanceof qx.ui.basic.Terminator)){continue}if(f.isFocusable()&&f.getTabIndex()>0){if(b==null||this.compareTabOrder(f,b)>0){b=f}}if(!f.isFocusRoot()&&f instanceof qx.ui.core.Parent){b=this._getLast(f,b)}}return b}},destruct:function(){this._disposeFields("_attachedWidget")}});
+qx.Class.define("qx.bom.element.Location",{statics:{__style:function(b,a){return qx.bom.element.Style.get(b,a,qx.bom.element.Style.COMPUTED_MODE,false)},__num:function(b,a){return parseInt(qx.bom.element.Style.get(b,a,qx.bom.element.Style.COMPUTED_MODE,false),10)||0},__computeScroll:function(b){var e=0,d=0;if(b.getBoundingClientRect){var c=qx.dom.Node.getWindow(b);if(!org.eclipse.rwt.Client.isMobileSafari()){e-=qx.bom.Viewport.getScrollLeft(c);d-=qx.bom.Viewport.getScrollTop(c)}}else{var a=qx.dom.Node.getDocument(b).body;b=b.parentNode;while(b&&b!=a){e+=b.scrollLeft;d+=b.scrollTop;b=b.parentNode}}return{left:Math.ceil(e),top:Math.ceil(d)}},__computeBody:qx.core.Variant.select($[0],{mshtml:function(b){var e=qx.dom.Node.getDocument(b);var a=e.body;var d=a.offsetLeft;var c=a.offsetTop;d-=this.__num(a,$[88]);c-=this.__num(a,$[89]);if(e.compatMode===$[121]){d+=this.__num(a,$[192]);c+=this.__num(a,$[214])}return{left:Math.ceil(d),top:Math.ceil(c)}},webkit:function(b){var e=qx.dom.Node.getDocument(b);var a=e.body;var d=a.offsetLeft;var c=a.offsetTop;d+=this.__num(a,$[88]);c+=this.__num(a,$[89]);if(e.compatMode===$[121]){d+=this.__num(a,$[192]);c+=this.__num(a,$[214])}return{left:Math.ceil(d),top:Math.ceil(c)}},gecko:function(b){var a=qx.dom.Node.getDocument(b).body;var d=a.offsetLeft;var c=a.offsetTop;if(qx.bom.element.BoxSizing.get(a)!==$[300]){d+=this.__num(a,$[88]);c+=this.__num(a,$[89]);if(!b.getBoundingClientRect){var e;while(b){if(this.__style(b,$[136])===$[28]||this.__style(b,$[136])===$[151]){e=true;break}b=b.offsetParent}if(!e){d+=this.__num(a,$[88]);c+=this.__num(a,$[89])}}}return{left:Math.ceil(d),top:Math.ceil(c)}},"default":function(b){var a=qx.dom.Node.getDocument(b).body;var d=a.offsetLeft;var c=a.offsetTop;return{left:Math.ceil(d),top:Math.ceil(c)}}}),__computeOffset:qx.core.Variant.select($[0],{"mshtml|webkit":function(c){var f=qx.dom.Node.getDocument(c);if(c.getBoundingClientRect){var b=c.getBoundingClientRect();var e=b.left;var d=b.top;if(f.compatMode===$[121]){e-=this.__num(c,$[88]);d-=this.__num(c,$[89])}}else{var e=c.offsetLeft;var d=c.offsetTop;c=c.offsetParent;var a=f.body;while(c&&c!=a){e+=c.offsetLeft;d+=c.offsetTop;e+=this.__num(c,$[88]);d+=this.__num(c,$[89]);c=c.offsetParent}}return{left:Math.ceil(e),top:Math.ceil(d)}},gecko:function(d){if(d.getBoundingClientRect){var c=d.getBoundingClientRect();var f=Math.round(c.left);var e=Math.round(c.top)}else{var f=0;var e=0;var a=qx.dom.Node.getDocument(d).body;var b=qx.bom.element.BoxSizing;if(b.get(d)!==$[300]){f-=this.__num(d,$[88]);e-=this.__num(d,$[89])}while(d&&d!==a){f+=d.offsetLeft;e+=d.offsetTop;if(b.get(d)!==$[300]){f+=this.__num(d,$[88]);e+=this.__num(d,$[89])}if(d.parentNode&&this.__style(d.parentNode,$[70])!="visible"){f+=this.__num(d.parentNode,$[88]);e+=this.__num(d.parentNode,$[89])}d=d.offsetParent}}return{left:Math.ceil(f),top:Math.ceil(e)}},"default":function(b){var d=0;var c=0;var a=qx.dom.Node.getDocument(b).body;while(b&&b!==a){d+=b.offsetLeft;c+=b.offsetTop;b=b.offsetParent}return{left:Math.ceil(d),top:Math.ceil(c)}}}),get:function(d,f){var g=this.__computeBody(d);if(d.tagName=="BODY"){var c=g.left;var h=g.top}else{var e=this.__computeOffset(d);var i=this.__computeScroll(d);var c=e.left+g.left-i.left;var h=e.top+g.top-i.top}var j=c+d.offsetWidth;var b=h+d.offsetHeight;if(f){if(f==$[36]||f==$[26]){var a=qx.bom.element.Overflow.getX(d);if(a==$[26]||a=="auto"){j+=d.scrollWidth-d.offsetWidth+this.__num(d,$[88])+this.__num(d,$[310])}var k=qx.bom.element.Overflow.getY(d);if(k==$[26]||k=="auto"){b+=d.scrollHeight-d.offsetHeight+this.__num(d,$[89])+this.__num(d,$[318])}}switch(f){case $[36]:c+=this.__num(d,$[221]);h+=this.__num(d,$[199]);j-=this.__num(d,$[256]);b-=this.__num(d,$[236]);case $[26]:c-=d.scrollLeft;h-=d.scrollTop;j-=d.scrollLeft;b-=d.scrollTop;case $[4]:c+=this.__num(d,$[88]);h+=this.__num(d,$[89]);j-=this.__num(d,$[310]);b-=this.__num(d,$[318]);break;case $[96]:c-=this.__num(d,$[192]);h-=this.__num(d,$[214]);j+=this.__num(d,$[298]);b+=this.__num(d,$[263]);break}}return{left:c,top:h,right:j,bottom:b}},getLeft:function(a,b){return this.get(a,b).left},getTop:function(a,b){return this.get(a,b).top},getRight:function(a,b){return this.get(a,b).right},getBottom:function(a,b){return this.get(a,b).bottom},getRelative:function(b,a,f,d){var e=this.get(b,f);var c=this.get(a,d);return{left:e.left-c.left,top:e.top-c.top,right:e.right-c.right,bottom:e.bottom-c.bottom}}}});
+qx.Class.define("qx.bom.element.Style",{statics:{__hints:{names:{"float":qx.core.Variant.isSet($[0],$[18])?"styleFloat":"cssFloat",boxSizing:qx.core.Variant.isSet($[0],$[40])?"mozBoxSizing":$[288]},mshtmlPixel:{width:"pixelWidth",height:"pixelHeight",left:"pixelLeft",right:"pixelRight",top:"pixelTop",bottom:"pixelBottom"}},COMPUTED_MODE:1,CASCADED_MODE:2,LOCAL_MODE:3,get:qx.core.Variant.select($[0],{mshtml:function(f,a,g,i){var b=this.__hints;a=b.names[a]||a;switch(g){case this.LOCAL_MODE:return f.style[a]||"";case this.CASCADED_MODE:return f.currentStyle[a];default:var c=f.currentStyle[a];if(/^-?[\.\d]+(px)?$/i.test(c)){return c}var d=b.mshtmlPixel[a];if(d){var e=f.style[a];f.style[a]=c||0;var h=f.style[d]+"px";f.style[a]=e;return h}if(/^-?[\.\d]+(em|pt|%)?$/i.test(c)){throw new Error("Untranslated computed property value: "+a+". Only pixel values work well across different clients.")}return c}},"default":function(b,a,g,f){var d=this.__hints;a=d.names[a]||a;switch(g){case this.LOCAL_MODE:return b.style[a];case this.CASCADED_MODE:if(b.currentStyle){return b.currentStyle[a]}throw new Error("Cascaded styles are not supported in this browser!");default:var e=qx.dom.Node.getDocument(b);var c=e.defaultView.getComputedStyle(b,null);return c?c[a]:null}}})}});
+qx.Class.define("qx.bom.element.BoxSizing",{statics:{__styleProperties:qx.core.Variant.select($[0],{mshtml:null,webkit:[$[288],"KhtmlBoxSizing","WebkitBoxSizing"],gecko:["MozBoxSizing",$[288]],opera:[$[288]]}),__nativeBorderBox:{tags:{button:true,select:true},types:{search:true,button:true,submit:true,reset:true,checkbox:true,radio:true}},__usesNativeBorderBox:function(a){var b=this.__nativeBorderBox;return b.tags[a.tagName.toLowerCase()]||b.types[a.type]},get:qx.core.Variant.select($[0],{mshtml:function(a){if(qx.bom.Document.isStandardMode(qx.dom.Node.getDocument(a))){if(!this.__usesNativeBorderBox(a)){return"content-box"}}return $[300]},"default":function(c){var d=this.__styleProperties;var e;if(d){for(var b=0,a=d.length;b<a;b++){e=qx.bom.element.Style.get(c,d[b],null,false);if(e!=null&&e!==""){return e}}}}})}});
+qx.Class.define("qx.bom.Document",{statics:{isQuirksMode:function(a){return(a||window).document.compatMode!==$[121]},isStandardMode:function(a){return(a||window).document.compatMode===$[121]},getWidth:function(d){var c=(d||window).document;var b=qx.bom.Viewport.getWidth(d);var a=c.compatMode===$[121]?c.documentElement.scrollWidth:c.body.scrollWidth;return Math.max(a,b)},getHeight:function(d){var c=(d||window).document;var b=qx.bom.Viewport.getHeight(d);var a=c.compatMode===$[121]?c.documentElement.scrollHeight:c.body.scrollHeight;return Math.max(a,b)}}});
+qx.Class.define("qx.bom.element.Overflow",{statics:{getX:qx.core.Variant.select($[0],{gecko:org.eclipse.rwt.Client.getVersion()<1.8?function(a,b){var c=qx.bom.element.Style.get(a,$[70],b,false);if(c===$[282]){c=$[17]}return c}:function(a,b){return qx.bom.element.Style.get(a,$[105],b,false)},opera:org.eclipse.rwt.Client.getVersion()<9.5?function(a,b){return qx.bom.element.Style.get(a,$[70],b,false)}:function(a,b){return qx.bom.element.Style.get(a,$[105],b,false)},"default":function(a,b){return qx.bom.element.Style.get(a,$[105],b,false)}}),getY:qx.core.Variant.select($[0],{gecko:org.eclipse.rwt.Client.getVersion()<1.8?function(a,b){var c=qx.bom.element.Style.get(a,$[70],b,false);if(c===$[282]){c=$[17]}return c}:function(a,b){return qx.bom.element.Style.get(a,$[98],b,false)},opera:org.eclipse.rwt.Client.getVersion()<9.5?function(a,b){return qx.bom.element.Style.get(a,$[70],b,false)}:function(a,b){return qx.bom.element.Style.get(a,$[98],b,false)},"default":function(a,b){return qx.bom.element.Style.get(a,$[98],b,false)}})}});
 qx.Class.define("qx.io.image.Manager",{type:$[33],extend:qx.core.Target,construct:function(){arguments.callee.base.call(this);this.__visible={};this.__all={}},members:{add:function(b){var a=this.__all;if(a[b]===undefined){a[b]=1}else{a[b]++}},remove:function(b){var a=this.__all;if(a[b]!==undefined){a[b]--}if(a[b]<=0){delete a[b]}},show:function(b){var a=this.__visible;if(a[b]===undefined){a[b]=1}else{a[b]++}},hide:function(b){var a=this.__visible;if(a[b]!==undefined){a[b]--}if(a[b]<=0){delete a[b]}},getVisibleImages:function(){var c=this.__visible;var b={};for(var a in c){if(c[a]>0){b[a]=true}}return b},getHiddenImages:function(){var d=this.__visible;var a=this.__all;var c={};for(var b in a){if(d[b]===undefined){c[b]=true}}return c}},destruct:function(){this._disposeFields("__all","__visible")}});
-qx.Class.define("qx.html.Offset",{statics:{getLeft:qx.core.Variant.select($[0],{gecko:function(c){var f=c.offsetLeft;var b=c.parentNode;var e=qx.html.Style.getStyleProperty(c,$[146]);var d=qx.html.Style.getStyleProperty(b,$[146]);if(e!=$[27]&&e!=$[151]){f-=qx.html.Style.getBorderLeft(b)}if(d!=$[27]&&d!=$[151]){while(b){b=b.parentNode;if(!b||typeof b.tagName!==$[13]){break}var a=qx.html.Style.getStyleProperty(b,$[146]);if(a==$[27]||a==$[151]){f-=qx.html.Style.getBorderLeft(b)+qx.html.Style.getPaddingLeft(b);break}}}return f},"default":function(a){return a.offsetLeft}}),getTop:qx.core.Variant.select($[0],{gecko:function(c){var f=c.offsetTop;var b=c.parentNode;var e=qx.html.Style.getStyleProperty(c,$[146]);var d=qx.html.Style.getStyleProperty(b,$[146]);if(e!=$[27]&&e!=$[151]){f-=qx.html.Style.getBorderTop(b)}if(d!=$[27]&&d!=$[151]){while(b){b=b.parentNode;if(!b||typeof b.tagName!==$[13]){break}var a=qx.html.Style.getStyleProperty(b,$[146]);if(a==$[27]||a==$[151]){f-=qx.html.Style.getBorderTop(b)+qx.html.Style.getPaddingTop(b);break}}}return f},"default":function(a){return a.offsetTop}})}});
-qx.Class.define("qx.html.ScrollIntoView",{statics:{scrollX:function(b,c){var a,f,e,d;var g=b.parentNode;var h=b.offsetLeft;var e=b.offsetWidth;while(g){switch(qx.html.Style.getStyleProperty(g,$[72])){case $[26]:case"auto":case $[316]:d=true;break;default:switch(qx.html.Style.getStyleProperty(g,$[103])){case $[26]:case"auto":d=true;break;default:d=false}}if(d){a=g.clientWidth;f=g.scrollLeft;if(c){g.scrollLeft=h}else{if(c==false){g.scrollLeft=h+e-a}else{if(e>a||h<f){g.scrollLeft=h}else{if((h+e)>(f+a)){g.scrollLeft=h+e-a}}}}h=g.offsetLeft;e=g.offsetWidth}else{h+=g.offsetLeft}if(g.tagName.toLowerCase()=="body"){break}g=g.offsetParent}return true},scrollY:function(b,d){var g,a,c,e;var f=b.parentNode;var h=b.offsetTop;var c=b.offsetHeight;while(f){switch(qx.html.Style.getStyleProperty(f,$[72])){case $[26]:case"auto":case $[259]:e=true;break;default:switch(qx.html.Style.getStyleProperty(f,$[104])){case $[26]:case"auto":e=true;break;default:e=false}}if(e){g=f.clientHeight;a=f.scrollTop;if(d){f.scrollTop=h}else{if(d==false){f.scrollTop=h+c-g}else{if(c>g||h<a){f.scrollTop=h}else{if((h+c)>(a+g)){f.scrollTop=h+c-g}}}}h=f.offsetTop;c=f.offsetHeight}else{h+=f.offsetTop}if(f.tagName.toLowerCase()=="body"){break}f=f.offsetParent}return true}}});
-qx.Class.define("qx.ui.layout.BoxLayout",{extend:qx.ui.core.Parent,construct:function(a){arguments.callee.base.call(this);if(a!=null){this.setOrientation(a)}else{this.initOrientation()}},statics:{STR_REVERSED:"-reversed"},properties:{orientation:{check:[$[52],$[46]],init:$[52],apply:$[435],event:"changeOrientation"},spacing:{check:$[22],init:0,themeable:true,apply:$[552],event:$[538]},horizontalChildrenAlign:{check:["left",$[38],$[23]],init:"left",themeable:true,apply:$[512]},verticalChildrenAlign:{check:["top",$[32],$[48]],init:"top",themeable:true,apply:$[551]},reverseChildrenOrder:{check:$[3],init:false,apply:"_applyReverseChildrenOrder"},stretchChildrenOrthogonalAxis:{check:$[3],init:true,apply:"_applyStretchChildrenOrthogonalAxis"},useAdvancedFlexAllocation:{check:$[3],init:false,apply:"_applyUseAdvancedFlexAllocation"},accumulatedChildrenOuterWidth:{_cached:true,defaultValue:null},accumulatedChildrenOuterHeight:{_cached:true,defaultValue:null}},members:{_createLayoutImpl:function(){return this.getOrientation()==$[46]?new qx.ui.layout.impl.VerticalBoxLayoutImpl(this):new qx.ui.layout.impl.HorizontalBoxLayoutImpl(this)},_layoutHorizontal:false,_layoutVertical:false,_layoutMode:"left",isHorizontal:function(){return this._layoutHorizontal},isVertical:function(){return this._layoutVertical},getLayoutMode:function(){if(this._layoutMode==null){this._updateLayoutMode()}return this._layoutMode},_updateLayoutMode:function(){this._layoutMode=this._layoutVertical?this.getVerticalChildrenAlign():this.getHorizontalChildrenAlign();if(this.getReverseChildrenOrder()){this._layoutMode+=qx.ui.layout.BoxLayout.STR_REVERSED}},_invalidateLayoutMode:function(){this._layoutMode=null},_applyOrientation:function(b,a){this._layoutHorizontal=b==$[52];this._layoutVertical=b==$[46];if(this._layoutImpl){this._layoutImpl.dispose();this._layoutImpl=null}if(b){this._layoutImpl=this._createLayoutImpl()}this._doLayoutOrder(b,a);this.addToQueueRuntime("orientation")},_applySpacing:function(b,a){this._doLayout();this.addToQueueRuntime($[107])},_applyHorizontalChildrenAlign:function(b,a){this._doLayoutOrder();this.addToQueueRuntime("horizontalChildrenAlign")},_applyVerticalChildrenAlign:function(b,a){this._doLayoutOrder();this.addToQueueRuntime("verticalChildrenAlign")},_applyReverseChildrenOrder:function(b,a){this._doLayoutOrder();this.addToQueueRuntime("reverseChildrenOrder")},_applyStretchChildrenOrthogonalAxis:function(b,a){this.addToQueueRuntime("stretchChildrenOrthogonalAxis")},_applyUseAdvancedFlexAllocation:function(b,a){this.addToQueueRuntime("useAdvancedFlexAllocation")},_doLayoutOrder:function(){this._invalidateLayoutMode();this._doLayout()},_doLayout:function(){this._invalidatePreferredInnerDimensions();this._invalidateAccumulatedChildrenOuterWidth();this._invalidateAccumulatedChildrenOuterHeight()},_computeAccumulatedChildrenOuterWidth:function(){var c=this.getVisibleChildren(),e,a=-1,d=this.getSpacing(),b=-d;while(e=c[++a]){b+=e.getOuterWidth()+d}return b},_computeAccumulatedChildrenOuterHeight:function(){var c=this.getVisibleChildren(),e,a=-1,d=this.getSpacing(),b=-d;while(e=c[++a]){b+=e.getOuterHeight()+d}return b},_recomputeChildrenStretchingX:function(){var b=this.getVisibleChildren(),c,a=-1;while(c=b[++a]){if(c._recomputeStretchingX()&&c._recomputeBoxWidth()){c._recomputeOuterWidth()}}},_recomputeChildrenStretchingY:function(){var b=this.getVisibleChildren(),c,a=-1;while(c=b[++a]){if(c._recomputeStretchingY()&&c._recomputeBoxHeight()){c._recomputeOuterHeight()}}}}});
-qx.Class.define("qx.ui.layout.impl.VerticalBoxLayoutImpl",{extend:qx.ui.layout.impl.LayoutImpl,properties:{enableFlexSupport:{check:$[3],init:true}},members:{computeChildBoxWidth:function(a){if(this.getWidget().getStretchChildrenOrthogonalAxis()&&a._computedWidthTypeNull&&a.getAllowStretchX()){return this.getWidget().getInnerWidth()}return a.getWidthValue()||a._computeBoxWidthFallback()},computeChildBoxHeight:function(a){return a.getHeightValue()||a._computeBoxHeightFallback()},computeChildrenFlexHeight:function(){if(this._childrenFlexHeightComputed||!this.getEnableFlexSupport()){return}this._childrenFlexHeightComputed=true;var j=this.getWidget();var i=j.getVisibleChildren();var g=i.length;var m;var e=[];var s=j.getInnerHeight();var n=j.getSpacing()*(g-1);var q;for(q=0;q<g;q++){m=i[q];if(m._computedHeightTypeFlex){e.push(m);if(j._computedHeightTypeAuto){n+=m.getPreferredBoxHeight()}}else{n+=m.getOuterHeight()}}var d=s-n;var c=e.length;var f=0;for(q=0;q<c;q++){f+=e[q]._computedHeightParsed}var h=d/f;if(!j.getUseAdvancedFlexAllocation()){for(q=0;q<c;q++){m=e[q];m._computedHeightFlexValue=Math.round(m._computedHeightParsed*h);n+=m._computedHeightFlexValue}}else{var b=0;var k,c,a,p,l,r;for(q=0;q<c;q++){m=e[q];r=m._computedHeightFlexValue=m._computedHeightParsed*h;b+=r-qx.lang.Number.limit(r,m.getMinHeightValue(),m.getMaxHeightValue())}b=Math.round(b);if(b==0){for(q=0;q<c;q++){m=e[q];m._computedHeightFlexValue=Math.round(m._computedHeightFlexValue);n+=m._computedHeightFlexValue}}else{var o=b>0;for(q=c-1;q>=0;q--){m=e[q];if(o){a=(m.getMaxHeightValue()||Infinity)-m._computedHeightFlexValue;if(a>0){m._allocationLoops=Math.floor(a/m._computedHeightParsed)}else{qx.lang.Array.removeAt(e,q);m._computedHeightFlexValue=Math.round(m._computedHeightFlexValue);n+=Math.round(m._computedHeightFlexValue+a)}}else{a=qx.util.Validation.isValidNumber(m.getMinHeightValue())?m._computedHeightFlexValue-m.getMinHeightValue():m._computedHeightFlexValue;if(a>0){m._allocationLoops=Math.floor(a/m._computedHeightParsed)}else{qx.lang.Array.removeAt(e,q);m._computedHeightFlexValue=Math.round(m._computedHeightFlexValue);n+=Math.round(m._computedHeightFlexValue-a)}}}while(b!=0&&c>0){c=e.length;k=Infinity;l=0;for(q=0;q<c;q++){k=Math.min(k,e[q]._allocationLoops);l+=e[q]._computedHeightParsed}p=Math.min(l*k,b);b-=p;for(q=c-1;q>=0;q--){m=e[q];m._computedHeightFlexValue+=p/l*m._computedHeightParsed;if(m._allocationLoops==k){m._computedHeightFlexValue=Math.round(m._computedHeightFlexValue);n+=m._computedHeightFlexValue;delete m._allocationLoops;qx.lang.Array.removeAt(e,q)}else{if(b==0){m._computedHeightFlexValue=Math.round(m._computedHeightFlexValue);n+=m._computedHeightFlexValue;delete m._allocationLoops}else{m._allocationLoops-=k}}}}}}m._computedHeightFlexValue+=s-n},invalidateChildrenFlexHeight:function(){delete this._childrenFlexHeightComputed},computeChildrenNeededHeight:function(){var a=this.getWidget();return qx.ui.layout.impl.LayoutImpl.prototype.computeChildrenNeededHeight_sum.call(this)+((a.getVisibleChildrenLength()-1)*a.getSpacing())},updateSelfOnChildOuterHeightChange:function(a){this.getWidget()._invalidateAccumulatedChildrenOuterHeight()},updateChildOnInnerWidthChange:function(c){var a=c._recomputePercentX();var b=c._recomputeStretchingX();if((c.getHorizontalAlign()||this.getWidget().getHorizontalChildrenAlign())==$[38]){c.addToLayoutChanges($[142])}return a||b},updateChildOnInnerHeightChange:function(c){if(this.getWidget().getVerticalChildrenAlign()==$[32]){c.addToLayoutChanges($[143])}var a=c._recomputePercentY();var b=c._recomputeFlexY();return a||b},updateSelfOnJobQueueFlush:function(a){if(a.addChild||a.removeChild){this.getWidget()._invalidateAccumulatedChildrenOuterHeight()}},updateChildrenOnJobQueueFlush:function(a){var d=false,b=false;var c=this.getWidget();if(a.orientation){d=b=true}if(a.spacing||a.orientation||a.reverseChildrenOrder||a.verticalChildrenAlign){c._addChildrenToLayoutQueue($[143])}if(a.horizontalChildrenAlign){c._addChildrenToLayoutQueue($[142])}if(a.stretchChildrenOrthogonalAxis){d=true}if(d){c._recomputeChildrenStretchingX();c._addChildrenToLayoutQueue($[19])}if(b){c._recomputeChildrenStretchingY();c._addChildrenToLayoutQueue($[36])}return true},updateChildrenOnRemoveChild:function(g,c){var b=this.getWidget(),e=b.getVisibleChildren(),a=e.length,f,d=-1;if(this.getEnableFlexSupport()){for(var d=0;d<a;d++){f=e[d];if(f.getHasFlexY()){c=Math.min(c,d);break}}d=-1}switch(b.getLayoutMode()){case $[48]:case $[238]:while((f=e[++d])&&d<c){f.addToLayoutChanges($[143])}break;case $[32]:case $[251]:while(f=e[++d]){f.addToLayoutChanges($[143])}break;default:d+=c;while(f=e[++d]){f.addToLayoutChanges($[143])}}},updateChildrenOnMoveChild:function(g,b,e){var a=this.getWidget().getVisibleChildren();var f=Math.min(b,e);var d=Math.max(b,e)+1;d=Math.min(a.length,d);for(var c=f;c<d;c++){a[c].addToLayoutChanges($[143])}},flushChildrenQueue:function(d){var b=this.getWidget(),f=b.getVisibleChildren(),a=f.length,h,e;if(this.getEnableFlexSupport()){this.invalidateChildrenFlexHeight();for(e=0;e<a;e++){h=f[e];if(h.getHasFlexY()){h._computedHeightValue=null;if(h._recomputeBoxHeight()){h._recomputeOuterHeight();h._recomputeInnerHeight()}d[h.toHashCode()]=h;h._layoutChanges.height=true}}}switch(b.getLayoutMode()){case $[48]:case $[238]:for(var e=a-1;e>=0&&!d[f[e].toHashCode()];e--){}for(var c=0;c<=e;c++){b._layoutChild(h=f[c])}break;case $[32]:case $[251]:e=-1;while(h=f[++e]){b._layoutChild(h)}break;default:e=-1;var g=false;while(h=f[++e]){if(g||d[h.toHashCode()]){b._layoutChild(h);g=true}}}},layoutChild:function(b,a){this.layoutChild_sizeX(b,a);this.layoutChild_sizeY(b,a);this.layoutChild_sizeLimitX(b,a);this.layoutChild_sizeLimitY(b,a);this.layoutChild_locationX(b,a);this.layoutChild_locationY(b,a);this.layoutChild_marginX(b,a);this.layoutChild_marginY(b,a)},layoutChild_sizeX:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(b,a){if(a.initial||a.width||a.minWidth||a.maxWidth){if((b._isWidthEssential()&&(!b._computedWidthTypeNull||!b._computedMinWidthTypeNull||!b._computedMaxWidthTypeNull))||(b.getAllowStretchX()&&this.getWidget().getStretchChildrenOrthogonalAxis())){b._renderRuntimeWidth(b.getBoxWidth())}else{b._resetRuntimeWidth()}}},"default":function(b,a){if(a.initial||a.width){if(b._isWidthEssential()&&!b._computedWidthTypeNull){b._renderRuntimeWidth(b.getWidthValue())}else{b._resetRuntimeWidth()}}}}),layoutChild_sizeY:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(b,a){if(a.initial||a.height||a.minHeight||a.maxHeight){if(b._isHeightEssential()&&(!b._computedHeightTypeNull||!b._computedMinHeightTypeNull||!b._computedMaxHeightTypeNull)){b._renderRuntimeHeight(b.getBoxHeight())}else{b._resetRuntimeHeight()}}},"default":function(b,a){if(a.initial||a.height){if(b._isHeightEssential()&&!b._computedHeightTypeNull){b._renderRuntimeHeight(b.getHeightValue())}else{b._resetRuntimeHeight()}}}}),layoutChild_locationY:function(e,a){var d=this.getWidget();if(d.getFirstVisibleChild()==e){switch(d.getLayoutMode()){case $[48]:case $[238]:var b=d.getPaddingBottom()+d.getAccumulatedChildrenOuterHeight()-e.getOuterHeight();break;case $[32]:case $[251]:var b=d.getPaddingTop()+Math.round((d.getInnerHeight()-d.getAccumulatedChildrenOuterHeight())/2);break;default:var b=d.getPaddingTop()}}else{var c=e.getPreviousVisibleSibling();switch(d.getLayoutMode()){case $[48]:case $[238]:var b=c._cachedLocationVertical-e.getOuterHeight()-d.getSpacing();break;default:var b=c._cachedLocationVertical+c.getOuterHeight()+d.getSpacing()}}e._cachedLocationVertical=b;switch(this.getWidget().getLayoutMode()){case $[48]:case $[490]:case $[251]:b+=!e._computedBottomTypeNull?e.getBottomValue():!e._computedTopTypeNull?-(e.getTopValue()):0;e._resetRuntimeTop();e._renderRuntimeBottom(b);break;default:b+=!e._computedTopTypeNull?e.getTopValue():!e._computedBottomTypeNull?-(e.getBottomValue()):0;e._resetRuntimeBottom();e._renderRuntimeTop(b)}},layoutChild_locationX:function(e,a){var c=this.getWidget();if(qx.core.Variant.isSet($[0],$[40])){if(e.getAllowStretchX()&&c.getStretchChildrenOrthogonalAxis()&&e._computedWidthTypeNull){e._renderRuntimeLeft(c.getPaddingLeft()||0);e._renderRuntimeRight(c.getPaddingRight()||0);return}}var d=e.getHorizontalAlign()||c.getHorizontalChildrenAlign();var b=d==$[38]?Math.round((c.getInnerWidth()-e.getOuterWidth())/2):0;if(d==$[23]){b+=c.getPaddingRight();if(!e._computedRightTypeNull){b+=e.getRightValue()}else{if(!e._computedLeftTypeNull){b-=e.getLeftValue()}}e._resetRuntimeLeft();e._renderRuntimeRight(b)}else{b+=c.getPaddingLeft();if(!e._computedLeftTypeNull){b+=e.getLeftValue()}else{if(!e._computedRightTypeNull){b-=e.getRightValue()}}e._resetRuntimeRight();e._renderRuntimeLeft(b)}}}});
-qx.Class.define("qx.util.Validation",{statics:{isValidNumber:function(a){return typeof a===$[77]&&!isNaN(a)},isValidString:function(a){return typeof a===$[13]&&a!==""}}});
-qx.Class.define("qx.ui.layout.impl.HorizontalBoxLayoutImpl",{extend:qx.ui.layout.impl.LayoutImpl,properties:{enableFlexSupport:{check:$[3],init:true}},members:{computeChildBoxWidth:function(a){return a.getWidthValue()||a._computeBoxWidthFallback()},computeChildBoxHeight:function(a){if(this.getWidget().getStretchChildrenOrthogonalAxis()&&a._computedHeightTypeNull&&a.getAllowStretchY()){return this.getWidget().getInnerHeight()}return a.getHeightValue()||a._computeBoxHeightFallback()},computeChildrenFlexWidth:function(){if(this._childrenFlexWidthComputed||!this.getEnableFlexSupport()){return}this._childrenFlexWidthComputed=true;var j=this.getWidget();var i=j.getVisibleChildren();var g=i.length;var n;var e=[];var d=j.getInnerWidth();var o=j.getSpacing()*(g-1);var s;for(s=0;s<g;s++){n=i[s];if(n._computedWidthTypeFlex){e.push(n);if(j._computedWidthTypeAuto){o+=n.getPreferredBoxWidth()}}else{o+=n.getOuterWidth()}}var l=d-o;var c=e.length;var f=0;for(s=0;s<c;s++){f+=e[s]._computedWidthParsed}var h=l/f;if(!j.getUseAdvancedFlexAllocation()){for(s=0;s<c;s++){n=e[s];n._computedWidthFlexValue=Math.round(n._computedWidthParsed*h);o+=n._computedWidthFlexValue}}else{var b=0;var k,c,a,r,m,p;for(s=0;s<c;s++){n=e[s];p=n._computedWidthFlexValue=n._computedWidthParsed*h;b+=p-qx.lang.Number.limit(p,n.getMinWidthValue(),n.getMaxWidthValue())}b=Math.round(b);if(b==0){for(s=0;s<c;s++){n=e[s];n._computedWidthFlexValue=Math.round(n._computedWidthFlexValue);o+=n._computedWidthFlexValue}}else{var q=b>0;for(s=c-1;s>=0;s--){n=e[s];if(q){a=(n.getMaxWidthValue()||Infinity)-n._computedWidthFlexValue;if(a>0){n._allocationLoops=Math.floor(a/n._computedWidthParsed)}else{qx.lang.Array.removeAt(e,s);n._computedWidthFlexValue=Math.round(n._computedWidthFlexValue);o+=Math.round(n._computedWidthFlexValue+a)}}else{a=qx.util.Validation.isValidNumber(n.getMinWidthValue())?n._computedWidthFlexValue-n.getMinWidthValue():n._computedWidthFlexValue;if(a>0){n._allocationLoops=Math.floor(a/n._computedWidthParsed)}else{qx.lang.Array.removeAt(e,s);n._computedWidthFlexValue=Math.round(n._computedWidthFlexValue);o+=Math.round(n._computedWidthFlexValue-a)}}}while(b!=0&&c>0){c=e.length;k=Infinity;m=0;for(s=0;s<c;s++){k=Math.min(k,e[s]._allocationLoops);m+=e[s]._computedWidthParsed}r=Math.min(m*k,b);b-=r;for(s=c-1;s>=0;s--){n=e[s];n._computedWidthFlexValue+=r/m*n._computedWidthParsed;if(n._allocationLoops==k){n._computedWidthFlexValue=Math.round(n._computedWidthFlexValue);o+=n._computedWidthFlexValue;delete n._allocationLoops;qx.lang.Array.removeAt(e,s)}else{if(b==0){n._computedWidthFlexValue=Math.round(n._computedWidthFlexValue);o+=n._computedWidthFlexValue;delete n._allocationLoops}else{n._allocationLoops-=k}}}}}}n._computedWidthFlexValue+=d-o},invalidateChildrenFlexWidth:function(){delete this._childrenFlexWidthComputed},computeChildrenNeededWidth:function(){var a=this.getWidget();return qx.ui.layout.impl.LayoutImpl.prototype.computeChildrenNeededWidth_sum.call(this)+((a.getVisibleChildrenLength()-1)*a.getSpacing())},updateSelfOnChildOuterWidthChange:function(a){this.getWidget()._invalidateAccumulatedChildrenOuterWidth()},updateChildOnInnerWidthChange:function(c){if(this.getWidget().getHorizontalChildrenAlign()==$[38]){c.addToLayoutChanges($[142])}var a=c._recomputePercentX();var b=c._recomputeFlexX();return a||b},updateChildOnInnerHeightChange:function(c){var a=c._recomputePercentY();var b=c._recomputeStretchingY();if((c.getVerticalAlign()||this.getWidget().getVerticalChildrenAlign())==$[32]){c.addToLayoutChanges($[143])}return a||b},updateSelfOnJobQueueFlush:function(a){if(a.addChild||a.removeChild){this.getWidget()._invalidateAccumulatedChildrenOuterWidth()}},updateChildrenOnJobQueueFlush:function(a){var d=false,b=false;var c=this.getWidget();if(a.orientation){d=b=true}if(a.spacing||a.orientation||a.reverseChildrenOrder||a.horizontalChildrenAlign){c._addChildrenToLayoutQueue($[142])}if(a.verticalChildrenAlign){c._addChildrenToLayoutQueue($[143])}if(a.stretchChildrenOrthogonalAxis){b=true}if(d){c._recomputeChildrenStretchingX();c._addChildrenToLayoutQueue($[19])}if(b){c._recomputeChildrenStretchingY();c._addChildrenToLayoutQueue($[36])}return true},updateChildrenOnRemoveChild:function(g,c){var b=this.getWidget(),e=b.getVisibleChildren(),a=e.length,f,d=-1;if(this.getEnableFlexSupport()){for(d=0;d<a;d++){f=e[d];if(f.getHasFlexX()){c=Math.min(c,d);break}}d=-1}switch(b.getLayoutMode()){case $[23]:case $[232]:while((f=e[++d])&&d<c){f.addToLayoutChanges($[142])}break;case $[38]:case $[248]:while(f=e[++d]){f.addToLayoutChanges($[142])}break;default:d+=c;while(f=e[++d]){f.addToLayoutChanges($[142])}}},updateChildrenOnMoveChild:function(g,b,e){var a=this.getWidget().getVisibleChildren();var f=Math.min(b,e);var d=Math.max(b,e)+1;d=Math.min(a.length,d);for(var c=f;c<d;c++){a[c].addToLayoutChanges($[142])}},flushChildrenQueue:function(d){var b=this.getWidget(),f=b.getVisibleChildren(),a=f.length,h,e;if(this.getEnableFlexSupport()){this.invalidateChildrenFlexWidth();for(e=0;e<a;e++){h=f[e];if(h.getHasFlexX()){h._computedWidthValue=null;if(h._recomputeBoxWidth()){h._recomputeOuterWidth();h._recomputeInnerWidth()}d[h.toHashCode()]=h;h._layoutChanges.width=true}}}switch(b.getLayoutMode()){case $[23]:case $[232]:for(var e=a-1;e>=0&&!d[f[e].toHashCode()];e--){}for(var c=0;c<=e;c++){b._layoutChild(h=f[c])}break;case $[38]:case $[248]:e=-1;while(h=f[++e]){b._layoutChild(h)}break;default:e=-1;var g=false;while(h=f[++e]){if(g||d[h.toHashCode()]){b._layoutChild(h);g=true}}}},layoutChild:function(b,a){this.layoutChild_sizeX(b,a);this.layoutChild_sizeY(b,a);this.layoutChild_sizeLimitX(b,a);this.layoutChild_sizeLimitY(b,a);this.layoutChild_locationX(b,a);this.layoutChild_locationY(b,a);this.layoutChild_marginX(b,a);this.layoutChild_marginY(b,a)},layoutChild_sizeX:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(b,a){if(a.initial||a.width||a.minWidth||a.maxWidth){if(b._isWidthEssential()&&(!b._computedWidthTypeNull||!b._computedMinWidthTypeNull||!b._computedMaxWidthTypeNull)){b._renderRuntimeWidth(b.getBoxWidth())}else{b._resetRuntimeWidth()}}},"default":function(b,a){if(a.initial||a.width){if(b._isWidthEssential()&&!b._computedWidthTypeNull){b._renderRuntimeWidth(b.getWidthValue())}else{b._resetRuntimeWidth()}}}}),layoutChild_sizeY:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(b,a){if(a.initial||a.height||a.minHeight||a.maxHeight){if((b._isHeightEssential()&&(!b._computedHeightTypeNull||!b._computedMinHeightTypeNull||!b._computedMaxHeightTypeNull))||(b.getAllowStretchY()&&this.getWidget().getStretchChildrenOrthogonalAxis())){b._renderRuntimeHeight(b.getBoxHeight())}else{b._resetRuntimeHeight()}}},"default":function(b,a){if(a.initial||a.height){if(b._isHeightEssential()&&!b._computedHeightTypeNull){b._renderRuntimeHeight(b.getHeightValue())}else{b._resetRuntimeHeight()}}}}),layoutChild_locationX:function(e,a){var d=this.getWidget();if(d.getFirstVisibleChild()==e){switch(d.getLayoutMode()){case $[23]:case $[232]:var b=d.getPaddingRight()+d.getAccumulatedChildrenOuterWidth()-e.getOuterWidth();break;case $[38]:case $[248]:var b=d.getPaddingLeft()+Math.round((d.getInnerWidth()-d.getAccumulatedChildrenOuterWidth())/2);break;default:var b=d.getPaddingLeft()}}else{var c=e.getPreviousVisibleSibling();switch(d.getLayoutMode()){case $[23]:case $[232]:var b=c._cachedLocationHorizontal-e.getOuterWidth()-d.getSpacing();break;default:var b=c._cachedLocationHorizontal+c.getOuterWidth()+d.getSpacing()}}e._cachedLocationHorizontal=b;switch(d.getLayoutMode()){case $[23]:case $[474]:case $[248]:b+=!e._computedRightTypeNull?e.getRightValue():!e._computedLeftTypeNull?-(e.getLeftValue()):0;e._resetRuntimeLeft();e._renderRuntimeRight(b);break;default:b+=!e._computedLeftTypeNull?e.getLeftValue():!e._computedRightTypeNull?-(e.getRightValue()):0;e._resetRuntimeRight();e._renderRuntimeLeft(b)}},layoutChild_locationY:function(e,a){var c=this.getWidget();if(qx.core.Variant.isSet($[0],$[40])){if(e.getAllowStretchY()&&c.getStretchChildrenOrthogonalAxis()&&e._computedHeightTypeNull){e._renderRuntimeTop(c.getPaddingTop()||0);e._renderRuntimeBottom(c.getPaddingBottom()||0);return}}var d=e.getVerticalAlign()||c.getVerticalChildrenAlign();var b=d==$[32]?Math.round((c.getInnerHeight()-e.getOuterHeight())/2):0;if(d==$[48]){b+=c.getPaddingBottom();if(!e._computedBottomTypeNull){b+=e.getBottomValue()}else{if(!e._computedTopTypeNull){b-=e.getTopValue()}}e._resetRuntimeTop();e._renderRuntimeBottom(b)}else{b+=c.getPaddingTop();if(!e._computedTopTypeNull){b+=e.getTopValue()}else{if(!e._computedBottomTypeNull){b-=e.getBottomValue()}}e._resetRuntimeBottom();e._renderRuntimeTop(b)}}}});
-qx.Class.define("qx.ui.basic.Atom",{extend:qx.ui.layout.BoxLayout,construct:function(c,e,d,a,b){arguments.callee.base.call(this);this.getLayoutImpl().setEnableFlexSupport(false);if(c!==undefined){this.setLabel(c)}if(qx.Class.isDefined($[409])&&b!=null&&d!=null&&a!=null&&qx.ui.embed.Flash.getPlayerVersion().getMajor()>0){this._flashMode=true;this.setIcon(b)}else{if(e!=null){this.setIcon(e)}}if(e||b){if(d!=null){this.setIconWidth(d)}if(a!=null){this.setIconHeight(a)}}this.initWidth();this.initHeight()},properties:{orientation:{refine:true,init:$[52]},allowStretchX:{refine:true,init:false},allowStretchY:{refine:true,init:false},appearance:{refine:true,init:"atom"},stretchChildrenOrthogonalAxis:{refine:true,init:false},width:{refine:true,init:"auto"},height:{refine:true,init:"auto"},horizontalChildrenAlign:{refine:true,init:$[38]},verticalChildrenAlign:{refine:true,init:$[32]},spacing:{refine:true,init:4},label:{apply:"_applyLabel",nullable:true,dispose:true,check:$[76]},icon:{check:$[25],apply:$[360],nullable:true,themeable:true},disabledIcon:{check:$[25],apply:"_applyDisabledIcon",nullable:true,themeable:true},show:{init:"both",check:["both",$[82],"icon","none"],themeable:true,nullable:true,inheritable:true,apply:"_applyShow",event:"changeShow"},iconPosition:{init:"left",check:["top",$[23],$[48],"left"],themeable:true,apply:"_applyIconPosition"},iconWidth:{check:$[22],themeable:true,apply:"_applyIconWidth",nullable:true},iconHeight:{check:$[22],themeable:true,apply:"_applyIconHeight",nullable:true}},members:{_flashMode:false,_labelObject:null,_iconObject:null,_createLabel:function(){var a=this._labelObject=new qx.ui.basic.Label(this.getLabel());a.setAnonymous(true);this.addAt(a,this._iconObject?1:0)},_createIcon:function(){if(this._flashMode&&qx.Class.isDefined($[409])){var b=this._iconObject=new qx.ui.embed.Flash(this.getIcon())}else{var b=this._iconObject=new qx.ui.basic.Image()}b.setAnonymous(true);var c=this.getIconWidth();if(c!==null){this._iconObject.setWidth(c)}var a=this.getIconWidth();if(a!==null){this._iconObject.setHeight(a)}this._updateIcon();this.addAt(b,0)},_updateIcon:function(){var a=this.getIcon();if(this._iconObject&&this.getIcon&&this.getDisabledIcon){var b=this.getDisabledIcon();if(b){if(this.getEnabled()){a?this._iconObject.setSource(a):this._iconObject.resetSource()}else{b?this._iconObject.setSource(b):this._iconObject.resetSource()}this._iconObject.setEnabled(true)}else{a?this._iconObject.setSource(a):this._iconObject.resetSource();this._iconObject.resetEnabled()}}},getLabelObject:function(){return this._labelObject},getIconObject:function(){return this._iconObject},_applyIconPosition:function(b,a){switch(b){case"top":case $[48]:this.setOrientation($[46]);this.setReverseChildrenOrder(b==$[48]);break;default:this.setOrientation($[52]);this.setReverseChildrenOrder(b==$[23]);break}},_applyShow:function(b,a){this._handleIcon();this._handleLabel()},_applyLabel:function(b,a){if(this._labelObject){b?this._labelObject.setText(b):this._labelObject.resetText()}this._handleLabel()},_applyIcon:function(b,a){this._updateIcon();this._handleIcon()},_applyDisabledIcon:function(b,a){this._updateIcon();this._handleIcon()},_applyIconWidth:function(b,a){if(this._iconObject){this._iconObject.setWidth(b)}},_applyIconHeight:function(b,a){if(this._iconObject){this._iconObject.setHeight(b)}},_iconIsVisible:false,_labelIsVisible:false,_handleLabel:function(){switch(this.getShow()){case $[82]:case"both":case $[133]:this._labelIsVisible=!!this.getLabel();break;default:this._labelIsVisible=false}if(this._labelIsVisible){this._labelObject?this._labelObject.setDisplay(true):this._createLabel()}else{if(this._labelObject){this._labelObject.setDisplay(false)}}},_handleIcon:function(){switch(this.getShow()){case"icon":case"both":case $[133]:this._iconIsVisible=!!this.getIcon();break;default:this._iconIsVisible=false}if(this._iconIsVisible){this._iconObject?this._iconObject.setDisplay(true):this._createIcon()}else{if(this._iconObject){this._iconObject.setDisplay(false)}}}},destruct:function(){this._disposeObjects("_iconObject","_labelObject")}});
-qx.Class.define("qx.ui.basic.Label",{extend:qx.ui.basic.Terminator,construct:function(a){arguments.callee.base.call(this);if(a!=null){this.setText(a)}this.initWidth();this.initHeight();this.initSelectable();this.initCursor();this.initWrap()},statics:{_getMeasureNode:function(){var b=this._measureNode;if(!b){b=document.createElement("div");var a=b.style;a.width=a.height="auto";a.visibility=$[17];a.position=$[27];a.zIndex="-1";document.body.appendChild(b);this._measureNode=b}if(!qx.core.Variant.isSet($[0],$[18])){b.style.font=""}return b}},properties:{appearance:{refine:true,init:$[82]},width:{refine:true,init:"auto"},height:{refine:true,init:"auto"},allowStretchX:{refine:true,init:false},allowStretchY:{refine:true,init:false},selectable:{refine:true,init:false},text:{apply:"_applyText",init:"",dispose:true,check:$[76]},wrap:{check:$[3],init:false,nullable:true,apply:$[394]},textAlign:{check:["left",$[38],$[23],"justify"],nullable:true,themeable:true,apply:$[400]},textOverflow:{check:$[3],init:true},mode:{check:["html","text","auto"],init:"auto"}},members:{_content:"",_applyTextAlign:function(b,a){b===null?this.removeStyleProperty($[278]):this.setStyleProperty($[278],b)},_applyFont:function(b,a){qx.theme.manager.Font.getInstance().connect(this._styleFont,this,b)},_styleFont:function(a){this._invalidatePreferredInnerDimensions();a?a.render(this):qx.ui.core.Font.reset(this)},_applyTextColor:function(b,a){qx.theme.manager.Color.getInstance().connect(this._styleTextColor,this,b)},_styleTextColor:function(a){a?this.setStyleProperty($[6],a):this.removeStyleProperty($[6])},_applyWrap:function(b,a){b==null?this.removeStyleProperty("whiteSpace"):this.setStyleProperty("whiteSpace",b?$[109]:"nowrap")},_applyText:function(b,a){this._syncText(this.getText())},_syncText:function(a){this._content=a;if(this._isCreated){this._renderContent()}},_computeObjectNeededDimensions:function(){var a=this.self(arguments)._getMeasureNode();var b=a.style;var d=this._styleProperties;b.fontFamily=d.fontFamily||"";b.fontSize=d.fontSize||"";b.fontWeight=d.fontWeight||"";b.fontStyle=d.fontStyle||"";a.innerHTML=this._content;if(org.eclipse.rwt.Client.isGecko()&&a.getBoundingClientRect){var c=a.getBoundingClientRect();if(c.width!=null&&c.height!=null){this._cachedPreferredInnerWidth=Math.ceil(c.width);this._cachedPreferredInnerHeight=Math.ceil(c.height)}else{this._cachedPreferredInnerWidth=a.scrollWidth;this._cachedPreferredInnerHeight=a.scrollHeight}}else{this._cachedPreferredInnerWidth=a.scrollWidth;this._cachedPreferredInnerHeight=a.scrollHeight}},_computePreferredInnerWidth:function(){this._computeObjectNeededDimensions();return this._cachedPreferredInnerWidth},_computePreferredInnerHeight:function(){this._computeObjectNeededDimensions();return this._cachedPreferredInnerHeight},_postApply:function(){var b=this._content;var a=this._getTargetNode();if(b==null){a.innerHTML=""}else{var c=a.style;if(!this.getWrap()){if(this.getInnerWidth()<this.getPreferredInnerWidth()){c.overflow=$[17]}else{c.overflow=""}}a.innerHTML=b}}}});
-qx.Class.define("qx.ui.basic.Image",{extend:qx.ui.basic.Terminator,construct:function(c,b,a){arguments.callee.base.call(this);this._blank=qx.io.Alias.getInstance().resolve($[344]);if(c!=null){this.setSource(c)}if(b!=null){this.setWidth(b)}else{this.initWidth()}if(a!=null){this.setHeight(a)}else{this.initHeight()}this.initSelectable()},events:{error:$[11]},properties:{allowStretchX:{refine:true,init:false},allowStretchY:{refine:true,init:false},selectable:{refine:true,init:false},width:{refine:true,init:"auto"},height:{refine:true,init:"auto"},appearance:{refine:true,init:$[35]},source:{check:$[25],apply:$[440],event:$[420],nullable:true,themeable:true},preloader:{check:$[521],apply:"_applyPreloader",nullable:true},loaded:{check:$[3],init:false,apply:"_applyLoaded"},resizeToInner:{check:$[3],init:false}},members:{_onload:function(){this.setLoaded(true)},_beforeAppear:function(){var a=this.getSource();if(a){qx.io.image.Manager.getInstance().show(a);this._registeredAsVisible=true}return arguments.callee.base.call(this)},_beforeDisappear:function(){var a=this.getSource();if(a&&this._registeredAsVisible){qx.io.image.Manager.getInstance().hide(a);delete this._registeredAsVisible}return arguments.callee.base.call(this)},_applySource:function(c,a){var b=qx.io.image.Manager.getInstance();if(a){b.remove(a);if(this._registeredAsVisible){b.hide(a);delete this._registeredAsVisible}}if(c){b.add(c);if(this.isSeeable()){this._registeredAsVisible=true;b.show(c)}}if(this.isCreated()){this._connect()}},_connect:function(){var a=qx.io.Alias.getInstance();a.connect(this._syncSource,this,this.getSource())},_syncSource:function(b){if(b===null){this.setPreloader(null)}else{var a=qx.io.image.PreloaderManager.getInstance().create(b);this.setPreloader(a)}},_applyPreloader:function(b,a){if(a){a.removeEventListener("load",this._onload,this)}if(b){this.setLoaded(false);if(!b.isErroneous()&&b.isLoaded()){this.setLoaded(true)}else{b.addEventListener("load",this._onload,this)}}else{this.setLoaded(false)}},_applyLoaded:function(b,a){if(b&&this.isCreated()){this._renderContent()}else{if(!b){this._invalidatePreferredInnerWidth();this._invalidatePreferredInnerHeight()}}},_applyElement:function(c,a){if(c){if(!this._image){try{if(qx.core.Variant.isSet($[0],$[71])){this._image=document.createElement("img")}else{this._image=new Image}this._image.style.border="0 none";this._image.style.verticalAlign="top";this._image.alt="";this._image.title=""}catch(b){throw new Error("Failed while creating image #1 "+b)}if(qx.core.Variant.isSet($[0],$[504])){this._styleEnabled()}}c.appendChild(this._image)}arguments.callee.base.call(this,c,a);if(c&&this.getSource()){this._connect()}},_postApply:function(){this._postApplyDimensions();this._updateContent()},_applyEnabled:function(b,a){if(this._image){this._styleEnabled()}return arguments.callee.base.call(this,b,a)},_updateContent:qx.core.Variant.select($[0],{mshtml:function(){var a=this._image;var b=this.getPreloader();var c=b&&b.isLoaded()?b.getSource():this._blank;if(b&&b.getIsPng()&&this.getEnabled()){a.src=this._blank;a.style.filter=$[442]+c+"',sizingMethod='scale')"}else{a.src=c;a.style.filter=this.getEnabled()?"":"Gray() Alpha(Opacity=30)"}},"default":function(){var a=this.getPreloader();var b=a&&a.isLoaded()?a.getSource():this._blank;this._image.src=b}}),_resetContent:qx.core.Variant.select($[0],{mshtml:function(){this._image.src=this._blank;this._image.style.filter=""},"default":function(){this._image.src=this._blank}}),_styleEnabled:qx.core.Variant.select($[0],{mshtml:function(){this._updateContent()},"default":function(){if(this._image){var b=this.getEnabled()===false?0.3:"";var a=this._image.style;a.opacity=a.KhtmlOpacity=a.MozOpacity=b}}}),_computePreferredInnerWidth:function(){var a=this.getPreloader();return a?a.getWidth():0},_computePreferredInnerHeight:function(){var a=this.getPreloader();return a?a.getHeight():0},_postApplyDimensions:qx.core.Variant.select($[0],{mshtml:function(){try{var b=this._image.style;if(this.getResizeToInner()){b.pixelWidth=this.getInnerWidth();b.pixelHeight=this.getInnerHeight()}else{b.pixelWidth=this.getPreferredInnerWidth();b.pixelHeight=this.getPreferredInnerHeight()}}catch(a){throw new Error($[404]+a)}},"default":function(){try{var b=this._image;if(this.getResizeToInner()){b.width=this.getInnerWidth();b.height=this.getInnerHeight()}else{b.width=this.getPreferredInnerWidth();b.height=this.getPreferredInnerHeight()}}catch(a){throw new Error($[404]+a)}}}),_changeInnerWidth:qx.core.Variant.select($[0],{mshtml:function(b,a){if(this.getResizeToInner()){this._image.style.pixelWidth=b}},"default":function(b,a){if(this.getResizeToInner()){this._image.width=b}}}),_changeInnerHeight:qx.core.Variant.select($[0],{mshtml:function(b,a){if(this.getResizeToInner()){this._image.style.pixelHeight=b}},"default":function(b,a){if(this.getResizeToInner()){this._image.height=b}}})},destruct:function(){if(this._image){this._image.style.filter=""}this._disposeFields("_image")}});
+qx.Class.define("qx.html.Offset",{statics:{getLeft:qx.core.Variant.select($[0],{gecko:function(c){var f=c.offsetLeft;var b=c.parentNode;var e=qx.html.Style.getStyleProperty(c,$[136]);var d=qx.html.Style.getStyleProperty(b,$[136]);if(e!=$[28]&&e!=$[151]){f-=qx.html.Style.getBorderLeft(b)}if(d!=$[28]&&d!=$[151]){while(b){b=b.parentNode;if(!b||typeof b.tagName!==$[13]){break}var a=qx.html.Style.getStyleProperty(b,$[136]);if(a==$[28]||a==$[151]){f-=qx.html.Style.getBorderLeft(b)+qx.html.Style.getPaddingLeft(b);break}}}return f},"default":function(a){return a.offsetLeft}}),getTop:qx.core.Variant.select($[0],{gecko:function(c){var f=c.offsetTop;var b=c.parentNode;var e=qx.html.Style.getStyleProperty(c,$[136]);var d=qx.html.Style.getStyleProperty(b,$[136]);if(e!=$[28]&&e!=$[151]){f-=qx.html.Style.getBorderTop(b)}if(d!=$[28]&&d!=$[151]){while(b){b=b.parentNode;if(!b||typeof b.tagName!==$[13]){break}var a=qx.html.Style.getStyleProperty(b,$[136]);if(a==$[28]||a==$[151]){f-=qx.html.Style.getBorderTop(b)+qx.html.Style.getPaddingTop(b);break}}}return f},"default":function(a){return a.offsetTop}})}});
+qx.Class.define("qx.html.ScrollIntoView",{statics:{scrollX:function(b,c){var a,f,e,d;var g=b.parentNode;var h=b.offsetLeft;var e=b.offsetWidth;while(g){switch(qx.html.Style.getStyleProperty(g,$[70])){case $[26]:case"auto":case $[283]:d=true;break;default:switch(qx.html.Style.getStyleProperty(g,$[105])){case $[26]:case"auto":d=true;break;default:d=false}}if(d){a=g.clientWidth;f=g.scrollLeft;if(c){g.scrollLeft=h}else{if(c==false){g.scrollLeft=h+e-a}else{if(e>a||h<f){g.scrollLeft=h}else{if((h+e)>(f+a)){g.scrollLeft=h+e-a}}}}h=g.offsetLeft;e=g.offsetWidth}else{h+=g.offsetLeft}if(g.tagName.toLowerCase()=="body"){break}g=g.offsetParent}return true},scrollY:function(b,d){var g,a,c,e;var f=b.parentNode;var h=b.offsetTop;var c=b.offsetHeight;while(f){switch(qx.html.Style.getStyleProperty(f,$[70])){case $[26]:case"auto":case $[306]:e=true;break;default:switch(qx.html.Style.getStyleProperty(f,$[98])){case $[26]:case"auto":e=true;break;default:e=false}}if(e){g=f.clientHeight;a=f.scrollTop;if(d){f.scrollTop=h}else{if(d==false){f.scrollTop=h+c-g}else{if(c>g||h<a){f.scrollTop=h}else{if((h+c)>(a+g)){f.scrollTop=h+c-g}}}}h=f.offsetTop;c=f.offsetHeight}else{h+=f.offsetTop}if(f.tagName.toLowerCase()=="body"){break}f=f.offsetParent}return true}}});
+qx.Class.define("qx.ui.layout.BoxLayout",{extend:qx.ui.core.Parent,construct:function(a){arguments.callee.base.call(this);if(a!=null){this.setOrientation(a)}else{this.initOrientation()}},statics:{STR_REVERSED:"-reversed"},properties:{orientation:{check:[$[52],$[47]],init:$[52],apply:$[449],event:"changeOrientation"},spacing:{check:$[22],init:0,themeable:true,apply:$[535],event:$[439]},horizontalChildrenAlign:{check:["left",$[37],$[24]],init:"left",themeable:true,apply:$[538]},verticalChildrenAlign:{check:["top",$[32],$[50]],init:"top",themeable:true,apply:$[524]},reverseChildrenOrder:{check:$[3],init:false,apply:"_applyReverseChildrenOrder"},stretchChildrenOrthogonalAxis:{check:$[3],init:true,apply:"_applyStretchChildrenOrthogonalAxis"},useAdvancedFlexAllocation:{check:$[3],init:false,apply:"_applyUseAdvancedFlexAllocation"},accumulatedChildrenOuterWidth:{_cached:true,defaultValue:null},accumulatedChildrenOuterHeight:{_cached:true,defaultValue:null}},members:{_createLayoutImpl:function(){return this.getOrientation()==$[47]?new qx.ui.layout.impl.VerticalBoxLayoutImpl(this):new qx.ui.layout.impl.HorizontalBoxLayoutImpl(this)},_layoutHorizontal:false,_layoutVertical:false,_layoutMode:"left",isHorizontal:function(){return this._layoutHorizontal},isVertical:function(){return this._layoutVertical},getLayoutMode:function(){if(this._layoutMode==null){this._updateLayoutMode()}return this._layoutMode},_updateLayoutMode:function(){this._layoutMode=this._layoutVertical?this.getVerticalChildrenAlign():this.getHorizontalChildrenAlign();if(this.getReverseChildrenOrder()){this._layoutMode+=qx.ui.layout.BoxLayout.STR_REVERSED}},_invalidateLayoutMode:function(){this._layoutMode=null},_applyOrientation:function(b,a){this._layoutHorizontal=b==$[52];this._layoutVertical=b==$[47];if(this._layoutImpl){this._layoutImpl.dispose();this._layoutImpl=null}if(b){this._layoutImpl=this._createLayoutImpl()}this._doLayoutOrder(b,a);this.addToQueueRuntime("orientation")},_applySpacing:function(b,a){this._doLayout();this.addToQueueRuntime($[110])},_applyHorizontalChildrenAlign:function(b,a){this._doLayoutOrder();this.addToQueueRuntime("horizontalChildrenAlign")},_applyVerticalChildrenAlign:function(b,a){this._doLayoutOrder();this.addToQueueRuntime("verticalChildrenAlign")},_applyReverseChildrenOrder:function(b,a){this._doLayoutOrder();this.addToQueueRuntime("reverseChildrenOrder")},_applyStretchChildrenOrthogonalAxis:function(b,a){this.addToQueueRuntime("stretchChildrenOrthogonalAxis")},_applyUseAdvancedFlexAllocation:function(b,a){this.addToQueueRuntime("useAdvancedFlexAllocation")},_doLayoutOrder:function(){this._invalidateLayoutMode();this._doLayout()},_doLayout:function(){this._invalidatePreferredInnerDimensions();this._invalidateAccumulatedChildrenOuterWidth();this._invalidateAccumulatedChildrenOuterHeight()},_computeAccumulatedChildrenOuterWidth:function(){var c=this.getVisibleChildren(),e,a=-1,d=this.getSpacing(),b=-d;while(e=c[++a]){b+=e.getOuterWidth()+d}return b},_computeAccumulatedChildrenOuterHeight:function(){var c=this.getVisibleChildren(),e,a=-1,d=this.getSpacing(),b=-d;while(e=c[++a]){b+=e.getOuterHeight()+d}return b},_recomputeChildrenStretchingX:function(){var b=this.getVisibleChildren(),c,a=-1;while(c=b[++a]){if(c._recomputeStretchingX()&&c._recomputeBoxWidth()){c._recomputeOuterWidth()}}},_recomputeChildrenStretchingY:function(){var b=this.getVisibleChildren(),c,a=-1;while(c=b[++a]){if(c._recomputeStretchingY()&&c._recomputeBoxHeight()){c._recomputeOuterHeight()}}}}});
+qx.Class.define("qx.ui.layout.impl.VerticalBoxLayoutImpl",{extend:qx.ui.layout.impl.LayoutImpl,properties:{enableFlexSupport:{check:$[3],init:true}},members:{computeChildBoxWidth:function(a){if(this.getWidget().getStretchChildrenOrthogonalAxis()&&a._computedWidthTypeNull&&a.getAllowStretchX()){return this.getWidget().getInnerWidth()}return a.getWidthValue()||a._computeBoxWidthFallback()},computeChildBoxHeight:function(a){return a.getHeightValue()||a._computeBoxHeightFallback()},computeChildrenFlexHeight:function(){if(this._childrenFlexHeightComputed||!this.getEnableFlexSupport()){return}this._childrenFlexHeightComputed=true;var j=this.getWidget();var i=j.getVisibleChildren();var g=i.length;var m;var e=[];var s=j.getInnerHeight();var n=j.getSpacing()*(g-1);var q;for(q=0;q<g;q++){m=i[q];if(m._computedHeightTypeFlex){e.push(m);if(j._computedHeightTypeAuto){n+=m.getPreferredBoxHeight()}}else{n+=m.getOuterHeight()}}var d=s-n;var c=e.length;var f=0;for(q=0;q<c;q++){f+=e[q]._computedHeightParsed}var h=d/f;if(!j.getUseAdvancedFlexAllocation()){for(q=0;q<c;q++){m=e[q];m._computedHeightFlexValue=Math.round(m._computedHeightParsed*h);n+=m._computedHeightFlexValue}}else{var b=0;var k,c,a,p,l,r;for(q=0;q<c;q++){m=e[q];r=m._computedHeightFlexValue=m._computedHeightParsed*h;b+=r-qx.lang.Number.limit(r,m.getMinHeightValue(),m.getMaxHeightValue())}b=Math.round(b);if(b==0){for(q=0;q<c;q++){m=e[q];m._computedHeightFlexValue=Math.round(m._computedHeightFlexValue);n+=m._computedHeightFlexValue}}else{var o=b>0;for(q=c-1;q>=0;q--){m=e[q];if(o){a=(m.getMaxHeightValue()||Infinity)-m._computedHeightFlexValue;if(a>0){m._allocationLoops=Math.floor(a/m._computedHeightParsed)}else{qx.lang.Array.removeAt(e,q);m._computedHeightFlexValue=Math.round(m._computedHeightFlexValue);n+=Math.round(m._computedHeightFlexValue+a)}}else{a=qx.util.Validation.isValidNumber(m.getMinHeightValue())?m._computedHeightFlexValue-m.getMinHeightValue():m._computedHeightFlexValue;if(a>0){m._allocationLoops=Math.floor(a/m._computedHeightParsed)}else{qx.lang.Array.removeAt(e,q);m._computedHeightFlexValue=Math.round(m._computedHeightFlexValue);n+=Math.round(m._computedHeightFlexValue-a)}}}while(b!=0&&c>0){c=e.length;k=Infinity;l=0;for(q=0;q<c;q++){k=Math.min(k,e[q]._allocationLoops);l+=e[q]._computedHeightParsed}p=Math.min(l*k,b);b-=p;for(q=c-1;q>=0;q--){m=e[q];m._computedHeightFlexValue+=p/l*m._computedHeightParsed;if(m._allocationLoops==k){m._computedHeightFlexValue=Math.round(m._computedHeightFlexValue);n+=m._computedHeightFlexValue;delete m._allocationLoops;qx.lang.Array.removeAt(e,q)}else{if(b==0){m._computedHeightFlexValue=Math.round(m._computedHeightFlexValue);n+=m._computedHeightFlexValue;delete m._allocationLoops}else{m._allocationLoops-=k}}}}}}m._computedHeightFlexValue+=s-n},invalidateChildrenFlexHeight:function(){delete this._childrenFlexHeightComputed},computeChildrenNeededHeight:function(){var a=this.getWidget();return qx.ui.layout.impl.LayoutImpl.prototype.computeChildrenNeededHeight_sum.call(this)+((a.getVisibleChildrenLength()-1)*a.getSpacing())},updateSelfOnChildOuterHeightChange:function(a){this.getWidget()._invalidateAccumulatedChildrenOuterHeight()},updateChildOnInnerWidthChange:function(c){var a=c._recomputePercentX();var b=c._recomputeStretchingX();if((c.getHorizontalAlign()||this.getWidget().getHorizontalChildrenAlign())==$[37]){c.addToLayoutChanges($[142])}return a||b},updateChildOnInnerHeightChange:function(c){if(this.getWidget().getVerticalChildrenAlign()==$[32]){c.addToLayoutChanges($[145])}var a=c._recomputePercentY();var b=c._recomputeFlexY();return a||b},updateSelfOnJobQueueFlush:function(a){if(a.addChild||a.removeChild){this.getWidget()._invalidateAccumulatedChildrenOuterHeight()}},updateChildrenOnJobQueueFlush:function(a){var d=false,b=false;var c=this.getWidget();if(a.orientation){d=b=true}if(a.spacing||a.orientation||a.reverseChildrenOrder||a.verticalChildrenAlign){c._addChildrenToLayoutQueue($[145])}if(a.horizontalChildrenAlign){c._addChildrenToLayoutQueue($[142])}if(a.stretchChildrenOrthogonalAxis){d=true}if(d){c._recomputeChildrenStretchingX();c._addChildrenToLayoutQueue($[19])}if(b){c._recomputeChildrenStretchingY();c._addChildrenToLayoutQueue($[39])}return true},updateChildrenOnRemoveChild:function(g,c){var b=this.getWidget(),e=b.getVisibleChildren(),a=e.length,f,d=-1;if(this.getEnableFlexSupport()){for(var d=0;d<a;d++){f=e[d];if(f.getHasFlexY()){c=Math.min(c,d);break}}d=-1}switch(b.getLayoutMode()){case $[50]:case $[216]:while((f=e[++d])&&d<c){f.addToLayoutChanges($[145])}break;case $[32]:case $[248]:while(f=e[++d]){f.addToLayoutChanges($[145])}break;default:d+=c;while(f=e[++d]){f.addToLayoutChanges($[145])}}},updateChildrenOnMoveChild:function(g,b,e){var a=this.getWidget().getVisibleChildren();var f=Math.min(b,e);var d=Math.max(b,e)+1;d=Math.min(a.length,d);for(var c=f;c<d;c++){a[c].addToLayoutChanges($[145])}},flushChildrenQueue:function(d){var b=this.getWidget(),f=b.getVisibleChildren(),a=f.length,h,e;if(this.getEnableFlexSupport()){this.invalidateChildrenFlexHeight();for(e=0;e<a;e++){h=f[e];if(h.getHasFlexY()){h._computedHeightValue=null;if(h._recomputeBoxHeight()){h._recomputeOuterHeight();h._recomputeInnerHeight()}d[h.toHashCode()]=h;h._layoutChanges.height=true}}}switch(b.getLayoutMode()){case $[50]:case $[216]:for(var e=a-1;e>=0&&!d[f[e].toHashCode()];e--){}for(var c=0;c<=e;c++){b._layoutChild(h=f[c])}break;case $[32]:case $[248]:e=-1;while(h=f[++e]){b._layoutChild(h)}break;default:e=-1;var g=false;while(h=f[++e]){if(g||d[h.toHashCode()]){b._layoutChild(h);g=true}}}},layoutChild:function(b,a){this.layoutChild_sizeX(b,a);this.layoutChild_sizeY(b,a);this.layoutChild_sizeLimitX(b,a);this.layoutChild_sizeLimitY(b,a);this.layoutChild_locationX(b,a);this.layoutChild_locationY(b,a);this.layoutChild_marginX(b,a);this.layoutChild_marginY(b,a)},layoutChild_sizeX:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(b,a){if(a.initial||a.width||a.minWidth||a.maxWidth){if((b._isWidthEssential()&&(!b._computedWidthTypeNull||!b._computedMinWidthTypeNull||!b._computedMaxWidthTypeNull))||(b.getAllowStretchX()&&this.getWidget().getStretchChildrenOrthogonalAxis())){b._renderRuntimeWidth(b.getBoxWidth())}else{b._resetRuntimeWidth()}}},"default":function(b,a){if(a.initial||a.width){if(b._isWidthEssential()&&!b._computedWidthTypeNull){b._renderRuntimeWidth(b.getWidthValue())}else{b._resetRuntimeWidth()}}}}),layoutChild_sizeY:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(b,a){if(a.initial||a.height||a.minHeight||a.maxHeight){if(b._isHeightEssential()&&(!b._computedHeightTypeNull||!b._computedMinHeightTypeNull||!b._computedMaxHeightTypeNull)){b._renderRuntimeHeight(b.getBoxHeight())}else{b._resetRuntimeHeight()}}},"default":function(b,a){if(a.initial||a.height){if(b._isHeightEssential()&&!b._computedHeightTypeNull){b._renderRuntimeHeight(b.getHeightValue())}else{b._resetRuntimeHeight()}}}}),layoutChild_locationY:function(e,a){var d=this.getWidget();if(d.getFirstVisibleChild()==e){switch(d.getLayoutMode()){case $[50]:case $[216]:var b=d.getPaddingBottom()+d.getAccumulatedChildrenOuterHeight()-e.getOuterHeight();break;case $[32]:case $[248]:var b=d.getPaddingTop()+Math.round((d.getInnerHeight()-d.getAccumulatedChildrenOuterHeight())/2);break;default:var b=d.getPaddingTop()}}else{var c=e.getPreviousVisibleSibling();switch(d.getLayoutMode()){case $[50]:case $[216]:var b=c._cachedLocationVertical-e.getOuterHeight()-d.getSpacing();break;default:var b=c._cachedLocationVertical+c.getOuterHeight()+d.getSpacing()}}e._cachedLocationVertical=b;switch(this.getWidget().getLayoutMode()){case $[50]:case $[523]:case $[248]:b+=!e._computedBottomTypeNull?e.getBottomValue():!e._computedTopTypeNull?-(e.getTopValue()):0;e._resetRuntimeTop();e._renderRuntimeBottom(b);break;default:b+=!e._computedTopTypeNull?e.getTopValue():!e._computedBottomTypeNull?-(e.getBottomValue()):0;e._resetRuntimeBottom();e._renderRuntimeTop(b)}},layoutChild_locationX:function(e,a){var c=this.getWidget();if(qx.core.Variant.isSet($[0],$[40])){if(e.getAllowStretchX()&&c.getStretchChildrenOrthogonalAxis()&&e._computedWidthTypeNull){e._renderRuntimeLeft(c.getPaddingLeft()||0);e._renderRuntimeRight(c.getPaddingRight()||0);return}}var d=e.getHorizontalAlign()||c.getHorizontalChildrenAlign();var b=d==$[37]?Math.round((c.getInnerWidth()-e.getOuterWidth())/2):0;if(d==$[24]){b+=c.getPaddingRight();if(!e._computedRightTypeNull){b+=e.getRightValue()}else{if(!e._computedLeftTypeNull){b-=e.getLeftValue()}}e._resetRuntimeLeft();e._renderRuntimeRight(b)}else{b+=c.getPaddingLeft();if(!e._computedLeftTypeNull){b+=e.getLeftValue()}else{if(!e._computedRightTypeNull){b-=e.getRightValue()}}e._resetRuntimeRight();e._renderRuntimeLeft(b)}}}});
+qx.Class.define("qx.util.Validation",{statics:{isValidNumber:function(a){return typeof a===$[78]&&!isNaN(a)},isValidString:function(a){return typeof a===$[13]&&a!==""}}});
+qx.Class.define("qx.ui.layout.impl.HorizontalBoxLayoutImpl",{extend:qx.ui.layout.impl.LayoutImpl,properties:{enableFlexSupport:{check:$[3],init:true}},members:{computeChildBoxWidth:function(a){return a.getWidthValue()||a._computeBoxWidthFallback()},computeChildBoxHeight:function(a){if(this.getWidget().getStretchChildrenOrthogonalAxis()&&a._computedHeightTypeNull&&a.getAllowStretchY()){return this.getWidget().getInnerHeight()}return a.getHeightValue()||a._computeBoxHeightFallback()},computeChildrenFlexWidth:function(){if(this._childrenFlexWidthComputed||!this.getEnableFlexSupport()){return}this._childrenFlexWidthComputed=true;var j=this.getWidget();var i=j.getVisibleChildren();var g=i.length;var n;var e=[];var d=j.getInnerWidth();var o=j.getSpacing()*(g-1);var s;for(s=0;s<g;s++){n=i[s];if(n._computedWidthTypeFlex){e.push(n);if(j._computedWidthTypeAuto){o+=n.getPreferredBoxWidth()}}else{o+=n.getOuterWidth()}}var l=d-o;var c=e.length;var f=0;for(s=0;s<c;s++){f+=e[s]._computedWidthParsed}var h=l/f;if(!j.getUseAdvancedFlexAllocation()){for(s=0;s<c;s++){n=e[s];n._computedWidthFlexValue=Math.round(n._computedWidthParsed*h);o+=n._computedWidthFlexValue}}else{var b=0;var k,c,a,r,m,p;for(s=0;s<c;s++){n=e[s];p=n._computedWidthFlexValue=n._computedWidthParsed*h;b+=p-qx.lang.Number.limit(p,n.getMinWidthValue(),n.getMaxWidthValue())}b=Math.round(b);if(b==0){for(s=0;s<c;s++){n=e[s];n._computedWidthFlexValue=Math.round(n._computedWidthFlexValue);o+=n._computedWidthFlexValue}}else{var q=b>0;for(s=c-1;s>=0;s--){n=e[s];if(q){a=(n.getMaxWidthValue()||Infinity)-n._computedWidthFlexValue;if(a>0){n._allocationLoops=Math.floor(a/n._computedWidthParsed)}else{qx.lang.Array.removeAt(e,s);n._computedWidthFlexValue=Math.round(n._computedWidthFlexValue);o+=Math.round(n._computedWidthFlexValue+a)}}else{a=qx.util.Validation.isValidNumber(n.getMinWidthValue())?n._computedWidthFlexValue-n.getMinWidthValue():n._computedWidthFlexValue;if(a>0){n._allocationLoops=Math.floor(a/n._computedWidthParsed)}else{qx.lang.Array.removeAt(e,s);n._computedWidthFlexValue=Math.round(n._computedWidthFlexValue);o+=Math.round(n._computedWidthFlexValue-a)}}}while(b!=0&&c>0){c=e.length;k=Infinity;m=0;for(s=0;s<c;s++){k=Math.min(k,e[s]._allocationLoops);m+=e[s]._computedWidthParsed}r=Math.min(m*k,b);b-=r;for(s=c-1;s>=0;s--){n=e[s];n._computedWidthFlexValue+=r/m*n._computedWidthParsed;if(n._allocationLoops==k){n._computedWidthFlexValue=Math.round(n._computedWidthFlexValue);o+=n._computedWidthFlexValue;delete n._allocationLoops;qx.lang.Array.removeAt(e,s)}else{if(b==0){n._computedWidthFlexValue=Math.round(n._computedWidthFlexValue);o+=n._computedWidthFlexValue;delete n._allocationLoops}else{n._allocationLoops-=k}}}}}}n._computedWidthFlexValue+=d-o},invalidateChildrenFlexWidth:function(){delete this._childrenFlexWidthComputed},computeChildrenNeededWidth:function(){var a=this.getWidget();return qx.ui.layout.impl.LayoutImpl.prototype.computeChildrenNeededWidth_sum.call(this)+((a.getVisibleChildrenLength()-1)*a.getSpacing())},updateSelfOnChildOuterWidthChange:function(a){this.getWidget()._invalidateAccumulatedChildrenOuterWidth()},updateChildOnInnerWidthChange:function(c){if(this.getWidget().getHorizontalChildrenAlign()==$[37]){c.addToLayoutChanges($[142])}var a=c._recomputePercentX();var b=c._recomputeFlexX();return a||b},updateChildOnInnerHeightChange:function(c){var a=c._recomputePercentY();var b=c._recomputeStretchingY();if((c.getVerticalAlign()||this.getWidget().getVerticalChildrenAlign())==$[32]){c.addToLayoutChanges($[145])}return a||b},updateSelfOnJobQueueFlush:function(a){if(a.addChild||a.removeChild){this.getWidget()._invalidateAccumulatedChildrenOuterWidth()}},updateChildrenOnJobQueueFlush:function(a){var d=false,b=false;var c=this.getWidget();if(a.orientation){d=b=true}if(a.spacing||a.orientation||a.reverseChildrenOrder||a.horizontalChildrenAlign){c._addChildrenToLayoutQueue($[142])}if(a.verticalChildrenAlign){c._addChildrenToLayoutQueue($[145])}if(a.stretchChildrenOrthogonalAxis){b=true}if(d){c._recomputeChildrenStretchingX();c._addChildrenToLayoutQueue($[19])}if(b){c._recomputeChildrenStretchingY();c._addChildrenToLayoutQueue($[39])}return true},updateChildrenOnRemoveChild:function(g,c){var b=this.getWidget(),e=b.getVisibleChildren(),a=e.length,f,d=-1;if(this.getEnableFlexSupport()){for(d=0;d<a;d++){f=e[d];if(f.getHasFlexX()){c=Math.min(c,d);break}}d=-1}switch(b.getLayoutMode()){case $[24]:case $[222]:while((f=e[++d])&&d<c){f.addToLayoutChanges($[142])}break;case $[37]:case $[219]:while(f=e[++d]){f.addToLayoutChanges($[142])}break;default:d+=c;while(f=e[++d]){f.addToLayoutChanges($[142])}}},updateChildrenOnMoveChild:function(g,b,e){var a=this.getWidget().getVisibleChildren();var f=Math.min(b,e);var d=Math.max(b,e)+1;d=Math.min(a.length,d);for(var c=f;c<d;c++){a[c].addToLayoutChanges($[142])}},flushChildrenQueue:function(d){var b=this.getWidget(),f=b.getVisibleChildren(),a=f.length,h,e;if(this.getEnableFlexSupport()){this.invalidateChildrenFlexWidth();for(e=0;e<a;e++){h=f[e];if(h.getHasFlexX()){h._computedWidthValue=null;if(h._recomputeBoxWidth()){h._recomputeOuterWidth();h._recomputeInnerWidth()}d[h.toHashCode()]=h;h._layoutChanges.width=true}}}switch(b.getLayoutMode()){case $[24]:case $[222]:for(var e=a-1;e>=0&&!d[f[e].toHashCode()];e--){}for(var c=0;c<=e;c++){b._layoutChild(h=f[c])}break;case $[37]:case $[219]:e=-1;while(h=f[++e]){b._layoutChild(h)}break;default:e=-1;var g=false;while(h=f[++e]){if(g||d[h.toHashCode()]){b._layoutChild(h);g=true}}}},layoutChild:function(b,a){this.layoutChild_sizeX(b,a);this.layoutChild_sizeY(b,a);this.layoutChild_sizeLimitX(b,a);this.layoutChild_sizeLimitY(b,a);this.layoutChild_locationX(b,a);this.layoutChild_locationY(b,a);this.layoutChild_marginX(b,a);this.layoutChild_marginY(b,a)},layoutChild_sizeX:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(b,a){if(a.initial||a.width||a.minWidth||a.maxWidth){if(b._isWidthEssential()&&(!b._computedWidthTypeNull||!b._computedMinWidthTypeNull||!b._computedMaxWidthTypeNull)){b._renderRuntimeWidth(b.getBoxWidth())}else{b._resetRuntimeWidth()}}},"default":function(b,a){if(a.initial||a.width){if(b._isWidthEssential()&&!b._computedWidthTypeNull){b._renderRuntimeWidth(b.getWidthValue())}else{b._resetRuntimeWidth()}}}}),layoutChild_sizeY:qx.core.Variant.select($[0],{"mshtml|opera|webkit":function(b,a){if(a.initial||a.height||a.minHeight||a.maxHeight){if((b._isHeightEssential()&&(!b._computedHeightTypeNull||!b._computedMinHeightTypeNull||!b._computedMaxHeightTypeNull))||(b.getAllowStretchY()&&this.getWidget().getStretchChildrenOrthogonalAxis())){b._renderRuntimeHeight(b.getBoxHeight())}else{b._resetRuntimeHeight()}}},"default":function(b,a){if(a.initial||a.height){if(b._isHeightEssential()&&!b._computedHeightTypeNull){b._renderRuntimeHeight(b.getHeightValue())}else{b._resetRuntimeHeight()}}}}),layoutChild_locationX:function(e,a){var d=this.getWidget();if(d.getFirstVisibleChild()==e){switch(d.getLayoutMode()){case $[24]:case $[222]:var b=d.getPaddingRight()+d.getAccumulatedChildrenOuterWidth()-e.getOuterWidth();break;case $[37]:case $[219]:var b=d.getPaddingLeft()+Math.round((d.getInnerWidth()-d.getAccumulatedChildrenOuterWidth())/2);break;default:var b=d.getPaddingLeft()}}else{var c=e.getPreviousVisibleSibling();switch(d.getLayoutMode()){case $[24]:case $[222]:var b=c._cachedLocationHorizontal-e.getOuterWidth()-d.getSpacing();break;default:var b=c._cachedLocationHorizontal+c.getOuterWidth()+d.getSpacing()}}e._cachedLocationHorizontal=b;switch(d.getLayoutMode()){case $[24]:case $[556]:case $[219]:b+=!e._computedRightTypeNull?e.getRightValue():!e._computedLeftTypeNull?-(e.getLeftValue()):0;e._resetRuntimeLeft();e._renderRuntimeRight(b);break;default:b+=!e._computedLeftTypeNull?e.getLeftValue():!e._computedRightTypeNull?-(e.getRightValue()):0;e._resetRuntimeRight();e._renderRuntimeLeft(b)}},layoutChild_locationY:function(e,a){var c=this.getWidget();if(qx.core.Variant.isSet($[0],$[40])){if(e.getAllowStretchY()&&c.getStretchChildrenOrthogonalAxis()&&e._computedHeightTypeNull){e._renderRuntimeTop(c.getPaddingTop()||0);e._renderRuntimeBottom(c.getPaddingBottom()||0);return}}var d=e.getVerticalAlign()||c.getVerticalChildrenAlign();var b=d==$[32]?Math.round((c.getInnerHeight()-e.getOuterHeight())/2):0;if(d==$[50]){b+=c.getPaddingBottom();if(!e._computedBottomTypeNull){b+=e.getBottomValue()}else{if(!e._computedTopTypeNull){b-=e.getTopValue()}}e._resetRuntimeTop();e._renderRuntimeBottom(b)}else{b+=c.getPaddingTop();if(!e._computedTopTypeNull){b+=e.getTopValue()}else{if(!e._computedBottomTypeNull){b-=e.getBottomValue()}}e._resetRuntimeBottom();e._renderRuntimeTop(b)}}}});
+qx.Class.define("qx.ui.basic.Atom",{extend:qx.ui.layout.BoxLayout,construct:function(c,e,d,a,b){arguments.callee.base.call(this);this.getLayoutImpl().setEnableFlexSupport(false);if(c!==undefined){this.setLabel(c)}if(qx.Class.isDefined($[574])&&b!=null&&d!=null&&a!=null&&qx.ui.embed.Flash.getPlayerVersion().getMajor()>0){this._flashMode=true;this.setIcon(b)}else{if(e!=null){this.setIcon(e)}}if(e||b){if(d!=null){this.setIconWidth(d)}if(a!=null){this.setIconHeight(a)}}this.initWidth();this.initHeight()},properties:{orientation:{refine:true,init:$[52]},allowStretchX:{refine:true,init:false},allowStretchY:{refine:true,init:false},appearance:{refine:true,init:"atom"},stretchChildrenOrthogonalAxis:{refine:true,init:false},width:{refine:true,init:"auto"},height:{refine:true,init:"auto"},horizontalChildrenAlign:{refine:true,init:$[37]},verticalChildrenAlign:{refine:true,init:$[32]},spacing:{refine:true,init:4},label:{apply:"_applyLabel",nullable:true,dispose:true,check:$[74]},icon:{check:$[25],apply:$[400],nullable:true,themeable:true},disabledIcon:{check:$[25],apply:"_applyDisabledIcon",nullable:true,themeable:true},show:{init:"both",check:["both",$[85],"icon","none"],themeable:true,nullable:true,inheritable:true,apply:"_applyShow",event:"changeShow"},iconPosition:{init:"left",check:["top",$[24],$[50],"left"],themeable:true,apply:"_applyIconPosition"},iconWidth:{check:$[22],themeable:true,apply:"_applyIconWidth",nullable:true},iconHeight:{check:$[22],themeable:true,apply:"_applyIconHeight",nullable:true}},members:{_flashMode:false,_labelObject:null,_iconObject:null,_createLabel:function(){var a=this._labelObject=new qx.ui.basic.Label(this.getLabel());a.setAnonymous(true);this.addAt(a,this._iconObject?1:0)},_createIcon:function(){if(this._flashMode&&qx.Class.isDefined($[574])){var b=this._iconObject=new qx.ui.embed.Flash(this.getIcon())}else{var b=this._iconObject=new qx.ui.basic.Image()}b.setAnonymous(true);var c=this.getIconWidth();if(c!==null){this._iconObject.setWidth(c)}var a=this.getIconWidth();if(a!==null){this._iconObject.setHeight(a)}this._updateIcon();this.addAt(b,0)},_updateIcon:function(){var a=this.getIcon();if(this._iconObject&&this.getIcon&&this.getDisabledIcon){var b=this.getDisabledIcon();if(b){if(this.getEnabled()){a?this._iconObject.setSource(a):this._iconObject.resetSource()}else{b?this._iconObject.setSource(b):this._iconObject.resetSource()}this._iconObject.setEnabled(true)}else{a?this._iconObject.setSource(a):this._iconObject.resetSource();this._iconObject.resetEnabled()}}},getLabelObject:function(){return this._labelObject},getIconObject:function(){return this._iconObject},_applyIconPosition:function(b,a){switch(b){case"top":case $[50]:this.setOrientation($[47]);this.setReverseChildrenOrder(b==$[50]);break;default:this.setOrientation($[52]);this.setReverseChildrenOrder(b==$[24]);break}},_applyShow:function(b,a){this._handleIcon();this._handleLabel()},_applyLabel:function(b,a){if(this._labelObject){b?this._labelObject.setText(b):this._labelObject.resetText()}this._handleLabel()},_applyIcon:function(b,a){this._updateIcon();this._handleIcon()},_applyDisabledIcon:function(b,a){this._updateIcon();this._handleIcon()},_applyIconWidth:function(b,a){if(this._iconObject){this._iconObject.setWidth(b)}},_applyIconHeight:function(b,a){if(this._iconObject){this._iconObject.setHeight(b)}},_iconIsVisible:false,_labelIsVisible:false,_handleLabel:function(){switch(this.getShow()){case $[85]:case"both":case $[125]:this._labelIsVisible=!!this.getLabel();break;default:this._labelIsVisible=false}if(this._labelIsVisible){this._labelObject?this._labelObject.setDisplay(true):this._createLabel()}else{if(this._labelObject){this._labelObject.setDisplay(false)}}},_handleIcon:function(){switch(this.getShow()){case"icon":case"both":case $[125]:this._iconIsVisible=!!this.getIcon();break;default:this._iconIsVisible=false}if(this._iconIsVisible){this._iconObject?this._iconObject.setDisplay(true):this._createIcon()}else{if(this._iconObject){this._iconObject.setDisplay(false)}}}},destruct:function(){this._disposeObjects("_iconObject","_labelObject")}});
+qx.Class.define("qx.ui.basic.Label",{extend:qx.ui.basic.Terminator,construct:function(a){arguments.callee.base.call(this);if(a!=null){this.setText(a)}this.initWidth();this.initHeight();this.initSelectable();this.initCursor();this.initWrap()},statics:{_getMeasureNode:function(){var b=this._measureNode;if(!b){b=document.createElement("div");var a=b.style;a.width=a.height="auto";a.visibility=$[17];a.position=$[28];a.zIndex="-1";document.body.appendChild(b);this._measureNode=b}if(!qx.core.Variant.isSet($[0],$[18])){b.style.font=""}return b}},properties:{appearance:{refine:true,init:$[85]},width:{refine:true,init:"auto"},height:{refine:true,init:"auto"},allowStretchX:{refine:true,init:false},allowStretchY:{refine:true,init:false},selectable:{refine:true,init:false},text:{apply:"_applyText",init:"",dispose:true,check:$[74]},wrap:{check:$[3],init:false,nullable:true,apply:$[359]},textAlign:{check:["left",$[37],$[24],"justify"],nullable:true,themeable:true,apply:$[376]},textOverflow:{check:$[3],init:true},mode:{check:["html","text","auto"],init:"auto"}},members:{_content:"",_applyTextAlign:function(b,a){b===null?this.removeStyleProperty($[281]):this.setStyleProperty($[281],b)},_applyFont:function(b,a){qx.theme.manager.Font.getInstance().connect(this._styleFont,this,b)},_styleFont:function(a){this._invalidatePreferredInnerDimensions();a?a.render(this):qx.ui.core.Font.reset(this)},_applyTextColor:function(b,a){qx.theme.manager.Color.getInstance().connect(this._styleTextColor,this,b)},_styleTextColor:function(a){a?this.setStyleProperty($[6],a):this.removeStyleProperty($[6])},_applyWrap:function(b,a){b==null?this.removeStyleProperty("whiteSpace"):this.setStyleProperty("whiteSpace",b?$[108]:"nowrap")},_applyText:function(b,a){this._syncText(this.getText())},_syncText:function(a){this._content=a;if(this._isCreated){this._renderContent()}},_computeObjectNeededDimensions:function(){var a=this.self(arguments)._getMeasureNode();var b=a.style;var d=this._styleProperties;b.fontFamily=d.fontFamily||"";b.fontSize=d.fontSize||"";b.fontWeight=d.fontWeight||"";b.fontStyle=d.fontStyle||"";a.innerHTML=this._content;if(org.eclipse.rwt.Client.isGecko()&&a.getBoundingClientRect){var c=a.getBoundingClientRect();if(c.width!=null&&c.height!=null){this._cachedPreferredInnerWidth=Math.ceil(c.width);this._cachedPreferredInnerHeight=Math.ceil(c.height)}else{this._cachedPreferredInnerWidth=a.scrollWidth;this._cachedPreferredInnerHeight=a.scrollHeight}}else{this._cachedPreferredInnerWidth=a.scrollWidth;this._cachedPreferredInnerHeight=a.scrollHeight}},_computePreferredInnerWidth:function(){this._computeObjectNeededDimensions();return this._cachedPreferredInnerWidth},_computePreferredInnerHeight:function(){this._computeObjectNeededDimensions();return this._cachedPreferredInnerHeight},_postApply:function(){var b=this._content;var a=this._getTargetNode();if(b==null){a.innerHTML=""}else{var c=a.style;if(!this.getWrap()){if(this.getInnerWidth()<this.getPreferredInnerWidth()){c.overflow=$[17]}else{c.overflow=""}}a.innerHTML=b}}}});
+qx.Class.define("qx.ui.basic.Image",{extend:qx.ui.basic.Terminator,construct:function(c,b,a){arguments.callee.base.call(this);this._blank=qx.io.Alias.getInstance().resolve($[351]);if(c!=null){this.setSource(c)}if(b!=null){this.setWidth(b)}else{this.initWidth()}if(a!=null){this.setHeight(a)}else{this.initHeight()}this.initSelectable()},events:{error:$[11]},properties:{allowStretchX:{refine:true,init:false},allowStretchY:{refine:true,init:false},selectable:{refine:true,init:false},width:{refine:true,init:"auto"},height:{refine:true,init:"auto"},appearance:{refine:true,init:$[35]},source:{check:$[25],apply:$[525],event:$[416],nullable:true,themeable:true},preloader:{check:$[548],apply:"_applyPreloader",nullable:true},loaded:{check:$[3],init:false,apply:"_applyLoaded"},resizeToInner:{check:$[3],init:false}},members:{_onload:function(){this.setLoaded(true)},_beforeAppear:function(){var a=this.getSource();if(a){qx.io.image.Manager.getInstance().show(a);this._registeredAsVisible=true}return arguments.callee.base.call(this)},_beforeDisappear:function(){var a=this.getSource();if(a&&this._registeredAsVisible){qx.io.image.Manager.getInstance().hide(a);delete this._registeredAsVisible}return arguments.callee.base.call(this)},_applySource:function(c,a){var b=qx.io.image.Manager.getInstance();if(a){b.remove(a);if(this._registeredAsVisible){b.hide(a);delete this._registeredAsVisible}}if(c){b.add(c);if(this.isSeeable()){this._registeredAsVisible=true;b.show(c)}}if(this.isCreated()){this._connect()}},_connect:function(){var a=qx.io.Alias.getInstance();a.connect(this._syncSource,this,this.getSource())},_syncSource:function(b){if(b===null){this.setPreloader(null)}else{var a=qx.io.image.PreloaderManager.getInstance().create(b);this.setPreloader(a)}},_applyPreloader:function(b,a){if(a){a.removeEventListener("load",this._onload,this)}if(b){this.setLoaded(false);if(!b.isErroneous()&&b.isLoaded()){this.setLoaded(true)}else{b.addEventListener("load",this._onload,this)}}else{this.setLoaded(false)}},_applyLoaded:function(b,a){if(b&&this.isCreated()){this._renderContent()}else{if(!b){this._invalidatePreferredInnerWidth();this._invalidatePreferredInnerHeight()}}},_applyElement:function(c,a){if(c){if(!this._image){try{if(qx.core.Variant.isSet($[0],$[69])){this._image=document.createElement("img")}else{this._image=new Image}this._image.style.border="0 none";this._image.style.verticalAlign="top";this._image.alt="";this._image.title=""}catch(b){throw new Error("Failed while creating image #1 "+b)}if(qx.core.Variant.isSet($[0],$[533])){this._styleEnabled()}}c.appendChild(this._image)}arguments.callee.base.call(this,c,a);if(c&&this.getSource()){this._connect()}},_postApply:function(){this._postApplyDimensions();this._updateContent()},_applyEnabled:function(b,a){if(this._image){this._styleEnabled()}return arguments.callee.base.call(this,b,a)},_updateContent:qx.core.Variant.select($[0],{mshtml:function(){var a=this._image;var b=this.getPreloader();var c=b&&b.isLoaded()?b.getSource():this._blank;if(b&&b.getIsPng()&&this.getEnabled()){a.src=this._blank;a.style.filter=$[575]+c+"',sizingMethod='scale')"}else{a.src=c;a.style.filter=this.getEnabled()?"":"Gray() Alpha(Opacity=30)"}},"default":function(){var a=this.getPreloader();var b=a&&a.isLoaded()?a.getSource():this._blank;this._image.src=b}}),_resetContent:qx.core.Variant.select($[0],{mshtml:function(){this._image.src=this._blank;this._image.style.filter=""},"default":function(){this._image.src=this._blank}}),_styleEnabled:qx.core.Variant.select($[0],{mshtml:function(){this._updateContent()},"default":function(){if(this._image){var b=this.getEnabled()===false?0.3:"";var a=this._image.style;a.opacity=a.KhtmlOpacity=a.MozOpacity=b}}}),_computePreferredInnerWidth:function(){var a=this.getPreloader();return a?a.getWidth():0},_computePreferredInnerHeight:function(){var a=this.getPreloader();return a?a.getHeight():0},_postApplyDimensions:qx.core.Variant.select($[0],{mshtml:function(){try{var b=this._image.style;if(this.getResizeToInner()){b.pixelWidth=this.getInnerWidth();b.pixelHeight=this.getInnerHeight()}else{b.pixelWidth=this.getPreferredInnerWidth();b.pixelHeight=this.getPreferredInnerHeight()}}catch(a){throw new Error($[484]+a)}},"default":function(){try{var b=this._image;if(this.getResizeToInner()){b.width=this.getInnerWidth();b.height=this.getInnerHeight()}else{b.width=this.getPreferredInnerWidth();b.height=this.getPreferredInnerHeight()}}catch(a){throw new Error($[484]+a)}}}),_changeInnerWidth:qx.core.Variant.select($[0],{mshtml:function(b,a){if(this.getResizeToInner()){this._image.style.pixelWidth=b}},"default":function(b,a){if(this.getResizeToInner()){this._image.width=b}}}),_changeInnerHeight:qx.core.Variant.select($[0],{mshtml:function(b,a){if(this.getResizeToInner()){this._image.style.pixelHeight=b}},"default":function(b,a){if(this.getResizeToInner()){this._image.height=b}}})},destruct:function(){if(this._image){this._image.style.filter=""}this._disposeFields("_image")}});
 qx.Class.define("qx.io.image.PreloaderManager",{type:$[33],extend:qx.core.Object,construct:function(){arguments.callee.base.call(this);this._objects={}},members:{add:function(a){this._objects[a.getUri()]=a},remove:function(a){delete this._objects[a.getUri()]},has:function(a){return this._objects[a]!=null},get:function(a){return this._objects[a]},create:function(a){if(this._objects[a]){return this._objects[a]}return new qx.io.image.Preloader(a)}},destruct:function(){this._disposeFields("_objects")}});
-qx.Class.define($[521],{extend:qx.core.Target,events:{load:$[11],error:$[11]},construct:function(a){if(qx.io.image.PreloaderManager.getInstance().has(a)){return qx.io.image.PreloaderManager.getInstance().get(a)}arguments.callee.base.call(this);this._element=new Image;this._element.onload=qx.lang.Function.bind(this.__onload,this);this._element.onerror=qx.lang.Function.bind(this.__onerror,this);this._source=a;this._element.src=a;if(qx.core.Variant.isSet($[0],$[18])){this._isPng=/\.png$/i.test(this._element.nameProp)}qx.io.image.PreloaderManager.getInstance().add(this)},members:{_source:null,_isLoaded:false,_isErroneous:false,getUri:function(){return this._source},getSource:function(){return this._source},isLoaded:function(){return this._isLoaded},isErroneous:function(){return this._isErroneous},_isPng:false,getIsPng:function(){return this._isPng},getWidth:qx.core.Variant.select($[0],{gecko:function(){return this._element.naturalWidth},"default":function(){return this._element.width}}),getHeight:qx.core.Variant.select($[0],{gecko:function(){return this._element.naturalHeight},"default":function(){return this._element.height}}),__onload:function(){if(this._isLoaded||this._isErroneous){return}this._isLoaded=true;this._isErroneous=false;if(this.hasEventListeners("load")){this.dispatchEvent(new qx.event.type.Event("load"),true)}},__onerror:function(){if(this._isLoaded||this._isErroneous){return}this._isLoaded=false;this._isErroneous=true;if(this.hasEventListeners("error")){this.dispatchEvent(new qx.event.type.Event("error"),true)}}},destruct:function(){if(this._element){this._element.onload=this._element.onerror=null}this._disposeFields("_element","_isLoaded","_isErroneous","_isPng")}});
-qx.Class.define("qx.ui.form.ListItem",{extend:qx.ui.basic.Atom,construct:function(c,a,b){arguments.callee.base.call(this,c,a);if(b!=null){this.setValue(b)}this.addEventListener($[61],this._ondblclick);this.initMinWidth()},events:{action:$[11]},properties:{appearance:{refine:true,init:"list-item"},minWidth:{refine:true,init:"auto"},width:{refine:true,init:null},allowStretchX:{refine:true,init:true},value:{check:$[25],event:$[80]}},members:{handleStateChange:function(){if(this.hasState("lead")){this.setStyleProperty($[120],$[369])}else{this.setStyleProperty($[120],"0px none")}},_applyStateStyleFocus:function(a){},matchesString:function(a){a=String(a);return a!=""&&this.getLabel().toString().toLowerCase().indexOf(a.toLowerCase())==0},matchesStringExact:function(a){a=String(a);return a!=""&&this.getLabel().toString().toLowerCase()==String(a).toLowerCase()},matchesValue:function(a){a=String(a);return a!=""&&this.getValue().toLowerCase().indexOf(a.toLowerCase())==0},matchesValueExact:function(a){a=String(a);return a!=""&&this.getValue().toLowerCase()==String(a).toLowerCase()},_ondblclick:function(b){var a=this.getCommand();if(a){a.execute()}}}});
-qx.Class.define("qx.constant.Layout",{statics:{ORIENTATION_HORIZONTAL:$[52],ORIENTATION_VERTICAL:$[46],ALIGN_LEFT:"left",ALIGN_LEFT_REVERSED:$[232],ALIGN_CENTER:$[38],ALIGN_CENTER_REVERSED:$[248],ALIGN_RIGHT:$[23],ALIGN_RIGHT_REVERSED:$[474],ALIGN_TOP:"top",ALIGN_TOP_REVERSED:$[238],ALIGN_MIDDLE:$[32],ALIGN_MIDDLE_REVERSED:$[251],ALIGN_BOTTOM:$[48],ALIGN_BOTTOM_REVERSED:$[490]}});
-qx.Class.define("qx.constant.Style",{statics:{POSITION_ABSOLUTE:$[27],POSITION_RELATIVE:"relative",POSITION_STATIC:$[118],POSITION_FIXED:$[151],CURSOR_WAIT:"wait",CURSOR_PROGRESS:$[267],CURSOR_DEFAULT:$[39],CURSOR_HAND:$[149],OVERFLOW_AUTO:"auto",OVERFLOW_HIDDEN:$[17],OVERFLOW_BOTH:$[26],OVERFLOW_HORIZONTAL:$[94],OVERFLOW_VERTICAL:$[93],OVERFLOW_ELLIPSIS:"ellipsis",OVERFLOW_VISIBLE:"visible",OVERFLOW_MOZ_NONE:$[285],OVERFLOW_MOZ_HORIZONTAL:$[316],OVERFLOW_MOZ_VERTICAL:$[259],FOCUS_OUTLINE:$[322],BORDER_SOLID:$[20],LABEL_MODE_HTML:"html",BUTTON_SHOW_ICON:"icon"}});
-qx.Class.define($[517],{type:$[102],extend:qx.core.Target,construct:function(){arguments.callee.base.call(this)},events:{created:$[11],configured:$[11],sending:$[11],receiving:$[11],completed:$[11],aborted:$[11],failed:$[11],timeout:$[11]},properties:{url:{check:$[25],nullable:true},method:{check:$[25],nullable:true},asynchronous:{check:$[3],nullable:true},data:{check:$[25],nullable:true},username:{check:$[25],nullable:true},password:{check:$[25],nullable:true},state:{check:[$[166],$[101],$[62],$[67],$[43],$[65],$[63],$[51]],init:$[166],event:$[365],apply:$[406]},requestHeaders:{check:$[110],nullable:true},parameters:{check:$[110],nullable:true},formFields:{check:$[110],nullable:true},responseType:{check:$[25],nullable:true},useBasicHttpAuth:{check:$[3],nullable:true}},members:{send:function(){throw new Error("send is abstract")},abort:function(){if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[185])){throw new Error("Aborting...")}}this.setState($[65])},timeout:function(){if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[185])){throw new Error("Timeout...")}}this.setState($[63])},failed:function(){if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[185])){throw new Error("Failed...")}}this.setState($[51])},setRequestHeader:function(a,b){throw new Error("setRequestHeader is abstract")},getResponseHeader:function(a){throw new Error("getResponseHeader is abstract")},getResponseHeaders:function(){throw new Error("getResponseHeaders is abstract")},getStatusCode:function(){throw new Error("getStatusCode is abstract")},getStatusText:function(){throw new Error("getStatusText is abstract")},getResponseText:function(){throw new Error("getResponseText is abstract")},getResponseXml:function(){throw new Error("getResponseXml is abstract")},getFetchedLength:function(){throw new Error("getFetchedLength is abstract")},_applyState:function(b,a){switch(b){case $[166]:this.createDispatchEvent($[166]);break;case $[101]:this.createDispatchEvent($[101]);break;case $[62]:this.createDispatchEvent($[62]);break;case $[67]:this.createDispatchEvent($[67]);break;case $[43]:this.createDispatchEvent($[43]);break;case $[65]:this.createDispatchEvent($[65]);break;case $[51]:this.createDispatchEvent($[51]);break;case $[63]:this.createDispatchEvent($[63]);break}return true}}});
+qx.Class.define($[548],{extend:qx.core.Target,events:{load:$[11],error:$[11]},construct:function(a){if(qx.io.image.PreloaderManager.getInstance().has(a)){return qx.io.image.PreloaderManager.getInstance().get(a)}arguments.callee.base.call(this);this._element=new Image;this._element.onload=qx.lang.Function.bind(this.__onload,this);this._element.onerror=qx.lang.Function.bind(this.__onerror,this);this._source=a;this._element.src=a;if(qx.core.Variant.isSet($[0],$[18])){this._isPng=/\.png$/i.test(this._element.nameProp)}qx.io.image.PreloaderManager.getInstance().add(this)},members:{_source:null,_isLoaded:false,_isErroneous:false,getUri:function(){return this._source},getSource:function(){return this._source},isLoaded:function(){return this._isLoaded},isErroneous:function(){return this._isErroneous},_isPng:false,getIsPng:function(){return this._isPng},getWidth:qx.core.Variant.select($[0],{gecko:function(){return this._element.naturalWidth},"default":function(){return this._element.width}}),getHeight:qx.core.Variant.select($[0],{gecko:function(){return this._element.naturalHeight},"default":function(){return this._element.height}}),__onload:function(){if(this._isLoaded||this._isErroneous){return}this._isLoaded=true;this._isErroneous=false;if(this.hasEventListeners("load")){this.dispatchEvent(new qx.event.type.Event("load"),true)}},__onerror:function(){if(this._isLoaded||this._isErroneous){return}this._isLoaded=false;this._isErroneous=true;if(this.hasEventListeners("error")){this.dispatchEvent(new qx.event.type.Event("error"),true)}}},destruct:function(){if(this._element){this._element.onload=this._element.onerror=null}this._disposeFields("_element","_isLoaded","_isErroneous","_isPng")}});
+qx.Class.define("qx.ui.form.ListItem",{extend:qx.ui.basic.Atom,construct:function(c,a,b){arguments.callee.base.call(this,c,a);if(b!=null){this.setValue(b)}this.addEventListener($[62],this._ondblclick);this.initMinWidth()},events:{action:$[11]},properties:{appearance:{refine:true,init:"list-item"},minWidth:{refine:true,init:"auto"},width:{refine:true,init:null},allowStretchX:{refine:true,init:true},value:{check:$[25],event:$[80]}},members:{handleStateChange:function(){if(this.hasState("lead")){this.setStyleProperty($[115],$[372])}else{this.setStyleProperty($[115],"0px none")}},_applyStateStyleFocus:function(a){},matchesString:function(a){a=String(a);return a!=""&&this.getLabel().toString().toLowerCase().indexOf(a.toLowerCase())==0},matchesStringExact:function(a){a=String(a);return a!=""&&this.getLabel().toString().toLowerCase()==String(a).toLowerCase()},matchesValue:function(a){a=String(a);return a!=""&&this.getValue().toLowerCase().indexOf(a.toLowerCase())==0},matchesValueExact:function(a){a=String(a);return a!=""&&this.getValue().toLowerCase()==String(a).toLowerCase()},_ondblclick:function(b){var a=this.getCommand();if(a){a.execute()}}}});
+qx.Class.define("qx.constant.Layout",{statics:{ORIENTATION_HORIZONTAL:$[52],ORIENTATION_VERTICAL:$[47],ALIGN_LEFT:"left",ALIGN_LEFT_REVERSED:$[222],ALIGN_CENTER:$[37],ALIGN_CENTER_REVERSED:$[219],ALIGN_RIGHT:$[24],ALIGN_RIGHT_REVERSED:$[556],ALIGN_TOP:"top",ALIGN_TOP_REVERSED:$[216],ALIGN_MIDDLE:$[32],ALIGN_MIDDLE_REVERSED:$[248],ALIGN_BOTTOM:$[50],ALIGN_BOTTOM_REVERSED:$[523]}});
+qx.Class.define("qx.constant.Style",{statics:{POSITION_ABSOLUTE:$[28],POSITION_RELATIVE:"relative",POSITION_STATIC:$[119],POSITION_FIXED:$[151],CURSOR_WAIT:"wait",CURSOR_PROGRESS:$[262],CURSOR_DEFAULT:$[38],CURSOR_HAND:$[144],OVERFLOW_AUTO:"auto",OVERFLOW_HIDDEN:$[17],OVERFLOW_BOTH:$[26],OVERFLOW_HORIZONTAL:$[94],OVERFLOW_VERTICAL:$[93],OVERFLOW_ELLIPSIS:"ellipsis",OVERFLOW_VISIBLE:"visible",OVERFLOW_MOZ_NONE:$[282],OVERFLOW_MOZ_HORIZONTAL:$[283],OVERFLOW_MOZ_VERTICAL:$[306],FOCUS_OUTLINE:$[358],BORDER_SOLID:$[20],LABEL_MODE_HTML:"html",BUTTON_SHOW_ICON:"icon"}});
+qx.Class.define($[501],{type:$[97],extend:qx.core.Target,construct:function(){arguments.callee.base.call(this)},events:{created:$[11],configured:$[11],sending:$[11],receiving:$[11],completed:$[11],aborted:$[11],failed:$[11],timeout:$[11]},properties:{url:{check:$[25],nullable:true},method:{check:$[25],nullable:true},asynchronous:{check:$[3],nullable:true},data:{check:$[25],nullable:true},username:{check:$[25],nullable:true},password:{check:$[25],nullable:true},state:{check:[$[170],$[103],$[64],$[67],$[42],$[63],$[65],$[54]],init:$[170],event:$[333],apply:$[421]},requestHeaders:{check:$[111],nullable:true},parameters:{check:$[111],nullable:true},formFields:{check:$[111],nullable:true},responseType:{check:$[25],nullable:true},useBasicHttpAuth:{check:$[3],nullable:true}},members:{send:function(){throw new Error("send is abstract")},abort:function(){if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[186])){throw new Error("Aborting...")}}this.setState($[63])},timeout:function(){if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[186])){throw new Error("Timeout...")}}this.setState($[65])},failed:function(){if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[186])){throw new Error("Failed...")}}this.setState($[54])},setRequestHeader:function(a,b){throw new Error("setRequestHeader is abstract")},getResponseHeader:function(a){throw new Error("getResponseHeader is abstract")},getResponseHeaders:function(){throw new Error("getResponseHeaders is abstract")},getStatusCode:function(){throw new Error("getStatusCode is abstract")},getStatusText:function(){throw new Error("getStatusText is abstract")},getResponseText:function(){throw new Error("getResponseText is abstract")},getResponseXml:function(){throw new Error("getResponseXml is abstract")},getFetchedLength:function(){throw new Error("getFetchedLength is abstract")},_applyState:function(b,a){switch(b){case $[170]:this.createDispatchEvent($[170]);break;case $[103]:this.createDispatchEvent($[103]);break;case $[64]:this.createDispatchEvent($[64]);break;case $[67]:this.createDispatchEvent($[67]);break;case $[42]:this.createDispatchEvent($[42]);break;case $[63]:this.createDispatchEvent($[63]);break;case $[54]:this.createDispatchEvent($[54]);break;case $[65]:this.createDispatchEvent($[65]);break}return true}}});
 qx.Class.define("qx.ui.layout.HorizontalBoxLayout",{extend:qx.ui.layout.BoxLayout});
-qx.Class.define("qx.ui.form.Spinner",{extend:qx.ui.layout.HorizontalBoxLayout,construct:function(c,b,a){arguments.callee.base.call(this);if(qx.core.Variant.isSet($[0],$[18])){this.setStyleProperty($[194],"0px")}this._textfield=new qx.ui.form.TextField;this._textfield.setBorder(null);this._textfield.setWidth("1*");this._textfield.setAllowStretchY(true);this._textfield.setHeight(null);this._textfield.setLiveUpdate(true);this._textfield.setVerticalAlign($[32]);this._textfield.setAppearance("spinner-text-field");this.add(this._textfield);this._buttonlayout=new qx.ui.layout.VerticalBoxLayout;this._buttonlayout.setWidth("auto");this.add(this._buttonlayout);this._upbutton=new qx.ui.form.Button;this._upbutton.setAppearance("spinner-button-up");this._upbutton.setTabIndex(null);this._upbutton.setHeight("1*");this._buttonlayout.add(this._upbutton);this._downbutton=new qx.ui.form.Button;this._downbutton.setAppearance("spinner-button-down");this._downbutton.setTabIndex(null);this._downbutton.setHeight("1*");this._buttonlayout.add(this._downbutton);this._timer=new qx.client.Timer(this.getInterval());this.setManager(new qx.util.range.Range());this.initWrap();this.addEventListener($[12],this._onkeypress,this);this.addEventListener($[24],this._onkeydown,this);this.addEventListener($[60],this._onkeyup,this);this.addEventListener($[56],this._onmousewheel,this);this._textfield.addEventListener($[80],this._ontextchange,this);this._textfield.addEventListener($[85],this._oninput,this);this._textfield.addEventListener("blur",this._onblur,this);this._upbutton.addEventListener($[2],this._onmousedown,this);this._downbutton.addEventListener($[2],this._onmousedown,this);this._timer.addEventListener($[50],this._oninterval,this);if(c!=null){this.setMin(c)}if(a!=null){this.setMax(a)}if(b!=null){this.setValue(b)}this._checkValue=this.__checkValue;this.initWidth();this.initHeight();this._last_value=""},events:{change:$[70]},properties:{appearance:{refine:true,init:"spinner"},width:{refine:true,init:60},height:{refine:true,init:22},incrementAmount:{check:$[73],init:1,apply:"_applyIncrementAmount"},wheelIncrementAmount:{check:$[73],init:1},pageIncrementAmount:{check:$[73],init:10},interval:{check:$[22],init:100},firstInterval:{check:$[22],init:500},minTimer:{check:$[22],init:20},timerDecrease:{check:$[22],init:2},amountGrowth:{check:$[73],init:1.01},wrap:{check:$[3],init:false,apply:$[394]},editable:{check:$[3],init:true,apply:"_applyEditable"},manager:{check:$[457],apply:$[567],dispose:true},checkValueFunction:{apply:"_applyCheckValueFunction"},selectTextOnInteract:{check:$[3],init:true}},members:{_applyIncrementAmount:function(b,a){this._computedIncrementAmount=b},_applyEditable:function(b,a){if(this._textfield){this._textfield.setReadOnly(!b)}},_applyWrap:function(b,a){this.getManager().setWrap(b);this._onchange()},_applyManager:function(b,a){if(a){a.removeEventListener($[79],this._onchange,this)}if(b){b.addEventListener($[79],this._onchange,this)}this._onchange()},_applyCheckValueFunction:function(b,a){this._checkValue=b},_computePreferredInnerWidth:function(){return 50},_computePreferredInnerHeight:function(){return 14},_onkeypress:function(b){var a=b.getKeyIdentifier();if(a==$[68]&&!b.isAltPressed()){this._checkValue(true,false);if(this.getSelectTextOnInteract()){this._textfield.selectAll()}}else{switch(a){case"Up":case"Down":case"Left":case $[53]:case"Shift":case $[266]:case"Alt":case $[116]:case"Delete":case $[351]:case"Insert":case"Home":case"End":case $[58]:case $[55]:case"NumLock":case"Tab":break;default:if((a>="0"&&a<="9")||(a=="-")){return}if(b.getModifiers()==0){b.preventDefault()}}}},_onkeydown:function(b){var a=b.getKeyIdentifier();if(this._intervalIncrease==null){switch(a){case"Up":case"Down":this._intervalIncrease=a=="Up";this._intervalMode="single";this._resetIncrements();this._checkValue(true,false);this._increment();this._timer.startWith(this.getFirstInterval());break;case $[58]:case $[55]:this._intervalIncrease=a==$[58];this._intervalMode="page";this._resetIncrements();this._checkValue(true,false);this._pageIncrement();this._timer.startWith(this.getFirstInterval());break}}},_onkeyup:function(a){if(this._intervalIncrease!=null){switch(a.getKeyIdentifier()){case"Up":case"Down":case $[58]:case $[55]:this._timer.stop();this._intervalIncrease=null;this._intervalMode=null}}},_onmousedown:function(b){if(!b.isLeftButtonPressed()){return}this._checkValue(true);var a=b.getCurrentTarget();a.addState($[21]);a.addEventListener($[15],this._onmouseup,this);a.addEventListener($[14],this._onmouseup,this);this._intervalIncrease=a==this._upbutton;this._resetIncrements();this._increment();if(this.getSelectTextOnInteract()){this._textfield.selectAll()}this._timer.setInterval(this.getFirstInterval());this._timer.start()},_onmouseup:function(b){var a=b.getCurrentTarget();a.removeState($[21]);a.removeEventListener($[15],this._onmouseup,this);a.removeEventListener($[14],this._onmouseup,this);if(this.getSelectTextOnInteract()){this._textfield.selectAll()}this._textfield.setFocused(true);this._timer.stop();this._intervalIncrease=null},_onmousewheel:function(b){this._checkValue(true);if(this.getManager().incrementValue){this.getManager().incrementValue(this.getWheelIncrementAmount()*b.getWheelDelta())}else{var a=this.getManager().getValue()+(this.getWheelIncrementAmount()*b.getWheelDelta());a=this.getManager().limit(a);this.getManager().setValue(a)}this._textfield.selectAll();b.preventDefault();b.stopPropagation()},_ontextchange:function(a){this._last_value=a.getOldValue()},_oninput:function(a){this._checkValue(true,true)},_onchange:function(b){var a=this.getManager().getValue();this._textfield.setValue(String(a));if(a==this.getMin()&&!this.getWrap()){this._downbutton.removeState($[21]);this._downbutton.setEnabled(false);this._timer.stop()}else{this._downbutton.resetEnabled()}if(a==this.getMax()&&!this.getWrap()){this._upbutton.removeState($[21]);this._upbutton.setEnabled(false);this._timer.stop()}else{this._upbutton.resetEnabled()}this.createDispatchDataEvent($[79],a)},_onblur:function(a){this._checkValue(false)},setValue:function(a){this.getManager().setValue(this.getManager().limit(a))},getValue:function(){this._checkValue(true);return this.getManager().getValue()},resetValue:function(){this.getManager().resetValue()},setMax:function(a){return this.getManager().setMax(a)},getMax:function(){return this.getManager().getMax()},setMin:function(a){return this.getManager().setMin(a)},getMin:function(){return this.getManager().getMin()},_intervalIncrease:null,_oninterval:function(b){this._timer.stop();this.setInterval(Math.max(this.getMinTimer(),this.getInterval()-this.getTimerDecrease()));if(this._intervalMode=="page"){this._pageIncrement()}else{if(this.getInterval()==this.getMinTimer()){this._computedIncrementAmount=this.getAmountGrowth()*this._computedIncrementAmount}this._increment()}var a=this.getManager().getWrap();switch(this._intervalIncrease){case true:if(this.getValue()==this.getMax()&&!a){return}case false:if(this.getValue()==this.getMin()&&!a){return}}this._timer.restartWith(this.getInterval())},__checkValue:function(i,c){var b=this._textfield.getInputElement();if(!b){return}if((b.value=="")||(b.value=="-")){if(!i){this.resetValue();return}}else{var h=b.value;var g;g=h;var d=parseFloat(g);var e=this.getManager().limit(d);var a=this.getManager().getValue();var j=e;if(isNaN(d)||(e!=d)||(d!=g)){if(c){this._textfield.setValue(this._last_value)}else{if(isNaN(e)){j=a}else{j=e}}}if(c){return}var f;f=String(j);if((j===a)&&(h!==f)){this._textfield.setValue(f)}this.getManager().setValue(j)}},_increment:function(){if(this.getManager().incrementValue){this.getManager().incrementValue((this._intervalIncrease?1:-1)*this._computedIncrementAmount)}else{var a=this.getManager().getValue()+((this._intervalIncrease?1:-1)*this._computedIncrementAmount);a=this.getManager().limit(a);this.getManager().setValue(a)}},_pageIncrement:function(){if(this.getManager().pageIncrementValue){this.getManager().pageIncrementValue()}else{var a=this.getManager().getValue()+((this._intervalIncrease?1:-1)*this.getPageIncrementAmount());a=this.getManager().limit(a);this.getManager().setValue(a)}},_resetIncrements:function(){this._computedIncrementAmount=this.getIncrementAmount();this.resetInterval()}},destruct:function(){var a=this.getManager();if(a){a.dispose()}this._disposeObjects("_textfield","_buttonlayout","_upbutton","_downbutton","_timer")}});
-qx.Class.define($[558],{extend:qx.ui.basic.Terminator,construct:function(a){arguments.callee.base.call(this);if(a!=null){this.setValue(a)}this.initHideFocus();this.initWidth();this.initHeight();this.initTabIndex();this.initSpellCheck();this.__oninput=qx.lang.Function.bindEvent(this._oninputDom,this);this.addEventListener("blur",this._onblur);this.addEventListener($[74],this._onfocus);this.addEventListener($[85],this._oninput);this.addEventListener($[24],this._onkeydown);this.addEventListener($[12],this._onkeypress)},statics:{createRegExpValidator:function(a){return function(b){return a.test(b)}}},events:{input:$[70]},properties:{allowStretchX:{refine:true,init:true},allowStretchY:{refine:true,init:false},appearance:{refine:true,init:"text-field"},tabIndex:{refine:true,init:1},hideFocus:{refine:true,init:true},width:{refine:true,init:"auto"},height:{refine:true,init:"auto"},selectable:{refine:true,init:true},value:{init:"",nullable:true,event:$[80],apply:"_applyValue",dispose:true},textAlign:{check:["left",$[38],$[23],"justify"],nullable:true,themeable:true,apply:$[400]},spellCheck:{check:$[3],init:false,apply:"_applySpellCheck"},liveUpdate:{check:$[3],init:false},maxLength:{check:$[22],apply:"_applyMaxLength",nullable:true},readOnly:{check:$[3],apply:"_applyReadOnly",init:false},validator:{check:"Function",event:"changeValidator",nullable:true}},members:{_inputTag:$[85],_inputType:"text",_inputOverflow:$[17],_applyElement:function(d,b){arguments.callee.base.call(this,d,b);if(d){var c=this._inputElement=document.createElement(this._inputTag);if(this._inputType){c.type=this._inputType}c.autoComplete="off";c.setAttribute("autoComplete","off");c.disabled=this.getEnabled()===false;c.readOnly=this.getReadOnly();c.value=this.getValue()!=null?this.getValue().toString():"";if(this.getMaxLength()!=null){c.maxLength=this.getMaxLength()}var a=c.style;a.padding=a.margin=0;a.border="0 none";a.background=$[156];a.overflow=this._inputOverflow;a.outline="none";a.resize="none";a.WebkitAppearance="none";a.MozAppearance="none";if(qx.core.Variant.isSet($[0],$[504])){a.margin="1px 0 1px -1px"}this._renderFont();this._renderTextColor();this._renderTextAlign();this._renderCursor();this._renderSpellCheck();if(qx.core.Variant.isSet($[0],$[18])){c.onpropertychange=this.__oninput}else{c.addEventListener($[85],this.__oninput,false)}this._getTargetNode().appendChild(c)}},_postApply:function(){this._syncFieldWidth();this._syncFieldHeight()},_changeInnerWidth:function(b,a){this._syncFieldWidth()},_changeInnerHeight:function(b,a){this._syncFieldHeight();this._centerFieldVertically()},_syncFieldWidth:function(){this._inputElement.style.width=this.getInnerWidth()+"px"},_syncFieldHeight:function(){if(this._inputTag!==$[85]){this._inputElement.style.height=(this.getInnerHeight()-2)+"px"}},_applyCursor:function(b,a){if(this._inputElement){this._renderCursor()}},_renderCursor:function(){var a=this._inputElement.style;var b=this.getCursor();if(b){if(b==$[149]&&org.eclipse.rwt.Client.isMshtml()){a.cursor="hand"}else{a.cursor=b}}else{a.cursor=""}},_applyTextAlign:function(b,a){if(this._inputElement){this._renderTextAlign()}},_renderTextAlign:function(){this._inputElement.style.textAlign=this.getTextAlign()||""},_applySpellCheck:function(b,a){if(this._inputElement){this._renderSpellCheck()}},_renderSpellCheck:function(){this._inputElement.spellcheck=this.getSpellCheck()},_applyEnabled:function(b,a){if(this._inputElement){this._inputElement.disabled=b===false}return arguments.callee.base.call(this,b,a)},_applyValue:function(b,a){this._inValueProperty=true;if(this._inputElement){if(b===null){b=""}if(this._inputElement.value!==b){this._inputElement.value=b}}delete this._inValueProperty},_applyMaxLength:function(b,a){if(this._inputElement){this._inputElement.maxLength=b==null?"":b}},_applyReadOnly:function(b,a){if(this._inputElement){this._inputElement.readOnly=b}if(b){this.addState($[338])}else{this.removeState($[338])}},_applyTextColor:function(b,a){qx.theme.manager.Color.getInstance().connect(this._styleTextColor,this,b)},_styleTextColor:function(a){this.__textColor=a;this._renderTextColor()},_renderTextColor:function(){var a=this._inputElement;if(a){a.style.color=this.__textColor||""}},_applyFont:function(b,a){qx.theme.manager.Font.getInstance().connect(this._styleFont,this,b)},_styleFont:function(a){this.__font=a;this._renderFont()},_renderFont:function(){var a=this._inputElement;if(a){var b=this.__font;b?b.renderElement(a):qx.ui.core.Font.resetElement(a)}},_visualizeFocus:function(){arguments.callee.base.call(this);if(this.getEnableElementFocus()){try{this._inputElement.focus()}catch(a){}if(qx.core.Variant.isSet($[0],$[71])){if(this.getSelectionLength()>0){this.setSelectionStart(this.getSelectionLength());this.setSelectionLength(0)}}}},_visualizeBlur:function(){arguments.callee.base.call(this);try{this._inputElement.blur()}catch(a){}},getComputedValue:function(){if(this._inputElement){return this._inputElement.value}return this.getValue()},getInputElement:function(){return this._inputElement||null},isValid:function(){var a=this.getValidator();return !a||a(this.getValue())},isComputedValid:function(){var a=this.getValidator();return !a||a(this.getComputedValue())},_computePreferredInnerWidth:function(){return 120},_computePreferredInnerHeight:function(){return 16},_ieFirstInputFix:qx.core.Variant.select($[0],{mshtml:function(){this._inValueProperty=true;this._inputElement.value=this.getValue()===null?"":this.getValue().toString();this._firstInputFixApplied=true;delete this._inValueProperty},"default":null}),_afterAppear:qx.core.Variant.select($[0],{mshtml:function(){arguments.callee.base.call(this);if(!this._firstInputFixApplied&&this._inputElement){qx.client.Timer.once(this._ieFirstInputFix,this,1)}this._centerFieldVertically()},"default":function(){arguments.callee.base.call(this);this._centerFieldVertically()}}),_centerFieldVertically:function(){if(this._inputTag===$[85]&&this._inputElement){var c=this.getInnerHeight();var a=qx.html.Dimension.getBoxHeight(this._inputElement);if(a!=0){if(qx.core.Variant.isSet($[0],$[18])){a-=2}var b=(c-a)/2-1;if(b<0){b=0}b=Math.floor(b);this.setStyleProperty($[209],b+"px")}}},_firstInputFixApplied:false,_textOnFocus:null,_oninputDom:qx.core.Variant.select($[0],{mshtml:function(a){if(!this._inValueProperty&&a.propertyName==="value"){this.createDispatchDataEvent($[85],this.getComputedValue())}},"default":function(a){this.createDispatchDataEvent($[85],this.getComputedValue())}}),_ontabfocus:function(){this.selectAll()},_onfocus:function(){this._textOnFocus=this.getComputedValue()},_onblur:function(){var a=this.getComputedValue().toString();if(this._textOnFocus!=a){this.setValue(a)}if(this.getParent()!=null){this.setSelectionLength(0)}},_oninput:function(){if(!this.isLiveUpdate()){return}var a=this.getComputedValue().toString();this.setValue(a)},_onkeydown:function(a){if(a.getKeyIdentifier()==$[351]&&this.getReadOnly()){a.preventDefault()}},_onkeypress:function(a){if(a.getKeyIdentifier()!=="Tab"){a.stopPropagation()}},__getRange:qx.core.Variant.select($[0],{mshtml:function(){this._visualPropertyCheck();return this._inputElement.createTextRange()},"default":null}),__getSelectionRange:qx.core.Variant.select($[0],{mshtml:function(){this._visualPropertyCheck();return window.document.selection.createRange()},"default":null}),setSelectionStart:qx.core.Variant.select($[0],{mshtml:function(d){this._visualPropertyCheck();var c=this._inputElement.value;var b=0;while(b<d){b=c.indexOf("\r\n",b);if(b==-1){break}d--;b++}var a=this.__getRange();a.collapse();a.move("character",d);a.select()},gecko:function(b){this._visualPropertyCheck();try{this._inputElement.selectionStart=b}catch(a){}},"default":function(a){this._visualPropertyCheck();this._inputElement.selectionStart=a}}),getSelectionStart:qx.core.Variant.select($[0],{mshtml:function(){this._visualPropertyCheck();var d=this.__getSelectionRange();if(!this._inputElement.contains(d.parentElement())){return -1}var b=this.__getRange();var a=b.duplicate();a.moveToBookmark(d.getBookmark());b.setEndPoint("EndToStart",a);var c=d.text.replace(/[\r\n]/g,".");var e=this._inputElement.value.replace(/[\r\n]/g,".");return e.indexOf(c,b.text.length)},gecko:function(){this._visualPropertyCheck();var b=this._inputElement;try{if(qx.util.Validation.isValidString(b.value)){return b.selectionStart}}catch(a){return 0}},"default":function(){this._visualPropertyCheck();return this._inputElement.selectionStart}}),setSelectionLength:qx.core.Variant.select($[0],{mshtml:function(b){this._visualPropertyCheck();var a=this.__getSelectionRange();if(!this._inputElement.contains(a.parentElement())){return}a.collapse();a.moveEnd("character",b);a.select()},gecko:function(c){this._visualPropertyCheck();var b=this._inputElement;try{if(qx.util.Validation.isValidString(b.value)){b.selectionEnd=b.selectionStart+c}}catch(a){}},"default":function(b){this._visualPropertyCheck();var a=this._inputElement;if(qx.util.Validation.isValidString(a.value)){a.selectionEnd=a.selectionStart+b}}}),getSelectionLength:qx.core.Variant.select($[0],{mshtml:function(){this._visualPropertyCheck();var a=this.__getSelectionRange();if(!this._inputElement.contains(a.parentElement())){return 0}return a.text.length},gecko:function(){this._visualPropertyCheck();var b=this._inputElement;try{return b.selectionEnd-b.selectionStart}catch(a){}},"default":function(){this._visualPropertyCheck();var a=this._inputElement;return a.selectionEnd-a.selectionStart}}),setSelectionText:qx.core.Variant.select($[0],{mshtml:function(c){this._visualPropertyCheck();var b=this.getSelectionStart();var a=this.__getSelectionRange();if(!this._inputElement.contains(a.parentElement())){return}a.text=c;this.setValue(this._inputElement.value);this.setSelectionStart(b);this.setSelectionLength(c.length)},gecko:function(h){this._visualPropertyCheck();var d=this._inputElement;try{if(qx.util.Validation.isValidString(d.value)){var f=d.value;var g=d.selectionStart;var b=f.substr(0,g);var a=f.substr(d.selectionEnd);var e=d.value=b+h+a;d.selectionStart=g;d.selectionEnd=g+h.length;this.setValue(e)}}catch(c){}},"default":function(g){this._visualPropertyCheck();var c=this._inputElement;var e=c.value;var f=c.selectionStart;var b=e.substr(0,f);var a=e.substr(c.selectionEnd);var d=c.value=b+g+a;c.selectionStart=f;c.selectionEnd=f+g.length;this.setValue(d)}}),getSelectionText:qx.core.Variant.select($[0],{mshtml:function(){this._visualPropertyCheck();var a=this.__getSelectionRange();if(!this._inputElement.contains(a.parentElement())){return""}return a.text},"default":function(){this._visualPropertyCheck();return this._inputElement.value.substr(this.getSelectionStart(),this.getSelectionLength())}}),selectAll:function(){this._visualPropertyCheck();if(this.getValue()!=null){this.setSelectionStart(0);this.setSelectionLength(this._inputElement.value.length)}this._inputElement.select();if(this.isEnabled()&&this.isSeeable()){this._inputElement.focus()}},selectFromTo:qx.core.Variant.select($[0],{mshtml:function(b,a){this._visualPropertyCheck();this.setSelectionStart(b);this.setSelectionLength(a-b)},gecko:function(d,c){this._visualPropertyCheck();var b=this._inputElement;try{b.selectionStart=d;b.selectionEnd=c}catch(a){}},"default":function(c,b){this._visualPropertyCheck();var a=this._inputElement;a.selectionStart=c;a.selectionEnd=b}})},destruct:function(){if(this._inputElement){if(qx.core.Variant.isSet($[0],$[18])){this._inputElement.onpropertychange=null}else{this._inputElement.removeEventListener($[85],this.__oninput,false)}}this._disposeFields("_inputElement","__font","__oninput")}});
-qx.Class.define("qx.ui.layout.VerticalBoxLayout",{extend:qx.ui.layout.BoxLayout,properties:{orientation:{refine:true,init:$[46]}}});
-qx.Class.define($[387],{extend:qx.ui.basic.Atom,construct:function(e,d,c,a,b){arguments.callee.base.call(this,e,d,c,a,b);this.initTabIndex();this.addEventListener($[9],this._onmouseover);this.addEventListener($[14],this._onmouseout);this.addEventListener($[2],this._onmousedown);this.addEventListener($[15],this._onmouseup);this.addEventListener($[24],this._onkeydown);this.addEventListener($[60],this._onkeyup)},properties:{appearance:{refine:true,init:"button"},tabIndex:{refine:true,init:1}},members:{_onmouseover:function(a){if(a.getTarget()!=this){return}if(this.hasState($[47])){this.removeState($[47]);this.addState($[21])}this.addState("over")},_onmouseout:function(a){if(a.getTarget()!=this){return}this.removeState("over");if(this.hasState($[21])){this.setCapture(true);this.removeState($[21]);this.addState($[47])}},_onmousedown:function(a){if(a.getTarget()!=this||!a.isLeftButtonPressed()){return}this.removeState($[47]);this.addState($[21])},_onmouseup:function(b){this.setCapture(false);var a=this.hasState($[21]);var c=this.hasState($[47]);if(a){this.removeState($[21])}if(c){this.removeState($[47])}if(!c){this.addState("over");if(a){this.execute()}}},_onkeydown:function(a){switch(a.getKeyIdentifier()){case $[68]:case $[92]:this.removeState($[47]);this.addState($[21]);a.stopPropagation()}},_onkeyup:function(a){switch(a.getKeyIdentifier()){case $[68]:case $[92]:if(this.hasState($[21])){this.removeState($[47]);this.removeState($[21]);this.execute();a.stopPropagation()}}}}});
-qx.Class.define($[457],{extend:qx.core.Target,events:{change:$[11]},properties:{value:{check:"!isNaN(value)&&value>=this.getMin()&&value<=this.getMax()",nullable:true,event:$[79],init:0},precision:{check:$[22],nullable:true,event:$[79],init:0},min:{check:$[73],apply:"_applyMin",event:$[79],init:0},max:{check:$[73],apply:"_applyMax",event:$[79],init:100},wrap:{check:$[3],init:false}},members:{_applyMax:function(b,a){this.setValue(Math.min(this.getValue(),b))},_applyMin:function(b,a){this.setValue(Math.max(this.getValue(),b))},limit:function(c){var a=this.getPrecision();if(a!=null){var b=Math.pow(10,a)}if(this.getWrap()){if(a!=null){var c=Math.round(c*b)/b}if(c<this.getMin()){return(this.getMax()-(this.getMin()-c))+1}if(c>this.getMax()){return(this.getMin()+(c-this.getMax()))-1}}if(c<this.getMin()){return this.getMin()}if(c>this.getMax()){return this.getMax()}if(a!=null){return Math.round(c*b)/b}else{return c}}}});
-qx.Class.define("qx.ui.pageview.AbstractPageView",{type:$[102],extend:qx.ui.layout.BoxLayout,construct:function(a,b){arguments.callee.base.call(this);this._bar=new a;this._pane=new b;this.add(this._bar,this._pane)},members:{getPane:function(){return this._pane},getBar:function(){return this._bar}},destruct:function(){this._disposeObjects("_bar","_pane")}});
-qx.Class.define($[433],{extend:qx.ui.pageview.AbstractPageView,construct:function(){arguments.callee.base.call(this,qx.ui.pageview.tabview.Bar,qx.ui.pageview.tabview.Pane)},properties:{appearance:{refine:true,init:"tab-view"},orientation:{refine:true,init:$[46]},alignTabsToLeft:{check:$[3],init:true,apply:"_applyAlignTabsToLeft"},placeBarOnTop:{check:$[3],init:true,apply:"_applyPlaceBarOnTop"}},members:{_applyAlignTabsToLeft:function(c,b){var a=this._bar;a.setHorizontalChildrenAlign(c?"left":$[23]);a._addChildrenToStateQueue()},_applyPlaceBarOnTop:function(c,b){var a=this._bar;if(c){a.moveSelfToBegin()}else{a.moveSelfToEnd()}a._addChildrenToStateQueue()}}});
-qx.Class.define("qx.ui.pageview.AbstractBar",{type:$[102],extend:qx.ui.layout.BoxLayout,construct:function(){arguments.callee.base.call(this);this._manager=new qx.ui.selection.RadioManager()},members:{getManager:function(){return this._manager}},destruct:function(){this._disposeObjects($[375])}});
-qx.Class.define($[455],{extend:qx.core.Target,construct:function(a,b){arguments.callee.base.call(this);this._items=[];this.setName(a!=null?a:qx.ui.selection.RadioManager.AUTO_NAME_PREFIX+this.toHashCode());if(b!=null){this.add.apply(this,b)}},statics:{AUTO_NAME_PREFIX:"qx-radio-"},properties:{selected:{nullable:true,apply:"_applySelected",event:"changeSelected",check:$[470]},name:{check:$[25],nullable:true,apply:"_applyName"}},members:{getItems:function(){return this._items},getEnabledItems:function(){var c=[];for(var f=0,e=this._items,d=e.length;f<d;f++){if(e[f].getEnabled()){c.push(e[f])}}return c},handleItemChecked:function(b,a){if(a){this.setSelected(b)}else{if(this.getSelected()==b){this.setSelected(null)}}},add:function(b){var a=arguments;var e=a.length;var d;for(var c=0;c<e;c++){d=a[c];if(qx.lang.Array.contains(this._items,d)){return}this._items.push(d);d.setManager(this);if(d.getChecked()){this.setSelected(d)}d.setName(this.getName())}},remove:function(a){qx.lang.Array.remove(this._items,a);a.setManager(null);if(a.getChecked()){this.setSelected(null)}},_applySelected:function(b,a){if(a){a.setChecked(false)}if(b){b.setChecked(true)}},_applyName:function(e,a){for(var c=0,b=this._items,d=b.length;c<d;c++){b[c].setName(e)}},selectNext:function(d){var a=this._items.indexOf(d);if(a==-1){return}var b=0;var c=this._items.length;a=(a+1)%c;while(b<c&&!this._items[a].getEnabled()){a=(a+1)%c;b++}this._selectByIndex(a)},selectPrevious:function(d){var a=this._items.indexOf(d);if(a==-1){return}var b=0;var c=this._items.length;a=(a-1+c)%c;while(b<c&&!this._items[a].getEnabled()){a=(a-1+c)%c;b++}this._selectByIndex(a)},_selectByIndex:function(a){if(this._items[a].getEnabled()){this.setSelected(this._items[a]);this._items[a].setFocused(true)}}},destruct:function(){this._disposeObjectDeep("_items",1)}});
+qx.Class.define("qx.ui.form.Spinner",{extend:qx.ui.layout.HorizontalBoxLayout,construct:function(c,b,a){arguments.callee.base.call(this);if(qx.core.Variant.isSet($[0],$[18])){this.setStyleProperty($[211],"0px")}this._textfield=new qx.ui.form.TextField;this._textfield.setBorder(null);this._textfield.setWidth("1*");this._textfield.setAllowStretchY(true);this._textfield.setHeight(null);this._textfield.setLiveUpdate(true);this._textfield.setVerticalAlign($[32]);this._textfield.setAppearance("spinner-text-field");this.add(this._textfield);this._buttonlayout=new qx.ui.layout.VerticalBoxLayout;this._buttonlayout.setWidth("auto");this.add(this._buttonlayout);this._upbutton=new qx.ui.form.Button;this._upbutton.setAppearance("spinner-button-up");this._upbutton.setTabIndex(null);this._upbutton.setHeight("1*");this._buttonlayout.add(this._upbutton);this._downbutton=new qx.ui.form.Button;this._downbutton.setAppearance("spinner-button-down");this._downbutton.setTabIndex(null);this._downbutton.setHeight("1*");this._buttonlayout.add(this._downbutton);this._timer=new qx.client.Timer(this.getInterval());this.setManager(new qx.util.range.Range());this.initWrap();this.addEventListener($[12],this._onkeypress,this);this.addEventListener($[23],this._onkeydown,this);this.addEventListener($[60],this._onkeyup,this);this.addEventListener($[55],this._onmousewheel,this);this._textfield.addEventListener($[80],this._ontextchange,this);this._textfield.addEventListener($[82],this._oninput,this);this._textfield.addEventListener("blur",this._onblur,this);this._upbutton.addEventListener($[2],this._onmousedown,this);this._downbutton.addEventListener($[2],this._onmousedown,this);this._timer.addEventListener($[49],this._oninterval,this);if(c!=null){this.setMin(c)}if(a!=null){this.setMax(a)}if(b!=null){this.setValue(b)}this._checkValue=this.__checkValue;this.initWidth();this.initHeight();this._last_value=""},events:{change:$[68]},properties:{appearance:{refine:true,init:"spinner"},width:{refine:true,init:60},height:{refine:true,init:22},incrementAmount:{check:$[73],init:1,apply:"_applyIncrementAmount"},wheelIncrementAmount:{check:$[73],init:1},pageIncrementAmount:{check:$[73],init:10},interval:{check:$[22],init:100},firstInterval:{check:$[22],init:500},minTimer:{check:$[22],init:20},timerDecrease:{check:$[22],init:2},amountGrowth:{check:$[73],init:1.01},wrap:{check:$[3],init:false,apply:$[359]},editable:{check:$[3],init:true,apply:"_applyEditable"},manager:{check:$[515],apply:$[403],dispose:true},checkValueFunction:{apply:"_applyCheckValueFunction"},selectTextOnInteract:{check:$[3],init:true}},members:{_applyIncrementAmount:function(b,a){this._computedIncrementAmount=b},_applyEditable:function(b,a){if(this._textfield){this._textfield.setReadOnly(!b)}},_applyWrap:function(b,a){this.getManager().setWrap(b);this._onchange()},_applyManager:function(b,a){if(a){a.removeEventListener($[79],this._onchange,this)}if(b){b.addEventListener($[79],this._onchange,this)}this._onchange()},_applyCheckValueFunction:function(b,a){this._checkValue=b},_computePreferredInnerWidth:function(){return 50},_computePreferredInnerHeight:function(){return 14},_onkeypress:function(b){var a=b.getKeyIdentifier();if(a==$[71]&&!b.isAltPressed()){this._checkValue(true,false);if(this.getSelectTextOnInteract()){this._textfield.selectAll()}}else{switch(a){case"Up":case"Down":case"Left":case $[51]:case"Shift":case $[317]:case"Alt":case $[118]:case"Delete":case $[352]:case"Insert":case"Home":case"End":case $[57]:case $[58]:case"NumLock":case"Tab":break;default:if((a>="0"&&a<="9")||(a=="-")){return}if(b.getModifiers()==0){b.preventDefault()}}}},_onkeydown:function(b){var a=b.getKeyIdentifier();if(this._intervalIncrease==null){switch(a){case"Up":case"Down":this._intervalIncrease=a=="Up";this._intervalMode="single";this._resetIncrements();this._checkValue(true,false);this._increment();this._timer.startWith(this.getFirstInterval());break;case $[57]:case $[58]:this._intervalIncrease=a==$[57];this._intervalMode="page";this._resetIncrements();this._checkValue(true,false);this._pageIncrement();this._timer.startWith(this.getFirstInterval());break}}},_onkeyup:function(a){if(this._intervalIncrease!=null){switch(a.getKeyIdentifier()){case"Up":case"Down":case $[57]:case $[58]:this._timer.stop();this._intervalIncrease=null;this._intervalMode=null}}},_onmousedown:function(b){if(!b.isLeftButtonPressed()){return}this._checkValue(true);var a=b.getCurrentTarget();a.addState($[21]);a.addEventListener($[15],this._onmouseup,this);a.addEventListener($[14],this._onmouseup,this);this._intervalIncrease=a==this._upbutton;this._resetIncrements();this._increment();if(this.getSelectTextOnInteract()){this._textfield.selectAll()}this._timer.setInterval(this.getFirstInterval());this._timer.start()},_onmouseup:function(b){var a=b.getCurrentTarget();a.removeState($[21]);a.removeEventListener($[15],this._onmouseup,this);a.removeEventListener($[14],this._onmouseup,this);if(this.getSelectTextOnInteract()){this._textfield.selectAll()}this._textfield.setFocused(true);this._timer.stop();this._intervalIncrease=null},_onmousewheel:function(b){this._checkValue(true);if(this.getManager().incrementValue){this.getManager().incrementValue(this.getWheelIncrementAmount()*b.getWheelDelta())}else{var a=this.getManager().getValue()+(this.getWheelIncrementAmount()*b.getWheelDelta());a=this.getManager().limit(a);this.getManager().setValue(a)}this._textfield.selectAll();b.preventDefault();b.stopPropagation()},_ontextchange:function(a){this._last_value=a.getOldValue()},_oninput:function(a){this._checkValue(true,true)},_onchange:function(b){var a=this.getManager().getValue();this._textfield.setValue(String(a));if(a==this.getMin()&&!this.getWrap()){this._downbutton.removeState($[21]);this._downbutton.setEnabled(false);this._timer.stop()}else{this._downbutton.resetEnabled()}if(a==this.getMax()&&!this.getWrap()){this._upbutton.removeState($[21]);this._upbutton.setEnabled(false);this._timer.stop()}else{this._upbutton.resetEnabled()}this.createDispatchDataEvent($[79],a)},_onblur:function(a){this._checkValue(false)},setValue:function(a){this.getManager().setValue(this.getManager().limit(a))},getValue:function(){this._checkValue(true);return this.getManager().getValue()},resetValue:function(){this.getManager().resetValue()},setMax:function(a){return this.getManager().setMax(a)},getMax:function(){return this.getManager().getMax()},setMin:function(a){return this.getManager().setMin(a)},getMin:function(){return this.getManager().getMin()},_intervalIncrease:null,_oninterval:function(b){this._timer.stop();this.setInterval(Math.max(this.getMinTimer(),this.getInterval()-this.getTimerDecrease()));if(this._intervalMode=="page"){this._pageIncrement()}else{if(this.getInterval()==this.getMinTimer()){this._computedIncrementAmount=this.getAmountGrowth()*this._computedIncrementAmount}this._increment()}var a=this.getManager().getWrap();switch(this._intervalIncrease){case true:if(this.getValue()==this.getMax()&&!a){return}case false:if(this.getValue()==this.getMin()&&!a){return}}this._timer.restartWith(this.getInterval())},__checkValue:function(i,c){var b=this._textfield.getInputElement();if(!b){return}if((b.value=="")||(b.value=="-")){if(!i){this.resetValue();return}}else{var h=b.value;var g;g=h;var d=parseFloat(g);var e=this.getManager().limit(d);var a=this.getManager().getValue();var j=e;if(isNaN(d)||(e!=d)||(d!=g)){if(c){this._textfield.setValue(this._last_value)}else{if(isNaN(e)){j=a}else{j=e}}}if(c){return}var f;f=String(j);if((j===a)&&(h!==f)){this._textfield.setValue(f)}this.getManager().setValue(j)}},_increment:function(){if(this.getManager().incrementValue){this.getManager().incrementValue((this._intervalIncrease?1:-1)*this._computedIncrementAmount)}else{var a=this.getManager().getValue()+((this._intervalIncrease?1:-1)*this._computedIncrementAmount);a=this.getManager().limit(a);this.getManager().setValue(a)}},_pageIncrement:function(){if(this.getManager().pageIncrementValue){this.getManager().pageIncrementValue()}else{var a=this.getManager().getValue()+((this._intervalIncrease?1:-1)*this.getPageIncrementAmount());a=this.getManager().limit(a);this.getManager().setValue(a)}},_resetIncrements:function(){this._computedIncrementAmount=this.getIncrementAmount();this.resetInterval()}},destruct:function(){var a=this.getManager();if(a){a.dispose()}this._disposeObjects("_textfield","_buttonlayout","_upbutton","_downbutton","_timer")}});
+qx.Class.define($[422],{extend:qx.ui.basic.Terminator,construct:function(a){arguments.callee.base.call(this);if(a!=null){this.setValue(a)}this.initHideFocus();this.initWidth();this.initHeight();this.initTabIndex();this.initSpellCheck();this.__oninput=qx.lang.Function.bindEvent(this._oninputDom,this);this.addEventListener("blur",this._onblur);this.addEventListener($[66],this._onfocus);this.addEventListener($[82],this._oninput);this.addEventListener($[23],this._onkeydown);this.addEventListener($[12],this._onkeypress)},statics:{createRegExpValidator:function(a){return function(b){return a.test(b)}}},events:{input:$[68]},properties:{allowStretchX:{refine:true,init:true},allowStretchY:{refine:true,init:false},appearance:{refine:true,init:"text-field"},tabIndex:{refine:true,init:1},hideFocus:{refine:true,init:true},width:{refine:true,init:"auto"},height:{refine:true,init:"auto"},selectable:{refine:true,init:true},value:{init:"",nullable:true,event:$[80],apply:"_applyValue",dispose:true},textAlign:{check:["left",$[37],$[24],"justify"],nullable:true,themeable:true,apply:$[376]},spellCheck:{check:$[3],init:false,apply:"_applySpellCheck"},liveUpdate:{check:$[3],init:false},maxLength:{check:$[22],apply:"_applyMaxLength",nullable:true},readOnly:{check:$[3],apply:"_applyReadOnly",init:false},validator:{check:"Function",event:"changeValidator",nullable:true}},members:{_inputTag:$[82],_inputType:"text",_inputOverflow:$[17],_applyElement:function(d,b){arguments.callee.base.call(this,d,b);if(d){var c=this._inputElement=document.createElement(this._inputTag);if(this._inputType){c.type=this._inputType}c.autoComplete="off";c.setAttribute("autoComplete","off");c.disabled=this.getEnabled()===false;c.readOnly=this.getReadOnly();c.value=this.getValue()!=null?this.getValue().toString():"";if(this.getMaxLength()!=null){c.maxLength=this.getMaxLength()}var a=c.style;a.padding=a.margin=0;a.border="0 none";a.background=$[155];a.overflow=this._inputOverflow;a.outline="none";a.resize="none";a.WebkitAppearance="none";a.MozAppearance="none";if(qx.core.Variant.isSet($[0],$[533])){a.margin="1px 0 1px -1px"}this._renderFont();this._renderTextColor();this._renderTextAlign();this._renderCursor();this._renderSpellCheck();if(qx.core.Variant.isSet($[0],$[18])){c.onpropertychange=this.__oninput}else{c.addEventListener($[82],this.__oninput,false)}this._getTargetNode().appendChild(c)}},_postApply:function(){this._syncFieldWidth();this._syncFieldHeight()},_changeInnerWidth:function(b,a){this._syncFieldWidth()},_changeInnerHeight:function(b,a){this._syncFieldHeight();this._centerFieldVertically()},_syncFieldWidth:function(){this._inputElement.style.width=this.getInnerWidth()+"px"},_syncFieldHeight:function(){if(this._inputTag!==$[82]){this._inputElement.style.height=(this.getInnerHeight()-2)+"px"}},_applyCursor:function(b,a){if(this._inputElement){this._renderCursor()}},_renderCursor:function(){var a=this._inputElement.style;var b=this.getCursor();if(b){if(b==$[144]&&org.eclipse.rwt.Client.isMshtml()){a.cursor="hand"}else{a.cursor=b}}else{a.cursor=""}},_applyTextAlign:function(b,a){if(this._inputElement){this._renderTextAlign()}},_renderTextAlign:function(){this._inputElement.style.textAlign=this.getTextAlign()||""},_applySpellCheck:function(b,a){if(this._inputElement){this._renderSpellCheck()}},_renderSpellCheck:function(){this._inputElement.spellcheck=this.getSpellCheck()},_applyEnabled:function(b,a){if(this._inputElement){this._inputElement.disabled=b===false}return arguments.callee.base.call(this,b,a)},_applyValue:function(b,a){this._inValueProperty=true;if(this._inputElement){if(b===null){b=""}if(this._inputElement.value!==b){this._inputElement.value=b}}delete this._inValueProperty},_applyMaxLength:function(b,a){if(this._inputElement){this._inputElement.maxLength=b==null?"":b}},_applyReadOnly:function(b,a){if(this._inputElement){this._inputElement.readOnly=b}if(b){this.addState($[335])}else{this.removeState($[335])}},_applyTextColor:function(b,a){qx.theme.manager.Color.getInstance().connect(this._styleTextColor,this,b)},_styleTextColor:function(a){this.__textColor=a;this._renderTextColor()},_renderTextColor:function(){var a=this._inputElement;if(a){a.style.color=this.__textColor||""}},_applyFont:function(b,a){qx.theme.manager.Font.getInstance().connect(this._styleFont,this,b)},_styleFont:function(a){this.__font=a;this._renderFont()},_renderFont:function(){var a=this._inputElement;if(a){var b=this.__font;b?b.renderElement(a):qx.ui.core.Font.resetElement(a)}},_visualizeFocus:function(){arguments.callee.base.call(this);if(this.getEnableElementFocus()){try{this._inputElement.focus()}catch(a){}if(qx.core.Variant.isSet($[0],$[69])){if(this.getSelectionLength()>0){this.setSelectionStart(this.getSelectionLength());this.setSelectionLength(0)}}}},_visualizeBlur:function(){arguments.callee.base.call(this);try{this._inputElement.blur()}catch(a){}},getComputedValue:function(){if(this._inputElement){return this._inputElement.value}return this.getValue()},getInputElement:function(){return this._inputElement||null},isValid:function(){var a=this.getValidator();return !a||a(this.getValue())},isComputedValid:function(){var a=this.getValidator();return !a||a(this.getComputedValue())},_computePreferredInnerWidth:function(){return 120},_computePreferredInnerHeight:function(){return 16},_ieFirstInputFix:qx.core.Variant.select($[0],{mshtml:function(){this._inValueProperty=true;this._inputElement.value=this.getValue()===null?"":this.getValue().toString();this._firstInputFixApplied=true;delete this._inValueProperty},"default":null}),_afterAppear:qx.core.Variant.select($[0],{mshtml:function(){arguments.callee.base.call(this);if(!this._firstInputFixApplied&&this._inputElement){qx.client.Timer.once(this._ieFirstInputFix,this,1)}this._centerFieldVertically()},"default":function(){arguments.callee.base.call(this);this._centerFieldVertically()}}),_centerFieldVertically:function(){if(this._inputTag===$[82]&&this._inputElement){var c=this.getInnerHeight();var a=qx.html.Dimension.getBoxHeight(this._inputElement);if(a!=0){if(qx.core.Variant.isSet($[0],$[18])){a-=2}var b=(c-a)/2-1;if(b<0){b=0}b=Math.floor(b);this.setStyleProperty($[199],b+"px")}}},_firstInputFixApplied:false,_textOnFocus:null,_oninputDom:qx.core.Variant.select($[0],{mshtml:function(a){if(!this._inValueProperty&&a.propertyName==="value"){this.createDispatchDataEvent($[82],this.getComputedValue())}},"default":function(a){this.createDispatchDataEvent($[82],this.getComputedValue())}}),_ontabfocus:function(){this.selectAll()},_onfocus:function(){this._textOnFocus=this.getComputedValue()},_onblur:function(){var a=this.getComputedValue().toString();if(this._textOnFocus!=a){this.setValue(a)}if(this.getParent()!=null){this.setSelectionLength(0)}},_oninput:function(){if(!this.isLiveUpdate()){return}var a=this.getComputedValue().toString();this.setValue(a)},_onkeydown:function(a){if(a.getKeyIdentifier()==$[352]&&this.getReadOnly()){a.preventDefault()}},_onkeypress:function(a){if(a.getKeyIdentifier()!=="Tab"){a.stopPropagation()}},__getRange:qx.core.Variant.select($[0],{mshtml:function(){this._visualPropertyCheck();return this._inputElement.createTextRange()},"default":null}),__getSelectionRange:qx.core.Variant.select($[0],{mshtml:function(){this._visualPropertyCheck();return window.document.selection.createRange()},"default":null}),setSelectionStart:qx.core.Variant.select($[0],{mshtml:function(d){this._visualPropertyCheck();var c=this._inputElement.value;var b=0;while(b<d){b=c.indexOf("\r\n",b);if(b==-1){break}d--;b++}var a=this.__getRange();a.collapse();a.move("character",d);a.select()},gecko:function(b){this._visualPropertyCheck();try{this._inputElement.selectionStart=b}catch(a){}},"default":function(a){this._visualPropertyCheck();this._inputElement.selectionStart=a}}),getSelectionStart:qx.core.Variant.select($[0],{mshtml:function(){this._visualPropertyCheck();var d=this.__getSelectionRange();if(!this._inputElement.contains(d.parentElement())){return -1}var b=this.__getRange();var a=b.duplicate();a.moveToBookmark(d.getBookmark());b.setEndPoint("EndToStart",a);var c=d.text.replace(/[\r\n]/g,".");var e=this._inputElement.value.replace(/[\r\n]/g,".");return e.indexOf(c,b.text.length)},gecko:function(){this._visualPropertyCheck();var b=this._inputElement;try{if(qx.util.Validation.isValidString(b.value)){return b.selectionStart}}catch(a){return 0}},"default":function(){this._visualPropertyCheck();return this._inputElement.selectionStart}}),setSelectionLength:qx.core.Variant.select($[0],{mshtml:function(b){this._visualPropertyCheck();var a=this.__getSelectionRange();if(!this._inputElement.contains(a.parentElement())){return}a.collapse();a.moveEnd("character",b);a.select()},gecko:function(c){this._visualPropertyCheck();var b=this._inputElement;try{if(qx.util.Validation.isValidString(b.value)){b.selectionEnd=b.selectionStart+c}}catch(a){}},"default":function(b){this._visualPropertyCheck();var a=this._inputElement;if(qx.util.Validation.isValidString(a.value)){a.selectionEnd=a.selectionStart+b}}}),getSelectionLength:qx.core.Variant.select($[0],{mshtml:function(){this._visualPropertyCheck();var a=this.__getSelectionRange();if(!this._inputElement.contains(a.parentElement())){return 0}return a.text.length},gecko:function(){this._visualPropertyCheck();var b=this._inputElement;try{return b.selectionEnd-b.selectionStart}catch(a){}},"default":function(){this._visualPropertyCheck();var a=this._inputElement;return a.selectionEnd-a.selectionStart}}),setSelectionText:qx.core.Variant.select($[0],{mshtml:function(c){this._visualPropertyCheck();var b=this.getSelectionStart();var a=this.__getSelectionRange();if(!this._inputElement.contains(a.parentElement())){return}a.text=c;this.setValue(this._inputElement.value);this.setSelectionStart(b);this.setSelectionLength(c.length)},gecko:function(h){this._visualPropertyCheck();var d=this._inputElement;try{if(qx.util.Validation.isValidString(d.value)){var f=d.value;var g=d.selectionStart;var b=f.substr(0,g);var a=f.substr(d.selectionEnd);var e=d.value=b+h+a;d.selectionStart=g;d.selectionEnd=g+h.length;this.setValue(e)}}catch(c){}},"default":function(g){this._visualPropertyCheck();var c=this._inputElement;var e=c.value;var f=c.selectionStart;var b=e.substr(0,f);var a=e.substr(c.selectionEnd);var d=c.value=b+g+a;c.selectionStart=f;c.selectionEnd=f+g.length;this.setValue(d)}}),getSelectionText:qx.core.Variant.select($[0],{mshtml:function(){this._visualPropertyCheck();var a=this.__getSelectionRange();if(!this._inputElement.contains(a.parentElement())){return""}return a.text},"default":function(){this._visualPropertyCheck();return this._inputElement.value.substr(this.getSelectionStart(),this.getSelectionLength())}}),selectAll:function(){this._visualPropertyCheck();if(this.getValue()!=null){this.setSelectionStart(0);this.setSelectionLength(this._inputElement.value.length)}this._inputElement.select();if(this.isEnabled()&&this.isSeeable()){this._inputElement.focus()}},selectFromTo:qx.core.Variant.select($[0],{mshtml:function(b,a){this._visualPropertyCheck();this.setSelectionStart(b);this.setSelectionLength(a-b)},gecko:function(d,c){this._visualPropertyCheck();var b=this._inputElement;try{b.selectionStart=d;b.selectionEnd=c}catch(a){}},"default":function(c,b){this._visualPropertyCheck();var a=this._inputElement;a.selectionStart=c;a.selectionEnd=b}})},destruct:function(){if(this._inputElement){if(qx.core.Variant.isSet($[0],$[18])){this._inputElement.onpropertychange=null}else{this._inputElement.removeEventListener($[82],this.__oninput,false)}}this._disposeFields("_inputElement","__font","__oninput")}});
+qx.Class.define("qx.ui.layout.VerticalBoxLayout",{extend:qx.ui.layout.BoxLayout,properties:{orientation:{refine:true,init:$[47]}}});
+qx.Class.define($[402],{extend:qx.ui.basic.Atom,construct:function(e,d,c,a,b){arguments.callee.base.call(this,e,d,c,a,b);this.initTabIndex();this.addEventListener($[9],this._onmouseover);this.addEventListener($[14],this._onmouseout);this.addEventListener($[2],this._onmousedown);this.addEventListener($[15],this._onmouseup);this.addEventListener($[23],this._onkeydown);this.addEventListener($[60],this._onkeyup)},properties:{appearance:{refine:true,init:"button"},tabIndex:{refine:true,init:1}},members:{_onmouseover:function(a){if(a.getTarget()!=this){return}if(this.hasState($[46])){this.removeState($[46]);this.addState($[21])}this.addState("over")},_onmouseout:function(a){if(a.getTarget()!=this){return}this.removeState("over");if(this.hasState($[21])){this.setCapture(true);this.removeState($[21]);this.addState($[46])}},_onmousedown:function(a){if(a.getTarget()!=this||!a.isLeftButtonPressed()){return}this.removeState($[46]);this.addState($[21])},_onmouseup:function(b){this.setCapture(false);var a=this.hasState($[21]);var c=this.hasState($[46]);if(a){this.removeState($[21])}if(c){this.removeState($[46])}if(!c){this.addState("over");if(a){this.execute()}}},_onkeydown:function(a){switch(a.getKeyIdentifier()){case $[71]:case $[91]:this.removeState($[46]);this.addState($[21]);a.stopPropagation()}},_onkeyup:function(a){switch(a.getKeyIdentifier()){case $[71]:case $[91]:if(this.hasState($[21])){this.removeState($[46]);this.removeState($[21]);this.execute();a.stopPropagation()}}}}});
+qx.Class.define($[515],{extend:qx.core.Target,events:{change:$[11]},properties:{value:{check:"!isNaN(value)&&value>=this.getMin()&&value<=this.getMax()",nullable:true,event:$[79],init:0},precision:{check:$[22],nullable:true,event:$[79],init:0},min:{check:$[73],apply:"_applyMin",event:$[79],init:0},max:{check:$[73],apply:"_applyMax",event:$[79],init:100},wrap:{check:$[3],init:false}},members:{_applyMax:function(b,a){this.setValue(Math.min(this.getValue(),b))},_applyMin:function(b,a){this.setValue(Math.max(this.getValue(),b))},limit:function(c){var a=this.getPrecision();if(a!=null){var b=Math.pow(10,a)}if(this.getWrap()){if(a!=null){var c=Math.round(c*b)/b}if(c<this.getMin()){return(this.getMax()-(this.getMin()-c))+1}if(c>this.getMax()){return(this.getMin()+(c-this.getMax()))-1}}if(c<this.getMin()){return this.getMin()}if(c>this.getMax()){return this.getMax()}if(a!=null){return Math.round(c*b)/b}else{return c}}}});
+qx.Class.define("qx.ui.pageview.AbstractPageView",{type:$[97],extend:qx.ui.layout.BoxLayout,construct:function(a,b){arguments.callee.base.call(this);this._bar=new a;this._pane=new b;this.add(this._bar,this._pane)},members:{getPane:function(){return this._pane},getBar:function(){return this._bar}},destruct:function(){this._disposeObjects("_bar","_pane")}});
+qx.Class.define($[531],{extend:qx.ui.pageview.AbstractPageView,construct:function(){arguments.callee.base.call(this,qx.ui.pageview.tabview.Bar,qx.ui.pageview.tabview.Pane)},properties:{appearance:{refine:true,init:"tab-view"},orientation:{refine:true,init:$[47]},alignTabsToLeft:{check:$[3],init:true,apply:"_applyAlignTabsToLeft"},placeBarOnTop:{check:$[3],init:true,apply:"_applyPlaceBarOnTop"}},members:{_applyAlignTabsToLeft:function(c,b){var a=this._bar;a.setHorizontalChildrenAlign(c?"left":$[24]);a._addChildrenToStateQueue()},_applyPlaceBarOnTop:function(c,b){var a=this._bar;if(c){a.moveSelfToBegin()}else{a.moveSelfToEnd()}a._addChildrenToStateQueue()}}});
+qx.Class.define("qx.ui.pageview.AbstractBar",{type:$[97],extend:qx.ui.layout.BoxLayout,construct:function(){arguments.callee.base.call(this);this._manager=new qx.ui.selection.RadioManager()},members:{getManager:function(){return this._manager}},destruct:function(){this._disposeObjects($[321])}});
+qx.Class.define($[488],{extend:qx.core.Target,construct:function(a,b){arguments.callee.base.call(this);this._items=[];this.setName(a!=null?a:qx.ui.selection.RadioManager.AUTO_NAME_PREFIX+this.toHashCode());if(b!=null){this.add.apply(this,b)}},statics:{AUTO_NAME_PREFIX:"qx-radio-"},properties:{selected:{nullable:true,apply:"_applySelected",event:"changeSelected",check:$[483]},name:{check:$[25],nullable:true,apply:"_applyName"}},members:{getItems:function(){return this._items},getEnabledItems:function(){var c=[];for(var f=0,e=this._items,d=e.length;f<d;f++){if(e[f].getEnabled()){c.push(e[f])}}return c},handleItemChecked:function(b,a){if(a){this.setSelected(b)}else{if(this.getSelected()==b){this.setSelected(null)}}},add:function(b){var a=arguments;var e=a.length;var d;for(var c=0;c<e;c++){d=a[c];if(qx.lang.Array.contains(this._items,d)){return}this._items.push(d);d.setManager(this);if(d.getChecked()){this.setSelected(d)}d.setName(this.getName())}},remove:function(a){qx.lang.Array.remove(this._items,a);a.setManager(null);if(a.getChecked()){this.setSelected(null)}},_applySelected:function(b,a){if(a){a.setChecked(false)}if(b){b.setChecked(true)}},_applyName:function(e,a){for(var c=0,b=this._items,d=b.length;c<d;c++){b[c].setName(e)}},selectNext:function(d){var a=this._items.indexOf(d);if(a==-1){return}var b=0;var c=this._items.length;a=(a+1)%c;while(b<c&&!this._items[a].getEnabled()){a=(a+1)%c;b++}this._selectByIndex(a)},selectPrevious:function(d){var a=this._items.indexOf(d);if(a==-1){return}var b=0;var c=this._items.length;a=(a-1+c)%c;while(b<c&&!this._items[a].getEnabled()){a=(a-1+c)%c;b++}this._selectByIndex(a)},_selectByIndex:function(a){if(this._items[a].getEnabled()){this.setSelected(this._items[a]);this._items[a].setFocused(true)}}},destruct:function(){this._disposeObjectDeep("_items",1)}});
 qx.Class.define("qx.ui.pageview.tabview.Bar",{extend:qx.ui.pageview.AbstractBar,construct:function(){arguments.callee.base.call(this);this.initZIndex();this.initHeight()},properties:{appearance:{refine:true,init:"tab-view-bar"},zIndex:{refine:true,init:2},height:{refine:true,init:"auto"}}});
-qx.Class.define("qx.ui.pageview.AbstractPane",{type:$[102],extend:qx.ui.layout.CanvasLayout});
+qx.Class.define("qx.ui.pageview.AbstractPane",{type:$[97],extend:qx.ui.layout.CanvasLayout});
 qx.Class.define("qx.ui.pageview.tabview.Pane",{extend:qx.ui.pageview.AbstractPane,construct:function(){arguments.callee.base.call(this);this.initZIndex();this.initHeight()},properties:{appearance:{refine:true,init:"tab-view-pane"},zIndex:{refine:true,init:1},height:{refine:true,init:"1*"}}});
 qx.Class.define("qx.ui.popup.Popup",{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this.setZIndex(this._minZIndex);if(this._isFocusRoot){this.activateFocusRoot()}this.initHeight();this.initWidth()},properties:{appearance:{refine:true,init:"popup"},width:{refine:true,init:"auto"},height:{refine:true,init:"auto"},display:{refine:true,init:false},autoHide:{check:$[3],init:true},centered:{check:$[3],init:false},restrictToPageOnOpen:{check:$[3],init:true},restrictToPageLeft:{check:$[22],init:0},restrictToPageRight:{check:$[22],init:0},restrictToPageTop:{check:$[22],init:0},restrictToPageBottom:{check:$[22],init:0}},members:{_isFocusRoot:true,_showTimeStamp:(new Date(0)).valueOf(),_hideTimeStamp:(new Date(0)).valueOf(),_beforeAppear:function(){arguments.callee.base.call(this);if(this.getRestrictToPageOnOpen()){this._wantedLeft=this.getLeft();if(this._wantedLeft!=null){this.setLeft(10000);if(this.getElement()!=null){this.getElement().style.left=10000}}}qx.ui.popup.PopupManager.getInstance().add(this);qx.ui.popup.PopupManager.getInstance().update(this);this._showTimeStamp=(new Date).valueOf();this.bringToFront()},_beforeDisappear:function(){arguments.callee.base.call(this);qx.ui.popup.PopupManager.getInstance().remove(this);this._hideTimeStamp=(new Date).valueOf()},_afterAppear:function(){arguments.callee.base.call(this);if(this.getRestrictToPageOnOpen()){var l=qx.ui.core.ClientDocument.getInstance();var h=l.getClientWidth();var p=l.getClientHeight();var b=qx.bom.Viewport.getScrollTop();var f=qx.bom.Viewport.getScrollLeft();var n=this.getRestrictToPageLeft()+f;var i=this.getRestrictToPageRight()-f;var j=this.getRestrictToPageTop()+b;var c=this.getRestrictToPageBottom()-b;var d=(this._wantedLeft==null)?this.getLeft():this._wantedLeft;var k=this.getTop();var a=this.getBoxWidth();var m=this.getBoxHeight();var e=this.getLeft();var g=k;if(d+a>h-i){d=h-i-a}if(k+m>p-c){k=p-c-m}if(d<n){d=n}if(k<j){k=j}if(d!=e||k!=g){var o=this;window.setTimeout(function(){o.setLeft(d);o.setTop(k)},0)}}},_makeActive:function(){this.getFocusRoot().setActiveChild(this)},_makeInactive:function(){var a=this.getFocusRoot();var b=a.getActiveChild();if(b==this){a.setActiveChild(a)}},_minZIndex:1000000,bringToFront:function(){this.setZIndex(this._minZIndex+1000000);this._sendTo()},sendToBack:function(){this.setZIndex(this._minZIndex+1);this._sendTo()},_sendTo:function(){var d=qx.lang.Object.getValues(qx.ui.popup.PopupManager.getInstance().getAll());var g=function(j,i){return j.getZIndex()-i.getZIndex()};if(org.eclipse.rwt.EventHandler.getMenuManager()!=null){var c=org.eclipse.rwt.EventHandler.getMenuManager();var f=qx.lang.Object.getValues(c.getAll());var h=d.concat(f).sort(g)}else{var h=d.sort(g)}var e=h.length;var a=this._minZIndex;for(var b=0;b<e;b++){h[b].setZIndex(a++)}},getShowTimeStamp:function(){return this._showTimeStamp},getHideTimeStamp:function(){return this._hideTimeStamp},positionRelativeTo:function(c,a,d){if(c instanceof qx.ui.core.Widget){c=c.getElement()}if(c){var b=qx.bom.element.Location.get(c);this.setLocation(b.left+(a||0),b.top+(d||0))}else{throw new Error("Missing reference element")}},centerToBrowser:function(){var c=qx.ui.core.ClientDocument.getInstance();var b=(c.getClientWidth()-this.getBoxWidth())/2;var a=(c.getClientHeight()-this.getBoxHeight())/2;this.setLeft(b<0?0:b);this.setTop(a<0?0:a)}},destruct:function(){qx.ui.popup.PopupManager.getInstance().remove(this);this._disposeFields("_showTimeStamp","_hideTimeStamp")}});
-qx.Class.define($[329],{type:$[33],extend:qx.util.manager.Object,construct:function(){arguments.callee.base.call(this)},members:{update:function(c){if(!(c instanceof qx.ui.core.Widget)){c=null}var a,b;var d=this.getAll();for(b in d){a=d[b];if(!a.getAutoHide()||c==a||a.contains(c)){continue}if(qx.Class.isDefined($[268])&&c instanceof qx.ui.popup.ToolTip&&!(a instanceof qx.ui.popup.ToolTip)){continue}a.hide()}}}});
-qx.Class.define("qx.ui.selection.SelectionManager",{extend:qx.core.Target,construct:function(a){arguments.callee.base.call(this);this._selectedItems=new qx.ui.selection.Selection(this);if(a!=null){this.setBoundedWidget(a)}},events:{changeSelection:$[70]},properties:{boundedWidget:{check:$[136],nullable:true},multiSelection:{check:$[3],init:true},dragSelection:{check:$[3],init:true},canDeselect:{check:$[3],init:true},fireChange:{check:$[3],init:true},anchorItem:{check:$[110],nullable:true,apply:"_applyAnchorItem",event:"changeAnchorItem"},leadItem:{check:$[110],nullable:true,apply:"_applyLeadItem",event:$[354]},multiColumnSupport:{check:$[3],init:false}},members:{_applyAnchorItem:function(b,a){if(a){this.renderItemAnchorState(a,false)}if(b){this.renderItemAnchorState(b,true)}},_applyLeadItem:function(b,a){if(a){this.renderItemLeadState(a,false)}if(b){this.renderItemLeadState(b,true)}},_getFirst:function(){return this.getBoundedWidget().getFirstVisibleChild()},_getLast:function(){return this.getBoundedWidget().getLastVisibleChild()},getFirst:function(){var a=this._getFirst();if(a){return a.getEnabled()?a:this.getNext(a)}},getLast:function(){var a=this._getLast();if(a){return a.getEnabled()?a:this.getPrevious(a)}},getItems:function(){return this.getBoundedWidget().getChildren()},getNextSibling:function(a){return a.getNextSibling()},getPreviousSibling:function(a){return a.getPreviousSibling()},getNext:function(a){while(a){a=this.getNextSibling(a);if(!a){break}if(this.getItemEnabled(a)){return a}}return null},getPrevious:function(a){while(a){a=this.getPreviousSibling(a);if(!a){break}if(this.getItemEnabled(a)){return a}}return null},isBefore:function(b,a){var c=this.getItems();return c.indexOf(b)<c.indexOf(a)},isEqual:function(b,a){return b==a},getItemHashCode:function(a){return a.toHashCode()},scrollItemIntoView:function(b,a){b.scrollIntoView(a)},getItemLeft:function(a){return a.getOffsetLeft()},getItemTop:function(a){return a.getOffsetTop()},getItemWidth:function(a){return a.getOffsetWidth()},getItemHeight:function(a){return a.getOffsetHeight()},getItemEnabled:function(a){return a.getEnabled()},renderItemSelectionState:function(b,a){a?b.addState($[30]):b.removeState($[30]);if(b.handleStateChange){b.handleStateChange()}},renderItemAnchorState:function(a,b){b?a.addState("anchor"):a.removeState("anchor");if(a.handleStateChange!=null){a.handleStateChange()}},renderItemLeadState:function(b,a){a?b.addState("lead"):b.removeState("lead");if(b.handleStateChange!=null){b.handleStateChange()}},getItemSelected:function(a){return this._selectedItems.contains(a)},setItemSelected:function(d,c){switch(this.getMultiSelection()){case true:if(!this.getItemEnabled(d)){return}if(this.getItemSelected(d)==c){return}this.renderItemSelectionState(d,c);c?this._selectedItems.add(d):this._selectedItems.remove(d);this._dispatchChange();break;case false:var b=this.getSelectedItems()[0];if(c){var a=b;if(this.isEqual(d,a)){return}if(a!=null){this.renderItemSelectionState(a,false)}this.renderItemSelectionState(d,true);this._selectedItems.removeAll();this._selectedItems.add(d);this._dispatchChange()}else{if(!this.isEqual(b,d)){this.renderItemSelectionState(d,false);this._dispatchChange()}}break}},getSelectedItems:function(){return this._selectedItems.toArray()},getSelectedItem:function(){return this._selectedItems.getFirst()},setSelectedItems:function(c){var b=this._getChangeValue();var a=this.getFireChange();this.setFireChange(false);this._deselectAll();var e;var f=c.length;for(var d=0;d<f;d++){e=c[d];if(!this.getItemEnabled(e)){continue}this._selectedItems.add(e);this.renderItemSelectionState(e,true)}this.setFireChange(a);if(a&&this._hasChanged(b)){this._dispatchChange()}},setSelectedItem:function(c){if(!c){return}if(!this.getItemEnabled(c)){return}var b=this._getChangeValue();var a=this.getFireChange();this.setFireChange(false);this._deselectAll();this._selectedItems.add(c);this.renderItemSelectionState(c,true);this.setFireChange(a);if(a&&this._hasChanged(b)){this._dispatchChange()}},selectAll:function(){var b=this._getChangeValue();var a=this.getFireChange();this.setFireChange(false);this._selectAll();this.setFireChange(a);if(a&&this._hasChanged(b)){this._dispatchChange()}},_selectAll:function(){if(!this.getMultiSelection()){return}var c;var a=this.getItems();var d=a.length;this._selectedItems.removeAll();for(var b=0;b<d;b++){c=a[b];if(!this.getItemEnabled(c)){continue}this._selectedItems.add(c);this.renderItemSelectionState(c,true)}return true},deselectAll:function(){var b=this._getChangeValue();var a=this.getFireChange();this.setFireChange(false);this._deselectAll();this.setFireChange(a);if(a&&this._hasChanged(b)){this._dispatchChange()}},_deselectAll:function(){var a=this._selectedItems.toArray();for(var b=0;b<a.length;b++){this.renderItemSelectionState(a[b],false)}this._selectedItems.removeAll();return true},selectItemRange:function(d,b){var c=this._getChangeValue();var a=this.getFireChange();this.setFireChange(false);this._selectItemRange(d,b,true);this.setFireChange(a);if(a&&this._hasChanged(c)){this._dispatchChange()}},_selectItemRange:function(b,a,c){if(this.isBefore(a,b)){return this._selectItemRange(a,b,c)}if(c){this._deselectAll()}var d=b;while(d!=null){if(this.getItemEnabled(d)){this._selectedItems.add(d);this.renderItemSelectionState(d,true)}if(this.isEqual(d,a)){break}d=this.getNext(d)}return true},_deselectItemRange:function(b,a){if(this.isBefore(a,b)){return this._deselectItemRange(a,b)}var c=b;while(c!=null){this._selectedItems.remove(c);this.renderItemSelectionState(c,false);if(this.isEqual(c,a)){break}c=this.getNext(c)}},_activeDragSession:false,handleMouseDown:function(a,b){b.stopPropagation();if(!b.isLeftButtonPressed()&&!b.isRightButtonPressed()){return}if(b.isRightButtonPressed()&&this.getItemSelected(a)){return}if(b.isShiftPressed()||this.getDragSelection()||(!this.getItemSelected(a)&&!b.isCtrlPressed())){this._onmouseevent(a,b)}else{this.setLeadItem(a)}this._activeDragSession=this.getDragSelection();if(this._activeDragSession){this.getBoundedWidget().addEventListener($[15],this._ondragup,this);this.getBoundedWidget().setCapture(true)}},_ondragup:function(a){this.getBoundedWidget().removeEventListener($[15],this._ondragup,this);this.getBoundedWidget().setCapture(false);this._activeDragSession=false},handleMouseUp:function(a,b){if(!b.isLeftButtonPressed()){return}if(b.isCtrlPressed()||this.getItemSelected(a)&&!this._activeDragSession){this._onmouseevent(a,b)}if(this._activeDragSession){this._activeDragSession=false;this.getBoundedWidget().setCapture(false)}},handleMouseOver:function(b,a){if(!this.getDragSelection()||!this._activeDragSession){return}this._onmouseevent(b,a,true)},handleClick:function(a,b){},handleDblClick:function(a,b){},_onmouseevent:function(h,g,d){if(!this.getItemEnabled(h)){return}var k=this._getChangeValue();var j=this.getLeadItem();var a=this.getFireChange();this.setFireChange(false);var c=this.getSelectedItems();var b=c.length;this.setLeadItem(h);var l=this.getAnchorItem();var i=g.isCtrlPressed();var f=g.isShiftPressed();if(!l||b==0||(i&&!f&&this.getMultiSelection()&&!this.getDragSelection())){this.setAnchorItem(h);l=h}if((!i&&!f&&!this._activeDragSession||!this.getMultiSelection())){if(!this.getItemEnabled(h)){return}this._deselectAll();this.setAnchorItem(h);if(this._activeDragSession){this.scrollItemIntoView((this.getBoundedWidget().getScrollTop()>(this.getItemTop(h)-1)?this.getPrevious(h):this.getNext(h))||h)}if(!this.getItemSelected(h)){this.renderItemSelectionState(h,true)}this._selectedItems.add(h);this._addToCurrentSelection=true}else{if(this._activeDragSession&&d){if(j){this._deselectItemRange(l,j)}if(this.isBefore(l,h)){if(this._addToCurrentSelection){this._selectItemRange(l,h,false)}else{this._deselectItemRange(l,h)}}else{if(this._addToCurrentSelection){this._selectItemRange(h,l,false)}else{this._deselectItemRange(h,l)}}this.scrollItemIntoView((this.getBoundedWidget().getScrollTop()>(this.getItemTop(h)-1)?this.getPrevious(h):this.getNext(h))||h)}else{if(this.getMultiSelection()&&i&&!f){if(!this._activeDragSession){this._addToCurrentSelection=!(this.getCanDeselect()&&this.getItemSelected(h))}this.setItemSelected(h,this._addToCurrentSelection);this.setAnchorItem(h)}else{if(this.getMultiSelection()&&i&&f){if(!this._activeDragSession){this._addToCurrentSelection=!(this.getCanDeselect()&&this.getItemSelected(h))}if(this._addToCurrentSelection){this._selectItemRange(l,h,false)}else{this._deselectItemRange(l,h)}}else{if(this.getMultiSelection()&&!i&&f){if(this.getCanDeselect()){this._selectItemRange(l,h,true)}else{if(j){this._deselectItemRange(l,j)}this._selectItemRange(l,h,false)}}}}}}this.setFireChange(a);if(a&&this._hasChanged(k)){this._dispatchChange()}},handleKeyPress:function(d){var c=this._getChangeValue();var a=this.getFireChange();this.setFireChange(false);if(d.getKeyIdentifier()=="A"&&d.isCtrlPressed()){if(this.getMultiSelection()){this._selectAll();this.setLeadItem(this.getFirst())}}else{var b=this.getAnchorItem();var e=this.getItemToSelect(d);if(e&&this.getItemEnabled(e)){this.setLeadItem(e);this.scrollItemIntoView(e);d.preventDefault();if(d.isShiftPressed()&&this.getMultiSelection()){if(b==null){this.setAnchorItem(e)}this._selectItemRange(this.getAnchorItem(),e,true)}else{if(!d.isCtrlPressed()){this._deselectAll();this.renderItemSelectionState(e,true);this._selectedItems.add(e);this.setAnchorItem(e)}else{if(d.getKeyIdentifier()==$[92]){if(this._selectedItems.contains(e)){this.renderItemSelectionState(e,false);this._selectedItems.remove(e);this.setAnchorItem(this._selectedItems.getFirst())}else{if(!d.isCtrlPressed()||!this.getMultiSelection()){this._deselectAll()}this.renderItemSelectionState(e,true);this._selectedItems.add(e);this.setAnchorItem(e)}}}}}}this.setFireChange(a);if(a&&this._hasChanged(c)){this._dispatchChange()}},getItemToSelect:function(a){if(a.isAltPressed()){return null}switch(a.getKeyIdentifier()){case"Home":return this.getHome(this.getLeadItem());case"End":return this.getEnd(this.getLeadItem());case"Down":return this.getDown(this.getLeadItem());case"Up":return this.getUp(this.getLeadItem());case"Left":return this.getLeft(this.getLeadItem());case $[53]:return this.getRight(this.getLeadItem());case $[58]:return this.getPageUp(this.getLeadItem())||this.getHome(this.getLeadItem());case $[55]:return this.getPageDown(this.getLeadItem())||this.getEnd(this.getLeadItem());case $[92]:if(a.isCtrlPressed()){return this.getLeadItem()}}return null},_dispatchChange:function(){if(!this.getFireChange()){return}if(this.hasEventListeners($[284])){this.dispatchEvent(new qx.event.type.DataEvent($[284],this.getSelectedItems()),true)}},_hasChanged:function(a){return a!=this._getChangeValue()},_getChangeValue:function(){return this._selectedItems.getChangeValue()},getHome:function(){return this.getFirst()},getEnd:function(){return this.getLast()},getDown:function(a){if(!a){return this.getFirst()}return this.getMultiColumnSupport()?(this.getUnder(a)||this.getLast()):this.getNext(a)},getUp:function(a){if(!a){return this.getLast()}return this.getMultiColumnSupport()?(this.getAbove(a)||this.getFirst()):this.getPrevious(a)},getLeft:function(a){if(!this.getMultiColumnSupport()){return null}return !a?this.getLast():this.getPrevious(a)},getRight:function(a){if(!this.getMultiColumnSupport()){return null}return !a?this.getFirst():this.getNext(a)},getAbove:function(a){throw new Error("getAbove(): Not implemented yet")},getUnder:function(a){throw new Error("getUnder(): Not implemented yet")},getPageUp:function(e){var c=this.getLeadItem();if(!c){c=this.getFirst()}var b=this.getBoundedWidget();if(b.isCreated()){var a=b.getScrollTop();var f=b.getClientHeight();var d=0;while(d<2){while(c&&(this.getItemTop(c)-this.getItemHeight(c)>=a)){c=this.getUp(c)}if(c==null){break}if(c!=this.getLeadItem()){this.scrollItemIntoView(c,true);break}b.setScrollTop(a-f-this.getItemHeight(c));a=b.getScrollTop();d++}}return c},getPageDown:function(e){var c=this.getLeadItem();if(!c){c=this.getFirst()}var b=this.getBoundedWidget();if(b.isCreated()){var a=b.getScrollTop();var f=b.getClientHeight();var d=0;while(d<2){while(c&&((this.getItemTop(c)+(2*this.getItemHeight(c)))<=(a+f))){c=this.getDown(c)}if(c==null){break}if(c!=this.getLeadItem()){break}b.setScrollTop(a+f-2*this.getItemHeight(c));a=b.getScrollTop();d++}}return c}},destruct:function(){this._disposeObjects("_selectedItems")}});
+qx.Class.define($[330],{type:$[33],extend:qx.util.manager.Object,construct:function(){arguments.callee.base.call(this)},members:{update:function(c){if(!(c instanceof qx.ui.core.Widget)){c=null}var a,b;var d=this.getAll();for(b in d){a=d[b];if(!a.getAutoHide()||c==a||a.contains(c)){continue}if(qx.Class.isDefined($[260])&&c instanceof qx.ui.popup.ToolTip&&!(a instanceof qx.ui.popup.ToolTip)){continue}a.hide()}}}});
+qx.Class.define("qx.ui.selection.SelectionManager",{extend:qx.core.Target,construct:function(a){arguments.callee.base.call(this);this._selectedItems=new qx.ui.selection.Selection(this);if(a!=null){this.setBoundedWidget(a)}},events:{changeSelection:$[68]},properties:{boundedWidget:{check:$[152],nullable:true},multiSelection:{check:$[3],init:true},dragSelection:{check:$[3],init:true},canDeselect:{check:$[3],init:true},fireChange:{check:$[3],init:true},anchorItem:{check:$[111],nullable:true,apply:"_applyAnchorItem",event:"changeAnchorItem"},leadItem:{check:$[111],nullable:true,apply:"_applyLeadItem",event:$[328]},multiColumnSupport:{check:$[3],init:false}},members:{_applyAnchorItem:function(b,a){if(a){this.renderItemAnchorState(a,false)}if(b){this.renderItemAnchorState(b,true)}},_applyLeadItem:function(b,a){if(a){this.renderItemLeadState(a,false)}if(b){this.renderItemLeadState(b,true)}},_getFirst:function(){return this.getBoundedWidget().getFirstVisibleChild()},_getLast:function(){return this.getBoundedWidget().getLastVisibleChild()},getFirst:function(){var a=this._getFirst();if(a){return a.getEnabled()?a:this.getNext(a)}},getLast:function(){var a=this._getLast();if(a){return a.getEnabled()?a:this.getPrevious(a)}},getItems:function(){return this.getBoundedWidget().getChildren()},getNextSibling:function(a){return a.getNextSibling()},getPreviousSibling:function(a){return a.getPreviousSibling()},getNext:function(a){while(a){a=this.getNextSibling(a);if(!a){break}if(this.getItemEnabled(a)){return a}}return null},getPrevious:function(a){while(a){a=this.getPreviousSibling(a);if(!a){break}if(this.getItemEnabled(a)){return a}}return null},isBefore:function(b,a){var c=this.getItems();return c.indexOf(b)<c.indexOf(a)},isEqual:function(b,a){return b==a},getItemHashCode:function(a){return a.toHashCode()},scrollItemIntoView:function(b,a){b.scrollIntoView(a)},getItemLeft:function(a){return a.getOffsetLeft()},getItemTop:function(a){return a.getOffsetTop()},getItemWidth:function(a){return a.getOffsetWidth()},getItemHeight:function(a){return a.getOffsetHeight()},getItemEnabled:function(a){return a.getEnabled()},renderItemSelectionState:function(b,a){a?b.addState($[30]):b.removeState($[30]);if(b.handleStateChange){b.handleStateChange()}},renderItemAnchorState:function(a,b){b?a.addState("anchor"):a.removeState("anchor");if(a.handleStateChange!=null){a.handleStateChange()}},renderItemLeadState:function(b,a){a?b.addState("lead"):b.removeState("lead");if(b.handleStateChange!=null){b.handleStateChange()}},getItemSelected:function(a){return this._selectedItems.contains(a)},setItemSelected:function(d,c){switch(this.getMultiSelection()){case true:if(!this.getItemEnabled(d)){return}if(this.getItemSelected(d)==c){return}this.renderItemSelectionState(d,c);c?this._selectedItems.add(d):this._selectedItems.remove(d);this._dispatchChange();break;case false:var b=this.getSelectedItems()[0];if(c){var a=b;if(this.isEqual(d,a)){return}if(a!=null){this.renderItemSelectionState(a,false)}this.renderItemSelectionState(d,true);this._selectedItems.removeAll();this._selectedItems.add(d);this._dispatchChange()}else{if(!this.isEqual(b,d)){this.renderItemSelectionState(d,false);this._dispatchChange()}}break}},getSelectedItems:function(){return this._selectedItems.toArray()},getSelectedItem:function(){return this._selectedItems.getFirst()},setSelectedItems:function(c){var b=this._getChangeValue();var a=this.getFireChange();this.setFireChange(false);this._deselectAll();var e;var f=c.length;for(var d=0;d<f;d++){e=c[d];if(!this.getItemEnabled(e)){continue}this._selectedItems.add(e);this.renderItemSelectionState(e,true)}this.setFireChange(a);if(a&&this._hasChanged(b)){this._dispatchChange()}},setSelectedItem:function(c){if(!c){return}if(!this.getItemEnabled(c)){return}var b=this._getChangeValue();var a=this.getFireChange();this.setFireChange(false);this._deselectAll();this._selectedItems.add(c);this.renderItemSelectionState(c,true);this.setFireChange(a);if(a&&this._hasChanged(b)){this._dispatchChange()}},selectAll:function(){var b=this._getChangeValue();var a=this.getFireChange();this.setFireChange(false);this._selectAll();this.setFireChange(a);if(a&&this._hasChanged(b)){this._dispatchChange()}},_selectAll:function(){if(!this.getMultiSelection()){return}var c;var a=this.getItems();var d=a.length;this._selectedItems.removeAll();for(var b=0;b<d;b++){c=a[b];if(!this.getItemEnabled(c)){continue}this._selectedItems.add(c);this.renderItemSelectionState(c,true)}return true},deselectAll:function(){var b=this._getChangeValue();var a=this.getFireChange();this.setFireChange(false);this._deselectAll();this.setFireChange(a);if(a&&this._hasChanged(b)){this._dispatchChange()}},_deselectAll:function(){var a=this._selectedItems.toArray();for(var b=0;b<a.length;b++){this.renderItemSelectionState(a[b],false)}this._selectedItems.removeAll();return true},selectItemRange:function(d,b){var c=this._getChangeValue();var a=this.getFireChange();this.setFireChange(false);this._selectItemRange(d,b,true);this.setFireChange(a);if(a&&this._hasChanged(c)){this._dispatchChange()}},_selectItemRange:function(b,a,c){if(this.isBefore(a,b)){return this._selectItemRange(a,b,c)}if(c){this._deselectAll()}var d=b;while(d!=null){if(this.getItemEnabled(d)){this._selectedItems.add(d);this.renderItemSelectionState(d,true)}if(this.isEqual(d,a)){break}d=this.getNext(d)}return true},_deselectItemRange:function(b,a){if(this.isBefore(a,b)){return this._deselectItemRange(a,b)}var c=b;while(c!=null){this._selectedItems.remove(c);this.renderItemSelectionState(c,false);if(this.isEqual(c,a)){break}c=this.getNext(c)}},_activeDragSession:false,handleMouseDown:function(a,b){b.stopPropagation();if(!b.isLeftButtonPressed()&&!b.isRightButtonPressed()){return}if(b.isRightButtonPressed()&&this.getItemSelected(a)){return}if(b.isShiftPressed()||this.getDragSelection()||(!this.getItemSelected(a)&&!b.isCtrlPressed())){this._onmouseevent(a,b)}else{this.setLeadItem(a)}this._activeDragSession=this.getDragSelection();if(this._activeDragSession){this.getBoundedWidget().addEventListener($[15],this._ondragup,this);this.getBoundedWidget().setCapture(true)}},_ondragup:function(a){this.getBoundedWidget().removeEventListener($[15],this._ondragup,this);this.getBoundedWidget().setCapture(false);this._activeDragSession=false},handleMouseUp:function(a,b){if(!b.isLeftButtonPressed()){return}if(b.isCtrlPressed()||this.getItemSelected(a)&&!this._activeDragSession){this._onmouseevent(a,b)}if(this._activeDragSession){this._activeDragSession=false;this.getBoundedWidget().setCapture(false)}},handleMouseOver:function(b,a){if(!this.getDragSelection()||!this._activeDragSession){return}this._onmouseevent(b,a,true)},handleClick:function(a,b){},handleDblClick:function(a,b){},_onmouseevent:function(h,g,d){if(!this.getItemEnabled(h)){return}var k=this._getChangeValue();var j=this.getLeadItem();var a=this.getFireChange();this.setFireChange(false);var c=this.getSelectedItems();var b=c.length;this.setLeadItem(h);var l=this.getAnchorItem();var i=g.isCtrlPressed();var f=g.isShiftPressed();if(!l||b==0||(i&&!f&&this.getMultiSelection()&&!this.getDragSelection())){this.setAnchorItem(h);l=h}if((!i&&!f&&!this._activeDragSession||!this.getMultiSelection())){if(!this.getItemEnabled(h)){return}this._deselectAll();this.setAnchorItem(h);if(this._activeDragSession){this.scrollItemIntoView((this.getBoundedWidget().getScrollTop()>(this.getItemTop(h)-1)?this.getPrevious(h):this.getNext(h))||h)}if(!this.getItemSelected(h)){this.renderItemSelectionState(h,true)}this._selectedItems.add(h);this._addToCurrentSelection=true}else{if(this._activeDragSession&&d){if(j){this._deselectItemRange(l,j)}if(this.isBefore(l,h)){if(this._addToCurrentSelection){this._selectItemRange(l,h,false)}else{this._deselectItemRange(l,h)}}else{if(this._addToCurrentSelection){this._selectItemRange(h,l,false)}else{this._deselectItemRange(h,l)}}this.scrollItemIntoView((this.getBoundedWidget().getScrollTop()>(this.getItemTop(h)-1)?this.getPrevious(h):this.getNext(h))||h)}else{if(this.getMultiSelection()&&i&&!f){if(!this._activeDragSession){this._addToCurrentSelection=!(this.getCanDeselect()&&this.getItemSelected(h))}this.setItemSelected(h,this._addToCurrentSelection);this.setAnchorItem(h)}else{if(this.getMultiSelection()&&i&&f){if(!this._activeDragSession){this._addToCurrentSelection=!(this.getCanDeselect()&&this.getItemSelected(h))}if(this._addToCurrentSelection){this._selectItemRange(l,h,false)}else{this._deselectItemRange(l,h)}}else{if(this.getMultiSelection()&&!i&&f){if(this.getCanDeselect()){this._selectItemRange(l,h,true)}else{if(j){this._deselectItemRange(l,j)}this._selectItemRange(l,h,false)}}}}}}this.setFireChange(a);if(a&&this._hasChanged(k)){this._dispatchChange()}},handleKeyPress:function(d){var c=this._getChangeValue();var a=this.getFireChange();this.setFireChange(false);if(d.getKeyIdentifier()=="A"&&d.isCtrlPressed()){if(this.getMultiSelection()){this._selectAll();this.setLeadItem(this.getFirst())}}else{var b=this.getAnchorItem();var e=this.getItemToSelect(d);if(e&&this.getItemEnabled(e)){this.setLeadItem(e);this.scrollItemIntoView(e);d.preventDefault();if(d.isShiftPressed()&&this.getMultiSelection()){if(b==null){this.setAnchorItem(e)}this._selectItemRange(this.getAnchorItem(),e,true)}else{if(!d.isCtrlPressed()){this._deselectAll();this.renderItemSelectionState(e,true);this._selectedItems.add(e);this.setAnchorItem(e)}else{if(d.getKeyIdentifier()==$[91]){if(this._selectedItems.contains(e)){this.renderItemSelectionState(e,false);this._selectedItems.remove(e);this.setAnchorItem(this._selectedItems.getFirst())}else{if(!d.isCtrlPressed()||!this.getMultiSelection()){this._deselectAll()}this.renderItemSelectionState(e,true);this._selectedItems.add(e);this.setAnchorItem(e)}}}}}}this.setFireChange(a);if(a&&this._hasChanged(c)){this._dispatchChange()}},getItemToSelect:function(a){if(a.isAltPressed()){return null}switch(a.getKeyIdentifier()){case"Home":return this.getHome(this.getLeadItem());case"End":return this.getEnd(this.getLeadItem());case"Down":return this.getDown(this.getLeadItem());case"Up":return this.getUp(this.getLeadItem());case"Left":return this.getLeft(this.getLeadItem());case $[51]:return this.getRight(this.getLeadItem());case $[57]:return this.getPageUp(this.getLeadItem())||this.getHome(this.getLeadItem());case $[58]:return this.getPageDown(this.getLeadItem())||this.getEnd(this.getLeadItem());case $[91]:if(a.isCtrlPressed()){return this.getLeadItem()}}return null},_dispatchChange:function(){if(!this.getFireChange()){return}if(this.hasEventListeners($[271])){this.dispatchEvent(new qx.event.type.DataEvent($[271],this.getSelectedItems()),true)}},_hasChanged:function(a){return a!=this._getChangeValue()},_getChangeValue:function(){return this._selectedItems.getChangeValue()},getHome:function(){return this.getFirst()},getEnd:function(){return this.getLast()},getDown:function(a){if(!a){return this.getFirst()}return this.getMultiColumnSupport()?(this.getUnder(a)||this.getLast()):this.getNext(a)},getUp:function(a){if(!a){return this.getLast()}return this.getMultiColumnSupport()?(this.getAbove(a)||this.getFirst()):this.getPrevious(a)},getLeft:function(a){if(!this.getMultiColumnSupport()){return null}return !a?this.getLast():this.getPrevious(a)},getRight:function(a){if(!this.getMultiColumnSupport()){return null}return !a?this.getFirst():this.getNext(a)},getAbove:function(a){throw new Error("getAbove(): Not implemented yet")},getUnder:function(a){throw new Error("getUnder(): Not implemented yet")},getPageUp:function(e){var c=this.getLeadItem();if(!c){c=this.getFirst()}var b=this.getBoundedWidget();if(b.isCreated()){var a=b.getScrollTop();var f=b.getClientHeight();var d=0;while(d<2){while(c&&(this.getItemTop(c)-this.getItemHeight(c)>=a)){c=this.getUp(c)}if(c==null){break}if(c!=this.getLeadItem()){this.scrollItemIntoView(c,true);break}b.setScrollTop(a-f-this.getItemHeight(c));a=b.getScrollTop();d++}}return c},getPageDown:function(e){var c=this.getLeadItem();if(!c){c=this.getFirst()}var b=this.getBoundedWidget();if(b.isCreated()){var a=b.getScrollTop();var f=b.getClientHeight();var d=0;while(d<2){while(c&&((this.getItemTop(c)+(2*this.getItemHeight(c)))<=(a+f))){c=this.getDown(c)}if(c==null){break}if(c!=this.getLeadItem()){break}b.setScrollTop(a+f-2*this.getItemHeight(c));a=b.getScrollTop();d++}}return c}},destruct:function(){this._disposeObjects("_selectedItems")}});
 qx.Class.define("qx.ui.selection.Selection",{extend:qx.core.Object,construct:function(a){arguments.callee.base.call(this);this.__manager=a;this.removeAll()},members:{add:function(a){this.__storage[this.getItemHashCode(a)]=a},remove:function(a){delete this.__storage[this.getItemHashCode(a)]},removeAll:function(){this.__storage={}},contains:function(a){return this.getItemHashCode(a) in this.__storage},toArray:function(){var b=[];for(var a in this.__storage){b.push(this.__storage[a])}return b},getFirst:function(){for(var a in this.__storage){return this.__storage[a]}return null},getChangeValue:function(){var b=[];for(var a in this.__storage){b.push(a)}b.sort();return b.join(";")},getItemHashCode:function(a){return this.__manager.getItemHashCode(a)},isEmpty:function(){return qx.lang.Object.isEmpty(this.__storage)}},destruct:function(){this._disposeFields("__storage","__manager")}});
-qx.Class.define("org.eclipse.swt.widgets.AbstractSlider",{extend:qx.ui.layout.CanvasLayout,construct:function(a){arguments.callee.base.call(this);this.setOverflow($[17]);this._horizontal=a;this._selection=0;this._minimum=0;this._maximum=100;this._increment=1;this._pageIncrement=10;this._thumbLength=10;this._pxStep=1.38;this._thumbDragOffset=0;this._autoRepeat="";this._mouseOffset=0;this._delayTimer=new qx.client.Timer(250);this._repeatTimer=new qx.client.Timer(100);this._thumb=new org.eclipse.rwt.widgets.BasicButton("push");this._minButton=new org.eclipse.rwt.widgets.BasicButton("push");this._maxButton=new org.eclipse.rwt.widgets.BasicButton("push");this.add(this._thumb);this.add(this._minButton);this.add(this._maxButton);this._configureSubwidgets();this._configureAppearance();this._setStates();this._registerListeners()},destruct:function(){this._delayTimer.stop();this._delayTimer.dispose();this._delayTimer=null;this._repeatTimer.stop();this._repeatTimer.dispose();this._repeatTimer=null;this._thumb=null;this._minButton=null;this._maxButton=null},members:{_setSelection:function(b){var a=this._limitSelection(b);if(a!==this._selection){this._selection=a;this._selectionChanged()}},_setMinimum:function(a){this._minimum=a;this._updateThumbSize()},_setMaximum:function(a){this._maximum=a;this._updateThumbSize()},_setIncrement:function(a){this._increment=a},_setPageIncrement:function(a){this._pageIncrement=a},_setThumb:function(a){this._thumbLength=a;this._updateThumbSize()},_registerListeners:function(){this._repeatTimer.addEventListener($[50],this._onRepeatTimerInterval,this);this._delayTimer.addEventListener($[50],this._repeatTimerStart,this);this.addEventListener($[57],this._onChangeSize,this);this.addEventListener($[66],this._onChangeSize,this);this.addEventListener($[132],this._onChangeEnabled,this);this.addEventListener($[2],this._onMouseDown,this);this.addEventListener($[15],this._onMouseUp,this);this.addEventListener($[14],this._onMouseOut,this);this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[45],this._onMouseMove,this);this.addEventListener($[56],this._onMouseWheel,this);this._thumb.addEventListener($[2],this._onThumbMouseDown,this);this._thumb.addEventListener($[45],this._onThumbMouseMove,this);this._thumb.addEventListener($[15],this._onThumbMouseUp,this);this._minButton.addEventListener($[2],this._onMinButtonMouseEvent,this);this._maxButton.addEventListener($[2],this._onMaxButtonMouseEvent,this);this._minButton.addEventListener($[192],this._onMinButtonMouseEvent,this);this._maxButton.addEventListener($[192],this._onMaxButtonMouseEvent,this)},_selectionChanged:function(){this._updateThumbPosition();if(this._autoRepeat!==""&&!this._repeatTimer.isEnabled()){this._delayTimer.start()}},_onChangeSize:function(a){this._updateThumbSize()},_onChangeEnabled:function(a){this._thumb.setVisibility(a.getValue())},_onMouseWheel:function(a){if(a.getTarget()===this){a.preventDefault();a.stopPropagation();var c=a.getWheelDelta();var d=(c/Math.abs(c))*this._increment;var b=this._selection-d;if(b<this._minimum){b=this._minimum}if(b>(this._maximum-this._thumbWidth)){b=this._maximum-this._thumbWidth}this._setSelection(b)}},_onMouseDown:function(a){if(a.isLeftButtonPressed()){this._mouseOffset=this._getMouseOffset(a);this._handleLineMouseDown()}},_onMouseUp:function(a){this.setCapture(false);this._autoRepeat="";this._delayTimer.stop();this._repeatTimer.stop()},_onMouseOver:function(a){var b=a.getOriginalTarget();if(b===this&&this._autoRepeat.slice(0,4)==="line"){this.setCapture(false);this._repeatTimerStart()}},_onMouseOut:function(b){var c=b.getRelatedTarget();var a=c!==this&&!this.contains(c);if(a&&this._autoRepeat.slice(0,4)==="line"){this.setCapture(true);this._delayTimer.stop();this._repeatTimer.stop()}},_onMouseMove:function(a){this._mouseOffset=this._getMouseOffset(a)},_onMinButtonMouseEvent:function(a){a.stopPropagation();if(this._minButton.hasState($[21])){this._autoRepeat="minButton";this._setSelection(this._selection-this._increment)}else{this._autoRepeat=""}},_onMaxButtonMouseEvent:function(a){a.stopPropagation();if(this._maxButton.hasState($[21])){this._autoRepeat="maxButton";this._setSelection(this._selection+this._increment)}else{this._autoRepeat=""}},_onThumbMouseDown:function(b){b.stopPropagation();this._thumb.addState($[21]);if(b.isLeftButtonPressed()){var a=this._getMouseOffset(b);this._thumbDragOffset=a-this._getThumbPosition();this._thumb.setCapture(true)}},_onThumbMouseMove:function(c){c.stopPropagation();if(this._thumb.getCapture()){var b=this._getMouseOffset(c);var a=this._getSelectionFromPosition(b-this._thumbDragOffset);this._setSelection(a)}},_onThumbMouseUp:function(a){if(this._thumb.hasState($[21])){a.stopPropagation();this._repeatTimer.stop();this._thumb.setCapture(false);this._thumb.removeState($[21])}},_configureSubwidgets:function(){if(this._horizontal){this._thumb.setHeight("100%");this._minButton.setHeight("100%");this._maxButton.setHeight("100%");this._maxButton.setRight(0)}else{this._thumb.setWidth("100%");this._minButton.setWidth("100%");this._maxButton.setWidth("100%");this._maxButton.setBottom(0)}org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._thumb);org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._minButton);org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._maxButton);this._minButton.setTabIndex(null);this._maxButton.setTabIndex(null)},_setStates:function(){var a=this._horizontal?$[200]:$[304];var b=this._horizontal?$[52]:$[46];this.addState(a);this._minButton.addState(a);this._minButton.addState(b);this._maxButton.addState(a);this._maxButton.addState(b);this._thumb.addState(a);this._renderAppearance();this._minButton._renderAppearance();this._maxButton._renderAppearance();this._thumb._renderAppearance()},_visualizeFocus:function(){arguments.callee.base.call(this);this._thumb.addState($[123])},_visualizeBlur:function(){arguments.callee.base.call(this);this._thumb.removeState($[123])},_repeatTimerStart:function(){this._delayTimer.stop();if(this._autoRepeat!==""){this._repeatTimer.start()}},_onRepeatTimerInterval:function(a){switch(this._autoRepeat){case"minButton":this._setSelection(this._selection-this._increment);break;case"maxButton":this._setSelection(this._selection+this._increment);break;case"linePlus":case"lineMinus":this._handleLineMouseDown();break}},_handleLineMouseDown:function(){var e;var b=this._getThumbSize()/2;var c=this._getThumbPosition()+b;var a;if(this._mouseOffset>c){a=this._selection+this._pageIncrement;e="linePlus"}else{e="lineMinus";a=this._selection-this._pageIncrement}if(this._autoRepeat===""||this._autoRepeat===e){this._autoRepeat=e;var d=this._pageIncrement*this._pxStep+b;this._setSelection(a)}},_updateThumbPosition:function(){var a=this._getMinButtonWidth();a+=this._pxStep*(this._selection-this._minimum);if(this._horizontal){this._thumb.setLeft(a)}else{this._thumb.setTop(a)}},_updateThumbSize:function(){var a=this._thumbLength*this._getLineSize()/(this._maximum-this._minimum);a=Math.round(a);if(this._horizontal){this._thumb.setWidth(a)}else{this._thumb.setHeight(a)}this._updateStepsize()},_updateStepsize:function(){var a=this._maximum-this._minimum-this._thumbLength;if(a!=0){var b=this._getLineSize()-this._getThumbSize();this._pxStep=b/a}else{this._pxStep=0}this._selection=this._limitSelection(this._selection);this._updateThumbPosition()},_getSelectionFromPosition:function(a){var b=this._getMinButtonWidth();var c=(a-b)/this._pxStep+this._minimum;return this._limitSelection(Math.round(c))},_limitSelection:function(b){var a=b;if(b>=(this._maximum-this._thumbLength)){a=this._maximum-this._thumbLength}if(a<=this._minimum){a=this._minimum}return a},_getMouseOffset:function(c){var b=qx.bom.element.Location;var a;if(this._horizontal){a=c.getPageX()-b.getLeft(this.getElement())}else{a=c.getPageY()-b.getTop(this.getElement())}return a},_getThumbPosition:function(){var a;if(this._horizontal){a=this._thumb.getLeft()}else{a=this._thumb.getTop()}return a},_getThumbSize:function(){var a;if(this._horizontal){a=this._thumb.getWidth()}else{a=this._thumb.getHeight()}return a},_getLineSize:function(){var b=this._getMinButtonWidth()+this._getMaxButtonWidth();var a=this._getSliderSize()-this.getFrameWidth()-b;return a},_getSliderSize:function(){var a;if(this._horizontal){a=this.getWidth()}else{a=this.getHeight()}return a},_getMinButtonWidth:function(){var a;if(this._horizontal){a=this._minButton.getWidth()}else{a=this._minButton.getHeight()}return a},_getMaxButtonWidth:function(){var a;if(this._horizontal){a=this._maxButton.getWidth()}else{a=this._maxButton.getHeight()}return a}}});
-qx.Class.define("org.eclipse.rwt.widgets.ScrollBar",{extend:org.eclipse.swt.widgets.AbstractSlider,construct:function(a){arguments.callee.base.call(this,a);this._idealValue=0;this._selectionFactor=1;this._lastDispatchedValue=0;this._mergeEvents=false;this._renderSum=0;this._renderSamples=0;this._eventTimerId=null;this._setMinimum(0);this._minThumbSize=this._getMinThumbSize();this.setIncrement(20);this.addEventListener($[29],this._stopEvent,this);this.addEventListener($[61],this._stopEvent,this);this._eventTimer=null},destruct:function(){if(this._eventTimer!=null){this._eventTimer.dispose();this._eventTimer=null}},statics:{MERGE_THRESHOLD:4},events:{changeValue:$[11]},members:{_configureAppearance:function(){this.setAppearance("scrollbar");this._thumb.setAppearance($[182]);this._minButton.setAppearance("scrollbar-min-button");this._maxButton.setAppearance("scrollbar-max-button")},setValue:function(a){this._idealValue=a;this._setSelection(a*this._selectionFactor)},getValue:function(a){return Math.round(this._selection/this._selectionFactor)},setMaximum:function(a){this._setMaximum(a);if(this._idealValue!==null){this._setSelection(this._idealValue)}this._updateThumbLength()},getMaximum:function(){return this._maximum},setIncrement:function(a){this._setIncrement(a);this._updatePageIncrement()},setMergeEvents:function(a){if(!a&&this._mergeEvents){throw new Error("mergeEvents can not be set to false")}else{if(a){this._mergeEvents=true;this._eventTimer=new qx.client.Timer(125);this._eventTimer.addEventListener($[50],this._dispatchValueChanged,this)}}},getMergeEvents:function(){return this._mergeEvents},autoEnableMerge:function(c){if(!this._mergeEvents&&c>0){this._renderSamples++;this._renderSum+=c;var b=this._renderSum/this._renderSamples;var a=false;if(this._renderSamples>2){a=b>200}else{a=c>700}if(a){this.setMergeEvents(true)}}},_onChangeSize:function(){arguments.callee.base.call(this);this._updateThumbLength();this._updatePageIncrement();if(this._idealValue!==null){this._setSelection(this._idealValue)}},_updateThumbSize:function(){arguments.callee.base.call(this);var a=this._getThumbSize();if(a<this._minThumbSize){this.addToQueue($[454])}else{this._selectionFactor=1}if(this._horizontal){var b=this._thumb.getCellWidth(1);var d=a>=(b+6);this._thumb.setCellVisible(1,d)}else{var c=this._thumb.getCellHeight(1);var d=a>=(c+6);this._thumb.setCellVisible(1,d)}},_layoutPost:function(b){arguments.callee.base.call(this,b);if(b[$[454]]){if(this._maximum>0&&this._getLineSize()>0){var a=this._getThumbSize();if(a<this._minThumbSize){var d=this._getSliderSize();var c=this._minThumbSize*this._maximum/this._getLineSize();this._setThumb(c);this._selectionFactor=(this._maximum-c)/(this._maximum-d)}}}},_setSelection:function(a){if(a!==this._idealValue){this._idealValue=null}arguments.callee.base.call(this,a)},_selectionChanged:function(){arguments.callee.base.call(this);if(this._getMergeCurrentEvent()){this._eventTimer.stop();this._eventTimer.start()}else{this._dispatchValueChanged()}},_getMinThumbSize:function(){var a=new org.eclipse.swt.theme.ThemeValues(this.__states);return a.getCssDimension($[221],"min-height")},_updateThumbLength:function(){this._setThumb(this._getSliderSize())},_updatePageIncrement:function(){this._setPageIncrement(this._getSliderSize()-this._increment)},_stopEvent:function(a){a.stopPropagation();a.preventDefault()},_getMergeCurrentEvent:function(){var a=false;if(this._mergeEvents){var b=org.eclipse.rwt.widgets.ScrollBar.MERGE_THRESHOLD;var c=Math.abs(this._lastDispatchedValue-this._selection);if(c>=this._increment*b){a=true}}return a},_dispatchValueChanged:function(){if(this._mergeEvents){this._eventTimer.stop()}this._lastDispatchedValue=this._selection;this.createDispatchEvent($[80])},_updateStepsize:function(){var a=this._selection;arguments.callee.base.call(this);if(a!==this._selection){this._dispatchValueChanged()}}}});
-qx.Class.define($[541],{extend:qx.core.Target,properties:{uiReady:{check:$[3],init:false}},members:{main:function(){qx.theme.manager.Meta.getInstance().initialize();qx.ui.core.ClientDocument.getInstance();qx.client.Timer.once(this._preload,this,0)},close:function(){},terminate:function(){org.eclipse.rwt.EventHandler.detachEvents();org.eclipse.rwt.EventHandler.cleanUp()},_preload:function(){this.__preloader=new qx.io.image.PreloaderSystem(qx.io.image.Manager.getInstance().getVisibleImages(),this._preloaderDone,this);this.__preloader.start()},_preloaderDone:function(){this.setUiReady(true);this.__preloader.dispose();this.__preloader=null;var a=(new Date).valueOf();qx.ui.core.Widget.flushGlobalQueues();org.eclipse.rwt.EventHandler.init();org.eclipse.rwt.EventHandler.attachEvents();qx.client.Timer.once(this._postload,this,100)},_postload:function(){this.__postloader=new qx.io.image.PreloaderSystem(qx.io.image.Manager.getInstance().getHiddenImages(),this._postloaderDone,this);this.__postloader.start()},_postloaderDone:function(){this.__postloader.dispose();this.__postloader=null}}});
-qx.Class.define("qx.io.image.PreloaderSystem",{extend:qx.core.Target,construct:function(c,b,a){arguments.callee.base.call(this);if(c instanceof Array){this._list=qx.lang.Object.fromArray(c)}else{this._list=c}this._timer=new qx.client.Timer(qx.core.Setting.get("qx.preloaderTimeout"));this._timer.addEventListener($[50],this.__oninterval,this);if(b){this.addEventListener($[43],b,a||null)}},events:{completed:$[11]},members:{_stopped:false,start:function(){if(qx.lang.Object.isEmpty(this._list)){this.createDispatchEvent($[43]);return}for(var a in this._list){var b=qx.io.image.PreloaderManager.getInstance().create(qx.io.Alias.getInstance().resolve(a));if(b.isErroneous()||b.isLoaded()){delete this._list[a]}else{b._origSource=a;b.addEventListener("load",this.__onload,this);b.addEventListener("error",this.__onerror,this)}}this._check()},__onload:function(a){if(this.getDisposed()){return}delete this._list[a.getTarget()._origSource];this._check()},__onerror:function(a){if(this.getDisposed()){return}delete this._list[a.getTarget()._origSource];this._check()},__oninterval:function(a){this._stopped=true;this._timer.stop();this.createDispatchEvent($[43])},_check:function(){if(this._stopped){return}if(qx.lang.Object.isEmpty(this._list)){this._timer.stop();this.createDispatchEvent($[43])}else{this._timer.restart()}}},settings:{"qx.preloaderTimeout":3000},destruct:function(){if(this._timer){this._timer.removeEventListener($[50],this.__oninterval,this);this._disposeObjects("_timer")}this._disposeFields("_list")}});
-qx.Class.define("qx.io.remote.RequestQueue",{type:$[33],extend:qx.core.Target,construct:function(){arguments.callee.base.call(this);this._queue=[];this._active=[];this._totalRequests=0;this._timer=new qx.client.Timer(500);this._timer.addEventListener($[50],this._oninterval,this)},properties:{enabled:{init:true,check:$[3],apply:$[373]},maxTotalRequests:{check:$[22],nullable:true},maxConcurrentRequests:{check:$[22],init:3},defaultTimeout:{check:$[22],init:5000}},members:{_debug:function(){if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[185])){var a=this._active.length+"/"+(this._queue.length+this._active.length);window.status="Request-Queue Progress: "+a}}},_check:function(){this._debug();if(this._active.length==0&&this._queue.length==0){this._timer.stop()}if(!this.getEnabled()){return}if(this._active.length>=this.getMaxConcurrentRequests()||this._queue.length==0){return}if(this.getMaxTotalRequests()!=null&&this._totalRequests>=this.getMaxTotalRequests()){return}var c=this._queue.shift();var e=new qx.io.remote.Exchange(c);this._totalRequests++;this._active.push(e);this._debug();e.addEventListener($[62],this._onsending,this);e.addEventListener($[67],this._onreceiving,this);e.addEventListener($[43],this._oncompleted,this);e.addEventListener($[65],this._oncompleted,this);e.addEventListener($[63],this._oncompleted,this);e.addEventListener($[51],this._oncompleted,this);var d=true;try{d=e.send()}catch(a){d=a}if(d!==true){var b=new qx.io.remote.Response($[51]);b.setContent(d);e.dispatchEvent(b)}else{e._start=(new Date()).valueOf()}if(this._queue.length>0){this._check()}},_remove:function(a){qx.lang.Array.remove(this._active,a);this._check()},_activeCount:0,_onsending:function(b){if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[185])){this._activeCount++;b.getTarget()._counted=true}}var a=b.getTarget();a.getRequest()._onsending(b)},_onreceiving:function(a){a.getTarget().getRequest()._onreceiving(a)},_oncompleted:function(c){if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[185])){if(c.getTarget()._counted){this._activeCount--}}}var b=c.getTarget();this._remove(b);var a=b.getRequest();if(a["_on"+c.getType()]){a["_on"+c.getType()](c)}b.dispose()},_oninterval:function(g){var j=this._active;if(j.length==0){this._timer.stop();return}var f;var d;var a=this.getDefaultTimeout();var b;var h;for(var c=j.length-1;c>=0;c--){f=j[c];d=f.getRequest();if(d.isAsynchronous()){b=d.getTimeout();if(b==0||f._start==null){continue}if(b==null){b=a}h=(new Date).valueOf()-f._start;if(h>b){f.timeout()}}}},_applyEnabled:function(b,a){if(b){this._check()}this._timer.setEnabled(b)},add:function(a){a.setState($[196]);this._queue.push(a);this._check();if(this.getEnabled()){this._timer.start()}},abort:function(a){var b=a.getTransport();if(b){b.abort()}else{if(qx.lang.Array.contains(this._queue,a)){qx.lang.Array.remove(this._queue,a)}}}},destruct:function(){this._disposeObjectDeep("_active",1);this._disposeObjects("_timer");this._disposeFields("_queue")}});
-qx.Class.define($[436],{extend:qx.core.Target,construct:function(a){arguments.callee.base.call(this);this.setRequest(a);a.setTransport(this)},events:{sending:$[11],receiving:$[11],completed:$[131],aborted:$[131],failed:$[131],timeout:$[131]},statics:{typesOrder:[$[331],"qx.io.remote.IframeTransport","qx.io.remote.ScriptTransport"],typesReady:false,typesAvailable:{},typesSupported:{},registerType:function(b,a){qx.io.remote.Exchange.typesAvailable[a]=b},initTypes:function(){if(qx.io.remote.Exchange.typesReady){return}for(var a in qx.io.remote.Exchange.typesAvailable){var b=qx.io.remote.Exchange.typesAvailable[a];if(b.isSupported()){qx.io.remote.Exchange.typesSupported[a]=b}}qx.io.remote.Exchange.typesReady=true;if(qx.lang.Object.isEmpty(qx.io.remote.Exchange.typesSupported)){throw new Error("No supported transport types were found!")}},canHandle:function(a,b,c){if(!qx.lang.Array.contains(a.handles.responseTypes,c)){return false}for(var d in b){if(!a.handles[d]){return false}}return true},_nativeMap:{0:$[166],1:$[101],2:$[62],3:$[67],4:$[43]},wasSuccessful:function(c,a,b){if(b){switch(c){case null:case 0:return true;case -1:return a<4;default:return typeof c===$[8]}}else{switch(c){case -1:return a<4;case 200:case 304:return true;case 201:case 202:case 203:case 204:case 205:return true;case 206:return a!==4;case 300:case 301:case 302:case 303:case 305:case 400:case 401:case 402:case 403:case 404:case 405:case 406:case 407:case 408:case 409:case 410:case 411:case 412:case 413:case 414:case 415:case 500:case 501:case 502:case 503:case 504:case 505:return false;case 12002:case 12007:case 12029:case 12030:case 12031:case 12152:case 13030:return false;default:if(c>206&&c<300){return true}return false}}},statusCodeToString:function(a){switch(a){case -1:return"Not available";case 200:return"Ok";case 304:return"Not modified";case 206:return"Partial content";case 204:return"No content";case 300:return"Multiple choices";case 301:return"Moved permanently";case 302:return"Moved temporarily";case 303:return"See other";case 305:return"Use proxy";case 400:return"Bad request";case 401:return"Unauthorized";case 402:return"Payment required";case 403:return"Forbidden";case 404:return"Not found";case 405:return"Method not allowed";case 406:return"Not acceptable";case 407:return"Proxy authentication required";case 408:return"Request time-out";case 409:return"Conflict";case 410:return"Gone";case 411:return"Length required";case 412:return"Precondition failed";case 413:return"Request entity too large";case 414:return"Request-URL too large";case 415:return"Unsupported media type";case 500:return"Server error";case 501:return"Not implemented";case 502:return"Bad gateway";case 503:return"Out of resources";case 504:return"Gateway time-out";case 505:return"HTTP version not supported";case 12002:return"Server timeout";case 12007:return"Internet name not resolved";case 12029:return $[325];case 12030:return $[325];case 12031:return $[325];case 12152:return"Connection closed by server";case 13030:return"MSHTML-specific HTTP status code";default:return"Unknown status code"}}},properties:{request:{check:$[518],nullable:true},implementation:{check:$[517],nullable:true,apply:"_applyImplementation"},state:{check:[$[101],$[62],$[67],$[43],$[65],$[63],$[51]],init:$[101],event:$[365],apply:$[406]}},members:{send:function(){var m=this.getRequest();if(!m){throw new Error("Please attach a request object first")}qx.io.remote.Exchange.initTypes();var f=qx.io.remote.Exchange.typesOrder;var k=qx.io.remote.Exchange.typesSupported;var c=m.getResponseType();var a={};if(m.getAsynchronous()){a.asynchronous=true}else{a.synchronous=true}if(m.getCrossDomain()){a.crossDomain=true}if(m.getFileUpload()){a.fileUpload=true}for(var h in m.getFormFields()){a.programaticFormFields=true;break}var g,j;for(var d=0,b=f.length;d<b;d++){g=k[f[d]];if(g){if(!qx.io.remote.Exchange.canHandle(g,a,c)){continue}try{j=new g;this.setImplementation(j);j.setUseBasicHttpAuth(m.getUseBasicHttpAuth());j.send();return true}catch(e){throw new Error("Request handler throws error "+e)}}}throw new Error("There is no transport implementation available to handle this request: "+m)},abort:function(){var a=this.getImplementation();if(a){a.abort()}else{this.setState($[65])}},timeout:function(){var a=this.getImplementation();if(a){a.timeout()}else{this.setState($[63])}if(this.getRequest()){this.getRequest().setTimeout(0)}},_onsending:function(a){this.setState($[62])},_onreceiving:function(a){this.setState($[67])},_oncompleted:function(a){this.setState($[43])},_onabort:function(a){this.setState($[65])},_onfailed:function(a){this.setState($[51])},_ontimeout:function(a){this.setState($[63])},_applyImplementation:function(c,a){if(a){a.removeEventListener($[62],this._onsending,this);a.removeEventListener($[67],this._onreceiving,this);a.removeEventListener($[43],this._oncompleted,this);a.removeEventListener($[65],this._onabort,this);a.removeEventListener($[63],this._ontimeout,this);a.removeEventListener($[51],this._onfailed,this)}if(c){var b=this.getRequest();c.setUrl(b.getUrl());c.setMethod(b.getMethod());c.setAsynchronous(b.getAsynchronous());c.setUsername(b.getUsername());c.setPassword(b.getPassword());c.setParameters(b.getParameters());c.setFormFields(b.getFormFields());c.setRequestHeaders(b.getRequestHeaders());c.setData(b.getData());c.setResponseType(b.getResponseType());c.addEventListener($[62],this._onsending,this);c.addEventListener($[67],this._onreceiving,this);c.addEventListener($[43],this._oncompleted,this);c.addEventListener($[65],this._onabort,this);c.addEventListener($[63],this._ontimeout,this);c.addEventListener($[51],this._onfailed,this)}},_applyState:function(e,b){switch(e){case $[62]:case $[67]:this.createDispatchEvent(e);break;case $[43]:case $[65]:case $[63]:case $[51]:var d=this.getImplementation();if(!d){break}if(this.hasEventListeners(e)){var a=new qx.io.remote.Response(e);if(e==$[43]){var c=d.getResponseContent();a.setContent(c);if(c===null){e=$[51]}}a.setStatusCode(d.getStatusCode());a.setResponseHeaders(d.getResponseHeaders());this.dispatchEvent(a)}this.setImplementation(null);d.dispose();break}}},settings:{"qx.ioRemoteDebug":false,"qx.ioRemoteDebugData":false},destruct:function(){var a=this.getImplementation();if(a){this.setImplementation(null);a.dispose()}this.setRequest(null)}});
-qx.Class.define($[131],{extend:qx.event.type.Event,construct:function(a){arguments.callee.base.call(this,a)},properties:{state:{check:$[22],nullable:true},statusCode:{check:$[22],nullable:true},content:{nullable:true},responseHeaders:{check:$[110],nullable:true}},members:{getResponseHeader:function(a){var b=this.getResponseHeaders();if(b){return b[a]||null}return null},getData:function(){return this}}});
+qx.Class.define("org.eclipse.swt.widgets.AbstractSlider",{extend:qx.ui.layout.CanvasLayout,construct:function(a){arguments.callee.base.call(this);this.setOverflow($[17]);this._horizontal=a;this._selection=0;this._minimum=0;this._maximum=100;this._increment=1;this._pageIncrement=10;this._thumbLength=10;this._pxStep=1.38;this._thumbDragOffset=0;this._autoRepeat="";this._mouseOffset=0;this._delayTimer=new qx.client.Timer(250);this._repeatTimer=new qx.client.Timer(100);this._thumb=new org.eclipse.rwt.widgets.BasicButton("push");this._minButton=new org.eclipse.rwt.widgets.BasicButton("push");this._maxButton=new org.eclipse.rwt.widgets.BasicButton("push");this.add(this._thumb);this.add(this._minButton);this.add(this._maxButton);this._configureSubwidgets();this._configureAppearance();this._setStates();this._registerListeners()},destruct:function(){this._delayTimer.stop();this._delayTimer.dispose();this._delayTimer=null;this._repeatTimer.stop();this._repeatTimer.dispose();this._repeatTimer=null;this._thumb=null;this._minButton=null;this._maxButton=null},members:{_setSelection:function(b){var a=this._limitSelection(b);if(a!==this._selection){this._selection=a;this._selectionChanged()}},_setMinimum:function(a){this._minimum=a;this._updateThumbSize()},_setMaximum:function(a){this._maximum=a;this._updateThumbSize()},_setIncrement:function(a){this._increment=a},_setPageIncrement:function(a){this._pageIncrement=a},_setThumb:function(a){this._thumbLength=a;this._updateThumbSize()},_registerListeners:function(){this._repeatTimer.addEventListener($[49],this._onRepeatTimerInterval,this);this._delayTimer.addEventListener($[49],this._repeatTimerStart,this);this.addEventListener($[56],this._onChangeSize,this);this.addEventListener($[76],this._onChangeSize,this);this.addEventListener($[131],this._onChangeEnabled,this);this.addEventListener($[2],this._onMouseDown,this);this.addEventListener($[15],this._onMouseUp,this);this.addEventListener($[14],this._onMouseOut,this);this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[45],this._onMouseMove,this);this.addEventListener($[55],this._onMouseWheel,this);this._thumb.addEventListener($[2],this._onThumbMouseDown,this);this._thumb.addEventListener($[45],this._onThumbMouseMove,this);this._thumb.addEventListener($[15],this._onThumbMouseUp,this);this._minButton.addEventListener($[2],this._onMinButtonMouseEvent,this);this._maxButton.addEventListener($[2],this._onMaxButtonMouseEvent,this);this._minButton.addEventListener($[182],this._onMinButtonMouseEvent,this);this._maxButton.addEventListener($[182],this._onMaxButtonMouseEvent,this)},_selectionChanged:function(){this._updateThumbPosition();if(this._autoRepeat!==""&&!this._repeatTimer.isEnabled()){this._delayTimer.start()}},_onChangeSize:function(a){this._updateThumbSize()},_onChangeEnabled:function(a){this._thumb.setVisibility(a.getValue())},_onMouseWheel:function(a){if(a.getTarget()===this){a.preventDefault();a.stopPropagation();var c=a.getWheelDelta();var d=(c/Math.abs(c))*this._increment;var b=this._selection-d;if(b<this._minimum){b=this._minimum}if(b>(this._maximum-this._thumbWidth)){b=this._maximum-this._thumbWidth}this._setSelection(b)}},_onMouseDown:function(a){if(a.isLeftButtonPressed()){this._mouseOffset=this._getMouseOffset(a);this._handleLineMouseDown()}},_onMouseUp:function(a){this.setCapture(false);this._autoRepeat="";this._delayTimer.stop();this._repeatTimer.stop()},_onMouseOver:function(a){var b=a.getOriginalTarget();if(b===this&&this._autoRepeat.slice(0,4)==="line"){this.setCapture(false);this._repeatTimerStart()}},_onMouseOut:function(b){var c=b.getRelatedTarget();var a=c!==this&&!this.contains(c);if(a&&this._autoRepeat.slice(0,4)==="line"){this.setCapture(true);this._delayTimer.stop();this._repeatTimer.stop()}},_onMouseMove:function(a){this._mouseOffset=this._getMouseOffset(a)},_onMinButtonMouseEvent:function(a){a.stopPropagation();if(this._minButton.hasState($[21])){this._autoRepeat="minButton";this._setSelection(this._selection-this._increment)}else{this._autoRepeat=""}},_onMaxButtonMouseEvent:function(a){a.stopPropagation();if(this._maxButton.hasState($[21])){this._autoRepeat="maxButton";this._setSelection(this._selection+this._increment)}else{this._autoRepeat=""}},_onThumbMouseDown:function(b){b.stopPropagation();this._thumb.addState($[21]);if(b.isLeftButtonPressed()){var a=this._getMouseOffset(b);this._thumbDragOffset=a-this._getThumbPosition();this._thumb.setCapture(true)}},_onThumbMouseMove:function(c){c.stopPropagation();if(this._thumb.getCapture()){var b=this._getMouseOffset(c);var a=this._getSelectionFromPosition(b-this._thumbDragOffset);this._setSelection(a)}},_onThumbMouseUp:function(a){if(this._thumb.hasState($[21])){a.stopPropagation();this._repeatTimer.stop();this._thumb.setCapture(false);this._thumb.removeState($[21])}},_configureSubwidgets:function(){if(this._horizontal){this._thumb.setHeight("100%");this._minButton.setHeight("100%");this._maxButton.setHeight("100%");this._maxButton.setRight(0)}else{this._thumb.setWidth("100%");this._minButton.setWidth("100%");this._maxButton.setWidth("100%");this._maxButton.setBottom(0)}org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._thumb);org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._minButton);org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._maxButton);this._minButton.setTabIndex(null);this._maxButton.setTabIndex(null)},_setStates:function(){var a=this._horizontal?$[181]:$[308];var b=this._horizontal?$[52]:$[47];this.addState(a);this._minButton.addState(a);this._minButton.addState(b);this._maxButton.addState(a);this._maxButton.addState(b);this._thumb.addState(a);this._renderAppearance();this._minButton._renderAppearance();this._maxButton._renderAppearance();this._thumb._renderAppearance()},_visualizeFocus:function(){arguments.callee.base.call(this);this._thumb.addState($[133])},_visualizeBlur:function(){arguments.callee.base.call(this);this._thumb.removeState($[133])},_repeatTimerStart:function(){this._delayTimer.stop();if(this._autoRepeat!==""){this._repeatTimer.start()}},_onRepeatTimerInterval:function(a){switch(this._autoRepeat){case"minButton":this._setSelection(this._selection-this._increment);break;case"maxButton":this._setSelection(this._selection+this._increment);break;case"linePlus":case"lineMinus":this._handleLineMouseDown();break}},_handleLineMouseDown:function(){var e;var b=this._getThumbSize()/2;var c=this._getThumbPosition()+b;var a;if(this._mouseOffset>c){a=this._selection+this._pageIncrement;e="linePlus"}else{e="lineMinus";a=this._selection-this._pageIncrement}if(this._autoRepeat===""||this._autoRepeat===e){this._autoRepeat=e;var d=this._pageIncrement*this._pxStep+b;this._setSelection(a)}},_updateThumbPosition:function(){var a=this._getMinButtonWidth();a+=this._pxStep*(this._selection-this._minimum);if(this._horizontal){this._thumb.setLeft(a)}else{this._thumb.setTop(a)}},_updateThumbSize:function(){var a=this._thumbLength*this._getLineSize()/(this._maximum-this._minimum);a=Math.round(a);if(this._horizontal){this._thumb.setWidth(a)}else{this._thumb.setHeight(a)}this._updateStepsize()},_updateStepsize:function(){var a=this._maximum-this._minimum-this._thumbLength;if(a!=0){var b=this._getLineSize()-this._getThumbSize();this._pxStep=b/a}else{this._pxStep=0}this._selection=this._limitSelection(this._selection);this._updateThumbPosition()},_getSelectionFromPosition:function(a){var b=this._getMinButtonWidth();var c=(a-b)/this._pxStep+this._minimum;return this._limitSelection(Math.round(c))},_limitSelection:function(b){var a=b;if(b>=(this._maximum-this._thumbLength)){a=this._maximum-this._thumbLength}if(a<=this._minimum){a=this._minimum}return a},_getMouseOffset:function(c){var b=qx.bom.element.Location;var a;if(this._horizontal){a=c.getPageX()-b.getLeft(this.getElement())}else{a=c.getPageY()-b.getTop(this.getElement())}return a},_getThumbPosition:function(){var a;if(this._horizontal){a=this._thumb.getLeft()}else{a=this._thumb.getTop()}return a},_getThumbSize:function(){var a;if(this._horizontal){a=this._thumb.getWidth()}else{a=this._thumb.getHeight()}return a},_getLineSize:function(){var b=this._getMinButtonWidth()+this._getMaxButtonWidth();var a=this._getSliderSize()-this.getFrameWidth()-b;return a},_getSliderSize:function(){var a;if(this._horizontal){a=this.getWidth()}else{a=this.getHeight()}return a},_getMinButtonWidth:function(){var a;if(this._horizontal){a=this._minButton.getWidth()}else{a=this._minButton.getHeight()}return a},_getMaxButtonWidth:function(){var a;if(this._horizontal){a=this._maxButton.getWidth()}else{a=this._maxButton.getHeight()}return a}}});
+qx.Class.define("org.eclipse.rwt.widgets.ScrollBar",{extend:org.eclipse.swt.widgets.AbstractSlider,construct:function(a){arguments.callee.base.call(this,a);this._idealValue=0;this._selectionFactor=1;this._lastDispatchedValue=0;this._mergeEvents=false;this._renderSum=0;this._renderSamples=0;this._eventTimerId=null;this._setMinimum(0);this._minThumbSize=this._getMinThumbSize();this.setIncrement(20);this.addEventListener($[29],this._stopEvent,this);this.addEventListener($[62],this._stopEvent,this);this._eventTimer=null},destruct:function(){if(this._eventTimer!=null){this._eventTimer.dispose();this._eventTimer=null}},statics:{MERGE_THRESHOLD:4},events:{changeValue:$[11]},members:{_configureAppearance:function(){this.setAppearance("scrollbar");this._thumb.setAppearance($[197]);this._minButton.setAppearance("scrollbar-min-button");this._maxButton.setAppearance("scrollbar-max-button")},setValue:function(a){this._idealValue=a;this._setSelection(a*this._selectionFactor)},getValue:function(a){return Math.round(this._selection/this._selectionFactor)},setMaximum:function(a){this._setMaximum(a);if(this._idealValue!==null){this._setSelection(this._idealValue)}this._updateThumbLength()},getMaximum:function(){return this._maximum},setIncrement:function(a){this._setIncrement(a);this._updatePageIncrement()},setMergeEvents:function(a){if(!a&&this._mergeEvents){throw new Error("mergeEvents can not be set to false")}else{if(a){this._mergeEvents=true;this._eventTimer=new qx.client.Timer(125);this._eventTimer.addEventListener($[49],this._dispatchValueChanged,this)}}},getMergeEvents:function(){return this._mergeEvents},autoEnableMerge:function(c){if(!this._mergeEvents&&c>0){this._renderSamples++;this._renderSum+=c;var b=this._renderSum/this._renderSamples;var a=false;if(this._renderSamples>2){a=b>200}else{a=c>700}if(a){this.setMergeEvents(true)}}},_onChangeSize:function(){arguments.callee.base.call(this);this._updateThumbLength();this._updatePageIncrement();if(this._idealValue!==null){this._setSelection(this._idealValue)}},_updateThumbSize:function(){arguments.callee.base.call(this);var a=this._getThumbSize();if(a<this._minThumbSize){this.addToQueue($[513])}else{this._selectionFactor=1}if(this._horizontal){var b=this._thumb.getCellWidth(1);var d=a>=(b+6);this._thumb.setCellVisible(1,d)}else{var c=this._thumb.getCellHeight(1);var d=a>=(c+6);this._thumb.setCellVisible(1,d)}},_layoutPost:function(b){arguments.callee.base.call(this,b);if(b[$[513]]){if(this._maximum>0&&this._getLineSize()>0){var a=this._getThumbSize();if(a<this._minThumbSize){var d=this._getSliderSize();var c=this._minThumbSize*this._maximum/this._getLineSize();this._setThumb(c);this._selectionFactor=(this._maximum-c)/(this._maximum-d)}}}},_setSelection:function(a){if(a!==this._idealValue){this._idealValue=null}arguments.callee.base.call(this,a)},_selectionChanged:function(){arguments.callee.base.call(this);if(this._getMergeCurrentEvent()){this._eventTimer.stop();this._eventTimer.start()}else{this._dispatchValueChanged()}},_getMinThumbSize:function(){var a=new org.eclipse.swt.theme.ThemeValues(this.__states);return a.getCssDimension($[254],"min-height")},_updateThumbLength:function(){this._setThumb(this._getSliderSize())},_updatePageIncrement:function(){this._setPageIncrement(this._getSliderSize()-this._increment)},_stopEvent:function(a){a.stopPropagation();a.preventDefault()},_getMergeCurrentEvent:function(){var a=false;if(this._mergeEvents){var b=org.eclipse.rwt.widgets.ScrollBar.MERGE_THRESHOLD;var c=Math.abs(this._lastDispatchedValue-this._selection);if(c>=this._increment*b){a=true}}return a},_dispatchValueChanged:function(){if(this._mergeEvents){this._eventTimer.stop()}this._lastDispatchedValue=this._selection;this.createDispatchEvent($[80])},_updateStepsize:function(){var a=this._selection;arguments.callee.base.call(this);if(a!==this._selection){this._dispatchValueChanged()}}}});
+qx.Class.define($[510],{extend:qx.core.Target,properties:{uiReady:{check:$[3],init:false}},members:{main:function(){qx.theme.manager.Meta.getInstance().initialize();qx.ui.core.ClientDocument.getInstance();qx.client.Timer.once(this._preload,this,0)},close:function(){},terminate:function(){org.eclipse.rwt.EventHandler.detachEvents();org.eclipse.rwt.EventHandler.cleanUp()},_preload:function(){this.__preloader=new qx.io.image.PreloaderSystem(qx.io.image.Manager.getInstance().getVisibleImages(),this._preloaderDone,this);this.__preloader.start()},_preloaderDone:function(){this.setUiReady(true);this.__preloader.dispose();this.__preloader=null;var a=(new Date).valueOf();qx.ui.core.Widget.flushGlobalQueues();org.eclipse.rwt.EventHandler.init();org.eclipse.rwt.EventHandler.attachEvents();qx.client.Timer.once(this._postload,this,100)},_postload:function(){this.__postloader=new qx.io.image.PreloaderSystem(qx.io.image.Manager.getInstance().getHiddenImages(),this._postloaderDone,this);this.__postloader.start()},_postloaderDone:function(){this.__postloader.dispose();this.__postloader=null}}});
+qx.Class.define("qx.io.image.PreloaderSystem",{extend:qx.core.Target,construct:function(c,b,a){arguments.callee.base.call(this);if(c instanceof Array){this._list=qx.lang.Object.fromArray(c)}else{this._list=c}this._timer=new qx.client.Timer(qx.core.Setting.get("qx.preloaderTimeout"));this._timer.addEventListener($[49],this.__oninterval,this);if(b){this.addEventListener($[42],b,a||null)}},events:{completed:$[11]},members:{_stopped:false,start:function(){if(qx.lang.Object.isEmpty(this._list)){this.createDispatchEvent($[42]);return}for(var a in this._list){var b=qx.io.image.PreloaderManager.getInstance().create(qx.io.Alias.getInstance().resolve(a));if(b.isErroneous()||b.isLoaded()){delete this._list[a]}else{b._origSource=a;b.addEventListener("load",this.__onload,this);b.addEventListener("error",this.__onerror,this)}}this._check()},__onload:function(a){if(this.getDisposed()){return}delete this._list[a.getTarget()._origSource];this._check()},__onerror:function(a){if(this.getDisposed()){return}delete this._list[a.getTarget()._origSource];this._check()},__oninterval:function(a){this._stopped=true;this._timer.stop();this.createDispatchEvent($[42])},_check:function(){if(this._stopped){return}if(qx.lang.Object.isEmpty(this._list)){this._timer.stop();this.createDispatchEvent($[42])}else{this._timer.restart()}}},settings:{"qx.preloaderTimeout":3000},destruct:function(){if(this._timer){this._timer.removeEventListener($[49],this.__oninterval,this);this._disposeObjects("_timer")}this._disposeFields("_list")}});
+qx.Class.define("qx.io.remote.RequestQueue",{type:$[33],extend:qx.core.Target,construct:function(){arguments.callee.base.call(this);this._queue=[];this._active=[];this._totalRequests=0;this._timer=new qx.client.Timer(500);this._timer.addEventListener($[49],this._oninterval,this)},properties:{enabled:{init:true,check:$[3],apply:$[396]},maxTotalRequests:{check:$[22],nullable:true},maxConcurrentRequests:{check:$[22],init:3},defaultTimeout:{check:$[22],init:5000}},members:{_debug:function(){if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[186])){var a=this._active.length+"/"+(this._queue.length+this._active.length);window.status="Request-Queue Progress: "+a}}},_check:function(){this._debug();if(this._active.length==0&&this._queue.length==0){this._timer.stop()}if(!this.getEnabled()){return}if(this._active.length>=this.getMaxConcurrentRequests()||this._queue.length==0){return}if(this.getMaxTotalRequests()!=null&&this._totalRequests>=this.getMaxTotalRequests()){return}var c=this._queue.shift();var e=new qx.io.remote.Exchange(c);this._totalRequests++;this._active.push(e);this._debug();e.addEventListener($[64],this._onsending,this);e.addEventListener($[67],this._onreceiving,this);e.addEventListener($[42],this._oncompleted,this);e.addEventListener($[63],this._oncompleted,this);e.addEventListener($[65],this._oncompleted,this);e.addEventListener($[54],this._oncompleted,this);var d=true;try{d=e.send()}catch(a){d=a}if(d!==true){var b=new qx.io.remote.Response($[54]);b.setContent(d);e.dispatchEvent(b)}else{e._start=(new Date()).valueOf()}if(this._queue.length>0){this._check()}},_remove:function(a){qx.lang.Array.remove(this._active,a);this._check()},_activeCount:0,_onsending:function(b){if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[186])){this._activeCount++;b.getTarget()._counted=true}}var a=b.getTarget();a.getRequest()._onsending(b)},_onreceiving:function(a){a.getTarget().getRequest()._onreceiving(a)},_oncompleted:function(c){if(qx.core.Variant.isSet($[7],"on")){if(qx.core.Setting.get($[186])){if(c.getTarget()._counted){this._activeCount--}}}var b=c.getTarget();this._remove(b);var a=b.getRequest();if(a["_on"+c.getType()]){a["_on"+c.getType()](c)}b.dispose()},_oninterval:function(g){var j=this._active;if(j.length==0){this._timer.stop();return}var f;var d;var a=this.getDefaultTimeout();var b;var h;for(var c=j.length-1;c>=0;c--){f=j[c];d=f.getRequest();if(d.isAsynchronous()){b=d.getTimeout();if(b==0||f._start==null){continue}if(b==null){b=a}h=(new Date).valueOf()-f._start;if(h>b){f.timeout()}}}},_applyEnabled:function(b,a){if(b){this._check()}this._timer.setEnabled(b)},add:function(a){a.setState($[185]);this._queue.push(a);this._check();if(this.getEnabled()){this._timer.start()}},abort:function(a){var b=a.getTransport();if(b){b.abort()}else{if(qx.lang.Array.contains(this._queue,a)){qx.lang.Array.remove(this._queue,a)}}}},destruct:function(){this._disposeObjectDeep("_active",1);this._disposeObjects("_timer");this._disposeFields("_queue")}});
+qx.Class.define($[495],{extend:qx.core.Target,construct:function(a){arguments.callee.base.call(this);this.setRequest(a);a.setTransport(this)},events:{sending:$[11],receiving:$[11],completed:$[124],aborted:$[124],failed:$[124],timeout:$[124]},statics:{typesOrder:[$[394],"qx.io.remote.IframeTransport","qx.io.remote.ScriptTransport"],typesReady:false,typesAvailable:{},typesSupported:{},registerType:function(b,a){qx.io.remote.Exchange.typesAvailable[a]=b},initTypes:function(){if(qx.io.remote.Exchange.typesReady){return}for(var a in qx.io.remote.Exchange.typesAvailable){var b=qx.io.remote.Exchange.typesAvailable[a];if(b.isSupported()){qx.io.remote.Exchange.typesSupported[a]=b}}qx.io.remote.Exchange.typesReady=true;if(qx.lang.Object.isEmpty(qx.io.remote.Exchange.typesSupported)){throw new Error("No supported transport types were found!")}},canHandle:function(a,b,c){if(!qx.lang.Array.contains(a.handles.responseTypes,c)){return false}for(var d in b){if(!a.handles[d]){return false}}return true},_nativeMap:{0:$[170],1:$[103],2:$[64],3:$[67],4:$[42]},wasSuccessful:function(c,a,b){if(b){switch(c){case null:case 0:return true;case -1:return a<4;default:return typeof c===$[8]}}else{switch(c){case -1:return a<4;case 200:case 304:return true;case 201:case 202:case 203:case 204:case 205:return true;case 206:return a!==4;case 300:case 301:case 302:case 303:case 305:case 400:case 401:case 402:case 403:case 404:case 405:case 406:case 407:case 408:case 409:case 410:case 411:case 412:case 413:case 414:case 415:case 500:case 501:case 502:case 503:case 504:case 505:return false;case 12002:case 12007:case 12029:case 12030:case 12031:case 12152:case 13030:return false;default:if(c>206&&c<300){return true}return false}}},statusCodeToString:function(a){switch(a){case -1:return"Not available";case 200:return"Ok";case 304:return"Not modified";case 206:return"Partial content";case 204:return"No content";case 300:return"Multiple choices";case 301:return"Moved permanently";case 302:return"Moved temporarily";case 303:return"See other";case 305:return"Use proxy";case 400:return"Bad request";case 401:return"Unauthorized";case 402:return"Payment required";case 403:return"Forbidden";case 404:return"Not found";case 405:return"Method not allowed";case 406:return"Not acceptable";case 407:return"Proxy authentication required";case 408:return"Request time-out";case 409:return"Conflict";case 410:return"Gone";case 411:return"Length required";case 412:return"Precondition failed";case 413:return"Request entity too large";case 414:return"Request-URL too large";case 415:return"Unsupported media type";case 500:return"Server error";case 501:return"Not implemented";case 502:return"Bad gateway";case 503:return"Out of resources";case 504:return"Gateway time-out";case 505:return"HTTP version not supported";case 12002:return"Server timeout";case 12007:return"Internet name not resolved";case 12029:return $[389];case 12030:return $[389];case 12031:return $[389];case 12152:return"Connection closed by server";case 13030:return"MSHTML-specific HTTP status code";default:return"Unknown status code"}}},properties:{request:{check:$[543],nullable:true},implementation:{check:$[501],nullable:true,apply:"_applyImplementation"},state:{check:[$[103],$[64],$[67],$[42],$[63],$[65],$[54]],init:$[103],event:$[333],apply:$[421]}},members:{send:function(){var m=this.getRequest();if(!m){throw new Error("Please attach a request object first")}qx.io.remote.Exchange.initTypes();var f=qx.io.remote.Exchange.typesOrder;var k=qx.io.remote.Exchange.typesSupported;var c=m.getResponseType();var a={};if(m.getAsynchronous()){a.asynchronous=true}else{a.synchronous=true}if(m.getCrossDomain()){a.crossDomain=true}if(m.getFileUpload()){a.fileUpload=true}for(var h in m.getFormFields()){a.programaticFormFields=true;break}var g,j;for(var d=0,b=f.length;d<b;d++){g=k[f[d]];if(g){if(!qx.io.remote.Exchange.canHandle(g,a,c)){continue}try{j=new g;this.setImplementation(j);j.setUseBasicHttpAuth(m.getUseBasicHttpAuth());j.send();return true}catch(e){throw new Error("Request handler throws error "+e)}}}throw new Error("There is no transport implementation available to handle this request: "+m)},abort:function(){var a=this.getImplementation();if(a){a.abort()}else{this.setState($[63])}},timeout:function(){var a=this.getImplementation();if(a){a.timeout()}else{this.setState($[65])}if(this.getRequest()){this.getRequest().setTimeout(0)}},_onsending:function(a){this.setState($[64])},_onreceiving:function(a){this.setState($[67])},_oncompleted:function(a){this.setState($[42])},_onabort:function(a){this.setState($[63])},_onfailed:function(a){this.setState($[54])},_ontimeout:function(a){this.setState($[65])},_applyImplementation:function(c,a){if(a){a.removeEventListener($[64],this._onsending,this);a.removeEventListener($[67],this._onreceiving,this);a.removeEventListener($[42],this._oncompleted,this);a.removeEventListener($[63],this._onabort,this);a.removeEventListener($[65],this._ontimeout,this);a.removeEventListener($[54],this._onfailed,this)}if(c){var b=this.getRequest();c.setUrl(b.getUrl());c.setMethod(b.getMethod());c.setAsynchronous(b.getAsynchronous());c.setUsername(b.getUsername());c.setPassword(b.getPassword());c.setParameters(b.getParameters());c.setFormFields(b.getFormFields());c.setRequestHeaders(b.getRequestHeaders());c.setData(b.getData());c.setResponseType(b.getResponseType());c.addEventListener($[64],this._onsending,this);c.addEventListener($[67],this._onreceiving,this);c.addEventListener($[42],this._oncompleted,this);c.addEventListener($[63],this._onabort,this);c.addEventListener($[65],this._ontimeout,this);c.addEventListener($[54],this._onfailed,this)}},_applyState:function(e,b){switch(e){case $[64]:case $[67]:this.createDispatchEvent(e);break;case $[42]:case $[63]:case $[65]:case $[54]:var d=this.getImplementation();if(!d){break}if(this.hasEventListeners(e)){var a=new qx.io.remote.Response(e);if(e==$[42]){var c=d.getResponseContent();a.setContent(c);if(c===null){e=$[54]}}a.setStatusCode(d.getStatusCode());a.setResponseHeaders(d.getResponseHeaders());this.dispatchEvent(a)}this.setImplementation(null);d.dispose();break}}},settings:{"qx.ioRemoteDebug":false,"qx.ioRemoteDebugData":false},destruct:function(){var a=this.getImplementation();if(a){this.setImplementation(null);a.dispose()}this.setRequest(null)}});
+qx.Class.define($[124],{extend:qx.event.type.Event,construct:function(a){arguments.callee.base.call(this,a)},properties:{state:{check:$[22],nullable:true},statusCode:{check:$[22],nullable:true},content:{nullable:true},responseHeaders:{check:$[111],nullable:true}},members:{getResponseHeader:function(a){var b=this.getResponseHeaders();if(b){return b[a]||null}return null},getData:function(){return this}}});
 qx.Class.define("qx.util.Mime",{statics:{JAVASCRIPT:"text/javascript",JSON:"application/json",XML:"application/xml",TEXT:"text/plain",HTML:"text/html"}});
-qx.Class.define($[331],{extend:qx.io.remote.AbstractRemoteTransport,construct:function(){arguments.callee.base.call(this);this._req=qx.io.remote.XmlHttpTransport.createRequestObject();this._req.onreadystatechange=qx.lang.Function.bind(this._onreadystatechange,this)},events:{created:$[11],configured:$[11],sending:$[11],receiving:$[11],completed:$[11],aborted:$[11],failed:$[11],timeout:$[11]},statics:{handles:{synchronous:true,asynchronous:true,crossDomain:false,fileUpload:false,programaticFormFields:false,responseTypes:[qx.util.Mime.TEXT,qx.util.Mime.JAVASCRIPT,qx.util.Mime.JSON,qx.util.Mime.XML,qx.util.Mime.HTML]},requestObjects:[],requestObjectCount:0,isSupported:function(){return qx.net.HttpRequest.create()!=null?true:false},createRequestObject:function(){return qx.net.HttpRequest.create()},__dummy:function(){}},members:{_localRequest:false,_lastReadyState:0,getRequest:function(){return this._req},send:function(){this._lastReadyState=0;var m=this.getRequest();var a=this.getMethod();var f=this.getAsynchronous();var b=this.getUrl();var h=(org.eclipse.rwt.Client.getRunsLocally()&&!(/^http(s){0,1}\:/.test(b)));this._localRequest=h;var k=this.getParameters();var e=[];for(var l in k){var j=k[l];if(j instanceof Array){for(var c=0;c<j.length;c++){e.push(encodeURIComponent(l)+"="+encodeURIComponent(j[c]))}}else{e.push(encodeURIComponent(l)+"="+encodeURIComponent(j))}}if(e.length>0){b+=(b.indexOf("?")>=0?"&":"?")+e.join("&")}var n=function(r){var p="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var o="";var y,w,u;var x,v,t,s;var q=0;do{y=r.charCodeAt(q++);w=r.charCodeAt(q++);u=r.charCodeAt(q++);x=y>>2;v=((y&3)<<4)|(w>>4);t=((w&15)<<2)|(u>>6);s=u&63;if(isNaN(w)){t=s=64}else{if(isNaN(u)){s=64}}o+=p.charAt(x)+p.charAt(v)+p.charAt(t)+p.charAt(s)}while(q<r.length);return o};m.onreadystatechange=qx.lang.Function.bind(this._onreadystatechange,this);if(this.getUsername()){if(this.getUseBasicHttpAuth()){m.open(a,b,f);m.setRequestHeader("Authorization","Basic "+n(this.getUsername()+":"+this.getPassword()))}else{m.open(a,b,f,this.getUsername(),this.getPassword())}}else{m.open(a,b,f)}if(!qx.core.Variant.isSet($[0],$[71])){m.setRequestHeader("Referer",window.location.href)}var d=this.getRequestHeaders();for(var l in d){m.setRequestHeader(l,d[l])}try{m.send(this.getData())}catch(g){if(h){this.failedLocally()}else{throw new Error("Failed to send data: "+g);this.failed()}return}if(!f){this._onreadystatechange()}},failedLocally:function(){if(this.getState()===$[51]){return}this.failed()},_onreadystatechange:function(b){switch(this.getState()){case $[43]:case $[65]:case $[51]:case $[63]:return}var a=this.getReadyState();if(a==4){if(!qx.io.remote.Exchange.wasSuccessful(this.getStatusCode(),a,this._localRequest)){return this.failed()}}while(this._lastReadyState<a){this.setState(qx.io.remote.Exchange._nativeMap[++this._lastReadyState])}},getReadyState:function(){var a=null;try{a=this._req.readyState}catch(b){}return a},setRequestHeader:function(a,b){this._req.setRequestHeader(a,b)},getResponseHeader:function(a){var c=null;try{this.getRequest().getResponseHeader(a)||null}catch(b){}return c},getStringResponseHeaders:function(){var c=null;try{var b=this._req.getAllResponseHeaders();if(b){c=b}}catch(a){}return c},getResponseHeaders:function(){var e=this.getStringResponseHeaders();var a={};if(e){var c=e.split(/[\r\n]+/g);for(var d=0,b=c.length;d<b;d++){var f=c[d].match(/^([^:]+)\s*:\s*(.+)$/i);if(f){a[f[1]]=f[2]}}}return a},getStatusCode:function(){var b=-1;try{b=this.getRequest().status}catch(a){}return b},getStatusText:function(){var a="";try{a=this.getRequest().statusText}catch(b){}return a},getResponseText:function(){var d=null;var a=this.getStatusCode();var b=this.getReadyState();if(qx.io.remote.Exchange.wasSuccessful(a,b,this._localRequest)){try{d=this.getRequest().responseText}catch(c){}}return d},getResponseXml:function(){var d=null;var a=this.getStatusCode();var b=this.getReadyState();if(qx.io.remote.Exchange.wasSuccessful(a,b,this._localRequest)){try{d=this.getRequest().responseXML}catch(c){}}if(typeof d==$[10]&&d!=null){if(!d.documentElement){var e=String(this.getRequest().responseText).replace(/<\?xml[^\?]*\?>/,"");d.loadXML(e)}if(!d.documentElement){throw new Error("Missing Document Element!")}if(d.documentElement.tagName=="parseerror"){throw new Error("XML-File is not well-formed!")}}else{throw new Error("Response was not a valid xml document ["+this.getRequest().responseText+"]")}return d},getFetchedLength:function(){var a=this.getResponseText();return typeof a==$[13]?a.length:0},getResponseContent:function(){var a=null;if(this.getState()===$[43]){a=this.getResponseText()}return a},_applyState:function(b,a){switch(b){case $[166]:this.createDispatchEvent($[166]);break;case $[101]:this.createDispatchEvent($[101]);break;case $[62]:this.createDispatchEvent($[62]);break;case $[67]:this.createDispatchEvent($[67]);break;case $[43]:this.createDispatchEvent($[43]);break;case $[51]:this.createDispatchEvent($[51]);break;case $[65]:this.getRequest().abort();this.createDispatchEvent($[65]);break;case $[63]:this.getRequest().abort();this.createDispatchEvent($[63]);break}}},defer:function(b,a){qx.io.remote.Exchange.registerType(qx.io.remote.XmlHttpTransport,$[331])},destruct:function(){var a=this.getRequest();if(a){a.onreadystatechange=qx.io.remote.XmlHttpTransport.__dummy;switch(a.readyState){case 1:case 2:case 3:a.abort()}}this._disposeFields("_req")}});
+qx.Class.define($[394],{extend:qx.io.remote.AbstractRemoteTransport,construct:function(){arguments.callee.base.call(this);this._req=qx.io.remote.XmlHttpTransport.createRequestObject();this._req.onreadystatechange=qx.lang.Function.bind(this._onreadystatechange,this)},events:{created:$[11],configured:$[11],sending:$[11],receiving:$[11],completed:$[11],aborted:$[11],failed:$[11],timeout:$[11]},statics:{handles:{synchronous:true,asynchronous:true,crossDomain:false,fileUpload:false,programaticFormFields:false,responseTypes:[qx.util.Mime.TEXT,qx.util.Mime.JAVASCRIPT,qx.util.Mime.JSON,qx.util.Mime.XML,qx.util.Mime.HTML]},requestObjects:[],requestObjectCount:0,isSupported:function(){return qx.net.HttpRequest.create()!=null?true:false},createRequestObject:function(){return qx.net.HttpRequest.create()},__dummy:function(){}},members:{_localRequest:false,_lastReadyState:0,getRequest:function(){return this._req},send:function(){this._lastReadyState=0;var m=this.getRequest();var a=this.getMethod();var f=this.getAsynchronous();var b=this.getUrl();var h=(org.eclipse.rwt.Client.getRunsLocally()&&!(/^http(s){0,1}\:/.test(b)));this._localRequest=h;var k=this.getParameters();var e=[];for(var l in k){var j=k[l];if(j instanceof Array){for(var c=0;c<j.length;c++){e.push(encodeURIComponent(l)+"="+encodeURIComponent(j[c]))}}else{e.push(encodeURIComponent(l)+"="+encodeURIComponent(j))}}if(e.length>0){b+=(b.indexOf("?")>=0?"&":"?")+e.join("&")}var n=function(r){var p="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var o="";var y,w,u;var x,v,t,s;var q=0;do{y=r.charCodeAt(q++);w=r.charCodeAt(q++);u=r.charCodeAt(q++);x=y>>2;v=((y&3)<<4)|(w>>4);t=((w&15)<<2)|(u>>6);s=u&63;if(isNaN(w)){t=s=64}else{if(isNaN(u)){s=64}}o+=p.charAt(x)+p.charAt(v)+p.charAt(t)+p.charAt(s)}while(q<r.length);return o};m.onreadystatechange=qx.lang.Function.bind(this._onreadystatechange,this);if(this.getUsername()){if(this.getUseBasicHttpAuth()){m.open(a,b,f);m.setRequestHeader("Authorization","Basic "+n(this.getUsername()+":"+this.getPassword()))}else{m.open(a,b,f,this.getUsername(),this.getPassword())}}else{m.open(a,b,f)}if(!qx.core.Variant.isSet($[0],$[69])){m.setRequestHeader("Referer",window.location.href)}var d=this.getRequestHeaders();for(var l in d){m.setRequestHeader(l,d[l])}try{m.send(this.getData())}catch(g){if(h){this.failedLocally()}else{throw new Error("Failed to send data: "+g);this.failed()}return}if(!f){this._onreadystatechange()}},failedLocally:function(){if(this.getState()===$[54]){return}this.failed()},_onreadystatechange:function(b){switch(this.getState()){case $[42]:case $[63]:case $[54]:case $[65]:return}var a=this.getReadyState();if(a==4){if(!qx.io.remote.Exchange.wasSuccessful(this.getStatusCode(),a,this._localRequest)){return this.failed()}}while(this._lastReadyState<a){this.setState(qx.io.remote.Exchange._nativeMap[++this._lastReadyState])}},getReadyState:function(){var a=null;try{a=this._req.readyState}catch(b){}return a},setRequestHeader:function(a,b){this._req.setRequestHeader(a,b)},getResponseHeader:function(a){var c=null;try{this.getRequest().getResponseHeader(a)||null}catch(b){}return c},getStringResponseHeaders:function(){var c=null;try{var b=this._req.getAllResponseHeaders();if(b){c=b}}catch(a){}return c},getResponseHeaders:function(){var e=this.getStringResponseHeaders();var a={};if(e){var c=e.split(/[\r\n]+/g);for(var d=0,b=c.length;d<b;d++){var f=c[d].match(/^([^:]+)\s*:\s*(.+)$/i);if(f){a[f[1]]=f[2]}}}return a},getStatusCode:function(){var b=-1;try{b=this.getRequest().status}catch(a){}return b},getStatusText:function(){var a="";try{a=this.getRequest().statusText}catch(b){}return a},getResponseText:function(){var d=null;var a=this.getStatusCode();var b=this.getReadyState();if(qx.io.remote.Exchange.wasSuccessful(a,b,this._localRequest)){try{d=this.getRequest().responseText}catch(c){}}return d},getResponseXml:function(){var d=null;var a=this.getStatusCode();var b=this.getReadyState();if(qx.io.remote.Exchange.wasSuccessful(a,b,this._localRequest)){try{d=this.getRequest().responseXML}catch(c){}}if(typeof d==$[10]&&d!=null){if(!d.documentElement){var e=String(this.getRequest().responseText).replace(/<\?xml[^\?]*\?>/,"");d.loadXML(e)}if(!d.documentElement){throw new Error("Missing Document Element!")}if(d.documentElement.tagName=="parseerror"){throw new Error("XML-File is not well-formed!")}}else{throw new Error("Response was not a valid xml document ["+this.getRequest().responseText+"]")}return d},getFetchedLength:function(){var a=this.getResponseText();return typeof a==$[13]?a.length:0},getResponseContent:function(){var a=null;if(this.getState()===$[42]){a=this.getResponseText()}return a},_applyState:function(b,a){switch(b){case $[170]:this.createDispatchEvent($[170]);break;case $[103]:this.createDispatchEvent($[103]);break;case $[64]:this.createDispatchEvent($[64]);break;case $[67]:this.createDispatchEvent($[67]);break;case $[42]:this.createDispatchEvent($[42]);break;case $[54]:this.createDispatchEvent($[54]);break;case $[63]:this.getRequest().abort();this.createDispatchEvent($[63]);break;case $[65]:this.getRequest().abort();this.createDispatchEvent($[65]);break}}},defer:function(b,a){qx.io.remote.Exchange.registerType(qx.io.remote.XmlHttpTransport,$[394])},destruct:function(){var a=this.getRequest();if(a){a.onreadystatechange=qx.io.remote.XmlHttpTransport.__dummy;switch(a.readyState){case 1:case 2:case 3:a.abort()}}this._disposeFields("_req")}});
 qx.Class.define("qx.net.HttpRequest",{statics:{create:qx.core.Variant.select($[0],{"default":function(){return new XMLHttpRequest},mshtml:qx.lang.Object.select(location.protocol!=="file:"&&window.XMLHttpRequest?"native":"activeX",{"native":function(){return new XMLHttpRequest},activeX:function(){if(this.__server){return new ActiveXObject(this.__server)}var f=["MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];var e;var d;for(var c=0,a=f.length;c<a;c++){d=f[c];try{e=new ActiveXObject(d);break}catch(b){e=null}}if(e){this.__server=d}return e}})})}});
 qx.Class.define("qx.html.Iframe",{statics:{getWindow:qx.core.Variant.select($[0],{mshtml:function(b){try{return b.contentWindow}catch(a){return null}},"default":function(c){try{var a=qx.html.Iframe.getDocument(c);return a?a.defaultView:null}catch(b){return null}}}),getDocument:qx.core.Variant.select($[0],{mshtml:function(c){try{var a=qx.html.Iframe.getWindow(c);return a?a.document:null}catch(b){return null}},"default":function(b){try{return b.contentDocument}catch(a){return null}}}),getBody:function(b){var a=qx.html.Iframe.getDocument(b);return a?a.getElementsByTagName("body")[0]:null}}});
 qx.Class.define("qx.net.Http",{statics:{METHOD_GET:"GET",METHOD_POST:"POST",METHOD_PUT:"PUT",METHOD_HEAD:"HEAD",METHOD_DELETE:"DELETE"}});
-qx.Class.define($[518],{extend:qx.core.Target,construct:function(c,a,b){arguments.callee.base.call(this);this._requestHeaders={};this._parameters={};this._formFields={};if(c!==undefined){this.setUrl(c)}if(a!==undefined){this.setMethod(a)}if(b!==undefined){this.setResponseType(b)}this.setProhibitCaching(true);this._seqNum=++qx.io.remote.Request._seqNum},events:{created:$[11],configured:$[11],sending:$[11],receiving:$[11],completed:$[131],aborted:$[131],failed:$[131],timeout:$[131]},statics:{_seqNum:0},properties:{url:{check:$[25],init:""},method:{check:[qx.net.Http.METHOD_GET,qx.net.Http.METHOD_POST,qx.net.Http.METHOD_PUT,qx.net.Http.METHOD_HEAD,qx.net.Http.METHOD_DELETE],apply:"_applyMethod",init:qx.net.Http.METHOD_GET},asynchronous:{check:$[3],init:true},data:{check:$[25],nullable:true},username:{check:$[25],nullable:true},password:{check:$[25],nullable:true},state:{check:[$[101],$[196],$[62],$[67],$[43],$[65],$[63],$[51]],init:$[101],event:$[365]},responseType:{check:[qx.util.Mime.TEXT,qx.util.Mime.JAVASCRIPT,qx.util.Mime.JSON,qx.util.Mime.XML,qx.util.Mime.HTML],init:qx.util.Mime.TEXT},timeout:{check:$[22],nullable:true},prohibitCaching:{check:$[3],init:true,apply:"_applyProhibitCaching"},crossDomain:{check:$[3],init:false},fileUpload:{check:$[3],init:false},transport:{check:$[436],nullable:true},useBasicHttpAuth:{check:$[3],init:false}},members:{send:function(){qx.io.remote.RequestQueue.getInstance().add(this)},abort:function(){qx.io.remote.RequestQueue.getInstance().abort(this)},reset:function(){switch(this.getState()){case $[62]:case $[67]:throw new Error("Aborting already sent request!");case $[196]:this.abort();break}},isConfigured:function(){return this.getState()===$[101]},isQueued:function(){return this.getState()===$[196]},isSending:function(){return this.getState()===$[62]},isReceiving:function(){return this.getState()===$[67]},isCompleted:function(){return this.getState()===$[43]},isAborted:function(){return this.getState()===$[65]},isTimeout:function(){return this.getState()===$[63]},isFailed:function(){return this.getState()===$[51]},_onqueued:function(a){this.setState($[196]);this.dispatchEvent(a)},_onsending:function(a){this.setState($[62]);this.dispatchEvent(a)},_onreceiving:function(a){this.setState($[67]);this.dispatchEvent(a)},_oncompleted:function(a){this.setState($[43]);this.dispatchEvent(a);this.dispose()},_onaborted:function(a){this.setState($[65]);this.dispatchEvent(a);this.dispose()},_ontimeout:function(a){this.setState($[63]);this.dispatchEvent(a);this.dispose()},_onfailed:function(a){this.setState($[51]);this.dispatchEvent(a);this.dispose()},_applyProhibitCaching:function(b,a){if(b){this.setParameter("nocache",new Date().valueOf());this.setRequestHeader("Pragma","no-cache");this.setRequestHeader($[495],"no-cache")}else{this.removeParameter("nocache");this.removeRequestHeader("Pragma");this.removeRequestHeader($[495])}},_applyMethod:function(b,a){if(b===qx.net.Http.METHOD_POST){this.setRequestHeader($[556],"application/x-www-form-urlencoded; charset=UTF-8")}else{this.removeRequestHeader($[556])}},setRequestHeader:function(a,b){this._requestHeaders[a]=b},removeRequestHeader:function(a){delete this._requestHeaders[a]},getRequestHeader:function(a){return this._requestHeaders[a]||null},getRequestHeaders:function(){return this._requestHeaders},setParameter:function(a,b){this._parameters[a]=b},removeParameter:function(a){delete this._parameters[a]},getParameter:function(a){return this._parameters[a]||null},getParameters:function(){return this._parameters},setFormField:function(a,b){this._formFields[a]=b},removeFormField:function(a){delete this._formFields[a]},getFormField:function(a){return this._formFields[a]||null},getFormFields:function(){return this._formFields},getSequenceNumber:function(){return this._seqNum}},destruct:function(){this.setTransport(null);this._disposeFields("_requestHeaders","_parameters","_formFields")}});
+qx.Class.define($[543],{extend:qx.core.Target,construct:function(c,a,b){arguments.callee.base.call(this);this._requestHeaders={};this._parameters={};this._formFields={};if(c!==undefined){this.setUrl(c)}if(a!==undefined){this.setMethod(a)}if(b!==undefined){this.setResponseType(b)}this.setProhibitCaching(true);this._seqNum=++qx.io.remote.Request._seqNum},events:{created:$[11],configured:$[11],sending:$[11],receiving:$[11],completed:$[124],aborted:$[124],failed:$[124],timeout:$[124]},statics:{_seqNum:0},properties:{url:{check:$[25],init:""},method:{check:[qx.net.Http.METHOD_GET,qx.net.Http.METHOD_POST,qx.net.Http.METHOD_PUT,qx.net.Http.METHOD_HEAD,qx.net.Http.METHOD_DELETE],apply:"_applyMethod",init:qx.net.Http.METHOD_GET},asynchronous:{check:$[3],init:true},data:{check:$[25],nullable:true},username:{check:$[25],nullable:true},password:{check:$[25],nullable:true},state:{check:[$[103],$[185],$[64],$[67],$[42],$[63],$[65],$[54]],init:$[103],event:$[333]},responseType:{check:[qx.util.Mime.TEXT,qx.util.Mime.JAVASCRIPT,qx.util.Mime.JSON,qx.util.Mime.XML,qx.util.Mime.HTML],init:qx.util.Mime.TEXT},timeout:{check:$[22],nullable:true},prohibitCaching:{check:$[3],init:true,apply:"_applyProhibitCaching"},crossDomain:{check:$[3],init:false},fileUpload:{check:$[3],init:false},transport:{check:$[495],nullable:true},useBasicHttpAuth:{check:$[3],init:false}},members:{send:function(){qx.io.remote.RequestQueue.getInstance().add(this)},abort:function(){qx.io.remote.RequestQueue.getInstance().abort(this)},reset:function(){switch(this.getState()){case $[64]:case $[67]:throw new Error("Aborting already sent request!");case $[185]:this.abort();break}},isConfigured:function(){return this.getState()===$[103]},isQueued:function(){return this.getState()===$[185]},isSending:function(){return this.getState()===$[64]},isReceiving:function(){return this.getState()===$[67]},isCompleted:function(){return this.getState()===$[42]},isAborted:function(){return this.getState()===$[63]},isTimeout:function(){return this.getState()===$[65]},isFailed:function(){return this.getState()===$[54]},_onqueued:function(a){this.setState($[185]);this.dispatchEvent(a)},_onsending:function(a){this.setState($[64]);this.dispatchEvent(a)},_onreceiving:function(a){this.setState($[67]);this.dispatchEvent(a)},_oncompleted:function(a){this.setState($[42]);this.dispatchEvent(a);this.dispose()},_onaborted:function(a){this.setState($[63]);this.dispatchEvent(a);this.dispose()},_ontimeout:function(a){this.setState($[65]);this.dispatchEvent(a);this.dispose()},_onfailed:function(a){this.setState($[54]);this.dispatchEvent(a);this.dispose()},_applyProhibitCaching:function(b,a){if(b){this.setParameter("nocache",new Date().valueOf());this.setRequestHeader("Pragma","no-cache");this.setRequestHeader($[520],"no-cache")}else{this.removeParameter("nocache");this.removeRequestHeader("Pragma");this.removeRequestHeader($[520])}},_applyMethod:function(b,a){if(b===qx.net.Http.METHOD_POST){this.setRequestHeader($[466],"application/x-www-form-urlencoded; charset=UTF-8")}else{this.removeRequestHeader($[466])}},setRequestHeader:function(a,b){this._requestHeaders[a]=b},removeRequestHeader:function(a){delete this._requestHeaders[a]},getRequestHeader:function(a){return this._requestHeaders[a]||null},getRequestHeaders:function(){return this._requestHeaders},setParameter:function(a,b){this._parameters[a]=b},removeParameter:function(a){delete this._parameters[a]},getParameter:function(a){return this._parameters[a]||null},getParameters:function(){return this._parameters},setFormField:function(a,b){this._formFields[a]=b},removeFormField:function(a){delete this._formFields[a]},getFormField:function(a){return this._formFields[a]||null},getFormFields:function(){return this._formFields},getSequenceNumber:function(){return this._seqNum}},destruct:function(){this.setTransport(null);this._disposeFields("_requestHeaders","_parameters","_formFields")}});
 qx.Class.define("qx.ui.popup.PopupAtom",{extend:qx.ui.popup.Popup,construct:function(a,b){arguments.callee.base.call(this);this._atom=new qx.ui.basic.Atom(a,b);this._atom.setParent(this)},members:{_isFocusRoot:false,getAtom:function(){return this._atom}},destruct:function(){this._disposeObjects("_atom")}});
-qx.Class.define($[268],{extend:qx.ui.popup.PopupAtom,construct:function(a,b){arguments.callee.base.call(this,a,b);this.setStyleProperty($[134],"progid:DXImageTransform.Microsoft.Shadow(color='Gray', Direction=135, Strength=4)");this._showTimer=new qx.client.Timer(this.getShowInterval());this._showTimer.addEventListener($[50],this._onshowtimer,this);this._hideTimer=new qx.client.Timer(this.getHideInterval());this._hideTimer.addEventListener($[50],this._onhidetimer,this);this.addEventListener($[9],this._onmouseover);this.addEventListener($[14],this._onmouseover)},properties:{appearance:{refine:true,init:"widget-tool-tip"},hideOnHover:{check:$[3],init:true},mousePointerOffsetX:{check:$[22],init:1},mousePointerOffsetY:{check:$[22],init:20},showInterval:{check:$[22],init:1000,apply:"_applyShowInterval"},hideInterval:{check:$[22],init:4000,apply:"_applyHideInterval"},boundToWidget:{check:$[136],apply:"_applyBoundToWidget"}},members:{_minZIndex:10000000,_applyHideInterval:function(b,a){this._hideTimer.setInterval(b)},_applyShowInterval:function(b,a){this._showTimer.setInterval(b)},_applyBoundToWidget:function(b,a){if(b){this.setParent(b.getTopLevelWidget())}else{if(a){this.setParent(null)}}},_beforeAppear:function(){arguments.callee.base.call(this);this._stopShowTimer();this._startHideTimer()},_beforeDisappear:function(){arguments.callee.base.call(this);this._stopHideTimer()},_afterAppear:function(){arguments.callee.base.call(this);if(this.getRestrictToPageOnOpen()){var z=qx.ui.core.ClientDocument.getInstance();var j=z.getClientWidth();var f=z.getClientHeight();var c=parseInt(this.getRestrictToPageLeft());var t=parseInt(this.getRestrictToPageRight());var y=parseInt(this.getRestrictToPageTop());var d=parseInt(this.getRestrictToPageBottom());var i=(this._wantedLeft==null)?this.getLeft():this._wantedLeft;var p=this.getTop();var s=this.getBoxWidth();var r=this.getBoxHeight();var m=qx.event.type.MouseEvent.getPageX();var l=qx.event.type.MouseEvent.getPageY();var h=this.getLeft();var a=p;if(i+s>j-t){i=j-t-s}if(p+r>f-d){p=f-d-r}if(i<c){i=c}if(p<y){p=y}if(i<=m&&m<=i+s&&p<=l&&l<=p+r){var e=l-p;var v=e-r;var u=m-i;var k=u-s;var b=Math.max(0,y-(p+v));var n=Math.max(0,p+r+e-(f-d));var g=Math.max(0,c-(i+k));var o=Math.max(0,i+s+u-(j-t));var x=[[0,v,b],[0,e,n],[k,0,g],[u,0,o]];x.sort(function(B,A){return B[2]-A[2]||(Math.abs(B[0])+Math.abs(B[1]))-(Math.abs(A[0])+Math.abs(A[1]))});var w=x[0];i=i+w[0];p=p+w[1]}if(i!=h||p!=a){var q=this;window.setTimeout(function(){q.setLeft(i);q.setTop(p)},0)}}},_startShowTimer:function(){if(!this._showTimer.getEnabled()){this._showTimer.start()}},_startHideTimer:function(){if(!this._hideTimer.getEnabled()){this._hideTimer.start()}},_stopShowTimer:function(){if(this._showTimer.getEnabled()){this._showTimer.stop()}},_stopHideTimer:function(){if(this._hideTimer.getEnabled()){this._hideTimer.stop()}},_onmouseover:function(a){if(this.getHideOnHover()){this.hide()}},_onshowtimer:function(a){this.setLeft(qx.event.type.MouseEvent.getPageX()+this.getMousePointerOffsetX());this.setTop(qx.event.type.MouseEvent.getPageY()+this.getMousePointerOffsetY());this.show()},_onhidetimer:function(a){return this.hide()}},destruct:function(){var a=qx.ui.popup.ToolTipManager.getInstance();a.remove(this);if(a.getCurrentToolTip()==this){a.resetCurrentToolTip()}this._disposeObjects("_showTimer","_hideTimer")}});
-qx.Class.define("qx.ui.popup.ToolTipManager",{type:$[33],extend:qx.util.manager.Object,properties:{currentToolTip:{check:$[268],nullable:true,apply:"_applyCurrentToolTip"}},members:{_applyCurrentToolTip:function(b,a){if(a&&a.contains(b)){return}if(a&&!a.isDisposed()){a.hide();a._stopShowTimer();a._stopHideTimer()}if(b){b._startShowTimer()}},handleMouseEvent:function(b){var a=b.getType();if(a===$[9]){this._handleMouseOver(b)}else{if(a===$[14]){this._handleMouseOut(b)}}},_handleMouseOver:function(b){var c=b.getTarget();var a;if(!(c instanceof qx.ui.core.Widget)&&c.nodeType==1){c=org.eclipse.rwt.EventHandlerUtil.getTargetObject(c)}while(c!=null&&!(a=c.getToolTip())){c=c.getParent()}if(a!=null){a.setBoundToWidget(c)}this.setCurrentToolTip(a)},_handleMouseOut:function(c){var d=c.getTarget();var b=c.getRelatedTarget();var a=this.getCurrentToolTip();if(a&&(b==a||a.contains(b))){return}if(b&&d&&d.contains(b)){return}if(a&&!b){this.setCurrentToolTip(null)}},handleFocus:function(b){var c=b.getTarget();var a=c.getToolTip();if(a!=null){a.setBoundToWidget(c);this.setCurrentToolTip(a)}},handleBlur:function(b){var c=b.getTarget();if(!c){return}var a=this.getCurrentToolTip();if(a&&a==c.getToolTip()){this.setCurrentToolTip(null)}}}});
+qx.Class.define($[260],{extend:qx.ui.popup.PopupAtom,construct:function(a,b){arguments.callee.base.call(this,a,b);this.setStyleProperty($[128],"progid:DXImageTransform.Microsoft.Shadow(color='Gray', Direction=135, Strength=4)");this._showTimer=new qx.client.Timer(this.getShowInterval());this._showTimer.addEventListener($[49],this._onshowtimer,this);this._hideTimer=new qx.client.Timer(this.getHideInterval());this._hideTimer.addEventListener($[49],this._onhidetimer,this);this.addEventListener($[9],this._onmouseover);this.addEventListener($[14],this._onmouseover)},properties:{appearance:{refine:true,init:"widget-tool-tip"},hideOnHover:{check:$[3],init:true},mousePointerOffsetX:{check:$[22],init:1},mousePointerOffsetY:{check:$[22],init:20},showInterval:{check:$[22],init:1000,apply:"_applyShowInterval"},hideInterval:{check:$[22],init:4000,apply:"_applyHideInterval"},boundToWidget:{check:$[152],apply:"_applyBoundToWidget"}},members:{_minZIndex:10000000,_applyHideInterval:function(b,a){this._hideTimer.setInterval(b)},_applyShowInterval:function(b,a){this._showTimer.setInterval(b)},_applyBoundToWidget:function(b,a){if(b){this.setParent(b.getTopLevelWidget())}else{if(a){this.setParent(null)}}},_beforeAppear:function(){arguments.callee.base.call(this);this._stopShowTimer();this._startHideTimer()},_beforeDisappear:function(){arguments.callee.base.call(this);this._stopHideTimer()},_afterAppear:function(){arguments.callee.base.call(this);if(this.getRestrictToPageOnOpen()){var z=qx.ui.core.ClientDocument.getInstance();var j=z.getClientWidth();var f=z.getClientHeight();var c=parseInt(this.getRestrictToPageLeft());var t=parseInt(this.getRestrictToPageRight());var y=parseInt(this.getRestrictToPageTop());var d=parseInt(this.getRestrictToPageBottom());var i=(this._wantedLeft==null)?this.getLeft():this._wantedLeft;var p=this.getTop();var s=this.getBoxWidth();var r=this.getBoxHeight();var m=qx.event.type.MouseEvent.getPageX();var l=qx.event.type.MouseEvent.getPageY();var h=this.getLeft();var a=p;if(i+s>j-t){i=j-t-s}if(p+r>f-d){p=f-d-r}if(i<c){i=c}if(p<y){p=y}if(i<=m&&m<=i+s&&p<=l&&l<=p+r){var e=l-p;var v=e-r;var u=m-i;var k=u-s;var b=Math.max(0,y-(p+v));var n=Math.max(0,p+r+e-(f-d));var g=Math.max(0,c-(i+k));var o=Math.max(0,i+s+u-(j-t));var x=[[0,v,b],[0,e,n],[k,0,g],[u,0,o]];x.sort(function(B,A){return B[2]-A[2]||(Math.abs(B[0])+Math.abs(B[1]))-(Math.abs(A[0])+Math.abs(A[1]))});var w=x[0];i=i+w[0];p=p+w[1]}if(i!=h||p!=a){var q=this;window.setTimeout(function(){q.setLeft(i);q.setTop(p)},0)}}},_startShowTimer:function(){if(!this._showTimer.getEnabled()){this._showTimer.start()}},_startHideTimer:function(){if(!this._hideTimer.getEnabled()){this._hideTimer.start()}},_stopShowTimer:function(){if(this._showTimer.getEnabled()){this._showTimer.stop()}},_stopHideTimer:function(){if(this._hideTimer.getEnabled()){this._hideTimer.stop()}},_onmouseover:function(a){if(this.getHideOnHover()){this.hide()}},_onshowtimer:function(a){this.setLeft(qx.event.type.MouseEvent.getPageX()+this.getMousePointerOffsetX());this.setTop(qx.event.type.MouseEvent.getPageY()+this.getMousePointerOffsetY());this.show()},_onhidetimer:function(a){return this.hide()}},destruct:function(){var a=qx.ui.popup.ToolTipManager.getInstance();a.remove(this);if(a.getCurrentToolTip()==this){a.resetCurrentToolTip()}this._disposeObjects("_showTimer","_hideTimer")}});
+qx.Class.define("qx.ui.popup.ToolTipManager",{type:$[33],extend:qx.util.manager.Object,properties:{currentToolTip:{check:$[260],nullable:true,apply:"_applyCurrentToolTip"}},members:{_applyCurrentToolTip:function(b,a){if(a&&a.contains(b)){return}if(a&&!a.isDisposed()){a.hide();a._stopShowTimer();a._stopHideTimer()}if(b){b._startShowTimer()}},handleMouseEvent:function(b){var a=b.getType();if(a===$[9]){this._handleMouseOver(b)}else{if(a===$[14]){this._handleMouseOut(b)}}},_handleMouseOver:function(b){var c=b.getTarget();var a;if(!(c instanceof qx.ui.core.Widget)&&c.nodeType==1){c=org.eclipse.rwt.EventHandlerUtil.getTargetObject(c)}while(c!=null&&!(a=c.getToolTip())){c=c.getParent()}if(a!=null){a.setBoundToWidget(c)}this.setCurrentToolTip(a)},_handleMouseOut:function(c){var d=c.getTarget();var b=c.getRelatedTarget();var a=this.getCurrentToolTip();if(a&&(b==a||a.contains(b))){return}if(b&&d&&d.contains(b)){return}if(a&&!b){this.setCurrentToolTip(null)}},handleFocus:function(b){var c=b.getTarget();var a=c.getToolTip();if(a!=null){a.setBoundToWidget(c);this.setCurrentToolTip(a)}},handleBlur:function(b){var c=b.getTarget();if(!c){return}var a=this.getCurrentToolTip();if(a&&a==c.getToolTip()){this.setCurrentToolTip(null)}}}});
 qx.Class.define("qx.html.Window",{statics:{getInnerWidth:qx.core.Variant.select($[0],{"mshtml|webkit":function(a){if(a.document.documentElement&&a.document.documentElement.clientWidth){return a.document.documentElement.clientWidth}else{if(a.document.body){return a.document.body.clientWidth}}return 0},"default":function(a){return a.innerWidth}}),getInnerHeight:qx.core.Variant.select($[0],{"mshtml|webkit":function(a){if(a.document.documentElement&&a.document.documentElement.clientHeight){return a.document.documentElement.clientHeight}else{if(a.document.body){return a.document.body.clientHeight}}return 0},"default":function(a){return a.innerHeight}}),getScrollLeft:qx.core.Variant.select($[0],{mshtml:function(a){if(a.document.documentElement&&a.document.documentElement.scrollLeft){return a.document.documentElement.scrollLeft}else{if(a.document.body){return a.document.body.scrollTop}}return 0},"default":function(a){return a.document.body.scrollLeft}}),getScrollTop:qx.core.Variant.select($[0],{mshtml:function(a){if(a.document.documentElement&&a.document.documentElement.scrollTop){return a.document.documentElement.scrollTop}else{if(a.document.body){return a.document.body.scrollTop}}return 0},"default":function(a){return a.document.body.scrollTop}})}});
-qx.Class.define("qx.client.History",{type:$[33],extend:qx.core.Target,construct:qx.core.Variant.select($[0],{mshtml:function(){arguments.callee.base.call(this);this._iframe=document.createElement("iframe");this._iframe.style.visibility=$[17];this._iframe.style.position=$[27];this._iframe.style.left="-1000px";this._iframe.style.top="-1000px";var a=qx.io.Alias.getInstance().resolve($[543]);this._iframe.src=a;document.body.appendChild(this._iframe);this._titles={};this._state=decodeURIComponent(this.__getHash());this._locationState=decodeURIComponent(this.__getHash());this.__waitForIFrame(function(){this.__storeState(this._state);this.__startTimer()},this)},"default":function(){arguments.callee.base.call(this);this._titles={};this._state=this.__getState();this.__startTimer()}}),events:{request:$[70]},properties:{timeoutInterval:{check:$[73],init:100,apply:"_applyTimeoutInterval"}},members:{addToHistory:function(a,b){if(b!=null){document.title=b}this._titles[a]=document.title;if(a!=this._state){this._state=a;window.location.hash="#"+encodeURIComponent(a);this.__storeState(a)}},getState:function(){return this._state},navigateBack:function(){qx.client.Timer.once(function(){history.back()},0)},navigateForward:function(){qx.client.Timer.once(function(){history.forward()},0)},_applyTimeoutInterval:function(a){this._timer.setInterval(a)},__onHistoryLoad:function(a){this._state=a;this.createDispatchDataEvent("request",a);if(this._titles[a]!=null){document.title=this._titles[a]}},__startTimer:function(){this._timer=new qx.client.Timer(this.getTimeoutInterval());this._timer.addEventListener($[50],function(b){var a=this.__getState();if(a!=this._state&&this._titles[a]!=null){this.__onHistoryLoad(a)}},this);this._timer.start()},__getHash:function(){var b=window.location.href;var a=b.indexOf("#");return a>=0?b.substring(a+1):""},__getState:qx.core.Variant.select($[0],{mshtml:function(){var d=decodeURIComponent(this.__getHash());if(d!=this._locationState){this._locationState=d;this.__storeState(d);return d}var c=this._iframe.contentWindow.document;var b=c.getElementById("state");var a=b?decodeURIComponent(b.innerText):"";return a},"default":function(){return decodeURIComponent(this.__getHash())}}),__storeState:qx.core.Variant.select($[0],{mshtml:function(c){var b='<html><body><div id="state">'+encodeURIComponent(c)+"</div></body></html>";try{var d=this._iframe.contentWindow.document;d.open();d.write(b);d.close()}catch(a){return false}return true},"default":function(a){qx.client.Timer.once(function(){window.location.hash="#"+encodeURIComponent(a)},this,0);return true}}),__waitForIFrame:qx.core.Variant.select($[0],{mshtml:function(b,a){if(!this._iframe.contentWindow||!this._iframe.contentWindow.document){qx.client.Timer.once(function(){this.__waitForIFrame(b,a)},this,10);return}b.call(a||window)},"default":null})},destruct:function(){this._timer.stop();this._disposeObjects("_timer");this._disposeFields("_iframe","_titles")}});
-qx.Class.define($[279],{type:$[33],extend:qx.util.manager.Object,construct:function(){arguments.callee.base.call(this);this.__data={};this.__actions={};this.__cursors={};var e,d;var c=["move","copy",$[100],"nodrop"];for(var b=0,a=c.length;b<a;b++){d=c[b];e=this.__cursors[d]=new qx.ui.basic.Image;e.setAppearance("cursor-dnd-"+d);e.setZIndex(100000000)}},properties:{sourceWidget:{check:$[136],nullable:true},destinationWidget:{check:$[136],nullable:true,apply:"_applyDestinationWidget"},currentAction:{check:$[25],nullable:true,event:"changeCurrentAction"},defaultCursorDeltaX:{check:$[22],init:5},defaultCursorDeltaY:{check:$[22],init:15}},members:{__lastDestinationEvent:null,_applyDestinationWidget:function(b,a){if(b){b.dispatchEvent(new qx.event.type.DragEvent($[226],this.__lastDestinationEvent,b,this.getSourceWidget()));this.__lastDestinationEvent=null}},addData:function(a,b){this.__data[a]=b},getData:function(a){return this.__data[a]},clearData:function(){this.__data={}},getDropDataTypes:function(){var d=this.getDestinationWidget();var a=[];if(!d){return a}var e=d.getDropDataTypes();for(var c=0,b=e.length;c<b;c++){if(e[c] in this.__data){a.push(e[c])}}return a},getDropTarget:qx.core.Variant.select($[0],{"default":function(b){var a=b.getTarget();while(a!=null){if(!a.supportsDrop(this.__dragCache)){return null}if(this.supportsDrop(a)){return a}a=a.getParent()}return null}}),startDrag:function(){if(!this.__dragCache){throw new Error("Invalid usage of startDrag. Missing dragInfo!")}this.__dragCache.dragHandlerActive=true;this.setSourceWidget(this.__dragCache.sourceWidget);if(this.__feedbackWidget){this.__feedbackWidget.setVisibility(false);var a=qx.ui.core.ClientDocument.getInstance();a.add(this.__feedbackWidget);this.__feedbackWidget.setZIndex(100000000)}},_fireUserEvents:function(b,a,c){if(b&&b!=a&&b.hasEventListeners($[311])){b.dispatchEvent(new qx.event.type.DragEvent($[311],c,b,a),true)}if(a){if(b!=a&&a.hasEventListeners($[152])){a.dispatchEvent(new qx.event.type.DragEvent($[152],c,a,b),true)}if(a.hasEventListeners($[270])){a.dispatchEvent(new qx.event.type.DragEvent($[270],c,a,null),true)}}},handleMouseEvent:function(a){switch(a.getType()){case $[2]:return this._handleMouseDown(a);case $[15]:return this._handleMouseUp(a);case $[45]:return this._handleMouseMove(a)}},_handleMouseDown:function(a){if(a.getDefaultPrevented()||!a.isLeftButtonPressed()){return}if(this.__dragCache==null){this.__dragCache={startScreenX:a.getScreenX(),startScreenY:a.getScreenY(),pageX:a.getPageX(),pageY:a.getPageY(),sourceWidget:a.getTarget(),sourceTopLevel:a.getTarget().getTopLevelWidget(),dragHandlerActive:false,hasFiredDragStart:false}}},_handleMouseMove:function(b){if(!this.__dragCache){return}if(this.__dragCache.dragHandlerActive){this.__dragCache.pageX=b.getPageX();this.__dragCache.pageY=b.getPageY();var a=this.getDropTarget(b);this.setCurrentAction(a?this._evalNewAction(b.isShiftPressed(),b.isCtrlPressed(),b.isAltPressed()):null);this._fireUserEvents(this.__dragCache.currentDropWidget,a,b);this.__dragCache.currentDropWidget=a;this._renderCursor();this._renderFeedbackWidget()}else{if(!this.__dragCache.hasFiredDragStart){if(Math.abs(b.getScreenX()-this.__dragCache.startScreenX)>5||Math.abs(b.getScreenY()-this.__dragCache.startScreenY)>5){this.__dragCache.sourceWidget.dispatchEvent(new qx.event.type.DragEvent($[75],b,this.__dragCache.sourceWidget),true);this.__dragCache.hasFiredDragStart=true;if(this.__dragCache.dragHandlerActive){var c=this.getDropTarget(b);this._fireUserEvents(null,c,b);this.__dragCache.currentDropWidget=c;qx.ui.core.ClientDocument.getInstance().setCapture(true)}}}}},_handleMouseUp:function(a){if(!this.__dragCache){return}if(this.__dragCache.dragHandlerActive){this._endDrag(this.getDropTarget(a),a)}else{this.__dragCache=null}},handleKeyEvent:function(a){if(!this.__dragCache){return}switch(a.getType()){case $[24]:this._handleKeyDown(a);return;case $[60]:this._handleKeyUp(a);return}},_handleKeyDown:function(a){if(a.getKeyIdentifier()==$[116]){this.cancelDrag(a)}else{if(this.getCurrentAction()!=null){switch(a.getKeyIdentifier()){case"Shift":case $[266]:case"Alt":this.setAction(this._evalNewAction(a.isShiftPressed(),a.isCtrlPressed(),a.isAltPressed()));this._renderCursor();a.preventDefault()}}}},_handleKeyUp:function(d){var c=d.getKeyIdentifier()=="Shift";var b=d.getKeyIdentifier()==$[266];var a=d.getKeyIdentifier()=="Alt";if(c||b||a){if(this.getCurrentAction()!=null){this.setAction(this._evalNewAction(!c&&d.isShiftPressed(),!b&&d.isCtrlPressed(),!a&&d.isAltPressed()));this._renderCursor();d.preventDefault()}}},cancelDrag:function(a){if(!this.__dragCache){return}if(this.__dragCache.dragHandlerActive){this._endDrag(null,a)}else{this.__dragCache=null}},globalCancelDrag:function(){if(this.__dragCache&&this.__dragCache.dragHandlerActive){this._endDragCore()}},_endDrag:function(a,b){if(a){this.__lastDestinationEvent=b;this.setDestinationWidget(a)}this.getSourceWidget().dispatchEvent(new qx.event.type.DragEvent($[292],b,this.getSourceWidget(),a),true);this._endDragCore()},_endDragCore:function(){if(this.__feedbackWidget){var b=qx.ui.core.ClientDocument.getInstance();b.remove(this.__feedbackWidget);if(this.__feedbackAutoDispose){this.__feedbackWidget.destroy()}this.__feedbackWidget=null}var a=this.__cursor;if(a){a._style.display="none";this.__cursor=null}this._cursorDeltaX=null;this._cursorDeltaY=null;if(this.__dragCache){this.__dragCache.currentDropWidget=null;this.__dragCache=null}qx.ui.core.ClientDocument.getInstance().setCapture(false);this.clearData();this.clearActions();this.setSourceWidget(null);this.setDestinationWidget(null)},setCursorPosition:function(b,a){this._cursorDeltaX=b;this._cursorDeltaY=a},_renderCursor:function(){var b;var a=this.__cursor;switch(this.getCurrentAction()){case"move":b=this.__cursors.move;break;case"copy":b=this.__cursors.copy;break;case $[100]:b=this.__cursors.alias;break;default:b=this.__cursors.nodrop}if(b!=a&&a!=null){a._style.display="none"}if(!b._initialLayoutDone){qx.ui.core.ClientDocument.getInstance().add(b);qx.ui.core.Widget.flushGlobalQueues()}b._renderRuntimeLeft(this.__dragCache.pageX+((this._cursorDeltaX!=null)?this._cursorDeltaX:this.getDefaultCursorDeltaX()));b._renderRuntimeTop(this.__dragCache.pageY+((this._cursorDeltaY!=null)?this._cursorDeltaY:this.getDefaultCursorDeltaY()));if(b!=a){b._style.display=""}this.__cursor=b},supportsDrop:function(c){var b=c.getDropDataTypes();if(!b){return false}for(var a=0;a<b.length;a++){if(b[a] in this.__data){return true}}return false},addAction:function(b,a){this.__actions[b]=true;if(a||this.getCurrentAction()==null){this.setCurrentAction(b)}},clearActions:function(){this.__actions={};this.setCurrentAction(null)},removeAction:function(a){delete this.__actions[a];if(this.getCurrentAction()==a){this.setCurrentAction(null)}},setAction:function(a){if(a!=null&&!(a in this.__actions)){this.addAction(a,true)}else{this.setCurrentAction(a)}},_evalNewAction:function(d,b,a){if(d&&b&&$[100] in this.__actions){return $[100]}else{if(d&&a&&"copy" in this.__actions){return"copy"}else{if(d&&"move" in this.__actions){return"move"}else{if(a&&$[100] in this.__actions){return $[100]}else{if(b&&"copy" in this.__actions){return"copy"}else{for(var c in this.__actions){return c}}}}}}return null},setFeedbackWidget:function(d,c,b,a){this.__feedbackWidget=d;this.__feedbackDeltaX=(c!=null)?c:10;this.__feedbackDeltaY=(b!=null)?b:10;this.__feedbackAutoDispose=a?true:false},_renderFeedbackWidget:function(){if(this.__feedbackWidget){this.__feedbackWidget.setVisibility(true);this.__feedbackWidget._renderRuntimeLeft(this.__dragCache.pageX+this.__feedbackDeltaX);this.__feedbackWidget._renderRuntimeTop(this.__dragCache.pageY+this.__feedbackDeltaY)}}},destruct:function(){this._disposeObjectDeep("__cursors",1);this._disposeObjects("__feedbackWidget");this._disposeFields("__dragCache","__data","__actions","__lastDestinationEvent")}});
-qx.Class.define($[164],{extend:qx.event.type.MouseEvent,construct:function(d,a,e,c){this._mouseEvent=a;var b=null;switch(d){case $[75]:case $[152]:b=a.getOriginalTarget()}arguments.callee.base.call(this,d,a.getDomEvent(),e.getElement(),e,b,c)},members:{getMouseEvent:function(){return this._mouseEvent},startDrag:function(){if(this.getType()!=$[75]){throw new Error("qx.event.type.DragEvent startDrag can only be called during the dragstart event: "+this.getType())}this.stopPropagation();qx.event.handler.DragAndDropHandler.getInstance().startDrag()},addData:function(b,a){qx.event.handler.DragAndDropHandler.getInstance().addData(b,a)},getData:function(a){return qx.event.handler.DragAndDropHandler.getInstance().getData(a)},clearData:function(){qx.event.handler.DragAndDropHandler.getInstance().clearData()},getDropDataTypes:function(){return qx.event.handler.DragAndDropHandler.getInstance().getDropDataTypes()},addAction:function(a){qx.event.handler.DragAndDropHandler.getInstance().addAction(a)},removeAction:function(a){qx.event.handler.DragAndDropHandler.getInstance().removeAction(a)},getAction:function(){return qx.event.handler.DragAndDropHandler.getInstance().getCurrentAction()},clearActions:function(){qx.event.handler.DragAndDropHandler.getInstance().clearActions()},setFeedbackWidget:function(d,c,b,a){qx.event.handler.DragAndDropHandler.getInstance().setFeedbackWidget(d,c,b,a)},setCursorPosition:function(b,a){qx.event.handler.DragAndDropHandler.getInstance().setCursorPosition(b,a)}},destruct:function(){this._disposeFields("_mouseEvent")}});
-qx.Class.define("qx.ui.embed.HtmlEmbed",{extend:qx.ui.basic.Terminator,construct:function(a){arguments.callee.base.call(this);if(a!=null){this.setHtml(a)}},properties:{html:{check:$[25],init:"",apply:"_applyHtml",event:$[330]},textAlign:{check:["left",$[38],$[23],"justify"],nullable:true,themeable:true,apply:$[400]},font:{refine:true,init:null},textColor:{refine:true,init:null}},members:{_applyHtml:function(){if(this._isCreated){this._syncHtml()}},_applyTextAlign:function(b,a){b===null?this.removeStyleProperty($[278]):this.setStyleProperty($[278],b)},_applyFont:function(b,a){qx.theme.manager.Font.getInstance().connect(this._styleFont,this,b)},_styleFont:function(a){a?a.render(this):qx.ui.core.Font.reset(this)},_applyTextColor:function(b,a){qx.theme.manager.Color.getInstance().connect(this._styleTextColor,this,b)},_styleTextColor:function(a){a?this.setStyleProperty($[6],a):this.removeStyleProperty($[6])},_applyElementData:function(){this._syncHtml()},_syncHtml:function(){this._getTargetNode().innerHTML=this.getHtml()}}});
-qx.Class.define("qx.ui.embed.Iframe",{extend:qx.ui.basic.Terminator,construct:function(a){arguments.callee.base.call(this);this.initSelectable();this.initTabIndex();this.initScrolling();if(a!=null){this.setSource(a)}},events:{load:$[11]},statics:{load:function(b){try{if(!b){throw new Error("Could not find iframe which was loaded [A]!")}if(b.currentTarget){b=b.currentTarget}if(b._QxIframe){b._QxIframe._onload()}else{if(b.parentNode){throw new Error("Could not find iframe which was loaded [B]!")}}}catch(a){org.eclipse.rwt.ErrorHandler.processJavaScriptError(a)}},_useAlternateLayouting:function(){return org.eclipse.rwt.Client.isMobileSafari()}},properties:{tabIndex:{refine:true,init:0},selectable:{refine:true,init:false},appearance:{refine:true,init:"iframe"},source:{check:$[25],apply:$[440],event:$[420],nullable:true},frameName:{check:$[25],init:"",apply:"_applyFrameName"},scrolling:{check:["yes","no","auto"],init:"auto",apply:"_applyScrolling"}},members:{getIframeNode:function(){return this._iframeNode},setIframeNode:function(a){return this._iframeNode=a},getBlockerNode:function(){return this._blockerNode},setBlockerNode:function(a){return this._blockerNode=a},getContentWindow:function(){if(this.isCreated()){return qx.html.Iframe.getWindow(this.getIframeNode())}else{return null}},getContentDocument:function(){if(this.isCreated()){return qx.html.Iframe.getDocument(this.getIframeNode())}else{return null}},isLoaded:qx.core.Variant.select($[0],{mshtml:function(){var a=this.getContentDocument();return a?a.readyState=="complete":false},"default":function(){return this._isLoaded}}),reload:function(){if(this.isCreated()&&this.getContentWindow()){this._isLoaded=false;var b=this.queryCurrentUrl()||this.getSource();try{try{this.getContentWindow().location.replace(b)}catch(a){this.getIframeNode().src=b}}catch(a){throw new Error($[566])}}},queryCurrentUrl:function(){var b=this.getContentDocument();try{if(b&&b.location){return b.location.href}}catch(a){}return null},block:function(){if(this._blockerNode&&(!this._blockerNode.parentElement||(qx.core.Variant.isSet($[0],$[40])&&!this._blockerNode.parentNode))){this._getBlockerParent().appendChild(this._blockerNode)}},release:function(){if(this._blockerNode&&(this._blockerNode.parentElement||(qx.core.Variant.isSet($[0],$[40])&&this._blockerNode.parentNode))){this._getBlockerParent().removeChild(this._blockerNode)}},_getBlockerParent:function(){var a=this.getElement();if(this._innerStyle){return a.firstChild}else{return a}},_generateIframeElement:function(){var b=this.getFrameName();if(qx.core.Variant.isSet($[0],$[18])){var c=b?'name="'+b+'"':"";var a=qx.ui.embed.Iframe._element=document.createElement("<iframe "+c+" ></iframe>");a.attachEvent("onload",function(){qx.ui.embed.Iframe.load(a)})}else{var a=qx.ui.embed.Iframe._element=document.createElement("iframe");a.onload=qx.ui.embed.Iframe.load;if(b){a.name=b}}a._QxIframe=this;a.frameBorder="0";a.frameSpacing="0";a.marginWidth="0";a.marginHeight="0";if(!qx.ui.embed.Iframe._useAlternateLayouting()){a.width="100%";a.height="100%"}a.hspace="0";a.vspace="0";a.border="0";a.unselectable="on";a.allowTransparency="true";a.style.position=$[27];a.style.top=0;a.style.left=0;return a},_generateBlockerElement:function(){var b=qx.ui.embed.Iframe._blocker=document.createElement("div");var a=b.style;if(qx.core.Variant.isSet($[0],$[18])){a.backgroundColor="white";a.filter="Alpha(Opacity=0)"}a.position=$[27];a.top=0;a.left=0;a.width="100%";a.height="100%";a.zIndex=1;return b},_applyElement:function(d,b){var a=this.setIframeNode(this._generateIframeElement());var c=this.setBlockerNode(this._generateBlockerElement());this._syncSource();this._syncScrolling();d.appendChild(a);arguments.callee.base.call(this,d,b)},_beforeAppear:function(){arguments.callee.base.call(this);qx.ui.embed.IframeManager.getInstance().add(this)},_beforeDisappear:function(){arguments.callee.base.call(this);qx.ui.embed.IframeManager.getInstance().remove(this)},_applySource:function(b,a){if(this.isCreated()){this._syncSource()}},_syncSource:function(){var b=this.getSource();if(b==null||b===""){b=qx.io.Alias.getInstance().resolve($[543])}this._isLoaded=false;try{if(this.getContentWindow()){try{this.getContentWindow().location.replace(b)}catch(a){this.getIframeNode().src=b}}else{this.getIframeNode().src=b}}catch(a){throw new Error($[566])}},_applyScrolling:function(b,a){if(this.isCreated()){this._syncScrolling()}},_syncScrolling:function(){this.getIframeNode().setAttribute("scrolling",this.getScrolling())},_applyFrameName:function(c,a,b,d){if(this.isCreated()){throw new Error("Not allowed to set frame name after it has been created")}},_onload:function(){if(!this._isLoaded){this._isLoaded=true;this.createDispatchEvent("load")}},destroy:function(){var a=qx.core.Variant.isSet($[0],$[18]);var b="javascript:false;";if(a&&this._iframeNode&&this.getSource()!==b){this.setStyleProperty($[115],$[17]);this.addToDocument();this.addEventListener("load",function(){this.destroy()},this);this.setSource(b)}else{arguments.callee.base.call(this)}},_isLoaded:false},defer:function(e,a){if(qx.ui.embed.Iframe._useAlternateLayouting()){var c=a._renderRuntimeWidth;var d=a._renderRuntimeHeight;var b=a._resetRuntimeWidth;var g=a._resetRuntimeHeight;a._renderRuntimeWidth=function(h){c.call(this,h);this._iframeNode.style.minWidth=h+"px";this._iframeNode.style.maxWidth=h+"px"};var f=a._renderRuntimeHeight;a._renderRuntimeHeight=function(h){d.call(this,h);this._iframeNode.style.minHeight=h+"px";this._iframeNode.style.maxHeight=h+"px"};a._resetRuntimeWidth=function(h){b.call(this,h);this._iframeNode.style.minWidth="";this._iframeNode.style.maxWidth=""};a._resetRuntimeHeight=function(h){g.call(this,h);this._iframeNode.style.minHeight="";this._iframeNode.style.maxHeight=""}}},destruct:function(){if(this._iframeNode){this._iframeNode._QxIframe=null;this._iframeNode.onload=null;this._iframeNode=null;this._getTargetNode().innerHTML=""}this._disposeFields("__onload","_blockerNode")}});
-qx.Class.define($[443],{type:$[102],extend:qx.ui.basic.Atom,construct:function(e,d,c,a,b){arguments.callee.base.call(this,e,d,c,a,b);this.initChecked();this.initTabIndex();this.addEventListener($[9],this._onmouseover);this.addEventListener($[14],this._onmouseout);this.addEventListener($[2],this._onmousedown);this.addEventListener($[24],this._onkeydown);this.addEventListener($[12],this._onkeypress)},properties:{tabIndex:{refine:true,init:1},checked:{check:$[3],init:false,apply:"_applyChecked",event:$[500]},page:{check:$[451],apply:"_applyPage",nullable:true},manager:{check:$[455],nullable:true,apply:$[567]},name:{check:$[25],apply:"_applyName"}},members:{getView:function(){var a=this.getParent();return a?a.getParent():null},_applyManager:function(b,a){if(a){a.remove(this)}if(b){b.add(this)}},_applyParent:function(b,a){arguments.callee.base.call(this,b,a);if(a){a.getManager().remove(this)}if(b){b.getManager().add(this)}},_applyPage:function(b,a){if(a){a.setButton(null)}if(b){b.setButton(this);this.getChecked()?b.show():b.hide()}},_applyChecked:function(c,b){if(this._hasParent){var a=this.getManager();if(a){a.handleItemChecked(this,c)}}c?this.addState($[199]):this.removeState($[199]);var d=this.getPage();if(d){this.getChecked()?d.show():d.hide()}},_applyName:function(b,a){if(this.getManager()){this.getManager().setName(b)}},_onmousedown:function(a){this.setChecked(true)},_onmouseover:function(a){this.addState("over")},_onmouseout:function(a){this.removeState("over")},_onkeydown:function(a){},_onkeypress:function(a){}}});
+qx.Class.define("qx.client.History",{type:$[33],extend:qx.core.Target,construct:qx.core.Variant.select($[0],{mshtml:function(){arguments.callee.base.call(this);this._iframe=document.createElement("iframe");this._iframe.style.visibility=$[17];this._iframe.style.position=$[28];this._iframe.style.left="-1000px";this._iframe.style.top="-1000px";var a=qx.io.Alias.getInstance().resolve($[526]);this._iframe.src=a;document.body.appendChild(this._iframe);this._titles={};this._state=decodeURIComponent(this.__getHash());this._locationState=decodeURIComponent(this.__getHash());this.__waitForIFrame(function(){this.__storeState(this._state);this.__startTimer()},this)},"default":function(){arguments.callee.base.call(this);this._titles={};this._state=this.__getState();this.__startTimer()}}),events:{request:$[68]},properties:{timeoutInterval:{check:$[73],init:100,apply:"_applyTimeoutInterval"}},members:{addToHistory:function(a,b){if(b!=null){document.title=b}this._titles[a]=document.title;if(a!=this._state){this._state=a;window.location.hash="#"+encodeURIComponent(a);this.__storeState(a)}},getState:function(){return this._state},navigateBack:function(){qx.client.Timer.once(function(){history.back()},0)},navigateForward:function(){qx.client.Timer.once(function(){history.forward()},0)},_applyTimeoutInterval:function(a){this._timer.setInterval(a)},__onHistoryLoad:function(a){this._state=a;this.createDispatchDataEvent("request",a);if(this._titles[a]!=null){document.title=this._titles[a]}},__startTimer:function(){this._timer=new qx.client.Timer(this.getTimeoutInterval());this._timer.addEventListener($[49],function(b){var a=this.__getState();if(a!=this._state&&this._titles[a]!=null){this.__onHistoryLoad(a)}},this);this._timer.start()},__getHash:function(){var b=window.location.href;var a=b.indexOf("#");return a>=0?b.substring(a+1):""},__getState:qx.core.Variant.select($[0],{mshtml:function(){var d=decodeURIComponent(this.__getHash());if(d!=this._locationState){this._locationState=d;this.__storeState(d);return d}var c=this._iframe.contentWindow.document;var b=c.getElementById("state");var a=b?decodeURIComponent(b.innerText):"";return a},"default":function(){return decodeURIComponent(this.__getHash())}}),__storeState:qx.core.Variant.select($[0],{mshtml:function(c){var b='<html><body><div id="state">'+encodeURIComponent(c)+"</div></body></html>";try{var d=this._iframe.contentWindow.document;d.open();d.write(b);d.close()}catch(a){return false}return true},"default":function(a){qx.client.Timer.once(function(){window.location.hash="#"+encodeURIComponent(a)},this,0);return true}}),__waitForIFrame:qx.core.Variant.select($[0],{mshtml:function(b,a){if(!this._iframe.contentWindow||!this._iframe.contentWindow.document){qx.client.Timer.once(function(){this.__waitForIFrame(b,a)},this,10);return}b.call(a||window)},"default":null})},destruct:function(){this._timer.stop();this._disposeObjects("_timer");this._disposeFields("_iframe","_titles")}});
+qx.Class.define($[304],{type:$[33],extend:qx.util.manager.Object,construct:function(){arguments.callee.base.call(this);this.__data={};this.__actions={};this.__cursors={};var e,d;var c=["move","copy",$[109],"nodrop"];for(var b=0,a=c.length;b<a;b++){d=c[b];e=this.__cursors[d]=new qx.ui.basic.Image;e.setAppearance("cursor-dnd-"+d);e.setZIndex(100000000)}},properties:{sourceWidget:{check:$[152],nullable:true},destinationWidget:{check:$[152],nullable:true,apply:"_applyDestinationWidget"},currentAction:{check:$[25],nullable:true,event:"changeCurrentAction"},defaultCursorDeltaX:{check:$[22],init:5},defaultCursorDeltaY:{check:$[22],init:15}},members:{__lastDestinationEvent:null,_applyDestinationWidget:function(b,a){if(b){b.dispatchEvent(new qx.event.type.DragEvent($[244],this.__lastDestinationEvent,b,this.getSourceWidget()));this.__lastDestinationEvent=null}},addData:function(a,b){this.__data[a]=b},getData:function(a){return this.__data[a]},clearData:function(){this.__data={}},getDropDataTypes:function(){var d=this.getDestinationWidget();var a=[];if(!d){return a}var e=d.getDropDataTypes();for(var c=0,b=e.length;c<b;c++){if(e[c] in this.__data){a.push(e[c])}}return a},getDropTarget:qx.core.Variant.select($[0],{"default":function(b){var a=b.getTarget();while(a!=null){if(!a.supportsDrop(this.__dragCache)){return null}if(this.supportsDrop(a)){return a}a=a.getParent()}return null}}),startDrag:function(){if(!this.__dragCache){throw new Error("Invalid usage of startDrag. Missing dragInfo!")}this.__dragCache.dragHandlerActive=true;this.setSourceWidget(this.__dragCache.sourceWidget);if(this.__feedbackWidget){this.__feedbackWidget.setVisibility(false);var a=qx.ui.core.ClientDocument.getInstance();a.add(this.__feedbackWidget);this.__feedbackWidget.setZIndex(100000000)}},_fireUserEvents:function(b,a,c){if(b&&b!=a&&b.hasEventListeners($[292])){b.dispatchEvent(new qx.event.type.DragEvent($[292],c,b,a),true)}if(a){if(b!=a&&a.hasEventListeners($[138])){a.dispatchEvent(new qx.event.type.DragEvent($[138],c,a,b),true)}if(a.hasEventListeners($[267])){a.dispatchEvent(new qx.event.type.DragEvent($[267],c,a,null),true)}}},handleMouseEvent:function(a){switch(a.getType()){case $[2]:return this._handleMouseDown(a);case $[15]:return this._handleMouseUp(a);case $[45]:return this._handleMouseMove(a)}},_handleMouseDown:function(a){if(a.getDefaultPrevented()||!a.isLeftButtonPressed()){return}if(this.__dragCache==null){this.__dragCache={startScreenX:a.getScreenX(),startScreenY:a.getScreenY(),pageX:a.getPageX(),pageY:a.getPageY(),sourceWidget:a.getTarget(),sourceTopLevel:a.getTarget().getTopLevelWidget(),dragHandlerActive:false,hasFiredDragStart:false}}},_handleMouseMove:function(b){if(!this.__dragCache){return}if(this.__dragCache.dragHandlerActive){this.__dragCache.pageX=b.getPageX();this.__dragCache.pageY=b.getPageY();var a=this.getDropTarget(b);this.setCurrentAction(a?this._evalNewAction(b.isShiftPressed(),b.isCtrlPressed(),b.isAltPressed()):null);this._fireUserEvents(this.__dragCache.currentDropWidget,a,b);this.__dragCache.currentDropWidget=a;this._renderCursor();this._renderFeedbackWidget()}else{if(!this.__dragCache.hasFiredDragStart){if(Math.abs(b.getScreenX()-this.__dragCache.startScreenX)>5||Math.abs(b.getScreenY()-this.__dragCache.startScreenY)>5){this.__dragCache.sourceWidget.dispatchEvent(new qx.event.type.DragEvent($[72],b,this.__dragCache.sourceWidget),true);this.__dragCache.hasFiredDragStart=true;if(this.__dragCache.dragHandlerActive){var c=this.getDropTarget(b);this._fireUserEvents(null,c,b);this.__dragCache.currentDropWidget=c;qx.ui.core.ClientDocument.getInstance().setCapture(true)}}}}},_handleMouseUp:function(a){if(!this.__dragCache){return}if(this.__dragCache.dragHandlerActive){this._endDrag(this.getDropTarget(a),a)}else{this.__dragCache=null}},handleKeyEvent:function(a){if(!this.__dragCache){return}switch(a.getType()){case $[23]:this._handleKeyDown(a);return;case $[60]:this._handleKeyUp(a);return}},_handleKeyDown:function(a){if(a.getKeyIdentifier()==$[118]){this.cancelDrag(a)}else{if(this.getCurrentAction()!=null){switch(a.getKeyIdentifier()){case"Shift":case $[317]:case"Alt":this.setAction(this._evalNewAction(a.isShiftPressed(),a.isCtrlPressed(),a.isAltPressed()));this._renderCursor();a.preventDefault()}}}},_handleKeyUp:function(d){var c=d.getKeyIdentifier()=="Shift";var b=d.getKeyIdentifier()==$[317];var a=d.getKeyIdentifier()=="Alt";if(c||b||a){if(this.getCurrentAction()!=null){this.setAction(this._evalNewAction(!c&&d.isShiftPressed(),!b&&d.isCtrlPressed(),!a&&d.isAltPressed()));this._renderCursor();d.preventDefault()}}},cancelDrag:function(a){if(!this.__dragCache){return}if(this.__dragCache.dragHandlerActive){this._endDrag(null,a)}else{this.__dragCache=null}},globalCancelDrag:function(){if(this.__dragCache&&this.__dragCache.dragHandlerActive){this._endDragCore()}},_endDrag:function(a,b){if(a){this.__lastDestinationEvent=b;this.setDestinationWidget(a)}this.getSourceWidget().dispatchEvent(new qx.event.type.DragEvent($[289],b,this.getSourceWidget(),a),true);this._endDragCore()},_endDragCore:function(){if(this.__feedbackWidget){var b=qx.ui.core.ClientDocument.getInstance();b.remove(this.__feedbackWidget);if(this.__feedbackAutoDispose){this.__feedbackWidget.destroy()}this.__feedbackWidget=null}var a=this.__cursor;if(a){a._style.display="none";this.__cursor=null}this._cursorDeltaX=null;this._cursorDeltaY=null;if(this.__dragCache){this.__dragCache.currentDropWidget=null;this.__dragCache=null}qx.ui.core.ClientDocument.getInstance().setCapture(false);this.clearData();this.clearActions();this.setSourceWidget(null);this.setDestinationWidget(null)},setCursorPosition:function(b,a){this._cursorDeltaX=b;this._cursorDeltaY=a},_renderCursor:function(){var b;var a=this.__cursor;switch(this.getCurrentAction()){case"move":b=this.__cursors.move;break;case"copy":b=this.__cursors.copy;break;case $[109]:b=this.__cursors.alias;break;default:b=this.__cursors.nodrop}if(b!=a&&a!=null){a._style.display="none"}if(!b._initialLayoutDone){qx.ui.core.ClientDocument.getInstance().add(b);qx.ui.core.Widget.flushGlobalQueues()}b._renderRuntimeLeft(this.__dragCache.pageX+((this._cursorDeltaX!=null)?this._cursorDeltaX:this.getDefaultCursorDeltaX()));b._renderRuntimeTop(this.__dragCache.pageY+((this._cursorDeltaY!=null)?this._cursorDeltaY:this.getDefaultCursorDeltaY()));if(b!=a){b._style.display=""}this.__cursor=b},supportsDrop:function(c){var b=c.getDropDataTypes();if(!b){return false}for(var a=0;a<b.length;a++){if(b[a] in this.__data){return true}}return false},addAction:function(b,a){this.__actions[b]=true;if(a||this.getCurrentAction()==null){this.setCurrentAction(b)}},clearActions:function(){this.__actions={};this.setCurrentAction(null)},removeAction:function(a){delete this.__actions[a];if(this.getCurrentAction()==a){this.setCurrentAction(null)}},setAction:function(a){if(a!=null&&!(a in this.__actions)){this.addAction(a,true)}else{this.setCurrentAction(a)}},_evalNewAction:function(d,b,a){if(d&&b&&$[109] in this.__actions){return $[109]}else{if(d&&a&&"copy" in this.__actions){return"copy"}else{if(d&&"move" in this.__actions){return"move"}else{if(a&&$[109] in this.__actions){return $[109]}else{if(b&&"copy" in this.__actions){return"copy"}else{for(var c in this.__actions){return c}}}}}}return null},setFeedbackWidget:function(d,c,b,a){this.__feedbackWidget=d;this.__feedbackDeltaX=(c!=null)?c:10;this.__feedbackDeltaY=(b!=null)?b:10;this.__feedbackAutoDispose=a?true:false},_renderFeedbackWidget:function(){if(this.__feedbackWidget){this.__feedbackWidget.setVisibility(true);this.__feedbackWidget._renderRuntimeLeft(this.__dragCache.pageX+this.__feedbackDeltaX);this.__feedbackWidget._renderRuntimeTop(this.__dragCache.pageY+this.__feedbackDeltaY)}}},destruct:function(){this._disposeObjectDeep("__cursors",1);this._disposeObjects("__feedbackWidget");this._disposeFields("__dragCache","__data","__actions","__lastDestinationEvent")}});
+qx.Class.define($[165],{extend:qx.event.type.MouseEvent,construct:function(d,a,e,c){this._mouseEvent=a;var b=null;switch(d){case $[72]:case $[138]:b=a.getOriginalTarget()}arguments.callee.base.call(this,d,a.getDomEvent(),e.getElement(),e,b,c)},members:{getMouseEvent:function(){return this._mouseEvent},startDrag:function(){if(this.getType()!=$[72]){throw new Error("qx.event.type.DragEvent startDrag can only be called during the dragstart event: "+this.getType())}this.stopPropagation();qx.event.handler.DragAndDropHandler.getInstance().startDrag()},addData:function(b,a){qx.event.handler.DragAndDropHandler.getInstance().addData(b,a)},getData:function(a){return qx.event.handler.DragAndDropHandler.getInstance().getData(a)},clearData:function(){qx.event.handler.DragAndDropHandler.getInstance().clearData()},getDropDataTypes:function(){return qx.event.handler.DragAndDropHandler.getInstance().getDropDataTypes()},addAction:function(a){qx.event.handler.DragAndDropHandler.getInstance().addAction(a)},removeAction:function(a){qx.event.handler.DragAndDropHandler.getInstance().removeAction(a)},getAction:function(){return qx.event.handler.DragAndDropHandler.getInstance().getCurrentAction()},clearActions:function(){qx.event.handler.DragAndDropHandler.getInstance().clearActions()},setFeedbackWidget:function(d,c,b,a){qx.event.handler.DragAndDropHandler.getInstance().setFeedbackWidget(d,c,b,a)},setCursorPosition:function(b,a){qx.event.handler.DragAndDropHandler.getInstance().setCursorPosition(b,a)}},destruct:function(){this._disposeFields("_mouseEvent")}});
+qx.Class.define("qx.ui.embed.HtmlEmbed",{extend:qx.ui.basic.Terminator,construct:function(a){arguments.callee.base.call(this);if(a!=null){this.setHtml(a)}},properties:{html:{check:$[25],init:"",apply:"_applyHtml",event:$[367]},textAlign:{check:["left",$[37],$[24],"justify"],nullable:true,themeable:true,apply:$[376]},font:{refine:true,init:null},textColor:{refine:true,init:null}},members:{_applyHtml:function(){if(this._isCreated){this._syncHtml()}},_applyTextAlign:function(b,a){b===null?this.removeStyleProperty($[281]):this.setStyleProperty($[281],b)},_applyFont:function(b,a){qx.theme.manager.Font.getInstance().connect(this._styleFont,this,b)},_styleFont:function(a){a?a.render(this):qx.ui.core.Font.reset(this)},_applyTextColor:function(b,a){qx.theme.manager.Color.getInstance().connect(this._styleTextColor,this,b)},_styleTextColor:function(a){a?this.setStyleProperty($[6],a):this.removeStyleProperty($[6])},_applyElementData:function(){this._syncHtml()},_syncHtml:function(){this._getTargetNode().innerHTML=this.getHtml()}}});
+qx.Class.define("qx.ui.embed.Iframe",{extend:qx.ui.basic.Terminator,construct:function(a){arguments.callee.base.call(this);this.initSelectable();this.initTabIndex();this.initScrolling();if(a!=null){this.setSource(a)}},events:{load:$[11]},statics:{load:function(b){try{if(!b){throw new Error("Could not find iframe which was loaded [A]!")}if(b.currentTarget){b=b.currentTarget}if(b._QxIframe){b._QxIframe._onload()}else{if(b.parentNode){throw new Error("Could not find iframe which was loaded [B]!")}}}catch(a){org.eclipse.rwt.ErrorHandler.processJavaScriptError(a)}},_useAlternateLayouting:function(){return org.eclipse.rwt.Client.isMobileSafari()}},properties:{tabIndex:{refine:true,init:0},selectable:{refine:true,init:false},appearance:{refine:true,init:"iframe"},source:{check:$[25],apply:$[525],event:$[416],nullable:true},frameName:{check:$[25],init:"",apply:"_applyFrameName"},scrolling:{check:["yes","no","auto"],init:"auto",apply:"_applyScrolling"}},members:{getIframeNode:function(){return this._iframeNode},setIframeNode:function(a){return this._iframeNode=a},getBlockerNode:function(){return this._blockerNode},setBlockerNode:function(a){return this._blockerNode=a},getContentWindow:function(){if(this.isCreated()){return qx.html.Iframe.getWindow(this.getIframeNode())}else{return null}},getContentDocument:function(){if(this.isCreated()){return qx.html.Iframe.getDocument(this.getIframeNode())}else{return null}},isLoaded:qx.core.Variant.select($[0],{mshtml:function(){var a=this.getContentDocument();return a?a.readyState=="complete":false},"default":function(){return this._isLoaded}}),reload:function(){if(this.isCreated()&&this.getContentWindow()){this._isLoaded=false;var b=this.queryCurrentUrl()||this.getSource();try{try{this.getContentWindow().location.replace(b)}catch(a){this.getIframeNode().src=b}}catch(a){throw new Error($[507])}}},queryCurrentUrl:function(){var b=this.getContentDocument();try{if(b&&b.location){return b.location.href}}catch(a){}return null},block:function(){if(this._blockerNode&&(!this._blockerNode.parentElement||(qx.core.Variant.isSet($[0],$[40])&&!this._blockerNode.parentNode))){this._getBlockerParent().appendChild(this._blockerNode)}},release:function(){if(this._blockerNode&&(this._blockerNode.parentElement||(qx.core.Variant.isSet($[0],$[40])&&this._blockerNode.parentNode))){this._getBlockerParent().removeChild(this._blockerNode)}},_getBlockerParent:function(){var a=this.getElement();if(this._innerStyle){return a.firstChild}else{return a}},_generateIframeElement:function(){var b=this.getFrameName();if(qx.core.Variant.isSet($[0],$[18])){var c=b?'name="'+b+'"':"";var a=qx.ui.embed.Iframe._element=document.createElement("<iframe "+c+" ></iframe>");a.attachEvent("onload",function(){qx.ui.embed.Iframe.load(a)})}else{var a=qx.ui.embed.Iframe._element=document.createElement("iframe");a.onload=qx.ui.embed.Iframe.load;if(b){a.name=b}}a._QxIframe=this;a.frameBorder="0";a.frameSpacing="0";a.marginWidth="0";a.marginHeight="0";if(!qx.ui.embed.Iframe._useAlternateLayouting()){a.width="100%";a.height="100%"}a.hspace="0";a.vspace="0";a.border="0";a.unselectable="on";a.allowTransparency="true";a.style.position=$[28];a.style.top=0;a.style.left=0;return a},_generateBlockerElement:function(){var b=qx.ui.embed.Iframe._blocker=document.createElement("div");var a=b.style;if(qx.core.Variant.isSet($[0],$[18])){a.backgroundColor="white";a.filter="Alpha(Opacity=0)"}a.position=$[28];a.top=0;a.left=0;a.width="100%";a.height="100%";a.zIndex=1;return b},_applyElement:function(d,b){var a=this.setIframeNode(this._generateIframeElement());var c=this.setBlockerNode(this._generateBlockerElement());this._syncSource();this._syncScrolling();d.appendChild(a);arguments.callee.base.call(this,d,b)},_beforeAppear:function(){arguments.callee.base.call(this);qx.ui.embed.IframeManager.getInstance().add(this)},_beforeDisappear:function(){arguments.callee.base.call(this);qx.ui.embed.IframeManager.getInstance().remove(this)},_applySource:function(b,a){if(this.isCreated()){this._syncSource()}},_syncSource:function(){var b=this.getSource();if(b==null||b===""){b=qx.io.Alias.getInstance().resolve($[526])}this._isLoaded=false;try{if(this.getContentWindow()){try{this.getContentWindow().location.replace(b)}catch(a){this.getIframeNode().src=b}}else{this.getIframeNode().src=b}}catch(a){throw new Error($[507])}},_applyScrolling:function(b,a){if(this.isCreated()){this._syncScrolling()}},_syncScrolling:function(){this.getIframeNode().setAttribute("scrolling",this.getScrolling())},_applyFrameName:function(c,a,b,d){if(this.isCreated()){throw new Error("Not allowed to set frame name after it has been created")}},_onload:function(){if(!this._isLoaded){this._isLoaded=true;this.createDispatchEvent("load")}},destroy:function(){var a=qx.core.Variant.isSet($[0],$[18]);var b="javascript:false;";if(a&&this._iframeNode&&this.getSource()!==b){this.setStyleProperty($[113],$[17]);this.addToDocument();this.addEventListener("load",function(){this.destroy()},this);this.setSource(b)}else{arguments.callee.base.call(this)}},_isLoaded:false},defer:function(e,a){if(qx.ui.embed.Iframe._useAlternateLayouting()){var c=a._renderRuntimeWidth;var d=a._renderRuntimeHeight;var b=a._resetRuntimeWidth;var g=a._resetRuntimeHeight;a._renderRuntimeWidth=function(h){c.call(this,h);this._iframeNode.style.minWidth=h+"px";this._iframeNode.style.maxWidth=h+"px"};var f=a._renderRuntimeHeight;a._renderRuntimeHeight=function(h){d.call(this,h);this._iframeNode.style.minHeight=h+"px";this._iframeNode.style.maxHeight=h+"px"};a._resetRuntimeWidth=function(h){b.call(this,h);this._iframeNode.style.minWidth="";this._iframeNode.style.maxWidth=""};a._resetRuntimeHeight=function(h){g.call(this,h);this._iframeNode.style.minHeight="";this._iframeNode.style.maxHeight=""}}},destruct:function(){if(this._iframeNode){this._iframeNode._QxIframe=null;this._iframeNode.onload=null;this._iframeNode=null;this._getTargetNode().innerHTML=""}this._disposeFields("__onload","_blockerNode")}});
+qx.Class.define($[423],{type:$[97],extend:qx.ui.basic.Atom,construct:function(e,d,c,a,b){arguments.callee.base.call(this,e,d,c,a,b);this.initChecked();this.initTabIndex();this.addEventListener($[9],this._onmouseover);this.addEventListener($[14],this._onmouseout);this.addEventListener($[2],this._onmousedown);this.addEventListener($[23],this._onkeydown);this.addEventListener($[12],this._onkeypress)},properties:{tabIndex:{refine:true,init:1},checked:{check:$[3],init:false,apply:"_applyChecked",event:$[532]},page:{check:$[468],apply:"_applyPage",nullable:true},manager:{check:$[488],nullable:true,apply:$[403]},name:{check:$[25],apply:"_applyName"}},members:{getView:function(){var a=this.getParent();return a?a.getParent():null},_applyManager:function(b,a){if(a){a.remove(this)}if(b){b.add(this)}},_applyParent:function(b,a){arguments.callee.base.call(this,b,a);if(a){a.getManager().remove(this)}if(b){b.getManager().add(this)}},_applyPage:function(b,a){if(a){a.setButton(null)}if(b){b.setButton(this);this.getChecked()?b.show():b.hide()}},_applyChecked:function(c,b){if(this._hasParent){var a=this.getManager();if(a){a.handleItemChecked(this,c)}}c?this.addState($[203]):this.removeState($[203]);var d=this.getPage();if(d){this.getChecked()?d.show():d.hide()}},_applyName:function(b,a){if(this.getManager()){this.getManager().setName(b)}},_onmousedown:function(a){this.setChecked(true)},_onmouseover:function(a){this.addState("over")},_onmouseout:function(a){this.removeState("over")},_onkeydown:function(a){},_onkeypress:function(a){}}});
 qx.Class.define("qx.ui.groupbox.GroupBox",{extend:qx.ui.layout.CanvasLayout,construct:function(b,a){arguments.callee.base.call(this);this._createFrameObject();this._createLegendObject();this.setLegend(b||"");if(a!=null){this.setIcon(a)}this.remapChildrenHandlingTo(this._frameObject)},properties:{appearance:{refine:true,init:"group-box"}},members:{_createLegendObject:function(){this._legendObject=new qx.ui.basic.Atom;this._legendObject.setAppearance("group-box-legend");this.add(this._legendObject)},_createFrameObject:function(){this._frameObject=new qx.ui.layout.CanvasLayout;this._frameObject.setAppearance("group-box-frame");this.add(this._frameObject)},getFrameObject:function(){return this._frameObject},getLegendObject:function(){return this._legendObject},setLegend:function(a){if(a!==""&&a!==null){this._legendObject.setLabel(a);this._legendObject.setDisplay(true)}else{this._legendObject.setDisplay(false)}},getLegend:function(){return this._legendObject.getLabel()},setIcon:function(a){this._legendObject.setIcon(a)},getIcon:function(){this._legendObject.getIcon()}},destruct:function(){this._disposeObjects("_legendObject","_frameObject")}});
-qx.Mixin.define("qx.ui.resizer.MResizable",{construct:function(a){this._frame=new qx.ui.basic.Terminator;this._frame.setAppearance("resizer-frame");this.addEventListener($[2],this._onmousedown);this.addEventListener($[15],this._onmouseup);this.addEventListener($[45],this._onmousemove)},properties:{resizableWest:{check:$[3],init:true,apply:$[291]},resizableNorth:{check:$[3],init:true,apply:$[291]},resizableEast:{check:$[3],init:true,apply:$[291]},resizableSouth:{check:$[3],init:true,apply:$[291]},resizable:{group:["resizableNorth","resizableEast","resizableSouth","resizableWest"],mode:$[253]},resizeMethod:{init:$[122],check:["opaque","lazyopaque",$[122],$[170]],event:"changeResizeMethod"}},members:{isResizable:function(){return this.getResizableWest()||this.getResizableEast()||this.getResizableNorth()||this.getResizableSouth()},getResizable:function(){return this.isResizable()},_applyResizable:function(b,a){},_onmousedown:function(g){if(this._resizeNorth||this._resizeSouth||this._resizeWest||this._resizeEast){this.setCapture(true);this.getTopLevelWidget().setGlobalCursor(this.getCursor());var a=this.getElement();var i=this._getResizeParent();var b=i.getElement();var d=qx.bom.element.Location.get(b,$[26]);var h=qx.bom.element.Location.get(a);switch(this.getResizeMethod()){case $[170]:this.setOpacity(0.5);break;case $[122]:var c=this._frame;if(c.getParent()!=i){c.setParent(i);qx.ui.core.Widget.flushGlobalQueues()}c._renderRuntimeLeft(h.left-d.left);c._renderRuntimeTop(h.top-d.top);c._renderRuntimeWidth(a.offsetWidth);c._renderRuntimeHeight(a.offsetHeight);c.setZIndex(this.getZIndex()+1);break}var k=this._resizeSession={};var j=this._getMinSizeReference();if(this._resizeWest){k.boxWidth=a.offsetWidth;k.boxRight=h.right}if(this._resizeWest||this._resizeEast){k.boxLeft=h.left;k.parentContentLeft=d.left;k.parentContentRight=d.right;k.minWidth=j.getMinWidthValue();k.maxWidth=j.getMaxWidthValue()}if(this._resizeNorth){k.boxHeight=a.offsetHeight;k.boxBottom=h.bottom}if(this._resizeNorth||this._resizeSouth){k.boxTop=h.top;k.parentContentTop=d.top;k.parentContentBottom=d.bottom;k.minHeight=j.getMinHeightValue();k.maxHeight=j.getMaxHeightValue()}}else{delete this._resizeSession}g.stopPropagation()},_onmouseup:function(b){var a=this._resizeSession;if(a){this.setCapture(false);this.getTopLevelWidget().setGlobalCursor(null);switch(this.getResizeMethod()){case $[122]:var c=this._frame;if(!(c&&c.getParent())){break}case"lazyopaque":if(a.lastLeft!=null){this.setLeft(a.lastLeft)}if(a.lastTop!=null){this.setTop(a.lastTop)}if(a.lastWidth!=null){this._changeWidth(a.lastWidth)}if(a.lastHeight!=null){this._changeHeight(a.lastHeight)}if(this.getResizeMethod()==$[122]){this._frame.setParent(null)}break;case $[170]:this.setOpacity(null);break}delete this._resizeSession}b.stopPropagation()},_near:function(b,a){return a>(b-5)&&a<(b+5)},_onmousemove:function(d){if(this._disableResize){return}var c=this._resizeSession;if(c){if(this._resizeWest){c.lastWidth=qx.lang.Number.limit(c.boxWidth+c.boxLeft-Math.max(d.getPageX(),c.parentContentLeft),c.minWidth,c.maxWidth);c.lastLeft=c.boxRight-c.lastWidth-c.parentContentLeft}else{if(this._resizeEast){c.lastWidth=qx.lang.Number.limit(Math.min(d.getPageX(),c.parentContentRight)-c.boxLeft,c.minWidth,c.maxWidth)}}if(this._resizeNorth){c.lastHeight=qx.lang.Number.limit(c.boxHeight+c.boxTop-Math.max(d.getPageY(),c.parentContentTop),c.minHeight,c.maxHeight);c.lastTop=c.boxBottom-c.lastHeight-c.parentContentTop}else{if(this._resizeSouth){c.lastHeight=qx.lang.Number.limit(Math.min(d.getPageY(),c.parentContentBottom)-c.boxTop,c.minHeight,c.maxHeight)}}switch(this.getResizeMethod()){case"opaque":case $[170]:if(this._resizeWest||this._resizeEast){this.setWidth(c.lastWidth);if(this._resizeWest){this.setLeft(c.lastLeft)}}if(this._resizeNorth||this._resizeSouth){this.setHeight(c.lastHeight);if(this._resizeNorth){this.setTop(c.lastTop)}}break;default:var f=this.getResizeMethod()==$[122]?this._frame:this;if(this._resizeWest||this._resizeEast){f._renderRuntimeWidth(c.lastWidth);if(this._resizeWest){f._renderRuntimeLeft(c.lastLeft)}}if(this._resizeNorth||this._resizeSouth){f._renderRuntimeHeight(c.lastHeight);if(this._resizeNorth){f._renderRuntimeTop(c.lastTop)}}}}else{var g="";var b=this.getElement();this._resizeNorth=this._resizeSouth=this._resizeWest=this._resizeEast=false;var a=qx.bom.element.Location.get(b);if(this._near(a.top,d.getPageY())){if(this.getResizableNorth()){g="n";this._resizeNorth=true}}else{if(this._near(a.bottom,d.getPageY())){if(this.getResizableSouth()){g="s";this._resizeSouth=true}}}if(this._near(a.left,d.getPageX())){if(this.getResizableWest()){g+="w";this._resizeWest=true}}else{if(this._near(a.right,d.getPageX())){if(this.getResizableEast()){g+="e";this._resizeEast=true}}}if(this._resizeNorth||this._resizeSouth||this._resizeWest||this._resizeEast){this.setCursor(g+"-resize")}else{this.resetCursor()}}d.stopPropagation()}},destruct:function(){this._disposeObjects("_frame")}});
+qx.Mixin.define("qx.ui.resizer.MResizable",{construct:function(a){this._frame=new qx.ui.basic.Terminator;this._frame.setAppearance("resizer-frame");this.addEventListener($[2],this._onmousedown);this.addEventListener($[15],this._onmouseup);this.addEventListener($[45],this._onmousemove)},properties:{resizableWest:{check:$[3],init:true,apply:$[275]},resizableNorth:{check:$[3],init:true,apply:$[275]},resizableEast:{check:$[3],init:true,apply:$[275]},resizableSouth:{check:$[3],init:true,apply:$[275]},resizable:{group:["resizableNorth","resizableEast","resizableSouth","resizableWest"],mode:$[247]},resizeMethod:{init:$[112],check:["opaque","lazyopaque",$[112],$[176]],event:"changeResizeMethod"}},members:{isResizable:function(){return this.getResizableWest()||this.getResizableEast()||this.getResizableNorth()||this.getResizableSouth()},getResizable:function(){return this.isResizable()},_applyResizable:function(b,a){},_onmousedown:function(g){if(this._resizeNorth||this._resizeSouth||this._resizeWest||this._resizeEast){this.setCapture(true);this.getTopLevelWidget().setGlobalCursor(this.getCursor());var a=this.getElement();var i=this._getResizeParent();var b=i.getElement();var d=qx.bom.element.Location.get(b,$[26]);var h=qx.bom.element.Location.get(a);switch(this.getResizeMethod()){case $[176]:this.setOpacity(0.5);break;case $[112]:var c=this._frame;if(c.getParent()!=i){c.setParent(i);qx.ui.core.Widget.flushGlobalQueues()}c._renderRuntimeLeft(h.left-d.left);c._renderRuntimeTop(h.top-d.top);c._renderRuntimeWidth(a.offsetWidth);c._renderRuntimeHeight(a.offsetHeight);c.setZIndex(this.getZIndex()+1);break}var k=this._resizeSession={};var j=this._getMinSizeReference();if(this._resizeWest){k.boxWidth=a.offsetWidth;k.boxRight=h.right}if(this._resizeWest||this._resizeEast){k.boxLeft=h.left;k.parentContentLeft=d.left;k.parentContentRight=d.right;k.minWidth=j.getMinWidthValue();k.maxWidth=j.getMaxWidthValue()}if(this._resizeNorth){k.boxHeight=a.offsetHeight;k.boxBottom=h.bottom}if(this._resizeNorth||this._resizeSouth){k.boxTop=h.top;k.parentContentTop=d.top;k.parentContentBottom=d.bottom;k.minHeight=j.getMinHeightValue();k.maxHeight=j.getMaxHeightValue()}}else{delete this._resizeSession}g.stopPropagation()},_onmouseup:function(b){var a=this._resizeSession;if(a){this.setCapture(false);this.getTopLevelWidget().setGlobalCursor(null);switch(this.getResizeMethod()){case $[112]:var c=this._frame;if(!(c&&c.getParent())){break}case"lazyopaque":if(a.lastLeft!=null){this.setLeft(a.lastLeft)}if(a.lastTop!=null){this.setTop(a.lastTop)}if(a.lastWidth!=null){this._changeWidth(a.lastWidth)}if(a.lastHeight!=null){this._changeHeight(a.lastHeight)}if(this.getResizeMethod()==$[112]){this._frame.setParent(null)}break;case $[176]:this.setOpacity(null);break}delete this._resizeSession}b.stopPropagation()},_near:function(b,a){return a>(b-5)&&a<(b+5)},_onmousemove:function(d){if(this._disableResize){return}var c=this._resizeSession;if(c){if(this._resizeWest){c.lastWidth=qx.lang.Number.limit(c.boxWidth+c.boxLeft-Math.max(d.getPageX(),c.parentContentLeft),c.minWidth,c.maxWidth);c.lastLeft=c.boxRight-c.lastWidth-c.parentContentLeft}else{if(this._resizeEast){c.lastWidth=qx.lang.Number.limit(Math.min(d.getPageX(),c.parentContentRight)-c.boxLeft,c.minWidth,c.maxWidth)}}if(this._resizeNorth){c.lastHeight=qx.lang.Number.limit(c.boxHeight+c.boxTop-Math.max(d.getPageY(),c.parentContentTop),c.minHeight,c.maxHeight);c.lastTop=c.boxBottom-c.lastHeight-c.parentContentTop}else{if(this._resizeSouth){c.lastHeight=qx.lang.Number.limit(Math.min(d.getPageY(),c.parentContentBottom)-c.boxTop,c.minHeight,c.maxHeight)}}switch(this.getResizeMethod()){case"opaque":case $[176]:if(this._resizeWest||this._resizeEast){this.setWidth(c.lastWidth);if(this._resizeWest){this.setLeft(c.lastLeft)}}if(this._resizeNorth||this._resizeSouth){this.setHeight(c.lastHeight);if(this._resizeNorth){this.setTop(c.lastTop)}}break;default:var f=this.getResizeMethod()==$[112]?this._frame:this;if(this._resizeWest||this._resizeEast){f._renderRuntimeWidth(c.lastWidth);if(this._resizeWest){f._renderRuntimeLeft(c.lastLeft)}}if(this._resizeNorth||this._resizeSouth){f._renderRuntimeHeight(c.lastHeight);if(this._resizeNorth){f._renderRuntimeTop(c.lastTop)}}}}else{var g="";var b=this.getElement();this._resizeNorth=this._resizeSouth=this._resizeWest=this._resizeEast=false;var a=qx.bom.element.Location.get(b);if(this._near(a.top,d.getPageY())){if(this.getResizableNorth()){g="n";this._resizeNorth=true}}else{if(this._near(a.bottom,d.getPageY())){if(this.getResizableSouth()){g="s";this._resizeSouth=true}}}if(this._near(a.left,d.getPageX())){if(this.getResizableWest()){g+="w";this._resizeWest=true}}else{if(this._near(a.right,d.getPageX())){if(this.getResizableEast()){g+="e";this._resizeEast=true}}}if(this._resizeNorth||this._resizeSouth||this._resizeWest||this._resizeEast){this.setCursor(g+"-resize")}else{this.resetCursor()}}d.stopPropagation()}},destruct:function(){this._disposeObjects("_frame")}});
 qx.Class.define("qx.ui.resizer.ResizablePopup",{extend:qx.ui.popup.Popup,include:qx.ui.resizer.MResizable,construct:function(){arguments.callee.base.call(this);this.initMinWidth();this.initMinHeight();this.initWidth();this.initHeight()},properties:{appearance:{refine:true,init:"resizer"},minWidth:{refine:true,init:"auto"},minHeight:{refine:true,init:"auto"},width:{refine:true,init:"auto"},height:{refine:true,init:"auto"}},members:{_changeWidth:function(a){this.setWidth(a)},_changeHeight:function(a){this.setHeight(a)},_getResizeParent:function(){return this.getParent()},_getMinSizeReference:function(){return this}}});
-qx.Class.define($[429],{extend:qx.ui.resizer.ResizablePopup,construct:function(d,m,g){arguments.callee.base.call(this);this.setWindowManager(g||qx.ui.window.Window.getDefaultWindowManager());var e=this._layout=new qx.ui.layout.VerticalBoxLayout;e.setEdge(0);this.add(e);var f=this._captionBar=new qx.ui.layout.HorizontalBoxLayout;f.setAppearance("window-captionbar");f.setHeight("auto");f.setOverflow($[17]);e.add(f);var q=this._captionIcon=new qx.ui.basic.Image;q.setAppearance("window-captionbar-icon");f.add(q);var h=this._captionTitle=new qx.ui.basic.Label(d);h.setAppearance("window-captionbar-title");h.setSelectable(false);f.add(h);var b=this._captionFlex=new qx.ui.basic.HorizontalSpacer;f.add(b);var c=this._minimizeButton=new qx.ui.form.Button;c.setAppearance("window-captionbar-minimize-button");c.setTabIndex(null);c.addEventListener($[137],this._onminimizebuttonclick,this);c.addEventListener($[2],this._onbuttonmousedown,this);f.add(c);var o=this._restoreButton=new qx.ui.form.Button;o.setAppearance("window-captionbar-restore-button");o.setTabIndex(null);o.addEventListener($[137],this._onrestorebuttonclick,this);o.addEventListener($[2],this._onbuttonmousedown,this);var j=this._maximizeButton=new qx.ui.form.Button;j.setAppearance($[437]);j.setTabIndex(null);j.addEventListener($[137],this._onmaximizebuttonclick,this);j.addEventListener($[2],this._onbuttonmousedown,this);f.add(j);var i=this._closeButton=new qx.ui.form.Button;i.setAppearance("window-captionbar-close-button");i.setTabIndex(null);i.addEventListener($[137],this._onclosebuttonclick,this);i.addEventListener($[2],this._onbuttonmousedown,this);f.add(i);var a=this._pane=new qx.ui.layout.CanvasLayout;a.setHeight("1*");a.setOverflow($[17]);e.add(a);var k=this._statusBar=new qx.ui.layout.HorizontalBoxLayout;k.setAppearance("window-statusbar");k.setHeight("auto");var n=this._statusText=new qx.ui.basic.Label("Ready");n.setAppearance("window-statusbar-text");n.setSelectable(false);k.add(n);if(d!=null){this.setCaption(d)}if(m!=null){this.setIcon(m)}this.setAutoHide(false);this.addEventListener($[2],this._onwindowmousedown);this.addEventListener($[29],this._onwindowclick);f.addEventListener($[2],this._oncaptionmousedown,this);f.addEventListener($[15],this._oncaptionmouseup,this);f.addEventListener($[45],this._oncaptionmousemove,this);f.addEventListener($[61],this._oncaptiondblblick,this);this.remapChildrenHandlingTo(this._pane)},statics:{getDefaultWindowManager:function(){if(!qx.ui.window.Window._defaultWindowManager){qx.ui.window.Window._defaultWindowManager=new qx.ui.window.Manager}return qx.ui.window.Window._defaultWindowManager}},properties:{appearance:{refine:true,init:"window"},windowManager:{check:$[421],event:"changeWindowManager"},active:{check:$[3],init:false,apply:"_applyActive",event:$[359]},modal:{check:$[3],init:false,apply:"_applyModal",event:"changeModal"},mode:{check:[$[236],$[95]],init:null,nullable:true,apply:"_applyMode",event:$[391]},opener:{check:$[136]},caption:{apply:"_applyCaption",event:"changeCaption",dispose:true},icon:{check:$[25],nullable:true,apply:$[360],event:"changeIcon"},status:{check:$[25],init:"Ready",apply:"_applyStatus",event:"changeStatus"},showClose:{check:$[3],init:true,apply:"_applyShowClose"},showMaximize:{check:$[3],init:true,apply:"_applyShowMaximize"},showMinimize:{check:$[3],init:true,apply:"_applyShowMinimize"},showStatusbar:{check:$[3],init:false,apply:"_applyShowStatusbar"},allowClose:{check:$[3],init:true,apply:"_applyAllowClose"},allowMaximize:{check:$[3],init:true,apply:"_applyAllowMaximize"},allowMinimize:{check:$[3],init:true,apply:"_applyAllowMinimize"},showCaption:{check:$[3],init:true,apply:"_applyShowCaption"},showIcon:{check:$[3],init:true,apply:"_applyShowIcon"},moveable:{check:$[3],init:true,event:"changeMoveable"},moveMethod:{check:["opaque",$[122],$[170]],init:"opaque",event:"changeMoveMethod"}},members:{getPane:function(){return this._pane},getCaptionBar:function(){return this._captionBar},getStatusBar:function(){return this._statusBar},close:function(){this.hide()},open:function(a){if(a!=null){this.setOpener(a)}if(this.getCentered()){this.centerToBrowser()}this.show()},focus:function(){this.setActive(true)},blur:function(){this.setActive(false)},maximize:function(){this.setMode($[95])},minimize:function(){this.setMode($[236])},restore:function(){this.setMode(null)},_beforeAppear:function(){qx.ui.layout.CanvasLayout.prototype._beforeAppear.call(this);qx.ui.popup.PopupManager.getInstance().update();org.eclipse.rwt.EventHandler.setFocusRoot(this);this.getWindowManager().add(this);this._makeActive()},_beforeDisappear:function(){qx.ui.layout.CanvasLayout.prototype._beforeDisappear.call(this);var a=org.eclipse.rwt.EventHandler.getFocusRoot();if(a==this||this.contains(a)){org.eclipse.rwt.EventHandler.setFocusRoot(null)}var b=org.eclipse.rwt.EventHandler.getCaptureWidget();if(b&&this.contains(b)){b.setCapture(false)}this.getWindowManager().remove(this);this._makeInactive()},_minZIndex:100000,_sendTo:function(){var d=function(g,f){return g.getZIndex()-f.getZIndex()};var e=qx.lang.Object.getValues(this.getWindowManager().getAll()).sort(d);var c=e.length;var a=this._minZIndex;for(var b=0;b<c;b++){e[b].setZIndex(a++)}},_applyActive:function(b,a){if(a){if(this.getFocused()){this.setFocused(false)}if(this.getWindowManager().getActiveWindow()==this){this.getWindowManager().setActiveWindow(null)}this.removeState($[88]);this._captionBar.removeState($[88]);this._minimizeButton.removeState($[88]);this._restoreButton.removeState($[88]);this._maximizeButton.removeState($[88]);this._closeButton.removeState($[88])}else{if(!this.getFocusedChild()){this.setFocused(true)}this.getWindowManager().setActiveWindow(this);this.bringToFront();this.addState($[88]);this._captionBar.addState($[88]);this._minimizeButton.addState($[88]);this._restoreButton.addState($[88]);this._maximizeButton.addState($[88]);this._closeButton.addState($[88])}},_applyModal:function(c,a){if(this._initialLayoutDone&&this.getVisibility()&&this.getDisplay()){var b=this.getTopLevelWidget();c?b.block(this):b.release(this)}},_applyAllowClose:function(b,a){this._closeButtonManager()},_applyAllowMaximize:function(b,a){this._maximizeButtonManager()},_applyAllowMinimize:function(b,a){this._minimizeButtonManager()},_applyMode:function(b,a){switch(b){case $[236]:this._disableResize=true;this._minimize();break;case $[95]:this._disableResize=true;this._maximize();break;default:delete this._disableResize;switch(a){case $[95]:this._restoreFromMaximized();break;case $[236]:this._restoreFromMinimized();break}}},_applyShowCaption:function(b,a){if(b){this._captionBar.addAt(this._captionTitle,this.getShowIcon()?1:0)}else{this._captionBar.remove(this._captionTitle)}},_applyShowIcon:function(b,a){if(b){this._captionBar.addAtBegin(this._captionIcon)}else{this._captionBar.remove(this._captionIcon)}},_applyShowStatusbar:function(b,a){if(b){this._layout.addAtEnd(this._statusBar)}else{this._layout.remove(this._statusBar)}},_applyShowClose:function(b,a){if(b){this._captionBar.addAtEnd(this._closeButton)}else{this._captionBar.remove(this._closeButton)}},_applyShowMaximize:function(c,a){if(c){var b=this.getMode()==$[95]?this._restoreButton:this._maximizeButton;if(this.getShowMinimize()){this._captionBar.addAfter(b,this._minimizeButton)}else{this._captionBar.addAfter(b,this._captionFlex)}}else{this._captionBar.remove(this._maximizeButton);this._captionBar.remove(this._restoreButton)}},_applyShowMinimize:function(b,a){if(b){this._captionBar.addAfter(this._minimizeButton,this._captionFlex)}else{this._captionBar.remove(this._minimizeButton)}},_minimizeButtonManager:function(){this.getAllowMinimize()===false?this._minimizeButton.setEnabled(false):this._minimizeButton.resetEnabled()},_closeButtonManager:function(){this.getAllowClose()===false?this._closeButton.setEnabled(false):this._closeButton.resetEnabled()},_maximizeButtonManager:function(){var a=this.getAllowMaximize()&&this.getResizable()&&this._computedMaxWidthTypeNull&&this._computedMaxHeightTypeNull;if(this._maximizeButton){a===false?this._maximizeButton.setEnabled(false):this._maximizeButton.resetEnabled()}if(this._restoreButton){a===false?this._restoreButton.setEnabled(false):this._restoreButton.resetEnabled()}},_applyStatus:function(b,a){this._statusText.setText(b)},_applyMaxWidth:function(b,a){arguments.callee.base.call(this,b);this._maximizeButtonManager()},_applyMaxHeight:function(b,a){arguments.callee.base.call(this,b);this._maximizeButtonManager()},_applyResizable:function(b,a){this._maximizeButtonManager()},_applyCaption:function(b,a){this._captionTitle.setText(b)},_applyIcon:function(b,a){this._captionIcon.setSource(b)},_minimize:function(){this.blur();this.hide()},_restoreFromMaximized:function(){this.setLeft(this._previousLeft?this._previousLeft:null);this.setWidth(this._previousWidth?this._previousWidth:null);this.setRight(this._previousRight?this._previousRight:null);this.setTop(this._previousTop?this._previousTop:null);this.setHeight(this._previousHeight?this._previousHeight:null);this.setBottom(this._previousBottom?this._previousBottom:null);this.removeState($[95]);if(this.getShowMaximize()){var a=this._captionBar;var b=a.indexOf(this._restoreButton);a.remove(this._restoreButton);a.addAt(this._maximizeButton,b)}this.focus()},_restoreFromMinimized:function(){if(this.hasState($[95])){this.setMode($[95])}this.show();this.focus()},_maximize:function(){if(this.hasState($[95])){return}this._previousLeft=this.getLeft();this._previousWidth=this.getWidth();this._previousRight=this.getRight();this._previousTop=this.getTop();this._previousHeight=this.getHeight();this._previousBottom=this.getBottom();this.setLeft(0);this.setTop(0);this.setWidth("100%");this.setHeight("100%");this.addState($[95]);if(this.getShowMaximize()){var a=this._captionBar;var b=a.indexOf(this._maximizeButton);a.remove(this._maximizeButton);a.addAt(this._restoreButton,b)}this.focus()},_onwindowclick:function(a){a.stopPropagation()},_onwindowmousedown:function(a){this.focus()},_onbuttonmousedown:function(a){a.stopPropagation()},_onminimizebuttonclick:function(a){this.minimize();this._minimizeButton.removeState($[21]);this._minimizeButton.removeState($[47]);this._minimizeButton.removeState("over");a.stopPropagation()},_onrestorebuttonclick:function(a){this.restore();this._restoreButton.removeState($[21]);this._restoreButton.removeState($[47]);this._restoreButton.removeState("over");a.stopPropagation()},_onmaximizebuttonclick:function(a){this.maximize();this._maximizeButton.removeState($[21]);this._maximizeButton.removeState($[47]);this._maximizeButton.removeState("over");a.stopPropagation()},_onclosebuttonclick:function(a){this.close();this._closeButton.removeState($[21]);this._closeButton.removeState($[47]);this._closeButton.removeState("over");a.stopPropagation()},_oncaptionmousedown:function(i){if(!i.isLeftButtonPressed()||!this.getMoveable()||this.getMode()!=null){return}this._captionBar.setCapture(true);var g=this.getElement();var d=this.getParent();var c=d.getElement();var b=qx.bom.element.Location.get(c,$[26]);var a=qx.bom.element.Location.get(g);this._dragSession={offsetX:i.getPageX()-a.left+b.left,offsetY:i.getPageY()-a.top+b.top,parentAvailableAreaLeft:b.left+5,parentAvailableAreaTop:b.top+5,parentAvailableAreaRight:b.right-5,parentAvailableAreaBottom:b.bottom-5};switch(this.getMoveMethod()){case $[170]:this.setOpacity(0.5);break;case $[122]:var h=this._frame;if(h.getParent()!=this.getParent()){h.setParent(this.getParent());qx.ui.core.Widget.flushGlobalQueues()}h._renderRuntimeLeft(a.left-b.left);h._renderRuntimeTop(a.top-b.top);h._renderRuntimeWidth(g.offsetWidth);h._renderRuntimeHeight(g.offsetHeight);h.setZIndex(this.getZIndex()+1);break}},_oncaptionmouseup:function(b){var a=this._dragSession;if(!a){return}this._captionBar.setCapture(false);if(a.lastX!=null){this.setLeft(a.lastX)}if(a.lastY!=null){this.setTop(a.lastY)}switch(this.getMoveMethod()){case $[170]:this.setOpacity(null);break;case $[122]:this._frame.setParent(null);break}delete this._dragSession},_oncaptionmousemove:function(b){var a=this._dragSession;if(!a||!this._captionBar.getCapture()){return}if(!qx.lang.Number.isBetweenRange(b.getPageX(),a.parentAvailableAreaLeft,a.parentAvailableAreaRight)||!qx.lang.Number.isBetweenRange(b.getPageY(),a.parentAvailableAreaTop,a.parentAvailableAreaBottom)){return}var c=this.getMoveMethod()==$[122]?this._frame:this;c._renderRuntimeLeft(a.lastX=b.getPageX()-a.offsetX);c._renderRuntimeTop(a.lastY=b.getPageY()-a.offsetY)},_oncaptiondblblick:function(a){if(!this._maximizeButton.getEnabled()){return}return this.getMode()==$[95]?this.restore():this.maximize()}},destruct:function(){this._disposeObjects("_layout","_captionBar","_captionIcon","_captionTitle","_captionFlex","_closeButton","_minimizeButton","_maximizeButton","_restoreButton","_pane","_statusBar","_statusText")}});
+qx.Class.define($[544],{extend:qx.ui.resizer.ResizablePopup,construct:function(d,m,g){arguments.callee.base.call(this);this.setWindowManager(g||qx.ui.window.Window.getDefaultWindowManager());var e=this._layout=new qx.ui.layout.VerticalBoxLayout;e.setEdge(0);this.add(e);var f=this._captionBar=new qx.ui.layout.HorizontalBoxLayout;f.setAppearance("window-captionbar");f.setHeight("auto");f.setOverflow($[17]);e.add(f);var q=this._captionIcon=new qx.ui.basic.Image;q.setAppearance("window-captionbar-icon");f.add(q);var h=this._captionTitle=new qx.ui.basic.Label(d);h.setAppearance("window-captionbar-title");h.setSelectable(false);f.add(h);var b=this._captionFlex=new qx.ui.basic.HorizontalSpacer;f.add(b);var c=this._minimizeButton=new qx.ui.form.Button;c.setAppearance("window-captionbar-minimize-button");c.setTabIndex(null);c.addEventListener($[137],this._onminimizebuttonclick,this);c.addEventListener($[2],this._onbuttonmousedown,this);f.add(c);var o=this._restoreButton=new qx.ui.form.Button;o.setAppearance("window-captionbar-restore-button");o.setTabIndex(null);o.addEventListener($[137],this._onrestorebuttonclick,this);o.addEventListener($[2],this._onbuttonmousedown,this);var j=this._maximizeButton=new qx.ui.form.Button;j.setAppearance($[469]);j.setTabIndex(null);j.addEventListener($[137],this._onmaximizebuttonclick,this);j.addEventListener($[2],this._onbuttonmousedown,this);f.add(j);var i=this._closeButton=new qx.ui.form.Button;i.setAppearance("window-captionbar-close-button");i.setTabIndex(null);i.addEventListener($[137],this._onclosebuttonclick,this);i.addEventListener($[2],this._onbuttonmousedown,this);f.add(i);var a=this._pane=new qx.ui.layout.CanvasLayout;a.setHeight("1*");a.setOverflow($[17]);e.add(a);var k=this._statusBar=new qx.ui.layout.HorizontalBoxLayout;k.setAppearance("window-statusbar");k.setHeight("auto");var n=this._statusText=new qx.ui.basic.Label("Ready");n.setAppearance("window-statusbar-text");n.setSelectable(false);k.add(n);if(d!=null){this.setCaption(d)}if(m!=null){this.setIcon(m)}this.setAutoHide(false);this.addEventListener($[2],this._onwindowmousedown);this.addEventListener($[29],this._onwindowclick);f.addEventListener($[2],this._oncaptionmousedown,this);f.addEventListener($[15],this._oncaptionmouseup,this);f.addEventListener($[45],this._oncaptionmousemove,this);f.addEventListener($[62],this._oncaptiondblblick,this);this.remapChildrenHandlingTo(this._pane)},statics:{getDefaultWindowManager:function(){if(!qx.ui.window.Window._defaultWindowManager){qx.ui.window.Window._defaultWindowManager=new qx.ui.window.Manager}return qx.ui.window.Window._defaultWindowManager}},properties:{appearance:{refine:true,init:"window"},windowManager:{check:$[440],event:"changeWindowManager"},active:{check:$[3],init:false,apply:"_applyActive",event:$[371]},modal:{check:$[3],init:false,apply:"_applyModal",event:"changeModal"},mode:{check:[$[252],$[92]],init:null,nullable:true,apply:"_applyMode",event:$[319]},opener:{check:$[152]},caption:{apply:"_applyCaption",event:"changeCaption",dispose:true},icon:{check:$[25],nullable:true,apply:$[400],event:"changeIcon"},status:{check:$[25],init:"Ready",apply:"_applyStatus",event:"changeStatus"},showClose:{check:$[3],init:true,apply:"_applyShowClose"},showMaximize:{check:$[3],init:true,apply:"_applyShowMaximize"},showMinimize:{check:$[3],init:true,apply:"_applyShowMinimize"},showStatusbar:{check:$[3],init:false,apply:"_applyShowStatusbar"},allowClose:{check:$[3],init:true,apply:"_applyAllowClose"},allowMaximize:{check:$[3],init:true,apply:"_applyAllowMaximize"},allowMinimize:{check:$[3],init:true,apply:"_applyAllowMinimize"},showCaption:{check:$[3],init:true,apply:"_applyShowCaption"},showIcon:{check:$[3],init:true,apply:"_applyShowIcon"},moveable:{check:$[3],init:true,event:"changeMoveable"},moveMethod:{check:["opaque",$[112],$[176]],init:"opaque",event:"changeMoveMethod"}},members:{getPane:function(){return this._pane},getCaptionBar:function(){return this._captionBar},getStatusBar:function(){return this._statusBar},close:function(){this.hide()},open:function(a){if(a!=null){this.setOpener(a)}if(this.getCentered()){this.centerToBrowser()}this.show()},focus:function(){this.setActive(true)},blur:function(){this.setActive(false)},maximize:function(){this.setMode($[92])},minimize:function(){this.setMode($[252])},restore:function(){this.setMode(null)},_beforeAppear:function(){qx.ui.layout.CanvasLayout.prototype._beforeAppear.call(this);qx.ui.popup.PopupManager.getInstance().update();org.eclipse.rwt.EventHandler.setFocusRoot(this);this.getWindowManager().add(this);this._makeActive()},_beforeDisappear:function(){qx.ui.layout.CanvasLayout.prototype._beforeDisappear.call(this);var a=org.eclipse.rwt.EventHandler.getFocusRoot();if(a==this||this.contains(a)){org.eclipse.rwt.EventHandler.setFocusRoot(null)}var b=org.eclipse.rwt.EventHandler.getCaptureWidget();if(b&&this.contains(b)){b.setCapture(false)}this.getWindowManager().remove(this);this._makeInactive()},_minZIndex:100000,_sendTo:function(){var d=function(g,f){return g.getZIndex()-f.getZIndex()};var e=qx.lang.Object.getValues(this.getWindowManager().getAll()).sort(d);var c=e.length;var a=this._minZIndex;for(var b=0;b<c;b++){e[b].setZIndex(a++)}},_applyActive:function(b,a){if(a){if(this.getFocused()){this.setFocused(false)}if(this.getWindowManager().getActiveWindow()==this){this.getWindowManager().setActiveWindow(null)}this.removeState($[90]);this._captionBar.removeState($[90]);this._minimizeButton.removeState($[90]);this._restoreButton.removeState($[90]);this._maximizeButton.removeState($[90]);this._closeButton.removeState($[90])}else{if(!this.getFocusedChild()){this.setFocused(true)}this.getWindowManager().setActiveWindow(this);this.bringToFront();this.addState($[90]);this._captionBar.addState($[90]);this._minimizeButton.addState($[90]);this._restoreButton.addState($[90]);this._maximizeButton.addState($[90]);this._closeButton.addState($[90])}},_applyModal:function(c,a){if(this._initialLayoutDone&&this.getVisibility()&&this.getDisplay()){var b=this.getTopLevelWidget();c?b.block(this):b.release(this)}},_applyAllowClose:function(b,a){this._closeButtonManager()},_applyAllowMaximize:function(b,a){this._maximizeButtonManager()},_applyAllowMinimize:function(b,a){this._minimizeButtonManager()},_applyMode:function(b,a){switch(b){case $[252]:this._disableResize=true;this._minimize();break;case $[92]:this._disableResize=true;this._maximize();break;default:delete this._disableResize;switch(a){case $[92]:this._restoreFromMaximized();break;case $[252]:this._restoreFromMinimized();break}}},_applyShowCaption:function(b,a){if(b){this._captionBar.addAt(this._captionTitle,this.getShowIcon()?1:0)}else{this._captionBar.remove(this._captionTitle)}},_applyShowIcon:function(b,a){if(b){this._captionBar.addAtBegin(this._captionIcon)}else{this._captionBar.remove(this._captionIcon)}},_applyShowStatusbar:function(b,a){if(b){this._layout.addAtEnd(this._statusBar)}else{this._layout.remove(this._statusBar)}},_applyShowClose:function(b,a){if(b){this._captionBar.addAtEnd(this._closeButton)}else{this._captionBar.remove(this._closeButton)}},_applyShowMaximize:function(c,a){if(c){var b=this.getMode()==$[92]?this._restoreButton:this._maximizeButton;if(this.getShowMinimize()){this._captionBar.addAfter(b,this._minimizeButton)}else{this._captionBar.addAfter(b,this._captionFlex)}}else{this._captionBar.remove(this._maximizeButton);this._captionBar.remove(this._restoreButton)}},_applyShowMinimize:function(b,a){if(b){this._captionBar.addAfter(this._minimizeButton,this._captionFlex)}else{this._captionBar.remove(this._minimizeButton)}},_minimizeButtonManager:function(){this.getAllowMinimize()===false?this._minimizeButton.setEnabled(false):this._minimizeButton.resetEnabled()},_closeButtonManager:function(){this.getAllowClose()===false?this._closeButton.setEnabled(false):this._closeButton.resetEnabled()},_maximizeButtonManager:function(){var a=this.getAllowMaximize()&&this.getResizable()&&this._computedMaxWidthTypeNull&&this._computedMaxHeightTypeNull;if(this._maximizeButton){a===false?this._maximizeButton.setEnabled(false):this._maximizeButton.resetEnabled()}if(this._restoreButton){a===false?this._restoreButton.setEnabled(false):this._restoreButton.resetEnabled()}},_applyStatus:function(b,a){this._statusText.setText(b)},_applyMaxWidth:function(b,a){arguments.callee.base.call(this,b);this._maximizeButtonManager()},_applyMaxHeight:function(b,a){arguments.callee.base.call(this,b);this._maximizeButtonManager()},_applyResizable:function(b,a){this._maximizeButtonManager()},_applyCaption:function(b,a){this._captionTitle.setText(b)},_applyIcon:function(b,a){this._captionIcon.setSource(b)},_minimize:function(){this.blur();this.hide()},_restoreFromMaximized:function(){this.setLeft(this._previousLeft?this._previousLeft:null);this.setWidth(this._previousWidth?this._previousWidth:null);this.setRight(this._previousRight?this._previousRight:null);this.setTop(this._previousTop?this._previousTop:null);this.setHeight(this._previousHeight?this._previousHeight:null);this.setBottom(this._previousBottom?this._previousBottom:null);this.removeState($[92]);if(this.getShowMaximize()){var a=this._captionBar;var b=a.indexOf(this._restoreButton);a.remove(this._restoreButton);a.addAt(this._maximizeButton,b)}this.focus()},_restoreFromMinimized:function(){if(this.hasState($[92])){this.setMode($[92])}this.show();this.focus()},_maximize:function(){if(this.hasState($[92])){return}this._previousLeft=this.getLeft();this._previousWidth=this.getWidth();this._previousRight=this.getRight();this._previousTop=this.getTop();this._previousHeight=this.getHeight();this._previousBottom=this.getBottom();this.setLeft(0);this.setTop(0);this.setWidth("100%");this.setHeight("100%");this.addState($[92]);if(this.getShowMaximize()){var a=this._captionBar;var b=a.indexOf(this._maximizeButton);a.remove(this._maximizeButton);a.addAt(this._restoreButton,b)}this.focus()},_onwindowclick:function(a){a.stopPropagation()},_onwindowmousedown:function(a){this.focus()},_onbuttonmousedown:function(a){a.stopPropagation()},_onminimizebuttonclick:function(a){this.minimize();this._minimizeButton.removeState($[21]);this._minimizeButton.removeState($[46]);this._minimizeButton.removeState("over");a.stopPropagation()},_onrestorebuttonclick:function(a){this.restore();this._restoreButton.removeState($[21]);this._restoreButton.removeState($[46]);this._restoreButton.removeState("over");a.stopPropagation()},_onmaximizebuttonclick:function(a){this.maximize();this._maximizeButton.removeState($[21]);this._maximizeButton.removeState($[46]);this._maximizeButton.removeState("over");a.stopPropagation()},_onclosebuttonclick:function(a){this.close();this._closeButton.removeState($[21]);this._closeButton.removeState($[46]);this._closeButton.removeState("over");a.stopPropagation()},_oncaptionmousedown:function(i){if(!i.isLeftButtonPressed()||!this.getMoveable()||this.getMode()!=null){return}this._captionBar.setCapture(true);var g=this.getElement();var d=this.getParent();var c=d.getElement();var b=qx.bom.element.Location.get(c,$[26]);var a=qx.bom.element.Location.get(g);this._dragSession={offsetX:i.getPageX()-a.left+b.left,offsetY:i.getPageY()-a.top+b.top,parentAvailableAreaLeft:b.left+5,parentAvailableAreaTop:b.top+5,parentAvailableAreaRight:b.right-5,parentAvailableAreaBottom:b.bottom-5};switch(this.getMoveMethod()){case $[176]:this.setOpacity(0.5);break;case $[112]:var h=this._frame;if(h.getParent()!=this.getParent()){h.setParent(this.getParent());qx.ui.core.Widget.flushGlobalQueues()}h._renderRuntimeLeft(a.left-b.left);h._renderRuntimeTop(a.top-b.top);h._renderRuntimeWidth(g.offsetWidth);h._renderRuntimeHeight(g.offsetHeight);h.setZIndex(this.getZIndex()+1);break}},_oncaptionmouseup:function(b){var a=this._dragSession;if(!a){return}this._captionBar.setCapture(false);if(a.lastX!=null){this.setLeft(a.lastX)}if(a.lastY!=null){this.setTop(a.lastY)}switch(this.getMoveMethod()){case $[176]:this.setOpacity(null);break;case $[112]:this._frame.setParent(null);break}delete this._dragSession},_oncaptionmousemove:function(b){var a=this._dragSession;if(!a||!this._captionBar.getCapture()){return}if(!qx.lang.Number.isBetweenRange(b.getPageX(),a.parentAvailableAreaLeft,a.parentAvailableAreaRight)||!qx.lang.Number.isBetweenRange(b.getPageY(),a.parentAvailableAreaTop,a.parentAvailableAreaBottom)){return}var c=this.getMoveMethod()==$[112]?this._frame:this;c._renderRuntimeLeft(a.lastX=b.getPageX()-a.offsetX);c._renderRuntimeTop(a.lastY=b.getPageY()-a.offsetY)},_oncaptiondblblick:function(a){if(!this._maximizeButton.getEnabled()){return}return this.getMode()==$[92]?this.restore():this.maximize()}},destruct:function(){this._disposeObjects("_layout","_captionBar","_captionIcon","_captionTitle","_captionFlex","_closeButton","_minimizeButton","_maximizeButton","_restoreButton","_pane","_statusBar","_statusText")}});
 qx.Class.define("qx.ui.basic.HorizontalSpacer",{extend:qx.ui.basic.Terminator,construct:function(){arguments.callee.base.call(this);this.initWidth()},properties:{width:{refine:true,init:"1*"}}});
-qx.Class.define($[421],{extend:qx.util.manager.Object,properties:{activeWindow:{check:$[110],nullable:true,apply:"_applyActiveWindow"}},members:{_applyActiveWindow:function(b,a){qx.ui.popup.PopupManager.getInstance().update();if(a){a.setActive(false)}if(b){b.setActive(true)}if(a&&a.getModal()){a.getTopLevelWidget().release(a)}if(b&&b.getModal()){b.getTopLevelWidget().block(b)}},update:function(){var a,b;var c=this.getAll();for(var b in c){a=c[b];if(!a.getAutoHide()){continue}a.hide()}},compareWindows:function(b,a){switch(b.getWindowManager().getActiveWindow()){case b:return 1;case a:return -1}return b.getZIndex()-a.getZIndex()},add:function(a){arguments.callee.base.call(this,a);this.setActiveWindow(a)},remove:function(e){arguments.callee.base.call(this,e);if(this.getActiveWindow()==e){var c=[];for(var d in this._objects){c.push(this._objects[d])}var b=c.length;if(b==0){this.setActiveWindow(null)}else{if(b==1){this.setActiveWindow(c[0])}else{if(b>1){c.sort(this.compareWindows);this.setActiveWindow(c[b-1])}}}}}}});
-qx.Class.define("qx.ui.menu.Separator",{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this.initHeight();this.setStyleProperty($[194],"0");this.setStyleProperty($[343],"0");this._line=new qx.ui.basic.Terminator;this._line.setAnonymous(true);this._line.setAppearance("menu-separator-line");this.add(this._line);this.addEventListener($[2],this._onmousedown)},properties:{height:{refine:true,init:"auto"},appearance:{refine:true,init:"menu-separator"}},members:{hasIcon:qx.lang.Function.returnFalse,hasLabel:qx.lang.Function.returnFalse,hasShortcut:qx.lang.Function.returnFalse,hasMenu:qx.lang.Function.returnFalse,_onmousedown:function(a){a.stopPropagation()}},destruct:function(){this._disposeObjects("_line")}});
-qx.Class.define($[451],{type:$[102],extend:qx.ui.layout.CanvasLayout,construct:function(a){arguments.callee.base.call(this);if(a!==undefined){this.setButton(a)}this.initTop();this.initRight();this.initBottom();this.initLeft()},properties:{top:{refine:true,init:0},right:{refine:true,init:0},bottom:{refine:true,init:0},left:{refine:true,init:0},display:{refine:true,init:false},button:{check:$[443],apply:"_applyButton"}},members:{_applyButton:function(b,a){if(a){a.setPage(null)}if(b){b.setPage(this)}}}});
+qx.Class.define($[440],{extend:qx.util.manager.Object,properties:{activeWindow:{check:$[111],nullable:true,apply:"_applyActiveWindow"}},members:{_applyActiveWindow:function(b,a){qx.ui.popup.PopupManager.getInstance().update();if(a){a.setActive(false)}if(b){b.setActive(true)}if(a&&a.getModal()){a.getTopLevelWidget().release(a)}if(b&&b.getModal()){b.getTopLevelWidget().block(b)}},update:function(){var a,b;var c=this.getAll();for(var b in c){a=c[b];if(!a.getAutoHide()){continue}a.hide()}},compareWindows:function(b,a){switch(b.getWindowManager().getActiveWindow()){case b:return 1;case a:return -1}return b.getZIndex()-a.getZIndex()},add:function(a){arguments.callee.base.call(this,a);this.setActiveWindow(a)},remove:function(e){arguments.callee.base.call(this,e);if(this.getActiveWindow()==e){var c=[];for(var d in this._objects){c.push(this._objects[d])}var b=c.length;if(b==0){this.setActiveWindow(null)}else{if(b==1){this.setActiveWindow(c[0])}else{if(b>1){c.sort(this.compareWindows);this.setActiveWindow(c[b-1])}}}}}}});
+qx.Class.define("qx.ui.menu.Separator",{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this.initHeight();this.setStyleProperty($[211],"0");this.setStyleProperty($[337],"0");this._line=new qx.ui.basic.Terminator;this._line.setAnonymous(true);this._line.setAppearance("menu-separator-line");this.add(this._line);this.addEventListener($[2],this._onmousedown)},properties:{height:{refine:true,init:"auto"},appearance:{refine:true,init:"menu-separator"}},members:{hasIcon:qx.lang.Function.returnFalse,hasLabel:qx.lang.Function.returnFalse,hasShortcut:qx.lang.Function.returnFalse,hasMenu:qx.lang.Function.returnFalse,_onmousedown:function(a){a.stopPropagation()}},destruct:function(){this._disposeObjects("_line")}});
+qx.Class.define($[468],{type:$[97],extend:qx.ui.layout.CanvasLayout,construct:function(a){arguments.callee.base.call(this);if(a!==undefined){this.setButton(a)}this.initTop();this.initRight();this.initBottom();this.initLeft()},properties:{top:{refine:true,init:0},right:{refine:true,init:0},bottom:{refine:true,init:0},left:{refine:true,init:0},display:{refine:true,init:false},button:{check:$[423],apply:"_applyButton"}},members:{_applyButton:function(b,a){if(a){a.setPage(null)}if(b){b.setPage(this)}}}});
 qx.Class.define("qx.ui.pageview.tabview.Page",{extend:qx.ui.pageview.AbstractPage,properties:{appearance:{refine:true,init:"tab-view-page"}}});
-qx.Class.define("qx.ui.pageview.tabview.Button",{extend:qx.ui.pageview.AbstractButton,events:{closetab:$[11]},properties:{appearance:{refine:true,init:"tab-view-button"},showCloseButton:{check:$[3],init:false,apply:"_applyShowCloseButton",event:"changeShowCloseButton"},closeButtonImage:{check:$[25],init:"icon/16/actions/dialog-cancel.png",apply:"_applyCloseButtonImage"}},members:{_onkeydown:function(b){var a=b.getKeyIdentifier();if(a==$[68]||a==$[92]){this.setChecked(true)}},_onkeypress:function(c){switch(c.getKeyIdentifier()){case"Left":var b=this.getPreviousActiveSibling();if(b&&b!=this){delete qx.event.handler.FocusHandler.mouseFocus;b.setFocused(true);b.setChecked(true)}break;case $[53]:var a=this.getNextActiveSibling();if(a&&a!=this){delete qx.event.handler.FocusHandler.mouseFocus;a.setFocused(true);a.setChecked(true)}break}},_ontabclose:function(a){this.createDispatchDataEvent("closetab",this);a.stopPropagation()},_applyChecked:function(b,a){arguments.callee.base.call(this,b,a);this.setZIndex(b?1:0)},_applyShowCloseButton:function(b,a){if(!this._closeButtonImage){this._closeButtonImage=new qx.ui.basic.Image(this.getCloseButtonImage())}if(b){this._closeButtonImage.addEventListener($[29],this._ontabclose,this);this.add(this._closeButtonImage)}else{this.remove(this._closeButtonImage);this._closeButtonImage.removeEventListener($[29],this._ontabclose,this)}},_applyCloseButtonImage:function(b,a){if(this._closeButtonImage){this._closeButtonImage.setSource(b)}},_renderAppearance:function(){if(this.getView()){this.isFirstVisibleChild()?this.addState("firstChild"):this.removeState($[334]);this.isLastVisibleChild()?this.addState($[334]):this.removeState($[334]);this.getView().getAlignTabsToLeft()?this.addState("alignLeft"):this.removeState("alignLeft");!this.getView().getAlignTabsToLeft()?this.addState("alignRight"):this.removeState("alignRight");this.getView().getPlaceBarOnTop()?this.addState($[175]):this.removeState($[175]);!this.getView().getPlaceBarOnTop()?this.addState("barBottom"):this.removeState("barBottom")}arguments.callee.base.call(this)}},destruct:function(){this._disposeObjects("_closeButtonImage")}});
-qx.Class.define("org.eclipse.rwt.ErrorHandler",{statics:{showError:function(a){org.eclipse.rwt.ErrorHandler._enableTextSelection();org.eclipse.rwt.ErrorHandler._freezeApplication();document.title="Error Page";org.eclipse.rwt.ErrorHandler._createErrorArea().innerHTML=a},showTimeout:function(e){var b=String(window.location);var c=b.indexOf("#");if(c!=-1){b=b.substring(0,c)}var a='href="'+b+'"';var d=e.replace(/{HREF_URL}/,a);org.eclipse.rwt.ErrorHandler._freezeApplication();org.eclipse.rwt.ErrorHandler._createOverlay();org.eclipse.rwt.ErrorHandler._createTimeoutArea(400,100).innerHTML=d},processJavaScriptErrorInResponse:function(a,b,e){var f="<p>Could not evaluate javascript response:</p><pre>";var h=[];h.push("Error: "+b+"\n");h.push("Script: "+a);try{if(b instanceof Error){for(var d in b){h.push(d+": "+b[d])}}h.push("Debug: "+qx.core.Variant.get($[7]));h.push("Request: "+e.getData());var g=qx.ui.core.Widget._inFlushGlobalQueues;if(g){h.push("Phase: "+qx.ui.core.Widget._flushGlobalQueuesPhase)}}catch(c){}f+=h.join("\n  ");f+="</pre>";org.eclipse.rwt.ErrorHandler.showError(f)},processJavaScriptError:function(a){if(qx.core.Variant.isSet($[7],"on")){var b="<p>Javascript error occurred:</p><pre>"+a+"</pre>";org.eclipse.rwt.ErrorHandler.showError(b);throw a}else{if(typeof console===$[10]){if(typeof console.error===$[44]){console.error(a)}else{if(typeof console.log===$[44]){console.log(a)}}}}},_createOverlay:function(){var a=document.createElement("div");var b=a.style;b.position=$[27];b.width="100%";b.height="100%";b.backgroundColor="#808080";org.eclipse.rwt.HtmlUtil.setOpacity(a,0.2);b.zIndex=100000000;document.body.appendChild(a);return a},_createErrorArea:function(){var a=document.createElement("div");var b=a.style;b.position=$[27];b.width="100%";b.height="100%";b.backgroundColor="#ffffff";b.zIndex=100000001;b.overflow="auto";b.padding="10px";document.body.appendChild(a);return a},_createTimeoutArea:function(d,a){var b=document.createElement("div");var c=b.style;c.position=$[27];c.width=d+"px";c.height=a+"px";var g=qx.ui.core.ClientDocument.getInstance();var f=(g.getClientWidth()-d)/2;var e=(g.getClientHeight()-a)/2;c.left=f<0?0:f;c.top=e<0?0:e;c.backgroundColor="#dae9f7";c.border="1px solid black";c.zIndex=100000001;c.overflow="auto";c.padding="10px";c.textAlign=$[38];c.fontFamily='verdana,"lucida sans",arial,helvetica,sans-serif';c.fontSize="12px";c.fontStyle=$[109];c.fontWeight=$[109];document.body.appendChild(b);return b},_freezeApplication:function(){var a=qx.core.Init.getInstance().getApplication();a.setExitConfirmation(null);qx.io.remote.RequestQueue.getInstance().setEnabled(false);org.eclipse.rwt.EventHandler.detachEvents();qx.core.Target.prototype.dispatchEvent=function(){};org.eclipse.rwt.Animation._stopLoop()},_enableTextSelection:function(){var a=qx.ui.core.ClientDocument.getInstance();a.setSelectable(true);if(qx.core.Variant.isSet($[0],$[40])){var b=qx.core.Init.getInstance().getApplication();qx.html.EventRegistration.removeEventListener(document.documentElement,$[2],b._onFFMouseDown)}}}});
-qx.Class.define("org.eclipse.swt.LabelUtil",{statics:{SHOW_LABEL:$[82],SHOW_ICON:"icon",APPEARANCE:"label-wrapper",initialize:function(b){b.setHorizontalChildrenAlign(qx.constant.Layout.ALIGN_LEFT);b.setVerticalChildrenAlign(qx.constant.Layout.ALIGN_TOP);b.setAppearance(org.eclipse.swt.LabelUtil.APPEARANCE);b.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);b.setLabel($[139]);var a=b.getLabelObject();a.setMode(qx.constant.Style.LABEL_MODE_HTML);a.setTextOverflow(false);a.setAppearance($[483]);b.setLabel("");b.setHideFocus(true);b.addEventListener($[9],org.eclipse.swt.LabelUtil._onMouseOver);b.addEventListener($[14],org.eclipse.swt.LabelUtil._onMouseOut)},setWrap:function(b,a){b.getLabelObject().setWrap(a)},setAlignment:function(a,b){a.getLabelObject().setTextAlign(b);a.setHorizontalChildrenAlign(b)},setText:function(a,b){if(!a.isCreated()){a.setUserData("setText",b);a.addEventListener($[31],org.eclipse.swt.LabelUtil._setTextDelayed)}else{org.eclipse.swt.LabelUtil._doSetText(a,b)}},setImage:function(b,a){if(!b.isCreated()){b.setUserData($[392],a);b.addEventListener($[31],org.eclipse.swt.LabelUtil._setImageDelayed)}else{org.eclipse.swt.LabelUtil._doSetImage(b,a)}},_setTextDelayed:function(a){var b=a.getTarget();var c=b.getUserData("setText");if(c!=null){org.eclipse.swt.LabelUtil._doSetText(b,c)}b.removeEventListener($[31],org.eclipse.swt.LabelUtil._setTextDelayed)},_setImageDelayed:function(b){var c=b.getTarget();var a=c.getUserData($[392]);if(a!=null){org.eclipse.swt.LabelUtil._doSetImage(c,a)}c.removeEventListener($[31],org.eclipse.swt.LabelUtil._setImageDelayed)},_doSetText:function(a,b){a.setUserData("setText",null);if(b!=null){a.setLabel(b)}else{a.setLabel("")}a.setShow(org.eclipse.swt.LabelUtil.SHOW_LABEL)},_doSetImage:function(b,a){b.setUserData($[392],null);if(a){b.setIcon(a);b.setShow(org.eclipse.swt.LabelUtil.SHOW_ICON)}else{b.resetIcon();b.setShow(org.eclipse.swt.LabelUtil.SHOW_LABEL)}},_onMouseOver:function(){this.addState("over")},_onMouseOut:function(){this.removeState("over")}}});
-qx.Class.define("org.eclipse.rwt.widgets.TreeRow",{extend:qx.ui.basic.Terminator,construct:function(a){arguments.callee.base.call(this);this.setSelectable(false);this.setAppearance("tree-row");this._tree=a;this._textNodes=[];this._usedNodes=0;this._expandElement=null;this._checkBoxElement=null;this._selectionElements=[];this._styleMap=null;this._variant=null},destruct:function(){this._tree=null;this._textNodes=null;this._expandElement=null;this._checkBoxElement=null;this._selectionElements=null},members:{renderItem:function(a){this._usedNodes=0;if(a!=null){this._renderStates(a,this._tree.getHasFullSelection());this._renderBackground(a);this._renderIndention(a);this._renderCheckBox(a);this._renderCells(a)}else{this.setBackgroundColor(null)}this._hideRemainingElements()},isExpandSymbolTarget:function(b){var a=b.getDomTarget();return this._expandElement!==null&&this._expandElement===a},isCheckBoxTarget:function(b){var a=b.getDomTarget();return this._checkBoxElement!==null&&this._checkBoxElement===a},isSelectionClick:function(c){var a;var b=c.getDomTarget();if(this._tree.getHasFullSelection()){a=this._checkBoxElement!==b}else{a=this._selectionElements.indexOf(b)!=-1}return a},updateEvenState:function(a){this._setState("even",a%2==0)},updateGridlinesState:function(a){this._setState($[154],a)},_renderStates:function(b,a){this._setState($[199],b.isChecked());this._setState($[227],b.isGrayed());this._setState($[89],this._renderAsUnfocused());this._setState($[30],a&&this._renderAsSelected(b));this._renderVariant(b.getVariant());this._renderOverState(b);this._styleMap=this._getStyleMap()},_renderVariant:function(a){if(this._variant!=a){if(this._variant!=null){this._setState(this._variant,false)}this._variant=a;if(this._variant!=null){this._setState(this._variant,true)}}},_renderOverState:function(a){this._setState("over",this._tree.isHoverItem(a))},_setState:function(b,a){if(!this.__states){this.__states={}}if(a){this.__states[b]=true}else{delete this.__states[b]}},_getStyleMap:function(){var a=qx.theme.manager.Appearance.getInstance();return a.styleFrom(this.getAppearance(),this.__states)},_styleFromMap:function(){},_renderBackground:function(b){var a=null;if(this._getRenderThemingBackground(b)){a=this._styleMap.itemBackground}else{a=b.getBackground()}this.setBackgroundColor(a!=$[8]?a:null)},_getRenderThemingBackground:function(d){var b=this._renderAsSelected(d)&&this._tree.getHasFullSelection();var c=d!==null&&d.getBackground()!==null;var a=!c||b||this._hasHoverBackground()||this._tree.getEnabled()===false;return a},_hasHoverBackground:function(){var a=this.hasState("over")&&this._styleMap.itemBackground!==$[8];return a},_renderIndention:function(d){var e=this._getExpandSymbol(d);this._expandElement=null;if(e!=null){var b=this._addIndentSymbol(d.getLevel(),e);this._expandElement=b}var a=this._getLineSymbol(d);if(a!=null){var c=d.getParent();while(!c.isRootItem()){if(c.hasNextSibling()){this._addIndentSymbol(c.getLevel(),a)}c=c.getParent()}}},_getExpandSymbol:function(b){var a=this._tree.getStatesCopy();if(b.getLevel()==0&&!b.hasPreviousSibling()){a.first=true}if(!b.hasNextSibling()){a.last=true}if(b.hasChildren()){if(b.isExpanded()){a.expanded=true}else{a.collapsed=true}}if(this._tree.isHoverElement(this._expandElement)){a.over=true}return this._getImageFromAppearance($[444],a)},_getLineSymbol:function(b){var a=this._tree.getStatesCopy();a.line=true;return this._getImageFromAppearance($[444],a)},_getImageFromAppearance:function(a,b){var c=qx.theme.manager.Appearance.getInstance();var e=c.styleFrom(a,b);var d=e&&e.backgroundImage;return d?e.backgroundImage:null},_addIndentSymbol:function(b,a){var i=null;var g=this._tree.getIndentionOffset(b+1);var d=this._tree.getTreeColumnWidth();if(g<=d){var e=this._tree.getIndentionOffset(b);var h=this._tree.getItemHeight();var c=g-e;var f=this._getImageElement(3);this._setImage(f,a,true);this._setBounds(f,e,0,c,h);i=f}return i},_renderCheckBox:function(e){if(this._tree.getHasCheckBoxes()){var h=this._checkBoxElement;var b=this.__states;this._setState("over",this._tree.isHoverElement(h));var g=this._getImageFromAppearance("tree-check-box",b);this._renderOverState(e);var c=this._getImageElement(3);this._setImage(c,g,true);var f=this._tree.getCheckBoxLeft(e);var d=this._tree.getCheckBoxWidth(e);var a=this._tree.getItemHeight();this._setBounds(c,f,0,d,a);this._checkBoxElement=c}},_renderCells:function(f){var d=this._tree.getColumnCount();var b=this._tree.getHasFullSelection();var e=this._renderAsSelected(f);if(!b&&e){this._renderStates(f,false)}for(var c=0;c<d;c++){this._renderCellBackground(f,c);if(!b&&this._tree.isTreeColumn(c)){if(e){this._renderStates(f,true)}var g=this._renderCellImage(f,c);var a=this._renderCellLabel(f,c);this._selectionElements=[g,a];if(e){this._renderSelectionBackground(f,c);this._renderStates(f,false)}}else{this._renderCellImage(f,c);this._renderCellLabel(f,c)}}},_renderSelectionBackground:function(e,b){if(this._styleMap.itemBackground!==null){var c=this._getBackgroundElement(2);c.style.backgroundColor=this._styleMap.itemBackground;var h=this._tree.getSelectionPadding();var g=this._tree.getItemTextLeft(e,b,true);g-=h[0];var d=this._tree.getItemTextWidth(e,b,true);d+=d>0?h[0]:0;var f=this._getVisualTextWidth(e,b);f+=h[0]+h[1];d=Math.min(d,f);var a=this._tree.getItemHeight();this._setBounds(c,g,0,d,a)}},_renderCellBackground:function(f,b){var d=this._getCellBackground(f,b);if(d!=$[8]&&d!=this._styleMap.backgroundColor){var c=this._getBackgroundElement(1);c.style.backgroundColor=d;var g=this._tree.getItemLeft(f,b,false);var e=this._tree.getItemWidth(f,b,false);var a=this._tree.getItemHeight();if(this._tree.getLinesVisible()){a-=1}this._setBounds(c,g,0,e,a)}},_renderCellImage:function(d,a){var e=d.getImage(a);var b=null;if(e!==null){b=this._getImageElement(3);this._setImage(b,e,true);var f=this._tree.getItemImageLeft(d,a);var c=this._tree.getItemImageWidth(d,a);this._setBounds(b,f,0,c,this._tree.getItemHeight())}return b},_renderCellLabel:function(d,a){var f=d.getText(a);var b=null;if(f!==""){b=this._getTextElement(3);var e=this._tree.getItemTextLeft(d,a);var c=this._tree.getItemTextWidth(d,a);b.style.verticalAlign=$[32];b.style.whiteSpace="nowrap";if(this._tree.isTreeColumn(a)){b.style.textAlign="left"}else{b.style.textAlign=this._tree.getAlignment(a)}b.innerHTML=f;this._setForeground(b,this._getCellColor(d,a));this._setBounds(b,e,0,c,this._tree.getItemHeight());this._setFont(b,this._getCellFont(d,a));this._setTextDecoration(b,this._styleMap.textDecoration);b.style.lineHeight=b.style.height}return b},_getCellBackground:function(c,b){var a;if(this.hasState($[30])||this._tree.getEnabled()===false||this._hasHoverBackground()){a=$[8]}else{a=c.getCellBackground(b)}return a},_getCellColor:function(c,b){var a=c.getCellForeground(b);if(a===null||a===""||this._tree.getEnabled()===false||this.hasState($[30])||this._hasHoverBackground()){a=this._styleMap.itemForeground;if(a===$[8]){a=this._tree.getTextColor()}}return a},_getCellFont:function(c,b){var a=c.getCellFont(b);if(a===null||a===""){a=this._tree.getFont()}return a},_getVisualTextWidth:function(d,a){var e=d.getText(a);var b=this._getCellFont(d,a);var c=qx.ui.basic.Label._getMeasureNode();c.innerHTML=e;this._setFont(c,b);return c.scrollWidth},_renderAsSelected:function(a){return this._tree.isItemSelected(a)||this.hasState($[378])},_renderAsUnfocused:function(){return !this._tree.isFocused()&&!this.hasState($[378])},_setFont:function(b,a){if(a==""||a==null){if(!qx.core.Variant.isSet($[0],$[18])){b.style.font=a}b.style.fontFamily="";b.style.fontSize="";b.style.fontVariant="";b.style.fontStyle="";b.style.fontWeight=""}else{if(a instanceof qx.ui.core.Font){a.renderStyle(b.style)}else{b.style.font=a}}},_setTextDecoration:function(b,a){if(a==null||a==="none"){b.style.textDecoration=""}else{b.style.textDecoration=a}},_setBounds:function(d,b,f,e,a){try{d.style.left=b+"px";d.style.top=f+"px";d.style.width=e+"px";d.style.height=a+"px"}catch(c){throw"setBounds failed: "+[d,b,f,e,a]}},_setForeground:function(b,a){b.style.color=a!=null?a:""},_setImage:function(b,c){var a=this._tree.getEnabled()?1:0.3;org.eclipse.rwt.HtmlUtil.setBackgroundImage(b,c,a)},_getTextElement:function(b){var a=this._getNextElement(b);org.eclipse.rwt.HtmlUtil.setBackgroundImage(a,null);a.style.backgroundColor="";return a},_getImageElement:function(b){var a=this._getNextElement(b);a.innerHTML="";a.style.backgroundColor="";return a},_getBackgroundElement:function(b){var a=this._getNextElement(b);org.eclipse.rwt.HtmlUtil.setBackgroundImage(a,null);a.innerHTML="";return a},_getNextElement:function(c){var a;var b=this._getTargetNode();if(b.childNodes.length>this._usedNodes){a=b.childNodes[this._usedNodes];a.style.display=""}else{a=document.createElement("div");a.style.position=$[27];a.style.overflow=$[17];b.appendChild(a)}a.style.zIndex=c;this._usedNodes++;return a},_hideRemainingElements:function(){var b=this._getTargetNode();for(var a=this._usedNodes;a<b.childNodes.length;a++){b.childNodes[a].style.display="none"}},supportsDrop:function(){return true}}});
-qx.Class.define("org.eclipse.swt.Application",{extend:qx.application.Gui,construct:function(){arguments.callee.base.call(this);this._exitConfirmation=null;this._startupTime=new Date().getTime();if(!org.eclipse.rwt.Client.supportsCss3()){qx.Class.patch(qx.ui.core.Parent,org.eclipse.rwt.GraphicsMixin);qx.Class.patch(qx.ui.form.TextField,org.eclipse.rwt.GraphicsMixin);qx.Class.patch(org.eclipse.rwt.widgets.MultiCellWidget,org.eclipse.rwt.GraphicsMixin)}else{qx.Class.patch(org.eclipse.swt.widgets.ProgressBar,org.eclipse.rwt.GraphicsMixin)}qx.Class.patch(qx.ui.core.ClientDocumentBlocker,org.eclipse.rwt.FadeAnimationMixin);qx.Class.patch(qx.event.type.DomEvent,org.eclipse.rwt.DomEventPatch);org.eclipse.rwt.MobileWebkitSupport.init();org.eclipse.rwt.KeyEventUtil.getInstance();org.eclipse.rwt.GraphicsUtil.init();var a=org.eclipse.rwt.EventHandler;a.setAllowContextMenu(org.eclipse.rwt.widgets.Menu.getAllowContextMenu);a.setMenuManager(org.eclipse.rwt.MenuManager.getInstance())},destruct:function(){var b=qx.ui.core.ClientDocument.getInstance();b.removeEventListener($[271],org.eclipse.swt.Application._onResize);b.removeEventListener($[12],org.eclipse.swt.Application._onKeyPress);var a=org.eclipse.swt.Request.getInstance();a.removeEventListener("send",this._onSend,this)},statics:{_onResize:function(a){org.eclipse.swt.Application._appendWindowSize();var b=org.eclipse.swt.Request.getInstance();if(b.getRequestCounter()!=null){b.send()}},_onKeyPress:function(a){if(a.getKeyIdentifier()==$[116]){a.preventDefault()}},_appendWindowSize:function(){var b=qx.html.Window.getInnerWidth(window);var a=qx.html.Window.getInnerHeight(window);var c=org.eclipse.swt.Request.getInstance();var d=c.getUIRootId();c.addParameter(d+$[303],String(b));c.addParameter(d+$[317],String(a))},_appendSystemDPI:function(){var a=[0,0];if(typeof screen.systemXDPI==$[77]){a[0]=parseInt(screen.systemXDPI);a[1]=parseInt(screen.systemYDPI)}else{var c=document.createElement("div");c.style.width="1in";c.style.height="1in";c.style.padding=0;document.body.appendChild(c);a[0]=parseInt(c.offsetWidth);a[1]=parseInt(c.offsetHeight);document.body.removeChild(c)}var b=org.eclipse.swt.Request.getInstance();b.addParameter("w1.dpi.x",String(a[0]));b.addParameter("w1.dpi.y",String(a[1]))},_appendColorDepth:function(){var b=16;if(typeof screen.colorDepth==$[77]){b=parseInt(screen.colorDepth)}if(qx.core.Variant.isSet($[0],$[40])){b=b==24?32:b}var a=org.eclipse.swt.Request.getInstance();a.addParameter("w1.colorDepth",String(b))}},members:{setExitConfirmation:function(a){if(a==""){this._exitConfirmation=" "}else{this._exitConfirmation=a}},reload:function(a){if(confirm(a)){this.setExitConfirmation(null);window.location.reload(false)}},getStartupTime:function(){return this._startupTime},main:function(a){arguments.callee.base.call(this);qx.io.Alias.getInstance().add($[118],"./rwt-resources/resource/static");qx.io.Alias.getInstance().add("org.eclipse.swt","./rwt-resources/resource");var e=qx.ui.core.ClientDocument.getInstance();e.addEventListener($[271],org.eclipse.swt.Application._onResize);e.addEventListener($[12],org.eclipse.swt.Application._onKeyPress);e.getElement().setAttribute("spellcheck","false");if(qx.core.Variant.isSet($[0],$[40])){e.getElement().setAttribute("ondrop","event.preventDefault();");e.getElement().style.position=$[27];e.setSelectable(true);var b=document.documentElement;qx.html.EventRegistration.addEventListener(b,$[2],this._onFFMouseDown)}var d=qx.client.History.getInstance();d.addEventListener("request",this._historyNavigated,this);org.eclipse.swt.Application._appendWindowSize();org.eclipse.swt.Application._appendSystemDPI();org.eclipse.swt.Application._appendColorDepth();var c=org.eclipse.swt.Request.getInstance();c.addEventListener("send",this._onSend,this);c._sendImmediate(true)},close:function(a){arguments.callee.base.call(this);return this._exitConfirmation},_historyNavigated:function(c){var a=c.getData();var b=org.eclipse.swt.Request.getInstance();b.addParameter("org.eclipse.rwt.events.historyNavigated","true");b.addParameter("org.eclipse.rwt.events.historyNavigated.entryId",a);b.send()},_onFFMouseDown:function(b){var a=null;try{a=b.originalTarget.tagName}catch(c){}if(b.button===0&&a!=null&&a!="INPUT"){b.preventDefault()}},_onSend:function(a){var c=qx.event.type.MouseEvent.getPageX();var b=qx.event.type.MouseEvent.getPageY();var d=org.eclipse.swt.Request.getInstance();var e=d.getUIRootId();var d=org.eclipse.swt.Request.getInstance();d.addParameter(e+".cursorLocation.x",String(c));d.addParameter(e+".cursorLocation.y",String(b))}}});
-qx.Class.define("org.eclipse.rwt.AsyncKeyEventUtil",{type:$[33],extend:qx.core.Object,construct:function(){arguments.callee.base.call(this);this._pendingEventInfo=null;this._allowIntercept=true;this._bufferedEvents=new Array();this._keyEventRequestRunning=false;var a=org.eclipse.swt.Request.getInstance();a.addEventListener($[280],this._onRequestReceived,this)},destruct:function(){var a=org.eclipse.swt.Request.getInstance();a.removeEventListener($[280],this._onRequestReceived,this)},members:{_untrustedKeyCodes:qx.core.Variant.select($[0],{gecko:[37,38,39,40,35,36,45,46,112,113,114,115,116,117,118,119,120,121,122,123],"default":[]}),intercept:function(a,i,h,e){var c=org.eclipse.rwt.KeyEventUtil.getInstance();var j=false;if(this._allowIntercept){var d=c._getTargetControl();var g=c._hasKeyListener(d);var f=c._hasTraverseListener(d);var b=false;if(f){b=c._isTraverseKey(i)}if(g||(f&&b)){if(!this._isUntrustedKey(i,e)){if(this._keyEventRequestRunning){this._bufferedEvents.push(this._getEventInfo(e));this._cancelDomEvent(e);j=true}else{if(c._isRelevantEvent(a,i)){this._pendingEventInfo=this._getEventInfo(e);this._sendKeyDown(d,i,h,e);this._cancelDomEvent(e);j=true}}}}}return j},cancelEvent:function(){this._pendingEventInfo=null},allowEvent:function(){if(this._pendingEventInfo!==null){var a=org.eclipse.swt.EventUtil.getSuspended();org.eclipse.swt.EventUtil.setSuspended(false);this._allowIntercept=false;this._redispatchKeyEvent(this._pendingEventInfo);this._allowIntercept=true;org.eclipse.swt.EventUtil.setSuspended(a)}},_isUntrustedKey:function(e,d){var a=false;if(qx.core.Variant.isSet($[0],$[40])){var c=d.target.tagName.toLowerCase();if(d.ctrlKey){a=true}else{if(c==$[85]||c==$[167]){for(var b=0;!a&&b<this._untrustedKeyCodes.length;b++){if(this._untrustedKeyCodes[b]===e){a=true}}}}}return a},_cancelDomEvent:function(a){if(qx.core.Variant.isSet($[0],$[18])){a.returnValue=false;a.cancelBubble=true}else{a.preventDefault();a.stopPropagation()}},_sendKeyDown:function(d,e,a,c){var b=org.eclipse.rwt.KeyEventUtil.getInstance();b._attachKeyDown(d,e,a,c);this._keyEventRequestRunning=true;org.eclipse.swt.Request.getInstance()._sendImmediate(true)},_onRequestReceived:function(a){if(this._keyEventRequestRunning){this._keyEventRequestRunning=false;this._checkBufferedEvents()}},_getEventInfo:function(a){result={target:a.target||a.srcElement,type:a.type,bubbles:a.bubbles,view:a.view,ctrlKey:a.ctrlKey,altKey:a.altKey,shiftKey:a.shiftKey,keyCode:a.keyCode,isChar:a.isChar,pageX:a.pageX,pageY:a.pageY};result.charCode=a.type===$[12]?a.charCode:0;return result},_checkBufferedEvents:function(){while(this._bufferedEvents.length>0&&!this._keyEventRequestRunning){var b=this._bufferedEvents.length;var a=this._bufferedEvents.shift();this._redispatchKeyEvent(a)}},_redispatchKeyEvent:function(b){if(qx.core.Variant.isSet($[0],$[40])){var a=document.createEvent("KeyboardEvent");a.initKeyEvent(b.type,b.bubbles,true,b.view,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.keyCode,b.charCode);b.target.dispatchEvent(a)}else{if(qx.core.Variant.isSet($[0],$[71])){var a=document.createEvent("Events");a.initEvent(b.type,b.bubbles,true);a.view=b.view;a.ctrlKey=b.ctrlKey;a.altKey=b.altKey;a.metaKey=b.metaKey;a.keyCode=b.keyCode;b.target.dispatchEvent(a)}else{if(qx.core.Variant.isSet($[0],$[18])){var a=document.createEventObject();a.type=b.type;a.cancelable=true;if(b.view){a.view=b.view}a.ctrlKey=b.ctrlKey;a.altKey=b.altKey;a.metaKey=b.metaKey;a.keyCode=b.keyCode;b.srcElement.fireEvent(a)}else{throw new Error("Redispatching key events not supported")}}}}}});
-qx.Class.define("org.eclipse.swt.Request",{type:$[33],extend:qx.core.Target,construct:function(){arguments.callee.base.call(this);this._url="";this._parameters={};this._uiRootId="";this._requestCounter;this._runningRequestCount=0;this._inDelayedSend=false;var a=qx.io.remote.RequestQueue.getInstance();a.setDefaultTimeout(60000*60*24);a.setMaxConcurrentRequests(1);this._currentRequest=null;this._timeoutPage=""},destruct:function(){this._currentRequest=null},events:{send:$[70],received:$[70]},members:{setUrl:function(a){this._url=a},getUrl:function(){return this._url},setUIRootId:function(a){this._uiRootId=a},getUIRootId:function(){return this._uiRootId},setRequestCounter:function(a){this._requestCounter=a},getRequestCounter:function(){return this._requestCounter},setTimeoutPage:function(a){this._timeoutPage=a},addParameter:function(a,b){this._parameters[a]=b},removeParameter:function(a){delete this._parameters[a]},getParameter:function(b){var a=this._parameters[b];if(a===undefined){a=null}return a},addEvent:function(a,b){this._parameters[a]=b},enableUICallBack:function(){var a=new qx.io.remote.Request(this._url,qx.net.Http.METHOD_GET,qx.util.Mime.JAVASCRIPT);a.addEventListener($[43],this._handleUICallBackFinished,this);a.addEventListener($[51],this._handleUICallBackFinished,this);a.setParameter("custom_service_handler","org.eclipse.rwt.internal.lifecycle.UICallBackServiceHandler");this._sendStandalone(a)},_handleUICallBackFinished:function(event){if(event.getType()===$[43]){try{var text=event.getContent();if(text&&text.length>0){window.eval(text)}}catch(ex){throw new Error("Could not execute javascript: ["+text+"]",ex)}}var transport=event.getTarget();var request=transport.getRequest();transport.dispose();request.dispose()},send:function(){if(!this._inDelayedSend){this._inDelayedSend=true;var a=function(){this._sendImmediate(true)};qx.client.Timer.once(a,this,60)}},sendSyncronous:function(){this._sendImmediate(false)},_sendImmediate:function(a){this._dispatchSendEvent();this._parameters.uiRoot=this._uiRootId;if(this._requestCounter==-1){this._inDelayedSend=false;this.send()}else{if(this._requestCounter!=null){this._parameters.requestCounter=this._requestCounter;this._requestCounter=-1}var b=this._createRequest();b.setAsynchronous(a);this._inDelayedSend=false;this._copyParameters(b);this._runningRequestCount++;if(this._runningRequestCount===1){qx.client.Timer.once(this._showWaitHint,this,500)}this._parameters={};if(a){b.send()}else{this._sendStandalone(b)}}},_copyParameters:function(b){var c=new Array();for(var a in this._parameters){c.push(encodeURIComponent(a)+"="+encodeURIComponent(this._parameters[a]))}b.setData(c.join("&"))},_createRequest:function(){var a=new qx.io.remote.Request(this._url,qx.net.Http.METHOD_POST,qx.util.Mime.JAVASCRIPT);a.addEventListener($[62],this._handleSending,this);a.addEventListener($[43],this._handleCompleted,this);a.addEventListener($[51],this._handleFailed,this);return a},_sendStandalone:function(b){var a=b;var c=new qx.io.remote.Exchange(a);c.addEventListener($[62],a._onsending,a);c.addEventListener($[67],a._onreceiving,a);c.addEventListener($[43],a._oncompleted,a);c.addEventListener($[65],a._onaborted,a);c.addEventListener($[63],a._ontimeout,a);c.addEventListener($[51],a._onfailed,a);c._start=(new Date).valueOf();c.send()},_handleSending:function(a){var b=a.getTarget();this._currentRequest=b.getRequest()},_handleFailed:function(a){var b=a.getTarget();this._currentRequest=b.getRequest();var c=true;if(this._isConnectionError(a.getStatusCode())){c=!this._handleConnectionError(a)}if(c){this._hideWaitHint();var e;var f=null;var d=b.getImplementation().getRequest();if(typeof(d.responseText)!="unknown"){f=d.responseText}if(f==""||f==null){e="<p>Request failed.</p><pre>HTTP Status Code: "+String(a.getStatusCode())+"</pre>"}else{e=f}org.eclipse.rwt.ErrorHandler.showError(e)}b.dispose()},_handleCompleted:function(evt){var exchange=evt.getTarget();var text=exchange.getImplementation().getRequest().responseText;if(text&&text.indexOf("<!DOCTYPE")===0){org.eclipse.rwt.ErrorHandler.showTimeout(this._timeoutPage)}else{var errorOccured=false;try{if(text&&text.length>0){org.eclipse.swt.EventUtil.setSuspended(true);window.eval(text);qx.ui.core.Widget.flushGlobalQueues();org.eclipse.swt.EventUtil.setSuspended(false)}}catch(ex){org.eclipse.rwt.ErrorHandler.processJavaScriptErrorInResponse(text,ex,this._currentRequest);errorOccured=true}if(!errorOccured){this._dispatchReceivedEvent()}}this._runningRequestCount--;this._hideWaitHint();exchange.dispose()},_handleConnectionError:function(g){var a="The server seems to be temporarily unavailable.\nWould you like to retry?";var i=confirm(a);if(i){var b=this._createRequest();var e=this._currentRequest;b.setAsynchronous(e.getAsynchronous());var c=e.getRequestHeaders();for(var d in c){b.setRequestHeader(d,c[d])}var h=e.getParameters();for(var f in h){b.setParameter(f,h[f])}b.setData(e.getData());this._restartRequest(b)}return i},_restartRequest:function(a){a.setState($[196]);var b=qx.io.remote.RequestQueue.getInstance();qx.lang.Array.insertAt(b._queue,a,0);b._check();if(b.getEnabled()){b._timer.start()}},_isConnectionError:function(b){var a;if(qx.core.Variant.isSet($[0],$[18])){a=(b===12007||b===12029||b===12030||b===12031||b===12152)}else{if(qx.core.Variant.isSet($[0],$[40])){if(org.eclipse.rwt.Client.getMajor()*10+org.eclipse.rwt.Client.getMinor()>=19){a=(b===0)}else{a=(b===-1)}}else{if(qx.core.Variant.isSet($[0],$[71])){a=(b===0)}else{if(qx.core.Variant.isSet($[0],$[121])){a=(b===0)}else{a=false}}}}return a},_showWaitHint:function(){if(this._runningRequestCount>0){var a=qx.ui.core.ClientDocument.getInstance();a.setGlobalCursor(qx.constant.Style.CURSOR_PROGRESS)}},_hideWaitHint:function(){if(this._runningRequestCount===0){var a=qx.ui.core.ClientDocument.getInstance();a.setGlobalCursor(null)}},_dispatchSendEvent:function(){if(this.hasEventListeners("send")){var a=new qx.event.type.DataEvent("send",this);this.dispatchEvent(a,true)}},_dispatchReceivedEvent:function(){if(this.hasEventListeners($[280])){var a=new qx.event.type.DataEvent($[280],this);this.dispatchEvent(a,true)}}}});
-qx.Class.define("org.eclipse.swt.EventUtil",{statics:{_suspended:false,setSuspended:function(a){this._suspended=a},getSuspended:function(){return this._suspended},DOUBLE_CLICK_TIME:500,_capturingWidget:null,_lastMouseDown:{widget:null,button:"",x:-1,y:-1,mouseUpCount:0},_shiftKey:false,_ctrlKey:false,_altKey:false,_metaKey:false,eventTimestamp:function(){var a=qx.core.Init.getInstance().getApplication();return new Date().getTime()-a.getStartupTime()},widgetSelected:function(b){var h=org.eclipse.swt.WidgetManager.getInstance();var d=org.eclipse.swt.Request.getInstance();var g=h.findIdByWidget(b.getTarget());var f=b.getTarget().getLeft();var e=b.getTarget().getTop();var c=b.getTarget().getWidth();var a=b.getTarget().getHeight();org.eclipse.swt.EventUtil.doWidgetSelected(g,f,e,c,a)},doWidgetSelected:function(f,e,d,b,a){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.Request.getInstance();c.addEvent($[64],f);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();c.addParameter(f+$[294],e);c.addParameter(f+$[295],d);c.addParameter(f+$[303],b);c.addParameter(f+$[317],a);c.send()}},addWidgetSelectedModifier:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var a=org.eclipse.swt.EventUtil._getKeyModifier();if(a!==""){var b=org.eclipse.swt.Request.getInstance();b.addParameter("org.eclipse.swt.events.widgetSelected.modifier",a)}}},_getKeyModifier:function(){var a="";var b=org.eclipse.rwt.Client.getPlatform()==="mac"&&org.eclipse.swt.EventUtil._metaKey;if(org.eclipse.swt.EventUtil._shiftKey){a+="shift,"}if(org.eclipse.swt.EventUtil._ctrlKey||b){a+="ctrl,"}if(org.eclipse.swt.EventUtil._altKey){a+="alt,"}return a},focusGained:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var b=org.eclipse.swt.Request.getInstance();b.send()}},focusLost:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var b=org.eclipse.swt.Request.getInstance();b.send()}},mouseDown:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()&&org.eclipse.swt.EventUtil._isRelevantMouseEvent(this,a)){org.eclipse.swt.EventUtil._capturingWidget=this;if(org.eclipse.swt.EventUtil._isDoubleClick(this,a)){org.eclipse.swt.EventUtil._clearLastMouseDown();org.eclipse.swt.EventUtil._mouseDoubleClickParams(this,a)}else{var c=org.eclipse.swt.EventUtil._lastMouseDown;c.widget=this;c.button=a.getButton();c.x=a.getPageX();c.y=a.getPageY();c.mouseUpCount=0;qx.client.Timer.once(org.eclipse.swt.EventUtil._clearLastMouseDown,this,org.eclipse.swt.EventUtil.DOUBLE_CLICK_TIME)}org.eclipse.swt.EventUtil._mouseDownParams(this,a);var b=org.eclipse.swt.Request.getInstance();b.send()}},mouseUp:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()&&org.eclipse.swt.EventUtil._isRelevantMouseEvent(this,a)){org.eclipse.swt.EventUtil._capturingWidget=null;org.eclipse.swt.EventUtil._lastMouseDown.mouseUpCount+=1;org.eclipse.swt.EventUtil._mouseUpParams(this,a);var b=org.eclipse.swt.Request.getInstance();b.send()}},_isRelevantMouseEvent:function(c,b){var a=true;if(c!==org.eclipse.swt.EventUtil._capturingWidget&&c!==b.getOriginalTarget()){var f=org.eclipse.swt.WidgetManager.getInstance();var e=b.getOriginalTarget();var d=f.findControl(e);a=c===d}return a},_clearLastMouseDown:function(){var a=org.eclipse.swt.EventUtil._lastMouseDown;a.widget=null;a.button="";a.mouseUpCount=0;a.x=-1;a.y=-1},_isDoubleClick:function(b,a){var c=org.eclipse.swt.EventUtil._lastMouseDown;return c.mouseUpCount===1&&c.widget===b&&c.button===qx.event.type.MouseEvent.C_BUTTON_LEFT&&c.button===a.getButton()},_mouseDownParams:function(e,b){var f=org.eclipse.swt.WidgetManager.getInstance().findIdByWidget(e);var d=org.eclipse.swt.Request.getInstance();var c=org.eclipse.swt.EventUtil._determineMouseButton(b);var a=org.eclipse.swt.EventUtil._getKeyModifier();d.addEvent("org.eclipse.swt.events.mouseDown",f);d.addParameter("org.eclipse.swt.events.mouseDown.button",c);d.addParameter("org.eclipse.swt.events.mouseDown.x",b.getPageX());d.addParameter("org.eclipse.swt.events.mouseDown.y",b.getPageY());d.addParameter("org.eclipse.swt.events.mouseDown.time",this.eventTimestamp());if(a!==""){d.addParameter("org.eclipse.swt.events.mouseDown.modifier",a)}},_mouseUpParams:function(e,b){var f=org.eclipse.swt.WidgetManager.getInstance().findIdByWidget(e);var d=org.eclipse.swt.Request.getInstance();var c=org.eclipse.swt.EventUtil._determineMouseButton(b);var a=org.eclipse.swt.EventUtil._getKeyModifier();d.addEvent("org.eclipse.swt.events.mouseUp",f);d.addParameter("org.eclipse.swt.events.mouseUp.button",c);d.addParameter("org.eclipse.swt.events.mouseUp.x",b.getPageX());d.addParameter("org.eclipse.swt.events.mouseUp.y",b.getPageY());d.addParameter("org.eclipse.swt.events.mouseUp.time",this.eventTimestamp());if(a!==""){d.addParameter("org.eclipse.swt.events.mouseUp.modifier",a)}},_mouseDoubleClickParams:function(d,b){var e=org.eclipse.swt.WidgetManager.getInstance().findIdByWidget(d);var c=org.eclipse.swt.Request.getInstance();var a=org.eclipse.swt.EventUtil._getKeyModifier();c.addEvent("org.eclipse.swt.events.mouseDoubleClick",e);c.addParameter("org.eclipse.swt.events.mouseDoubleClick.button",org.eclipse.swt.EventUtil._determineMouseButton(b));c.addParameter("org.eclipse.swt.events.mouseDoubleClick.x",b.getPageX());c.addParameter("org.eclipse.swt.events.mouseDoubleClick.y",b.getPageY());c.addParameter("org.eclipse.swt.events.mouseDoubleClick.time",this.eventTimestamp());if(a!==""){c.addParameter("org.eclipse.swt.events.mouseDoubleClick.modifier",a)}},_determineMouseButton:function(b){var a=0;switch(b.getButton()){case qx.event.type.MouseEvent.C_BUTTON_LEFT:a=1;break;case qx.event.type.MouseEvent.C_BUTTON_MIDDLE:a=2;break;case qx.event.type.MouseEvent.C_BUTTON_RIGHT:a=3;break}return a},helpRequested:function(a){if(a.getKeyIdentifier()==="F1"){a.stopPropagation();a.preventDefault();var c=a.getTarget();var e=org.eclipse.swt.WidgetManager.getInstance();var d=e.findIdByWidget(c);if(d===null){c=e.findControl(c);d=e.findIdByWidget(c)}if(d!=null){var b=org.eclipse.swt.Request.getInstance();b.addEvent("org.eclipse.swt.events.help",d);b.send()}}},menuDetectedByKey:function(b){if(b.getKeyIdentifier()==="Apps"){b.stopPropagation();b.preventDefault();var a=qx.event.type.MouseEvent.getPageX();var c=qx.event.type.MouseEvent.getPageY();org.eclipse.swt.EventUtil.sendMenuDetected(b.getTarget(),a,c)}},menuDetectedByMouse:function(b){if(b.getButton()===qx.event.type.MouseEvent.C_BUTTON_RIGHT){b.stopPropagation();b.preventDefault();var a=b.getPageX();var c=b.getPageY();org.eclipse.swt.EventUtil.sendMenuDetected(b.getTarget(),a,c)}},sendMenuDetected:function(c,a,f){if(!org.eclipse.swt.EventUtil.getSuspended()){var e=org.eclipse.swt.WidgetManager.getInstance();while(c!=null&&!e.isControl(c)){c=c.getParent?c.getParent():null}var d=e.findIdByWidget(c);if(d!=null){var b=org.eclipse.swt.Request.getInstance();b.addEvent("org.eclipse.swt.events.menuDetect",d);b.addParameter("org.eclipse.swt.events.menuDetect.x",a);b.addParameter("org.eclipse.swt.events.menuDetect.y",f);b.send()}}}}});
-qx.Class.define("org.eclipse.swt.WidgetManager",{type:$[33],extend:qx.core.Object,construct:function(){arguments.callee.base.call(this);this._map={};this._current=null;this._fontPool=new Object()},statics:{_onAppearFocus:function(a){var b=this;b.focus();a.getTarget().removeEventListener($[31],org.eclipse.swt.WidgetManager._onAppearFocus,b)}},members:{dispose:function(c){var b=this.findWidgetById(c);if(b!=null){this.remove(b);if(!b.getDisposed()){this._removeToolTipPopup(b);var a=b.getParent();if(a&&a.getChildren()){b.setParent(null)}b.destroy()}}},add:function(b,c,a){this._map[c]=b;if(a!=$[8]&&a==true){b.setUserData("isControl",true)}b.setUserData("id",c)},remove:function(a){var b=this.findIdByWidget(a);delete this._map[b]},findWidgetById:function(a){return this._map[a]},findIdByWidget:function(b){var a;if(b!=null){a=b.getUserData("id")}return a},isControl:function(b){var a=null;if(b!=null){a=b.getUserData("isControl")}return a!=null&&a==true},findControl:function(b){var a=b;while(a!=null&&!this.isControl(a)){a=a.getParent?a.getParent():null}return a},setParent:function(b,c){var a=this.findWidgetById(c);if(a instanceof org.eclipse.swt.custom.ScrolledComposite){a.setContent(b)}else{if(a instanceof org.eclipse.swt.widgets.ExpandBar){a.addWidget(b)}else{b.setParent(a)}}},setHtmlId:function(a,b){if(a instanceof Object&&typeof a.setHtmlProperty==$[44]){a.setHtmlProperty("id",b)}},focus:function(a){var b=this.findWidgetById(a);if(b.isSeeable()){b.focus()}else{b.addEventListener($[31],org.eclipse.swt.WidgetManager._onAppearFocus,b)}},setFont:function(f,c,e,d,b){if(f.setFont){var a=this._createFont(c,e,d,b);f.setFont(a)}},_createFont:function(c,e,d,b){var f=c+e+d+b;var a=this._fontPool[f];if(!a){a=new qx.ui.core.Font(e,c);a.setBold(d);a.setItalic(b);this._fontPool[f]=a}return a},setToolTip:function(c,b){if(b!=null&&b!=""){c.setUserData($[327],b);var a=org.eclipse.rwt.widgets.WidgetToolTip.getInstance();c.setToolTip(a);if(a.getParent()!=null){if(a.getBoundToWidget()==c){a.updateText(c)}}}else{this._removeToolTipPopup(c)}},_removeToolTipPopup:function(a){a.setToolTip(null);a.setUserData($[327],null)},setBackgroundGradient:function(e,c,a,b){var f=null;if(c!=null&&a!=null){f=new Array();for(var d=0;d<c.length;d++){f[d]=[a[d]/100,c[d]]}f.horizontal=!b}e.setBackgroundGradient(f)},setRoundedBorder:function(h,b,e,f,i,c,a){if(b>0&&e!=null&&f>=0&&i>=0&&c>=0&&a>=0){var g=[f,i,c,a];var d=new org.eclipse.rwt.Border(b,$[114],e,g);h.setBorder(d)}else{h.resetBorder()}}}});
-qx.Mixin.define("org.eclipse.rwt.FadeAnimationMixin",{properties:{animation:{check:$[110],nullable:false,init:null,apply:$[345],themeable:true}},construct:function(){this.hide();this._renderAppearance()},destruct:function(){if(this._animation!=null){this._animation.dispose()}this._animation=null},members:{_animation:null,_applyAnimation:function(d,a){var b=0;if(d.fadeIn){b|=org.eclipse.rwt.AnimationRenderer.ANIMATION_APPEAR}if(d.fadeOut){b|=org.eclipse.rwt.AnimationRenderer.ANIMATION_DISAPPEAR}if(b!=0){if(this._animation==null){this._animation=new org.eclipse.rwt.Animation();var c=this._animation.getDefaultRenderer();c.animate(this,$[42],b);this._animation.addEventListener("init",this._initAnimation,this)}this._animation.getDefaultRenderer().setActive(true)}else{if(this._animation!=null){this._animation.getDefaultRenderer().setActive(false)}}},_initAnimation:function(a){if(a.getData()==$[31]){this._animation.setProperties(this.getAnimation()["fadeIn"])}else{this._animation.setProperties(this.getAnimation()["fadeOut"])}}}});
-qx.Class.define("org.eclipse.rwt.AnimationRenderer",{extend:qx.core.Object,construct:function(a){this._autoDispose=false;arguments.callee.base.call(this);this._animation=a;this._animation._addRenderer(this);this._converterFunction=null;this._renderFunction=null;this._context=null;this._startValue=null;this._endValue=null;this._lastValue=null;this._setupFunction=null;this._cloneFrom=null;this._active=true;this._activeOnce=false;this._invisibilityValue=0;this._fullVisibilityValue=null;this._autoStartEnabled=true;this._renderType=null;this._renderAdapter=null;this._animationType=0;this._autoCheck=true},destruct:function(){this.clearAnimation();this._animation._removeRenderer(this);this._animation=null;this._startValue=null;this._endValue=null;this._invisibilityValue=null;this._lastValue=null;this._setupFunction=null;this._converterFunction=null;this._renderFunction=null;this._context=null;this._cloneFrom=null},members:{setConverter:function(a){if(typeof a==$[13]){this._converterFunction=org.eclipse.rwt.AnimationRenderer.converter[a]}else{this._converterFunction=a}},setRenderFunction:function(b,a){if(this._renderType==null){this._renderFunction=b;this._context=a}},renderValue:function(a){this._renderFunction.call(this._context,a);this._lastValue=a},setStartValue:function(a){this._startValue=a},setEndValue:function(a){this._endValue=a},setSetupFunction:function(a){this._setupFunction=a},setCloneFrom:function(a){this._cloneFrom=a},getAnimation:function(){return this._animation},getContext:function(){return this._context},getStartValue:function(a){return this._startValue},getEndValue:function(a){return this._endValue},getLastValue:function(){return this._lastValue},setActive:function(a){if(this._active!=a){if(this._animation.isRunning()){throw'AnimationRenderer: Can not change "active" while running!'}this._active=a;if(this._renderType!=null){this._handleAnimationType()}}},activateOnce:function(){if(!this._activeOnce){this.setActive(true);this._activeOnce=true}},cancelActivateOnce:function(){if(this._activeOnce){this._activeOnce=false;this.setActive(false)}},_setup:function(a){if(this._active){if(this._context instanceof qx.ui.core.Widget&&this._context._isCreated!==true){if(this._context._isInGlobalElementQueue){qx.ui.core.Widget.flushGlobalQueues()}else{throw new Error("AnimationRenderer setup failed: Widget not ready.")}}if(this._setupFunction!=null){this._setupFunction.call(this._context,a,this)}this._startValue=this._prepareValue(this._startValue);this._endValue=this._prepareValue(this._endValue);if(this._renderFunction==null||this._converterFunction==null){throw new Error("renderFunction or converterFunction missing")}}},_render:function(b){if(this._active){var a=this._cloneFrom!=null?this._cloneFrom.getLastValue():b;try{var c=this._converterFunction(a,this._startValue,this._endValue);this.renderValue(c)}catch(d){throw"AnimationRenderer failed: "+(d.message?d.message:d)}}},_finish:function(a){if(this._active&&a==$[318]){this._updateWidgetVisibility();this._forceWidgetRenderer()}this.cancelActivateOnce()},_prepareValue:function(c){var a=c;switch(this._renderType){case $[78]:if(typeof c==$[13]){if(c==$[156]||c==""){a=null}else{a=qx.util.ColorUtil.cssStringToRgb(c)}}break;case $[298]:if(c){var a=[];for(var b=0;b<c.length;b++){a[b]=[c[b][0],qx.util.ColorUtil.cssStringToRgb(c[b][1])]}}break;case $[42]:a=(c==null||c>1||c<0)?1:c;break;default:a=c!=null?c:0;break}return a},animate:function(c,a,b){if(this._context!=c||this._renderType!=a||this._animationType!=b){this.clearAnimation()}this._context=c;this._renderAdapter=c.getAdapter(org.eclipse.rwt.WidgetRenderAdapter);this._renderType=a;this._animationType=b;this._renderFunction=c[this._getRenderFunctionName()];var d=org.eclipse.rwt.AnimationRenderer.converterByRenderType;this.setConverter(d[this._renderType]);this._handleAnimationType()},clearAnimation:function(){if(this._renderType!=null){this._animationType=0;this._handleAnimationType();this._renderType=null;this.setRenderFunction(null,null);this._renderAdapter=null}},isAnimated:function(b){var a=false;if(this._animationType>0&&this._active){var c=b&this._animationType;if(typeof b==$[8]||c!=0){a=true}}return a},setInvisibilityValue:function(a){this._invisibilityValue=a},setAutoStart:function(a){this._autoStartEnabled=a},setAutoCheck:function(a){this._autoCheck=a},getValueFromWidget:function(){var a=null;switch(this._renderType){case $[42]:a=this._context.getOpacity();break;case $[36]:if(this._context.isCreated()){a=parseInt(this._context._style.height)}else{a=this._context.getHeightValue();this._context._computedHeightValue=null;this._context._invalidatePreferredInnerHeight();this._context._invalidatePreferredBoxHeight()}break;case $[78]:var c=$[78];var b=this._context;if(b.getGfxProperty&&b.getGfxProperty(c)){a=b.getGfxProperty(c)}else{if(b.getStyleProperty(c)){a=b.getStyleProperty(c)}else{a=null}}break;case $[298]:var b=this._context;a=b.getBackgroundGradient();break;default:throw"getValueFromWidget: "+this._renderType+" not supported!";break}return a},checkValues:function(){var a;switch(this._renderType){case $[298]:case $[78]:a=this._startValue!=null&&this._endValue!=null;break;default:a=true;break}return a&&this._startValue!=this._endValue},_handleAnimationType:function(){if(this._animation.isRunning()){throw"AnimationRenderer: Can not change animation while running!"}if(this.isAnimated()){if(!this._context.getUserData($[225])){this._context.setUserData($[225],this);this._overwriteApplyVisibility(true);this._overwriteWidgetRenderer(true)}if(this._context.getUserData($[225])!=this){throw"Error: Widget already has an active animationRenderer!"}}else{if(this._context.getUserData($[225])==this){this._context.setUserData($[225],null);this._overwriteApplyVisibility(false);this._overwriteWidgetRenderer(false)}}},_overwriteApplyVisibility:function(a){if(a){this._renderAdapter.addRenderListener($[115],this._onVisibilityChange,this)}else{this._renderAdapter.removeRenderListener($[115],this._onVisibilityChange,this)}},_overwriteWidgetRenderer:function(b){var a=this._getRenderFunctionName();if(!this._context[a]){throw ("unkown renderfunction "+a)}if(b){if(!this.__onOriginalRenderer){this.__onOriginalRenderer=qx.lang.Function.bind(this._onOriginalRenderer,this)}this._context[a]=this.__onOriginalRenderer}else{delete this._context[a]}},_onVisibilityChange:function(b){var a;if(b.getData()){a=this._onBeforeAppear()}else{a=this._onBeforeDisappear()}if(!a){b.preventDefault()}},_onBeforeAppear:function(){if(this._context.isCreated()){this._animation.skip()}else{this._animation.cancel()}var a=org.eclipse.rwt.AnimationRenderer.ANIMATION_APPEAR;if(this.isAnimated(a)){this.setEndValue(this.getValueFromWidget());if(this._invisibilityValue!=null){this.setStartValue(this._invisibilityValue);if(this._context.isCreated()){this._render(0)}else{this._renderStartValueOnCreate()}}this._autoStart(a)}return true},_onBeforeDisappear:function(){if(this._context.isCreated()){this._animation.skip()}else{this._animation.cancel()}var b=org.eclipse.rwt.AnimationRenderer.ANIMATION_DISAPPEAR;var a=!this.isAnimated(b);if(!a){if(this._invisibilityValue!=null){this.setEndValue(this._invisibilityValue)}this.setStartValue(this.getValueFromWidget());this._autoStart(b)}return a},_onOriginalRenderer:function(e,d){if(this._animation.isStarted()){var c=this._animation.getConfig();var b=this._endValue;if(c==$[79]||c==$[31]){this.setEndValue(e)}if(b!=this._endValue){if(this._animation.isRunning()){this.setStartValue(this.getLastValue())}if(!this._animation.restart()){this.renderValue(e);this.cancelActivateOnce()}}}else{var a=org.eclipse.rwt.AnimationRenderer.ANIMATION_CHANGE;if(this.isAnimated(a)&&this._context.isSeeable()){this.setStartValue(typeof d!=$[8]?d:this.getValueFromWidget());this.setEndValue(e);if(!this._autoStart(a)&&this._autoStartEnabled){this.renderValue(e)}}else{this.renderValue(e)}}},_getRenderFunctionName:function(){var a=org.eclipse.rwt.AnimationRenderer.renderFunctionNames;return a[this._renderType]},_forceWidgetRenderer:function(){var a=org.eclipse.rwt.AnimationRenderer.applyFunctionNames[this._renderType];this._context[a](this._context.get(this._renderType))},_autoStart:function(b){var a=false;if(this._autoStartEnabled&&this.isAnimated(b)&&(this._autoCheck?this.checkValues():true)){a=this._animation.start(this._typeToConfig(b))}else{this.cancelActivateOnce()}return a},_typeToConfig:function(b){var a=null;switch(b){case org.eclipse.rwt.AnimationRenderer.ANIMATION_APPEAR:a=$[31];break;case org.eclipse.rwt.AnimationRenderer.ANIMATION_DISAPPEAR:a=$[318];break;case org.eclipse.rwt.AnimationRenderer.ANIMATION_CHANGE:a=$[79];break}return a},_updateWidgetVisibility:function(){var a=this._context.getVisibility();this._renderAdapter.forceRender($[115],a)},_renderStartValueOnCreate:function(){this._context.addEventListener($[105],this._onCreate,this)},_onCreate:function(){this._context.removeEventListener($[105],this._onCreate,this);this._render(0)}},statics:{ANIMATION_APPEAR:1,ANIMATION_DISAPPEAR:2,ANIMATION_CHANGE:4,renderFunctionNames:{height:"_renderRuntimeHeight",opacity:$[372],backgroundColor:"_styleBackgroundColor",backgroundGradient:$[356]},applyFunctionNames:{height:$[450],opacity:$[372],backgroundColor:$[540],backgroundGradient:$[356]},converterByRenderType:{height:"numericPositiveRound",opacity:"factor",backgroundColor:$[6],backgroundGradient:$[128]},converter:{none:function(a){return a},round:Math.round,positive:function(a){return Math.max(0,a)},numeric:function(c,b,a){return b+(a-b)*c},numericRound:function(d,c,b){var a=c+(b-c)*d;return Math.round(a)},numericPositive:function(c,b,a){var d=a-b;return Math.max(0,b+d*c)},numericPositiveRound:function(d,c,b){var e=b-c;var a=Math.max(0,c+e*d);return Math.round(a)},factor:function(d,c,b){var a=c+(b-c)*d;return Math.max(0,Math.min(a,1))},color:function(g,c,b){var a=[];var d;var f;for(var e=0;e<3;e++){f=b[e]-c[e];d=Math.round(c[e]+f*g);a[e]=Math.max(0,Math.min(d,255))}return qx.util.ColorUtil.rgbToRgbString(a)},gradient:function(f,c,b){var g=org.eclipse.rwt.AnimationRenderer.converter.color;var h=org.eclipse.rwt.AnimationRenderer.converter.factor;var a=[];var e=Math.min(b.length,c.length);for(var d=0;d<e;d++){a[d]=[h(f,c[d][0],b[d][0]),g(f,c[d][1],b[d][1])]}return a}}}});
-qx.Class.define("org.eclipse.rwt.Animation",{extend:qx.core.Target,construct:function(){arguments.callee.base.call(this);this._renderer=[];this._duration=1000;this._transitionFunction=org.eclipse.rwt.Animation.transitions.linear;this._startOn=null;this._finishOn=null;this._totalTime=null;this._config=null;this._defaultRenderer=null;this._isRunning=false;this._inQueue=false},destruct:function(){if(this.isRunning()){this.skip()}else{this.cancel()}try{for(var b=0;b<this._renderer.length;b++){this._renderer[b].dispose()}}catch(a){throw"Could not Dispose AnimationRenderer: "+a}this._renderer=null},events:{init:$[70],finish:$[70],cancel:$[70]},members:{setDuration:function(a){this._duration=a},setTransition:function(a){this._transitionFunction=org.eclipse.rwt.Animation.transitions[a]},setProperties:function(a){this.setDuration(a[0]);this.setTransition(a[1])},getRenderer:function(a){return this._renderer[a]},getDefaultRenderer:function(a){if(this._defaultRenderer==null||this._defaultRenderer.isDisposed()){this._defaultRenderer=new org.eclipse.rwt.AnimationRenderer(this)}if(typeof a!=$[8]){this._defaultRenderer.setActive(a)}return this._defaultRenderer},getRendererLength:function(){return this._renderer.length},getRendererIndex:function(a){return this._renderer.indexOf(a)},getConfig:function(){return this._config},start:function(b){var a=false;if(!this.isStarted()){org.eclipse.rwt.Animation._addToQueue(this);this._inQueue=true;this._config=b;this._init();a=this.isStarted()}return a},restart:function(){var a=false;if(this.isStarted()){var b=this._config;this.cancel();a=this.start(b)}return a},cancel:function(){if(this.isStarted()){this._inQueue=false;this._isRunning=false;this.createDispatchDataEvent("cancel",this._config);this._config=null;org.eclipse.rwt.Animation._removeFromLoop(this)}},skip:function(){if(this.isStarted()){if(!this.isRunning()){this._render(0)}this._finish()}},setRendererActive:function(b){for(var a=0;a<this._renderer.length;a++){this._renderer[a].setActive(b)}},activateRendererOnce:function(){for(var a=0;a<this._renderer.length;a++){this._renderer[a].activateOnce()}},isStarted:function(){return this._inQueue},isRunning:function(){return this._isRunning},_addRenderer:function(a){this._renderer.push(a)},_removeRenderer:function(a){if(this.isStarted()){throw"Cannot remove AnimationRenderer: Animation already started!"}qx.lang.Array.remove(this._renderer,a)},_init:function(){this.createDispatchDataEvent("init",this._config);this._startOn=null;this._numberRenderer=this._renderer.length},_loop:function(b){if(this._startOn==null){this._startOn=new Date().getTime();this._finishOn=this._startOn+(this._duration);this._totalTime=this._duration}if(b>=this._finishOn){this._finish()}else{var a=(b-this._startOn)/this._totalTime;this._render(a)}},_render:function(a){var d=this._renderer.length;if(!this._isRunning){for(var b=0;b<this._numberRenderer;b++){this._renderer[b]._setup(this._config)}this._isRunning=true}var c=this._transitionFunction(a);for(var b=0;b<this._numberRenderer;b++){this._renderer[b]._render(c)}},_finish:function(){this._render(1);var a=this._config;this.cancel();for(var b=0;b<this._numberRenderer;b++){this._renderer[b]._finish(a)}this.createDispatchDataEvent("finish",a)}},statics:{FPS:60,_queue:[],_interval:null,_addToQueue:function(a){this._queue.push(a);if(this._interval==null){this._startLoop()}},_removeFromLoop:function(a){qx.lang.Array.remove(this._queue,a);if(this._queue.length==0){this._stopLoop()}},_startLoop:function(){this._interval=setInterval(this._mainLoop,Math.round(1000/this.FPS))},_stopLoop:function(){window.clearInterval(this._interval);this._interval=null},_mainLoop:function(){try{if(!org.eclipse.swt.EventUtil.getSuspended()){var g=new Date().getTime();var b=org.eclipse.rwt.Animation._queue;try{for(var d=0,a=b.length;d<a;d++){b[d]&&b[d]._loop(g)}}catch(f){org.eclipse.rwt.Animation._stopLoop();throw"Animation aborted: "+f}}}catch(c){org.eclipse.rwt.ErrorHandler.processJavaScriptError(c)}},blockGlobalFlushs:function(a){qx.ui.core.Widget._inFlushGlobalQueues=a;if(!a){qx.ui.core.Widget._initAutoFlush(0)}},transitions:{linear:function(a){return a},ease:function(a){var b=-Math.pow(a-1,2)+1;return(-Math.cos(b*Math.PI)/2)+0.5},easeIn:function(a){return Math.pow(a,2)},easeOut:function(a){return -Math.pow(a-1,2)+1},easeInOut:function(a){return(-Math.cos(a*Math.PI)/2)+0.5}}}});
-qx.Class.define("org.eclipse.rwt.widgets.WidgetToolTip",{type:$[33],extend:qx.ui.popup.ToolTip,include:org.eclipse.rwt.FadeAnimationMixin,construct:function(){arguments.callee.base.call(this);this._atom._createLabel();this._atom.getLabelObject().setMode("html")},members:{_applyBoundToWidget:function(c,a){arguments.callee.base.call(this,c,a);this.updateText(c);var b=qx.ui.popup.ToolTipManager.getInstance();b.setCurrentToolTip(null)},updateText:function(a){this._atom.setLabel(a.getUserData($[327]))}}});
-qx.Class.define("org.eclipse.rwt.SyncKeyEventUtil",{type:$[33],extend:qx.core.Object,construct:function(){arguments.callee.base.call(this);this._cancelEvent=false},members:{intercept:function(a,k,i,e){var c=org.eclipse.rwt.KeyEventUtil.getInstance();var g=this._getRealKeyCode(k,e);var j=c._isRelevantEvent(a,g);if(!org.eclipse.swt.EventUtil.getSuspended()&&j){var d=c._getTargetControl();var h=c._hasKeyListener(d);var f=c._hasTraverseListener(d);var b=false;if(f){b=c._isTraverseKey(g)}if(h||(f&&b)){this._cancelEvent=false;this._sendKeyDown(d,g,i,e);if(this._cancelEvent){this._cancelDomEvent(e)}}}return this._cancelEvent},cancelEvent:function(){this._cancelEvent=true},allowEvent:function(){},_getRealKeyCode:function(c,b){var a=c;if(qx.core.Variant.isSet($[0],$[121])){a=b.keyCode}return a},_cancelDomEvent:function(a){if(qx.core.Variant.isSet($[0],$[18])){a.returnValue=false;a.cancelBubble=true}else{a.__isCanceled=true;a.preventDefault();a.stopPropagation()}},_sendKeyDown:function(d,e,a,c){var b=org.eclipse.rwt.KeyEventUtil.getInstance();b._attachKeyDown(d,e,a,c);org.eclipse.swt.Request.getInstance().sendSyncronous()}}});
-qx.Mixin.define("org.eclipse.rwt.GraphicsMixin",{statics:{getSupportsShadows:function(){if(this._shadowSupport===undefined){var c=org.eclipse.rwt.Client.getEngine();var a=org.eclipse.rwt.Client.getVersion();this._shadowSupport=false;switch(c){case $[40]:this._shadowSupport=a>=1.9;break;case $[18]:this._shadowSupport=a>=7;break;case $[121]:this._shadowSupport=false;break;case $[71]:var b=org.eclipse.rwt.Client.getBrowser();this._shadowSupport=a>=532.9;break}}return this._shadowSupport}},members:{_gfxData:null,_gfxProperties:null,_gfxCanvas:null,_gfxEnabled:false,_gfxBorderEnabled:false,_gfxBackgroundEnabled:false,_gfxCanvasAppended:false,_applyBackgroundGradient:function(b,a){this.setGfxProperty($[128],b);this._handleGfxBackground()},_applyShadow:function(b,a){if(org.eclipse.rwt.GraphicsMixin.getSupportsShadows()){this.setGfxProperty($[28],b);this.setGfxProperty($[256],null);this._handleGfxShadow()}},_styleBackgroundColor:function(a){if(this._gfxBackgroundEnabled){this.setGfxProperty($[78],a);if(this.getGfxProperty($[195])==$[20]&&this._isCanvasReady()){this._renderGfxBackground()}}else{arguments.callee.base.call(this,a)}},_styleBackgroundImage:function(a){if(this._gfxBackgroundEnabled){this.setGfxProperty($[112],a);if(this.getGfxProperty($[195])==$[35]&&this._isCanvasReady()&&a!=null){this._renderGfxBackground()}else{this._handleGfxBackground()}}else{if(a==null&&this.getGfxProperty($[128])!=null){this._handleGfxBackground()}else{arguments.callee.base.call(this,a)}}},renderBorder:function(a){var b=this.__borderObject;if(b&&b.getStyle()===$[114]){this._styleGfxBorder(b.getWidths(),b.getColor(),b.getRadii())}else{if(this._gfxBorderEnabled){this._styleGfxBorder(null,null,null)}arguments.callee.base.call(this,a)}},_styleGfxBorder:function(d,b,f){var a=0;if(d){for(var c=0;c<d.length;c++){a=Math.max(a,d[c])}}var g;if(d!=null&&f!=null&&a>0){g=[];for(var c=0;c<4;c++){var e=c>0?c-1:3;if(d[c]==0||d[e]==0){g[c]=0}else{g[c]=f[c]}}}else{g=f}this.setGfxProperty($[269],d);this.setGfxProperty($[402],a);this.setGfxProperty($[363],b);this.setGfxProperty($[306],g);this.setGfxProperty($[228],null);this.setGfxProperty($[256],null);this._handleGfxBorder()},setGfxProperty:function(a,b){if(this._gfxProperties===null){this._gfxProperties={}}this._gfxProperties[a]=b},getGfxProperty:function(a){var b=this._gfxProperties!==null?this._gfxProperties[a]:null;return typeof b!=$[8]?b:null},_handleGfxBorder:function(){var b=this.getGfxProperty($[306])!=null&&this.getGfxProperty($[269])!=null&&this.getGfxProperty($[363])!=null;var a=(this._gfxBorderEnabled!=b);if(a){if(b){this._gfxBorderEnabled=true}else{this._gfxBorderEnabled=false;this._resetTargetNode()}this._handleGfxBackground();this._handleGfxStatus()}if(this._isCanvasReady()&&b){this._renderGfxBorder();if(!this._willBeLayouted()){this._layoutShapes()}}else{if(a&&!b){this._prepareBackgroundShape()}}},_handleGfxBackground:function(){var f=this.getBackgroundImage()!=null;var d=false;if(f){this.setGfxProperty($[195],$[35])}else{d=this.getGfxProperty($[128])!=null;if(d){this.setGfxProperty($[195],$[128])}else{this.setGfxProperty($[195],$[20])}}var b=(d||this._gfxBorderEnabled);var a=(this._gfxBackgroundEnabled!=b);if(a){if(b){var c=this.getStyleProperty($[78]);this.removeStyleProperty($[78]);this.setGfxProperty($[78],c);var e=this.getBackgroundImage();this.setGfxProperty($[112],e);this.removeStyleProperty($[112]);this._gfxBackgroundEnabled=true}else{this._gfxBackgroundEnabled=false;this._applyBackgroundColor(this.getBackgroundColor());this.setGfxProperty($[78],null);this._applyBackgroundImage(this.getBackgroundImage());this.setGfxProperty($[112],null)}this._handleGfxStatus()}if(this._isCanvasReady()&&b){this._renderGfxBackground();if(a&&!this._gfxBorderEnabled&&!this._willBeLayouted()){this._layoutShapes()}}else{if(a&&!b){this._prepareBackgroundShape()}}},_handleGfxShadow:function(){var a=this.getGfxProperty($[28])!=null;this._gfxShadowEnabled=a;this._handleGfxStatus();if(this._isCanvasReady()&&a){this._renderGfxShadow();if(!this._willBeLayouted()){this._layoutShapes()}}else{if(!this._gfxShadowEnabled&&this._gfxData&&this._gfxData.shadowInsert){this._prepareShadowShape()}}},_handleGfxStatus:function(){var a=this._gfxBorderEnabled||this._gfxBackgroundEnabled||this._gfxShadowEnabled;if(a!=this._gfxEnabled){if(a){this._gfxEnabled=true;this.addEventListener($[385],this._gfxOnElementChanged,this);this.addEventListener("flush",this._gfxOnFlush,this)}else{this._gfxEnabled=false;this.removeEventListener($[385],this._gfxOnElementChanged,this);this.removeEventListener("flush",this._gfxOnFlush,this)}this._targetNodeEnabled=(this._innerStyle||a)&&!this._gfxBorderEnabled}},_gfxOnElementChanged:function(a){if(a.getValue()==null&&this._gfxCanvasAppended){this._removeCanvas()}if(a.getValue()!=null&&this._isCanvasReady()){if(this._gfxBackgroundEnabled){this._renderGfxBackground()}if(this._gfxShadowEnabled){this._renderGfxShadow()}}},_gfxOnFlush:function(b){var a=b.getData();if(a.paddingRight||a.paddingBottom){this.setGfxProperty($[228],null);this.setGfxProperty($[256],null)}this._layoutShapes()},_layoutShapes:function(){if(this._gfxBackgroundEnabled){this._layoutBackgroundShape()}if(this._gfxShadowEnabled){this._layoutShadowShape()}},_layoutTargetNode:function(){if(this._innerStyle&&this._gfxBorderEnabled){var c=this.getGfxProperty($[228]);var b=this.getGfxProperty($[269]);var a=this._innerStyle;a.top=b[0]+"px";a.left=b[3]+"px";a.width=Math.max(0,c[0]-b[3]-b[1])+"px";a.height=Math.max(0,c[1]-b[0]-b[2])+"px"}},_resetTargetNode:function(){if(this._innerStyle){this._innerStyle.left="0px";this._innerStyle.top="0px";if(qx.core.Variant.isSet($[0],$[18])){this._innerStyle.width="";this._innerStyle.height="";this.addToQueue($[19]);this.addToQueue($[36])}else{this._innerStyle.width="100%";this._innerStyle.height="100%"}}},_isCanvasReady:function(){var a=false;if(this._isCreated){if(this._gfxEnabled&&this._gfxCanvasAppended){a=true}else{if(this._gfxEnabled&&!this._gfxCanvasAppended){if(this._gfxCanvas==null){this._createCanvas()}this._appendCanvas();a=true}else{if(!this._gfxEnabled&&this._gfxCanvasAppended){this._removeCanvas()}}}}return a},_createCanvas:function(){if(!this._innerStyle){var a=null;if(qx.core.Variant.isSet($[0],$[71])){a=this.getStyleProperty($[120]);this.removeStyleProperty($[120]);this.__outerElementStyleProperties.outline=true}if(qx.core.Variant.isSet($[0],$[18])){this.__outerElementStyleProperties.filter=true}else{this.__outerElementStyleProperties.opacity=true;if(qx.core.Variant.isSet($[0],$[40])){this.__outerElementStyleProperties.MozOpacity=true}}this.prepareEnhancedBorder();if(a){this.setStyleProperty($[120],a)}this._applyOpacity(this.getOpacity())}this._gfxData={};this._gfxCanvas=org.eclipse.rwt.GraphicsUtil.createCanvas();this._prepareBackgroundShape()},_appendCanvas:function(){var b=this.getElement();var a=org.eclipse.rwt.GraphicsUtil.getCanvasNode(this._gfxCanvas);if(a!=null){b.insertBefore(a,b.firstChild)}this._gfxCanvasAppended=true;this.addEventListener($[216],this._onCanvasAppear);if(this.isSeeable()){this._onCanvasAppear()}},_removeCanvas:function(){var a=org.eclipse.rwt.GraphicsUtil.getCanvasNode(this._gfxCanvas);if(a!=null){a.parentNode.removeChild(a);this._gfxCanvasAppended=false;this.removeEventListener($[216],this._onCanvasAppear)}},_onCanvasAppear:function(){if(this._gfxCanvasAppended){org.eclipse.rwt.GraphicsUtil.handleAppear(this._gfxCanvas)}},_prepareBackgroundShape:function(){var a=org.eclipse.rwt.GraphicsUtil;if(this._gfxData){var c=this._gfxData.backgroundShape;if(this._gfxBackgroundEnabled){if(c===undefined){this._gfxData.backgroundShape=a.createShape($[178])}if(!this._gfxData.backgroundInsert){var b=this._gfxData.backgroundShape;a.addToCanvas(this._gfxCanvas,b);this._gfxData.backgroundInsert=true}}else{if(this._gfxData.backgroundInsert){a.removeFromCanvas(this._gfxCanvas,c);this._gfxData.backgroundInsert=false}}}},_renderGfxBackground:function(){this._prepareBackgroundShape();var f=this.getGfxProperty($[195]);var a=org.eclipse.rwt.GraphicsUtil;if(f==$[128]){var e=this.getGfxProperty($[128]);a.setFillGradient(this._gfxData.backgroundShape,e)}else{if(f==$[35]){var d=this.getGfxProperty($[112]);d=typeof d==$[8]?null:d;var c=this._getImageSize(d);a.setFillPattern(this._gfxData.backgroundShape,d,c[0],c[1])}else{var b=this.getGfxProperty($[78]);b=b==""?null:b;a.setFillColor(this._gfxData.backgroundShape,b)}}},_renderGfxBorder:function(){this._prepareBackgroundShape();this._style.borderWidth=0;var c=this._innerStyle;c.borderWidth=0;var b=this._gfxData.backgroundShape;var d=this.getGfxProperty($[402]);var a=this.getGfxProperty($[363]);org.eclipse.rwt.GraphicsUtil.setStroke(b,a,d)},_layoutBackgroundShape:function(){var b=[this.getBoxWidth(),this.getBoxHeight()];var k=this.getGfxProperty($[228]);var d=!k||(b[0]!==k[0]);var c=!k||(b[1]!==k[1]);if(d||c){this.setGfxProperty($[228],b);this._layoutTargetNode();var b=[this.getBoxWidth(),this.getBoxHeight()];var g;var m;var e;var o;var h;if(this._gfxBorderEnabled){h=this.getGfxProperty($[306]);var a=this.getGfxProperty($[269]);var q=this.getGfxProperty($[402]);var f=0;var p=0;var n=0;var l=0;if(q>0){f=(a[0]==0?-q-1:q);p=(a[1]==0?-q-1:q);n=(a[2]==0?-q-1:q);l=(a[3]==0?-q-1:q)}g=b[0]-(l*0.5+p*0.5);m=b[1]-(f*0.5+n*0.5);e=l*0.5;o=f*0.5}else{e=0;o=0;g=b[0]-this._cachedBorderLeft-this._cachedBorderRight;m=b[1]-this._cachedBorderTop-this._cachedBorderBottom;h=[0,0,0,0]}g=Math.max(0,g);m=Math.max(0,m);var j=this._gfxData.backgroundShape;var i=org.eclipse.rwt.GraphicsUtil;i.setRoundRectLayout(j,e,o,g,m,h)}},_prepareShadowShape:function(){var a=org.eclipse.rwt.GraphicsUtil;if(this._gfxData){if(this._gfxShadowEnabled){if(this._gfxData.shadowShape===undefined){this._createShadowShape();var c=a.getCanvasNode(this._gfxCanvas);org.eclipse.rwt.HtmlUtil.setPointerEvents(c,"none")}var b=this._gfxData.shadowShape;if(!this._gfxData.shadowInsert){var d=null;if(this._gfxData.backgroundInsert){d=this._gfxData.backgroundShape}a.addToCanvas(this._gfxCanvas,b,d);this._gfxData.shadowInsert=true}}else{if(this._gfxData.shadowInsert){a.removeFromCanvas(this._gfxCanvas,this._gfxData.shadowShape);a.enableOverflow(this._gfxCanvas,0,0,null,null);delete this._gfxData.shadowInsert}}}},_createShadowShape:function(){var b=null;var a=org.eclipse.rwt.GraphicsUtil;var b=a.createShape($[178]);this._gfxData.shadowShape=b;return b},_renderGfxShadow:function(){this._prepareShadowShape();if(this._gfxShadowEnabled){var a=org.eclipse.rwt.GraphicsUtil;var c=this.getGfxProperty($[28]);var b=this._gfxData.shadowShape;a.setBlur(b,c[3]);a.setFillColor(b,c[5]);a.setOpacity(b,c[6])}},_layoutShadowShape:function(){var a=org.eclipse.rwt.GraphicsUtil;var c=[this.getBoxWidth(),this.getBoxHeight()];var l=[this.getBoxWidth(),this.getBoxHeight()];var n=this.getGfxProperty($[256]);var s=!n||(l[0]!==n[0]);var q=!n||(l[1]!==n[1]);if(s||q){var d=this._gfxData.shadowShape;this.setGfxProperty($[256],l);var h=this.getGfxProperty($[28]);var k=this.getGfxProperty($[306]);k=k===null?[0,0,0,0]:k;var f=h[1];var i=h[2];var m=c[0];var j=c[1];var p=h[3];var o=f<0?Math.abs(f)+p:0;var r=i<0?Math.abs(i)+p:0;var e=Math.max(0,p+f);var b=Math.max(0,p+i);var t=m+e;var g=j+b;a.enableOverflow(this._gfxCanvas,o,r,t,g);a.setRoundRectLayout(d,f,i,m,j,k)}},_getImageSize:function(c){var a=this.getUserData($[296]);if(a==null){var b=org.eclipse.swt.theme.ThemeStore.getInstance();a=b.getImageSize(c)}return a},_willBeLayouted:function(){return this._jobQueue!=undefined||!qx.lang.Object.isEmpty(this._layoutChanges)}}});
+qx.Class.define("qx.ui.pageview.tabview.Button",{extend:qx.ui.pageview.AbstractButton,events:{closetab:$[11]},properties:{appearance:{refine:true,init:"tab-view-button"},showCloseButton:{check:$[3],init:false,apply:"_applyShowCloseButton",event:"changeShowCloseButton"},closeButtonImage:{check:$[25],init:"icon/16/actions/dialog-cancel.png",apply:"_applyCloseButtonImage"}},members:{_onkeydown:function(b){var a=b.getKeyIdentifier();if(a==$[71]||a==$[91]){this.setChecked(true)}},_onkeypress:function(c){switch(c.getKeyIdentifier()){case"Left":var b=this.getPreviousActiveSibling();if(b&&b!=this){delete qx.event.handler.FocusHandler.mouseFocus;b.setFocused(true);b.setChecked(true)}break;case $[51]:var a=this.getNextActiveSibling();if(a&&a!=this){delete qx.event.handler.FocusHandler.mouseFocus;a.setFocused(true);a.setChecked(true)}break}},_ontabclose:function(a){this.createDispatchDataEvent("closetab",this);a.stopPropagation()},_applyChecked:function(b,a){arguments.callee.base.call(this,b,a);this.setZIndex(b?1:0)},_applyShowCloseButton:function(b,a){if(!this._closeButtonImage){this._closeButtonImage=new qx.ui.basic.Image(this.getCloseButtonImage())}if(b){this._closeButtonImage.addEventListener($[29],this._ontabclose,this);this.add(this._closeButtonImage)}else{this.remove(this._closeButtonImage);this._closeButtonImage.removeEventListener($[29],this._ontabclose,this)}},_applyCloseButtonImage:function(b,a){if(this._closeButtonImage){this._closeButtonImage.setSource(b)}},_renderAppearance:function(){if(this.getView()){this.isFirstVisibleChild()?this.addState("firstChild"):this.removeState($[339]);this.isLastVisibleChild()?this.addState($[339]):this.removeState($[339]);this.getView().getAlignTabsToLeft()?this.addState("alignLeft"):this.removeState("alignLeft");!this.getView().getAlignTabsToLeft()?this.addState("alignRight"):this.removeState("alignRight");this.getView().getPlaceBarOnTop()?this.addState($[171]):this.removeState($[171]);!this.getView().getPlaceBarOnTop()?this.addState("barBottom"):this.removeState("barBottom")}arguments.callee.base.call(this)}},destruct:function(){this._disposeObjects("_closeButtonImage")}});
+qx.Class.define("org.eclipse.rwt.ErrorHandler",{statics:{showError:function(a){org.eclipse.rwt.ErrorHandler._enableTextSelection();org.eclipse.rwt.ErrorHandler._freezeApplication();document.title="Error Page";org.eclipse.rwt.ErrorHandler._createErrorArea().innerHTML=a},showTimeout:function(e){var b=String(window.location);var c=b.indexOf("#");if(c!=-1){b=b.substring(0,c)}var a='href="'+b+'"';var d=e.replace(/{HREF_URL}/,a);org.eclipse.rwt.ErrorHandler._freezeApplication();org.eclipse.rwt.ErrorHandler._createOverlay();org.eclipse.rwt.ErrorHandler._createTimeoutArea(400,100).innerHTML=d},processJavaScriptErrorInResponse:function(a,b,e){var f="<p>Could not evaluate javascript response:</p><pre>";var h=[];h.push("Error: "+b+"\n");h.push("Script: "+a);try{if(b instanceof Error){for(var d in b){h.push(d+": "+b[d])}}h.push("Debug: "+qx.core.Variant.get($[7]));h.push("Request: "+e.getData());var g=qx.ui.core.Widget._inFlushGlobalQueues;if(g){h.push("Phase: "+qx.ui.core.Widget._flushGlobalQueuesPhase)}}catch(c){}f+=h.join("\n  ");f+="</pre>";org.eclipse.rwt.ErrorHandler.showError(f)},processJavaScriptError:function(a){if(qx.core.Variant.isSet($[7],"on")){var b="<p>Javascript error occurred:</p><pre>"+a+"</pre>";org.eclipse.rwt.ErrorHandler.showError(b);throw a}else{if(typeof console===$[10]){if(typeof console.error===$[44]){console.error(a)}else{if(typeof console.log===$[44]){console.log(a)}}}}},_createOverlay:function(){var a=document.createElement("div");var b=a.style;b.position=$[28];b.width="100%";b.height="100%";b.backgroundColor="#808080";org.eclipse.rwt.HtmlUtil.setOpacity(a,0.2);b.zIndex=100000000;document.body.appendChild(a);return a},_createErrorArea:function(){var a=document.createElement("div");var b=a.style;b.position=$[28];b.width="100%";b.height="100%";b.backgroundColor="#ffffff";b.zIndex=100000001;b.overflow="auto";b.padding="10px";document.body.appendChild(a);return a},_createTimeoutArea:function(d,a){var b=document.createElement("div");var c=b.style;c.position=$[28];c.width=d+"px";c.height=a+"px";var g=qx.ui.core.ClientDocument.getInstance();var f=(g.getClientWidth()-d)/2;var e=(g.getClientHeight()-a)/2;c.left=f<0?0:f;c.top=e<0?0:e;c.backgroundColor="#dae9f7";c.border="1px solid black";c.zIndex=100000001;c.overflow="auto";c.padding="10px";c.textAlign=$[37];c.fontFamily='verdana,"lucida sans",arial,helvetica,sans-serif';c.fontSize="12px";c.fontStyle=$[108];c.fontWeight=$[108];document.body.appendChild(b);return b},_freezeApplication:function(){var a=qx.core.Init.getInstance().getApplication();a.setExitConfirmation(null);qx.io.remote.RequestQueue.getInstance().setEnabled(false);org.eclipse.rwt.EventHandler.detachEvents();qx.core.Target.prototype.dispatchEvent=function(){};org.eclipse.rwt.Animation._stopLoop()},_enableTextSelection:function(){var a=qx.ui.core.ClientDocument.getInstance();a.setSelectable(true);if(qx.core.Variant.isSet($[0],$[40])){var b=qx.core.Init.getInstance().getApplication();qx.html.EventRegistration.removeEventListener(document.documentElement,$[2],b._onFFMouseDown)}}}});
+qx.Class.define("org.eclipse.swt.LabelUtil",{statics:{SHOW_LABEL:$[85],SHOW_ICON:"icon",APPEARANCE:"label-wrapper",initialize:function(b){b.setHorizontalChildrenAlign(qx.constant.Layout.ALIGN_LEFT);b.setVerticalChildrenAlign(qx.constant.Layout.ALIGN_TOP);b.setAppearance(org.eclipse.swt.LabelUtil.APPEARANCE);b.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);b.setLabel($[150]);var a=b.getLabelObject();a.setMode(qx.constant.Style.LABEL_MODE_HTML);a.setTextOverflow(false);a.setAppearance($[518]);b.setLabel("");b.setHideFocus(true);b.addEventListener($[9],org.eclipse.swt.LabelUtil._onMouseOver);b.addEventListener($[14],org.eclipse.swt.LabelUtil._onMouseOut)},setWrap:function(b,a){b.getLabelObject().setWrap(a)},setAlignment:function(a,b){a.getLabelObject().setTextAlign(b);a.setHorizontalChildrenAlign(b)},setText:function(a,b){if(!a.isCreated()){a.setUserData("setText",b);a.addEventListener($[31],org.eclipse.swt.LabelUtil._setTextDelayed)}else{org.eclipse.swt.LabelUtil._doSetText(a,b)}},setImage:function(b,a){if(!b.isCreated()){b.setUserData($[341],a);b.addEventListener($[31],org.eclipse.swt.LabelUtil._setImageDelayed)}else{org.eclipse.swt.LabelUtil._doSetImage(b,a)}},_setTextDelayed:function(a){var b=a.getTarget();var c=b.getUserData("setText");if(c!=null){org.eclipse.swt.LabelUtil._doSetText(b,c)}b.removeEventListener($[31],org.eclipse.swt.LabelUtil._setTextDelayed)},_setImageDelayed:function(b){var c=b.getTarget();var a=c.getUserData($[341]);if(a!=null){org.eclipse.swt.LabelUtil._doSetImage(c,a)}c.removeEventListener($[31],org.eclipse.swt.LabelUtil._setImageDelayed)},_doSetText:function(a,b){a.setUserData("setText",null);if(b!=null){a.setLabel(b)}else{a.setLabel("")}a.setShow(org.eclipse.swt.LabelUtil.SHOW_LABEL)},_doSetImage:function(b,a){b.setUserData($[341],null);if(a){b.setIcon(a);b.setShow(org.eclipse.swt.LabelUtil.SHOW_ICON)}else{b.resetIcon();b.setShow(org.eclipse.swt.LabelUtil.SHOW_LABEL)}},_onMouseOver:function(){this.addState("over")},_onMouseOut:function(){this.removeState("over")}}});
+qx.Class.define("org.eclipse.rwt.widgets.TreeRow",{extend:qx.ui.basic.Terminator,construct:function(a){arguments.callee.base.call(this);this.setSelectable(false);this.setAppearance("tree-row");this._tree=a;this._textNodes=[];this._usedNodes=0;this._expandElement=null;this._checkBoxElement=null;this._selectionElements=[];this._styleMap=null;this._variant=null},destruct:function(){this._tree=null;this._textNodes=null;this._expandElement=null;this._checkBoxElement=null;this._selectionElements=null},members:{renderItem:function(a){this._usedNodes=0;if(a!=null){this._renderStates(a,this._tree.getHasFullSelection());this._renderBackground(a);this._renderIndention(a);this._renderCheckBox(a);this._renderCells(a)}else{this.setBackgroundColor(null)}this._hideRemainingElements()},isExpandSymbolTarget:function(b){var a=b.getDomTarget();return this._expandElement!==null&&this._expandElement===a},isCheckBoxTarget:function(b){var a=b.getDomTarget();return this._checkBoxElement!==null&&this._checkBoxElement===a},isSelectionClick:function(c){var a;var b=c.getDomTarget();if(this._tree.getHasFullSelection()){a=this._checkBoxElement!==b}else{a=this._selectionElements.indexOf(b)!=-1}return a},updateEvenState:function(a){this._setState("even",a%2==0)},updateGridlinesState:function(a){this._setState($[179],a)},_renderStates:function(b,a){this._setState($[203],b.isChecked());this._setState($[235],b.isGrayed());this._setState($[87],this._renderAsUnfocused());this._setState($[30],a&&this._renderAsSelected(b));this._renderVariant(b.getVariant());this._renderOverState(b);this._styleMap=this._getStyleMap()},_renderVariant:function(a){if(this._variant!=a){if(this._variant!=null){this._setState(this._variant,false)}this._variant=a;if(this._variant!=null){this._setState(this._variant,true)}}},_renderOverState:function(a){this._setState("over",this._tree.isHoverItem(a))},_setState:function(b,a){if(!this.__states){this.__states={}}if(a){this.__states[b]=true}else{delete this.__states[b]}},_getStyleMap:function(){var a=qx.theme.manager.Appearance.getInstance();return a.styleFrom(this.getAppearance(),this.__states)},_styleFromMap:function(){},_renderBackground:function(b){var a=null;if(this._getRenderThemingBackground(b)){a=this._styleMap.itemBackground}else{a=b.getBackground()}this.setBackgroundColor(a!=$[8]?a:null)},_getRenderThemingBackground:function(d){var b=this._renderAsSelected(d)&&this._tree.getHasFullSelection();var c=d!==null&&d.getBackground()!==null;var a=!c||b||this._hasHoverBackground()||this._tree.getEnabled()===false;return a},_hasHoverBackground:function(){var a=this.hasState("over")&&this._styleMap.itemBackground!==$[8];return a},_renderIndention:function(d){var e=this._getExpandSymbol(d);this._expandElement=null;if(e!=null){var b=this._addIndentSymbol(d.getLevel(),e);this._expandElement=b}var a=this._getLineSymbol(d);if(a!=null){var c=d.getParent();while(!c.isRootItem()){if(c.hasNextSibling()){this._addIndentSymbol(c.getLevel(),a)}c=c.getParent()}}},_getExpandSymbol:function(b){var a=this._tree.getStatesCopy();if(b.getLevel()==0&&!b.hasPreviousSibling()){a.first=true}if(!b.hasNextSibling()){a.last=true}if(b.hasChildren()){if(b.isExpanded()){a.expanded=true}else{a.collapsed=true}}if(this._tree.isHoverElement(this._expandElement)){a.over=true}return this._getImageFromAppearance($[465],a)},_getLineSymbol:function(b){var a=this._tree.getStatesCopy();a.line=true;return this._getImageFromAppearance($[465],a)},_getImageFromAppearance:function(a,b){var c=qx.theme.manager.Appearance.getInstance();var e=c.styleFrom(a,b);var d=e&&e.backgroundImage;return d?e.backgroundImage:null},_addIndentSymbol:function(b,a){var i=null;var g=this._tree.getIndentionOffset(b+1);var d=this._tree.getTreeColumnWidth();if(g<=d){var e=this._tree.getIndentionOffset(b);var h=this._tree.getItemHeight();var c=g-e;var f=this._getImageElement(3);this._setImage(f,a,true);this._setBounds(f,e,0,c,h);i=f}return i},_renderCheckBox:function(e){if(this._tree.getHasCheckBoxes()){var h=this._checkBoxElement;var b=this.__states;this._setState("over",this._tree.isHoverElement(h));var g=this._getImageFromAppearance("tree-check-box",b);this._renderOverState(e);var c=this._getImageElement(3);this._setImage(c,g,true);var f=this._tree.getCheckBoxLeft(e);var d=this._tree.getCheckBoxWidth(e);var a=this._tree.getItemHeight();this._setBounds(c,f,0,d,a);this._checkBoxElement=c}},_renderCells:function(f){var d=this._tree.getColumnCount();var b=this._tree.getHasFullSelection();var e=this._renderAsSelected(f);if(!b&&e){this._renderStates(f,false)}for(var c=0;c<d;c++){this._renderCellBackground(f,c);if(!b&&this._tree.isTreeColumn(c)){if(e){this._renderStates(f,true)}var g=this._renderCellImage(f,c);var a=this._renderCellLabel(f,c);this._selectionElements=[g,a];if(e){this._renderSelectionBackground(f,c);this._renderStates(f,false)}}else{this._renderCellImage(f,c);this._renderCellLabel(f,c)}}},_renderSelectionBackground:function(e,b){if(this._styleMap.itemBackground!==null){var c=this._getBackgroundElement(2);c.style.backgroundColor=this._styleMap.itemBackground;var h=this._tree.getSelectionPadding();var g=this._tree.getItemTextLeft(e,b,true);g-=h[0];var d=this._tree.getItemTextWidth(e,b,true);d+=d>0?h[0]:0;var f=this._getVisualTextWidth(e,b);f+=h[0]+h[1];d=Math.min(d,f);var a=this._tree.getItemHeight();this._setBounds(c,g,0,d,a)}},_renderCellBackground:function(f,b){var d=this._getCellBackground(f,b);if(d!=$[8]&&d!=this._styleMap.backgroundColor){var c=this._getBackgroundElement(1);c.style.backgroundColor=d;var g=this._tree.getItemLeft(f,b,false);var e=this._tree.getItemWidth(f,b,false);var a=this._tree.getItemHeight();if(this._tree.getLinesVisible()){a-=1}this._setBounds(c,g,0,e,a)}},_renderCellImage:function(d,a){var e=d.getImage(a);var b=null;if(e!==null){b=this._getImageElement(3);this._setImage(b,e,true);var f=this._tree.getItemImageLeft(d,a);var c=this._tree.getItemImageWidth(d,a);this._setBounds(b,f,0,c,this._tree.getItemHeight())}return b},_renderCellLabel:function(d,a){var f=d.getText(a);var b=null;if(f!==""){b=this._getTextElement(3);var e=this._tree.getItemTextLeft(d,a);var c=this._tree.getItemTextWidth(d,a);b.style.verticalAlign=$[32];b.style.whiteSpace="nowrap";if(this._tree.isTreeColumn(a)){b.style.textAlign="left"}else{b.style.textAlign=this._tree.getAlignment(a)}b.innerHTML=f;this._setForeground(b,this._getCellColor(d,a));this._setBounds(b,e,0,c,this._tree.getItemHeight());this._setFont(b,this._getCellFont(d,a));this._setTextDecoration(b,this._styleMap.textDecoration);b.style.lineHeight=b.style.height}return b},_getCellBackground:function(c,b){var a;if(this.hasState($[30])||this._tree.getEnabled()===false||this._hasHoverBackground()){a=$[8]}else{a=c.getCellBackground(b)}return a},_getCellColor:function(c,b){var a=c.getCellForeground(b);if(a===null||a===""||this._tree.getEnabled()===false||this.hasState($[30])||this._hasHoverBackground()){a=this._styleMap.itemForeground;if(a===$[8]){a=this._tree.getTextColor()}}return a},_getCellFont:function(c,b){var a=c.getCellFont(b);if(a===null||a===""){a=this._tree.getFont()}return a},_getVisualTextWidth:function(d,a){var e=d.getText(a);var b=this._getCellFont(d,a);var c=qx.ui.basic.Label._getMeasureNode();c.innerHTML=e;this._setFont(c,b);return c.scrollWidth},_renderAsSelected:function(a){return this._tree.isItemSelected(a)||this.hasState($[386])},_renderAsUnfocused:function(){return !this._tree.isFocused()&&!this.hasState($[386])},_setFont:function(b,a){if(a==""||a==null){if(!qx.core.Variant.isSet($[0],$[18])){b.style.font=a}b.style.fontFamily="";b.style.fontSize="";b.style.fontVariant="";b.style.fontStyle="";b.style.fontWeight=""}else{if(a instanceof qx.ui.core.Font){a.renderStyle(b.style)}else{b.style.font=a}}},_setTextDecoration:function(b,a){if(a==null||a==="none"){b.style.textDecoration=""}else{b.style.textDecoration=a}},_setBounds:function(d,b,f,e,a){try{d.style.left=b+"px";d.style.top=f+"px";d.style.width=e+"px";d.style.height=a+"px"}catch(c){throw"setBounds failed: "+[d,b,f,e,a]}},_setForeground:function(b,a){b.style.color=a!=null?a:""},_setImage:function(b,c){var a=this._tree.getEnabled()?1:0.3;org.eclipse.rwt.HtmlUtil.setBackgroundImage(b,c,a)},_getTextElement:function(b){var a=this._getNextElement(b);org.eclipse.rwt.HtmlUtil.setBackgroundImage(a,null);a.style.backgroundColor="";return a},_getImageElement:function(b){var a=this._getNextElement(b);a.innerHTML="";a.style.backgroundColor="";return a},_getBackgroundElement:function(b){var a=this._getNextElement(b);org.eclipse.rwt.HtmlUtil.setBackgroundImage(a,null);a.innerHTML="";return a},_getNextElement:function(c){var a;var b=this._getTargetNode();if(b.childNodes.length>this._usedNodes){a=b.childNodes[this._usedNodes];a.style.display=""}else{a=document.createElement("div");a.style.position=$[28];a.style.overflow=$[17];b.appendChild(a)}a.style.zIndex=c;this._usedNodes++;return a},_hideRemainingElements:function(){var b=this._getTargetNode();for(var a=this._usedNodes;a<b.childNodes.length;a++){b.childNodes[a].style.display="none"}},supportsDrop:function(){return true}}});
+qx.Class.define("org.eclipse.swt.Application",{extend:qx.application.Gui,construct:function(){arguments.callee.base.call(this);this._exitConfirmation=null;this._startupTime=new Date().getTime();if(!org.eclipse.rwt.Client.supportsCss3()){qx.Class.patch(qx.ui.core.Parent,org.eclipse.rwt.GraphicsMixin);qx.Class.patch(qx.ui.form.TextField,org.eclipse.rwt.GraphicsMixin);qx.Class.patch(org.eclipse.rwt.widgets.MultiCellWidget,org.eclipse.rwt.GraphicsMixin)}else{qx.Class.patch(org.eclipse.swt.widgets.ProgressBar,org.eclipse.rwt.GraphicsMixin)}qx.Class.patch(qx.ui.core.ClientDocumentBlocker,org.eclipse.rwt.FadeAnimationMixin);qx.Class.patch(qx.event.type.DomEvent,org.eclipse.rwt.DomEventPatch);org.eclipse.rwt.MobileWebkitSupport.init();org.eclipse.rwt.KeyEventUtil.getInstance();org.eclipse.rwt.GraphicsUtil.init();var a=org.eclipse.rwt.EventHandler;a.setAllowContextMenu(org.eclipse.rwt.widgets.Menu.getAllowContextMenu);a.setMenuManager(org.eclipse.rwt.MenuManager.getInstance())},destruct:function(){var b=qx.ui.core.ClientDocument.getInstance();b.removeEventListener($[316],org.eclipse.swt.Application._onResize);b.removeEventListener($[12],org.eclipse.swt.Application._onKeyPress);var a=org.eclipse.swt.Request.getInstance();a.removeEventListener("send",this._onSend,this)},statics:{_onResize:function(a){org.eclipse.swt.Application._appendWindowSize();var b=org.eclipse.swt.Request.getInstance();if(b.getRequestCounter()!=null){b.send()}},_onKeyPress:function(a){if(a.getKeyIdentifier()==$[118]){a.preventDefault()}},_appendWindowSize:function(){var b=qx.html.Window.getInnerWidth(window);var a=qx.html.Window.getInnerHeight(window);var c=org.eclipse.swt.Request.getInstance();var d=c.getUIRootId();c.addParameter(d+$[315],String(b));c.addParameter(d+$[280],String(a))},_appendSystemDPI:function(){var a=[0,0];if(typeof screen.systemXDPI==$[78]){a[0]=parseInt(screen.systemXDPI);a[1]=parseInt(screen.systemYDPI)}else{var c=document.createElement("div");c.style.width="1in";c.style.height="1in";c.style.padding=0;document.body.appendChild(c);a[0]=parseInt(c.offsetWidth);a[1]=parseInt(c.offsetHeight);document.body.removeChild(c)}var b=org.eclipse.swt.Request.getInstance();b.addParameter("w1.dpi.x",String(a[0]));b.addParameter("w1.dpi.y",String(a[1]))},_appendColorDepth:function(){var b=16;if(typeof screen.colorDepth==$[78]){b=parseInt(screen.colorDepth)}if(qx.core.Variant.isSet($[0],$[40])){b=b==24?32:b}var a=org.eclipse.swt.Request.getInstance();a.addParameter("w1.colorDepth",String(b))}},members:{setExitConfirmation:function(a){if(a==""){this._exitConfirmation=" "}else{this._exitConfirmation=a}},reload:function(a){if(confirm(a)){this.setExitConfirmation(null);window.location.reload(false)}},getStartupTime:function(){return this._startupTime},main:function(a){arguments.callee.base.call(this);qx.io.Alias.getInstance().add($[119],"./rwt-resources/resource/static");qx.io.Alias.getInstance().add("org.eclipse.swt","./rwt-resources/resource");var e=qx.ui.core.ClientDocument.getInstance();e.addEventListener($[316],org.eclipse.swt.Application._onResize);e.addEventListener($[12],org.eclipse.swt.Application._onKeyPress);e.getElement().setAttribute("spellcheck","false");if(qx.core.Variant.isSet($[0],$[40])){e.getElement().setAttribute("ondrop","event.preventDefault();");e.getElement().style.position=$[28];e.setSelectable(true);var b=document.documentElement;qx.html.EventRegistration.addEventListener(b,$[2],this._onFFMouseDown)}var d=qx.client.History.getInstance();d.addEventListener("request",this._historyNavigated,this);org.eclipse.swt.Application._appendWindowSize();org.eclipse.swt.Application._appendSystemDPI();org.eclipse.swt.Application._appendColorDepth();var c=org.eclipse.swt.Request.getInstance();c.addEventListener("send",this._onSend,this);c._sendImmediate(true)},close:function(a){arguments.callee.base.call(this);return this._exitConfirmation},_historyNavigated:function(c){var a=c.getData();var b=org.eclipse.swt.Request.getInstance();b.addParameter("org.eclipse.rwt.events.historyNavigated","true");b.addParameter("org.eclipse.rwt.events.historyNavigated.entryId",a);b.send()},_onFFMouseDown:function(b){var a=null;try{a=b.originalTarget.tagName}catch(c){}if(b.button===0&&a!=null&&a!="INPUT"){b.preventDefault()}},_onSend:function(a){var c=qx.event.type.MouseEvent.getPageX();var b=qx.event.type.MouseEvent.getPageY();var d=org.eclipse.swt.Request.getInstance();var e=d.getUIRootId();var d=org.eclipse.swt.Request.getInstance();d.addParameter(e+".cursorLocation.x",String(c));d.addParameter(e+".cursorLocation.y",String(b))}}});
+qx.Class.define("org.eclipse.rwt.AsyncKeyEventUtil",{type:$[33],extend:qx.core.Object,construct:function(){arguments.callee.base.call(this);this._pendingEventInfo=null;this._allowIntercept=true;this._bufferedEvents=new Array();this._keyEventRequestRunning=false;var a=org.eclipse.swt.Request.getInstance();a.addEventListener($[278],this._onRequestReceived,this)},destruct:function(){var a=org.eclipse.swt.Request.getInstance();a.removeEventListener($[278],this._onRequestReceived,this)},members:{_untrustedKeyCodes:qx.core.Variant.select($[0],{gecko:[37,38,39,40,35,36,45,46,112,113,114,115,116,117,118,119,120,121,122,123],"default":[]}),intercept:function(a,i,h,e){var c=org.eclipse.rwt.KeyEventUtil.getInstance();var j=false;if(this._allowIntercept){var d=c._getTargetControl();var g=c._hasKeyListener(d);var f=c._hasTraverseListener(d);var b=false;if(f){b=c._isTraverseKey(i)}if(g||(f&&b)){if(!this._isUntrustedKey(i,e)){if(this._keyEventRequestRunning){this._bufferedEvents.push(this._getEventInfo(e));this._cancelDomEvent(e);j=true}else{if(c._isRelevantEvent(a,i)){this._pendingEventInfo=this._getEventInfo(e);this._sendKeyDown(d,i,h,e);this._cancelDomEvent(e);j=true}}}}}return j},cancelEvent:function(){this._pendingEventInfo=null},allowEvent:function(){if(this._pendingEventInfo!==null){var a=org.eclipse.swt.EventUtil.getSuspended();org.eclipse.swt.EventUtil.setSuspended(false);this._allowIntercept=false;this._redispatchKeyEvent(this._pendingEventInfo);this._allowIntercept=true;org.eclipse.swt.EventUtil.setSuspended(a)}},_isUntrustedKey:function(e,d){var a=false;if(qx.core.Variant.isSet($[0],$[40])){var c=d.target.tagName.toLowerCase();if(d.ctrlKey){a=true}else{if(c==$[82]||c==$[174]){for(var b=0;!a&&b<this._untrustedKeyCodes.length;b++){if(this._untrustedKeyCodes[b]===e){a=true}}}}}return a},_cancelDomEvent:function(a){if(qx.core.Variant.isSet($[0],$[18])){a.returnValue=false;a.cancelBubble=true}else{a.preventDefault();a.stopPropagation()}},_sendKeyDown:function(d,e,a,c){var b=org.eclipse.rwt.KeyEventUtil.getInstance();b._attachKeyDown(d,e,a,c);this._keyEventRequestRunning=true;org.eclipse.swt.Request.getInstance()._sendImmediate(true)},_onRequestReceived:function(a){if(this._keyEventRequestRunning){this._keyEventRequestRunning=false;this._checkBufferedEvents()}},_getEventInfo:function(a){result={target:a.target||a.srcElement,type:a.type,bubbles:a.bubbles,view:a.view,ctrlKey:a.ctrlKey,altKey:a.altKey,shiftKey:a.shiftKey,keyCode:a.keyCode,isChar:a.isChar,pageX:a.pageX,pageY:a.pageY};result.charCode=a.type===$[12]?a.charCode:0;return result},_checkBufferedEvents:function(){while(this._bufferedEvents.length>0&&!this._keyEventRequestRunning){var b=this._bufferedEvents.length;var a=this._bufferedEvents.shift();this._redispatchKeyEvent(a)}},_redispatchKeyEvent:function(b){if(qx.core.Variant.isSet($[0],$[40])){var a=document.createEvent("KeyboardEvent");a.initKeyEvent(b.type,b.bubbles,true,b.view,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.keyCode,b.charCode);b.target.dispatchEvent(a)}else{if(qx.core.Variant.isSet($[0],$[69])){var a=document.createEvent("Events");a.initEvent(b.type,b.bubbles,true);a.view=b.view;a.ctrlKey=b.ctrlKey;a.altKey=b.altKey;a.metaKey=b.metaKey;a.keyCode=b.keyCode;b.target.dispatchEvent(a)}else{if(qx.core.Variant.isSet($[0],$[18])){var a=document.createEventObject();a.type=b.type;a.cancelable=true;if(b.view){a.view=b.view}a.ctrlKey=b.ctrlKey;a.altKey=b.altKey;a.metaKey=b.metaKey;a.keyCode=b.keyCode;b.srcElement.fireEvent(a)}else{throw new Error("Redispatching key events not supported")}}}}}});
+qx.Class.define("org.eclipse.swt.Request",{type:$[33],extend:qx.core.Target,construct:function(){arguments.callee.base.call(this);this._url="";this._parameters={};this._uiRootId="";this._requestCounter;this._runningRequestCount=0;this._inDelayedSend=false;var a=qx.io.remote.RequestQueue.getInstance();a.setDefaultTimeout(60000*60*24);a.setMaxConcurrentRequests(1);this._currentRequest=null;this._timeoutPage=""},destruct:function(){this._currentRequest=null},events:{send:$[68],received:$[68]},members:{setUrl:function(a){this._url=a},getUrl:function(){return this._url},setUIRootId:function(a){this._uiRootId=a},getUIRootId:function(){return this._uiRootId},setRequestCounter:function(a){this._requestCounter=a},getRequestCounter:function(){return this._requestCounter},setTimeoutPage:function(a){this._timeoutPage=a},addParameter:function(a,b){this._parameters[a]=b},removeParameter:function(a){delete this._parameters[a]},getParameter:function(b){var a=this._parameters[b];if(a===undefined){a=null}return a},addEvent:function(a,b){this._parameters[a]=b},enableUICallBack:function(){var a=new qx.io.remote.Request(this._url,qx.net.Http.METHOD_GET,qx.util.Mime.JAVASCRIPT);a.addEventListener($[42],this._handleUICallBackFinished,this);a.addEventListener($[54],this._handleUICallBackFinished,this);a.setParameter("custom_service_handler","org.eclipse.rwt.internal.lifecycle.UICallBackServiceHandler");this._sendStandalone(a)},_handleUICallBackFinished:function(event){if(event.getType()===$[42]){try{var text=event.getContent();if(text&&text.length>0){window.eval(text)}}catch(ex){throw new Error("Could not execute javascript: ["+text+"]",ex)}}var transport=event.getTarget();var request=transport.getRequest();transport.dispose();request.dispose()},send:function(){if(!this._inDelayedSend){this._inDelayedSend=true;var a=function(){this._sendImmediate(true)};qx.client.Timer.once(a,this,60)}},sendSyncronous:function(){this._sendImmediate(false)},_sendImmediate:function(a){this._dispatchSendEvent();this._parameters.uiRoot=this._uiRootId;if(this._requestCounter==-1){this._inDelayedSend=false;this.send()}else{if(this._requestCounter!=null){this._parameters.requestCounter=this._requestCounter;this._requestCounter=-1}var b=this._createRequest();b.setAsynchronous(a);this._inDelayedSend=false;this._copyParameters(b);this._runningRequestCount++;if(this._runningRequestCount===1){qx.client.Timer.once(this._showWaitHint,this,500)}this._parameters={};if(a){b.send()}else{this._sendStandalone(b)}}},_copyParameters:function(b){var c=new Array();for(var a in this._parameters){c.push(encodeURIComponent(a)+"="+encodeURIComponent(this._parameters[a]))}b.setData(c.join("&"))},_createRequest:function(){var a=new qx.io.remote.Request(this._url,qx.net.Http.METHOD_POST,qx.util.Mime.JAVASCRIPT);a.addEventListener($[64],this._handleSending,this);a.addEventListener($[42],this._handleCompleted,this);a.addEventListener($[54],this._handleFailed,this);return a},_sendStandalone:function(b){var a=b;var c=new qx.io.remote.Exchange(a);c.addEventListener($[64],a._onsending,a);c.addEventListener($[67],a._onreceiving,a);c.addEventListener($[42],a._oncompleted,a);c.addEventListener($[63],a._onaborted,a);c.addEventListener($[65],a._ontimeout,a);c.addEventListener($[54],a._onfailed,a);c._start=(new Date).valueOf();c.send()},_handleSending:function(a){var b=a.getTarget();this._currentRequest=b.getRequest()},_handleFailed:function(a){var b=a.getTarget();this._currentRequest=b.getRequest();var c=true;if(this._isConnectionError(a.getStatusCode())){c=!this._handleConnectionError(a)}if(c){this._hideWaitHint();var e;var f=null;var d=b.getImplementation().getRequest();if(typeof(d.responseText)!="unknown"){f=d.responseText}if(f==""||f==null){e="<p>Request failed.</p><pre>HTTP Status Code: "+String(a.getStatusCode())+"</pre>"}else{e=f}org.eclipse.rwt.ErrorHandler.showError(e)}b.dispose()},_handleCompleted:function(evt){var exchange=evt.getTarget();var text=exchange.getImplementation().getRequest().responseText;if(text&&text.indexOf("<!DOCTYPE")===0){org.eclipse.rwt.ErrorHandler.showTimeout(this._timeoutPage)}else{var errorOccured=false;try{if(text&&text.length>0){org.eclipse.swt.EventUtil.setSuspended(true);window.eval(text);qx.ui.core.Widget.flushGlobalQueues();org.eclipse.swt.EventUtil.setSuspended(false)}}catch(ex){org.eclipse.rwt.ErrorHandler.processJavaScriptErrorInResponse(text,ex,this._currentRequest);errorOccured=true}if(!errorOccured){this._dispatchReceivedEvent()}}this._runningRequestCount--;this._hideWaitHint();exchange.dispose()},_handleConnectionError:function(g){var a="The server seems to be temporarily unavailable.\nWould you like to retry?";var i=confirm(a);if(i){var b=this._createRequest();var e=this._currentRequest;b.setAsynchronous(e.getAsynchronous());var c=e.getRequestHeaders();for(var d in c){b.setRequestHeader(d,c[d])}var h=e.getParameters();for(var f in h){b.setParameter(f,h[f])}b.setData(e.getData());this._restartRequest(b)}return i},_restartRequest:function(a){a.setState($[185]);var b=qx.io.remote.RequestQueue.getInstance();qx.lang.Array.insertAt(b._queue,a,0);b._check();if(b.getEnabled()){b._timer.start()}},_isConnectionError:function(b){var a;if(qx.core.Variant.isSet($[0],$[18])){a=(b===12007||b===12029||b===12030||b===12031||b===12152)}else{if(qx.core.Variant.isSet($[0],$[40])){if(org.eclipse.rwt.Client.getMajor()*10+org.eclipse.rwt.Client.getMinor()>=19){a=(b===0)}else{a=(b===-1)}}else{if(qx.core.Variant.isSet($[0],$[69])){a=(b===0)}else{if(qx.core.Variant.isSet($[0],$[122])){a=(b===0)}else{a=false}}}}return a},_showWaitHint:function(){if(this._runningRequestCount>0){var a=qx.ui.core.ClientDocument.getInstance();a.setGlobalCursor(qx.constant.Style.CURSOR_PROGRESS)}},_hideWaitHint:function(){if(this._runningRequestCount===0){var a=qx.ui.core.ClientDocument.getInstance();a.setGlobalCursor(null)}},_dispatchSendEvent:function(){if(this.hasEventListeners("send")){var a=new qx.event.type.DataEvent("send",this);this.dispatchEvent(a,true)}},_dispatchReceivedEvent:function(){if(this.hasEventListeners($[278])){var a=new qx.event.type.DataEvent($[278],this);this.dispatchEvent(a,true)}}}});
+qx.Class.define("org.eclipse.swt.EventUtil",{statics:{_suspended:false,setSuspended:function(a){this._suspended=a},getSuspended:function(){return this._suspended},DOUBLE_CLICK_TIME:500,_capturingWidget:null,_lastMouseDown:{widget:null,button:"",x:-1,y:-1,mouseUpCount:0},_shiftKey:false,_ctrlKey:false,_altKey:false,_metaKey:false,eventTimestamp:function(){var a=qx.core.Init.getInstance().getApplication();return new Date().getTime()-a.getStartupTime()},widgetSelected:function(b){var h=org.eclipse.swt.WidgetManager.getInstance();var d=org.eclipse.swt.Request.getInstance();var g=h.findIdByWidget(b.getTarget());var f=b.getTarget().getLeft();var e=b.getTarget().getTop();var c=b.getTarget().getWidth();var a=b.getTarget().getHeight();org.eclipse.swt.EventUtil.doWidgetSelected(g,f,e,c,a)},doWidgetSelected:function(f,e,d,b,a){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.Request.getInstance();c.addEvent($[61],f);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();c.addParameter(f+$[295],e);c.addParameter(f+$[294],d);c.addParameter(f+$[315],b);c.addParameter(f+$[280],a);c.send()}},addWidgetSelectedModifier:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var a=org.eclipse.swt.EventUtil._getKeyModifier();if(a!==""){var b=org.eclipse.swt.Request.getInstance();b.addParameter("org.eclipse.swt.events.widgetSelected.modifier",a)}}},_getKeyModifier:function(){var a="";var b=org.eclipse.rwt.Client.getPlatform()==="mac"&&org.eclipse.swt.EventUtil._metaKey;if(org.eclipse.swt.EventUtil._shiftKey){a+="shift,"}if(org.eclipse.swt.EventUtil._ctrlKey||b){a+="ctrl,"}if(org.eclipse.swt.EventUtil._altKey){a+="alt,"}return a},focusGained:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var b=org.eclipse.swt.Request.getInstance();b.send()}},focusLost:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var b=org.eclipse.swt.Request.getInstance();b.send()}},mouseDown:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()&&org.eclipse.swt.EventUtil._isRelevantMouseEvent(this,a)){org.eclipse.swt.EventUtil._capturingWidget=this;if(org.eclipse.swt.EventUtil._isDoubleClick(this,a)){org.eclipse.swt.EventUtil._clearLastMouseDown();org.eclipse.swt.EventUtil._mouseDoubleClickParams(this,a)}else{var c=org.eclipse.swt.EventUtil._lastMouseDown;c.widget=this;c.button=a.getButton();c.x=a.getPageX();c.y=a.getPageY();c.mouseUpCount=0;qx.client.Timer.once(org.eclipse.swt.EventUtil._clearLastMouseDown,this,org.eclipse.swt.EventUtil.DOUBLE_CLICK_TIME)}org.eclipse.swt.EventUtil._mouseDownParams(this,a);var b=org.eclipse.swt.Request.getInstance();b.send()}},mouseUp:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()&&org.eclipse.swt.EventUtil._isRelevantMouseEvent(this,a)){org.eclipse.swt.EventUtil._capturingWidget=null;org.eclipse.swt.EventUtil._lastMouseDown.mouseUpCount+=1;org.eclipse.swt.EventUtil._mouseUpParams(this,a);var b=org.eclipse.swt.Request.getInstance();b.send()}},_isRelevantMouseEvent:function(c,b){var a=true;if(c!==org.eclipse.swt.EventUtil._capturingWidget&&c!==b.getOriginalTarget()){var f=org.eclipse.swt.WidgetManager.getInstance();var e=b.getOriginalTarget();var d=f.findControl(e);a=c===d}return a},_clearLastMouseDown:function(){var a=org.eclipse.swt.EventUtil._lastMouseDown;a.widget=null;a.button="";a.mouseUpCount=0;a.x=-1;a.y=-1},_isDoubleClick:function(b,a){var c=org.eclipse.swt.EventUtil._lastMouseDown;return c.mouseUpCount===1&&c.widget===b&&c.button===qx.event.type.MouseEvent.C_BUTTON_LEFT&&c.button===a.getButton()},_mouseDownParams:function(e,b){var f=org.eclipse.swt.WidgetManager.getInstance().findIdByWidget(e);var d=org.eclipse.swt.Request.getInstance();var c=org.eclipse.swt.EventUtil._determineMouseButton(b);var a=org.eclipse.swt.EventUtil._getKeyModifier();d.addEvent("org.eclipse.swt.events.mouseDown",f);d.addParameter("org.eclipse.swt.events.mouseDown.button",c);d.addParameter("org.eclipse.swt.events.mouseDown.x",b.getPageX());d.addParameter("org.eclipse.swt.events.mouseDown.y",b.getPageY());d.addParameter("org.eclipse.swt.events.mouseDown.time",this.eventTimestamp());if(a!==""){d.addParameter("org.eclipse.swt.events.mouseDown.modifier",a)}},_mouseUpParams:function(e,b){var f=org.eclipse.swt.WidgetManager.getInstance().findIdByWidget(e);var d=org.eclipse.swt.Request.getInstance();var c=org.eclipse.swt.EventUtil._determineMouseButton(b);var a=org.eclipse.swt.EventUtil._getKeyModifier();d.addEvent("org.eclipse.swt.events.mouseUp",f);d.addParameter("org.eclipse.swt.events.mouseUp.button",c);d.addParameter("org.eclipse.swt.events.mouseUp.x",b.getPageX());d.addParameter("org.eclipse.swt.events.mouseUp.y",b.getPageY());d.addParameter("org.eclipse.swt.events.mouseUp.time",this.eventTimestamp());if(a!==""){d.addParameter("org.eclipse.swt.events.mouseUp.modifier",a)}},_mouseDoubleClickParams:function(d,b){var e=org.eclipse.swt.WidgetManager.getInstance().findIdByWidget(d);var c=org.eclipse.swt.Request.getInstance();var a=org.eclipse.swt.EventUtil._getKeyModifier();c.addEvent("org.eclipse.swt.events.mouseDoubleClick",e);c.addParameter("org.eclipse.swt.events.mouseDoubleClick.button",org.eclipse.swt.EventUtil._determineMouseButton(b));c.addParameter("org.eclipse.swt.events.mouseDoubleClick.x",b.getPageX());c.addParameter("org.eclipse.swt.events.mouseDoubleClick.y",b.getPageY());c.addParameter("org.eclipse.swt.events.mouseDoubleClick.time",this.eventTimestamp());if(a!==""){c.addParameter("org.eclipse.swt.events.mouseDoubleClick.modifier",a)}},_determineMouseButton:function(b){var a=0;switch(b.getButton()){case qx.event.type.MouseEvent.C_BUTTON_LEFT:a=1;break;case qx.event.type.MouseEvent.C_BUTTON_MIDDLE:a=2;break;case qx.event.type.MouseEvent.C_BUTTON_RIGHT:a=3;break}return a},helpRequested:function(a){if(a.getKeyIdentifier()==="F1"){a.stopPropagation();a.preventDefault();var c=a.getTarget();var e=org.eclipse.swt.WidgetManager.getInstance();var d=e.findIdByWidget(c);if(d===null){c=e.findControl(c);d=e.findIdByWidget(c)}if(d!=null){var b=org.eclipse.swt.Request.getInstance();b.addEvent("org.eclipse.swt.events.help",d);b.send()}}},menuDetectedByKey:function(b){if(b.getKeyIdentifier()==="Apps"){b.stopPropagation();b.preventDefault();var a=qx.event.type.MouseEvent.getPageX();var c=qx.event.type.MouseEvent.getPageY();org.eclipse.swt.EventUtil.sendMenuDetected(b.getTarget(),a,c)}},menuDetectedByMouse:function(b){if(b.getButton()===qx.event.type.MouseEvent.C_BUTTON_RIGHT){b.stopPropagation();b.preventDefault();var a=b.getPageX();var c=b.getPageY();org.eclipse.swt.EventUtil.sendMenuDetected(b.getTarget(),a,c)}},sendMenuDetected:function(c,a,f){if(!org.eclipse.swt.EventUtil.getSuspended()){var e=org.eclipse.swt.WidgetManager.getInstance();while(c!=null&&!e.isControl(c)){c=c.getParent?c.getParent():null}var d=e.findIdByWidget(c);if(d!=null){var b=org.eclipse.swt.Request.getInstance();b.addEvent("org.eclipse.swt.events.menuDetect",d);b.addParameter("org.eclipse.swt.events.menuDetect.x",a);b.addParameter("org.eclipse.swt.events.menuDetect.y",f);b.send()}}}}});
+qx.Class.define("org.eclipse.swt.WidgetManager",{type:$[33],extend:qx.core.Object,construct:function(){arguments.callee.base.call(this);this._map={};this._current=null;this._fontPool=new Object()},statics:{_onAppearFocus:function(a){var b=this;b.focus();a.getTarget().removeEventListener($[31],org.eclipse.swt.WidgetManager._onAppearFocus,b)}},members:{dispose:function(c){var b=this.findWidgetById(c);if(b!=null){this.remove(b);if(!b.getDisposed()){this._removeToolTipPopup(b);var a=b.getParent();if(a&&a.getChildren()){b.setParent(null)}b.destroy()}}},add:function(b,c,a){this._map[c]=b;if(a!=$[8]&&a==true){b.setUserData("isControl",true)}b.setUserData("id",c)},remove:function(a){var b=this.findIdByWidget(a);delete this._map[b]},findWidgetById:function(a){return this._map[a]},findIdByWidget:function(b){var a;if(b!=null){a=b.getUserData("id")}return a},isControl:function(b){var a=null;if(b!=null){a=b.getUserData("isControl")}return a!=null&&a==true},findControl:function(b){var a=b;while(a!=null&&!this.isControl(a)){a=a.getParent?a.getParent():null}return a},setParent:function(b,c){var a=this.findWidgetById(c);if(a instanceof org.eclipse.swt.custom.ScrolledComposite){a.setContent(b)}else{if(a instanceof org.eclipse.swt.widgets.ExpandBar){a.addWidget(b)}else{b.setParent(a)}}},setHtmlId:function(a,b){if(a instanceof Object&&typeof a.setHtmlProperty==$[44]){a.setHtmlProperty("id",b)}},focus:function(a){var b=this.findWidgetById(a);if(b.isSeeable()){b.focus()}else{b.addEventListener($[31],org.eclipse.swt.WidgetManager._onAppearFocus,b)}},setFont:function(f,c,e,d,b){if(f.setFont){var a=this._createFont(c,e,d,b);f.setFont(a)}},_createFont:function(c,e,d,b){var f=c+e+d+b;var a=this._fontPool[f];if(!a){a=new qx.ui.core.Font(e,c);a.setBold(d);a.setItalic(b);this._fontPool[f]=a}return a},setToolTip:function(c,b){if(b!=null&&b!=""){c.setUserData($[380],b);var a=org.eclipse.rwt.widgets.WidgetToolTip.getInstance();c.setToolTip(a);if(a.getParent()!=null){if(a.getBoundToWidget()==c){a.updateText(c)}}}else{this._removeToolTipPopup(c)}},_removeToolTipPopup:function(a){a.setToolTip(null);a.setUserData($[380],null)},setBackgroundGradient:function(e,c,a,b){var f=null;if(c!=null&&a!=null){f=new Array();for(var d=0;d<c.length;d++){f[d]=[a[d]/100,c[d]]}f.horizontal=!b}e.setBackgroundGradient(f)},setRoundedBorder:function(h,b,e,f,i,c,a){if(b>0&&e!=null&&f>=0&&i>=0&&c>=0&&a>=0){var g=[f,i,c,a];var d=new org.eclipse.rwt.Border(b,$[120],e,g);h.setBorder(d)}else{h.resetBorder()}}}});
+qx.Mixin.define("org.eclipse.rwt.FadeAnimationMixin",{properties:{animation:{check:$[111],nullable:false,init:null,apply:$[375],themeable:true}},construct:function(){this.hide();this._renderAppearance()},destruct:function(){if(this._animation!=null){this._animation.dispose()}this._animation=null},members:{_animation:null,_applyAnimation:function(d,a){var b=0;if(d.fadeIn){b|=org.eclipse.rwt.AnimationRenderer.ANIMATION_APPEAR}if(d.fadeOut){b|=org.eclipse.rwt.AnimationRenderer.ANIMATION_DISAPPEAR}if(b!=0){if(this._animation==null){this._animation=new org.eclipse.rwt.Animation();var c=this._animation.getDefaultRenderer();c.animate(this,$[43],b);this._animation.addEventListener("init",this._initAnimation,this)}this._animation.getDefaultRenderer().setActive(true)}else{if(this._animation!=null){this._animation.getDefaultRenderer().setActive(false)}}},_initAnimation:function(a){if(a.getData()==$[31]){this._animation.setProperties(this.getAnimation()["fadeIn"])}else{this._animation.setProperties(this.getAnimation()["fadeOut"])}}}});
+qx.Class.define("org.eclipse.rwt.AnimationRenderer",{extend:qx.core.Object,construct:function(a){this._autoDispose=false;arguments.callee.base.call(this);this._animation=a;this._animation._addRenderer(this);this._converterFunction=null;this._renderFunction=null;this._context=null;this._startValue=null;this._endValue=null;this._lastValue=null;this._setupFunction=null;this._cloneFrom=null;this._active=true;this._activeOnce=false;this._invisibilityValue=0;this._fullVisibilityValue=null;this._autoStartEnabled=true;this._renderType=null;this._renderAdapter=null;this._animationType=0;this._autoCheck=true},destruct:function(){this.clearAnimation();this._animation._removeRenderer(this);this._animation=null;this._startValue=null;this._endValue=null;this._invisibilityValue=null;this._lastValue=null;this._setupFunction=null;this._converterFunction=null;this._renderFunction=null;this._context=null;this._cloneFrom=null},members:{setConverter:function(a){if(typeof a==$[13]){this._converterFunction=org.eclipse.rwt.AnimationRenderer.converter[a]}else{this._converterFunction=a}},setRenderFunction:function(b,a){if(this._renderType==null){this._renderFunction=b;this._context=a}},renderValue:function(a){this._renderFunction.call(this._context,a);this._lastValue=a},setStartValue:function(a){this._startValue=a},setEndValue:function(a){this._endValue=a},setSetupFunction:function(a){this._setupFunction=a},setCloneFrom:function(a){this._cloneFrom=a},getAnimation:function(){return this._animation},getContext:function(){return this._context},getStartValue:function(a){return this._startValue},getEndValue:function(a){return this._endValue},getLastValue:function(){return this._lastValue},setActive:function(a){if(this._active!=a){if(this._animation.isRunning()){throw'AnimationRenderer: Can not change "active" while running!'}this._active=a;if(this._renderType!=null){this._handleAnimationType()}}},activateOnce:function(){if(!this._activeOnce){this.setActive(true);this._activeOnce=true}},cancelActivateOnce:function(){if(this._activeOnce){this._activeOnce=false;this.setActive(false)}},_setup:function(a){if(this._active){if(this._context instanceof qx.ui.core.Widget&&this._context._isCreated!==true){if(this._context._isInGlobalElementQueue){qx.ui.core.Widget.flushGlobalQueues()}else{throw new Error("AnimationRenderer setup failed: Widget not ready.")}}if(this._setupFunction!=null){this._setupFunction.call(this._context,a,this)}this._startValue=this._prepareValue(this._startValue);this._endValue=this._prepareValue(this._endValue);if(this._renderFunction==null||this._converterFunction==null){throw new Error("renderFunction or converterFunction missing")}}},_render:function(b){if(this._active){var a=this._cloneFrom!=null?this._cloneFrom.getLastValue():b;try{var c=this._converterFunction(a,this._startValue,this._endValue);this.renderValue(c)}catch(d){throw"AnimationRenderer failed: "+(d.message?d.message:d)}}},_finish:function(a){if(this._active&&a==$[312]){this._updateWidgetVisibility();this._forceWidgetRenderer()}this.cancelActivateOnce()},_prepareValue:function(c){var a=c;switch(this._renderType){case $[77]:if(typeof c==$[13]){if(c==$[155]||c==""){a=null}else{a=qx.util.ColorUtil.cssStringToRgb(c)}}break;case $[272]:if(c){var a=[];for(var b=0;b<c.length;b++){a[b]=[c[b][0],qx.util.ColorUtil.cssStringToRgb(c[b][1])]}}break;case $[43]:a=(c==null||c>1||c<0)?1:c;break;default:a=c!=null?c:0;break}return a},animate:function(c,a,b){if(this._context!=c||this._renderType!=a||this._animationType!=b){this.clearAnimation()}this._context=c;this._renderAdapter=c.getAdapter(org.eclipse.rwt.WidgetRenderAdapter);this._renderType=a;this._animationType=b;this._renderFunction=c[this._getRenderFunctionName()];var d=org.eclipse.rwt.AnimationRenderer.converterByRenderType;this.setConverter(d[this._renderType]);this._handleAnimationType()},clearAnimation:function(){if(this._renderType!=null){this._animationType=0;this._handleAnimationType();this._renderType=null;this.setRenderFunction(null,null);this._renderAdapter=null}},isAnimated:function(b){var a=false;if(this._animationType>0&&this._active){var c=b&this._animationType;if(typeof b==$[8]||c!=0){a=true}}return a},setInvisibilityValue:function(a){this._invisibilityValue=a},setAutoStart:function(a){this._autoStartEnabled=a},setAutoCheck:function(a){this._autoCheck=a},getValueFromWidget:function(){var a=null;switch(this._renderType){case $[43]:a=this._context.getOpacity();break;case $[39]:if(this._context.isCreated()){a=parseInt(this._context._style.height)}else{a=this._context.getHeightValue();this._context._computedHeightValue=null;this._context._invalidatePreferredInnerHeight();this._context._invalidatePreferredBoxHeight()}break;case $[77]:var c=$[77];var b=this._context;if(b.getGfxProperty&&b.getGfxProperty(c)){a=b.getGfxProperty(c)}else{if(b.getStyleProperty(c)){a=b.getStyleProperty(c)}else{a=null}}break;case $[272]:var b=this._context;a=b.getBackgroundGradient();break;default:throw"getValueFromWidget: "+this._renderType+" not supported!";break}return a},checkValues:function(){var a;switch(this._renderType){case $[272]:case $[77]:a=this._startValue!=null&&this._endValue!=null;break;default:a=true;break}return a&&this._startValue!=this._endValue},_handleAnimationType:function(){if(this._animation.isRunning()){throw"AnimationRenderer: Can not change animation while running!"}if(this.isAnimated()){if(!this._context.getUserData($[241])){this._context.setUserData($[241],this);this._overwriteApplyVisibility(true);this._overwriteWidgetRenderer(true)}if(this._context.getUserData($[241])!=this){throw"Error: Widget already has an active animationRenderer!"}}else{if(this._context.getUserData($[241])==this){this._context.setUserData($[241],null);this._overwriteApplyVisibility(false);this._overwriteWidgetRenderer(false)}}},_overwriteApplyVisibility:function(a){if(a){this._renderAdapter.addRenderListener($[113],this._onVisibilityChange,this)}else{this._renderAdapter.removeRenderListener($[113],this._onVisibilityChange,this)}},_overwriteWidgetRenderer:function(b){var a=this._getRenderFunctionName();if(!this._context[a]){throw ("unkown renderfunction "+a)}if(b){if(!this.__onOriginalRenderer){this.__onOriginalRenderer=qx.lang.Function.bind(this._onOriginalRenderer,this)}this._context[a]=this.__onOriginalRenderer}else{delete this._context[a]}},_onVisibilityChange:function(b){var a;if(b.getData()){a=this._onBeforeAppear()}else{a=this._onBeforeDisappear()}if(!a){b.preventDefault()}},_onBeforeAppear:function(){if(this._context.isCreated()){this._animation.skip()}else{this._animation.cancel()}var a=org.eclipse.rwt.AnimationRenderer.ANIMATION_APPEAR;if(this.isAnimated(a)){this.setEndValue(this.getValueFromWidget());if(this._invisibilityValue!=null){this.setStartValue(this._invisibilityValue);if(this._context.isCreated()){this._render(0)}else{this._renderStartValueOnCreate()}}this._autoStart(a)}return true},_onBeforeDisappear:function(){if(this._context.isCreated()){this._animation.skip()}else{this._animation.cancel()}var b=org.eclipse.rwt.AnimationRenderer.ANIMATION_DISAPPEAR;var a=!this.isAnimated(b);if(!a){if(this._invisibilityValue!=null){this.setEndValue(this._invisibilityValue)}this.setStartValue(this.getValueFromWidget());this._autoStart(b)}return a},_onOriginalRenderer:function(e,d){if(this._animation.isStarted()){var c=this._animation.getConfig();var b=this._endValue;if(c==$[79]||c==$[31]){this.setEndValue(e)}if(b!=this._endValue){if(this._animation.isRunning()){this.setStartValue(this.getLastValue())}if(!this._animation.restart()){this.renderValue(e);this.cancelActivateOnce()}}}else{var a=org.eclipse.rwt.AnimationRenderer.ANIMATION_CHANGE;if(this.isAnimated(a)&&this._context.isSeeable()){this.setStartValue(typeof d!=$[8]?d:this.getValueFromWidget());this.setEndValue(e);if(!this._autoStart(a)&&this._autoStartEnabled){this.renderValue(e)}}else{this.renderValue(e)}}},_getRenderFunctionName:function(){var a=org.eclipse.rwt.AnimationRenderer.renderFunctionNames;return a[this._renderType]},_forceWidgetRenderer:function(){var a=org.eclipse.rwt.AnimationRenderer.applyFunctionNames[this._renderType];this._context[a](this._context.get(this._renderType))},_autoStart:function(b){var a=false;if(this._autoStartEnabled&&this.isAnimated(b)&&(this._autoCheck?this.checkValues():true)){a=this._animation.start(this._typeToConfig(b))}else{this.cancelActivateOnce()}return a},_typeToConfig:function(b){var a=null;switch(b){case org.eclipse.rwt.AnimationRenderer.ANIMATION_APPEAR:a=$[31];break;case org.eclipse.rwt.AnimationRenderer.ANIMATION_DISAPPEAR:a=$[312];break;case org.eclipse.rwt.AnimationRenderer.ANIMATION_CHANGE:a=$[79];break}return a},_updateWidgetVisibility:function(){var a=this._context.getVisibility();this._renderAdapter.forceRender($[113],a)},_renderStartValueOnCreate:function(){this._context.addEventListener($[107],this._onCreate,this)},_onCreate:function(){this._context.removeEventListener($[107],this._onCreate,this);this._render(0)}},statics:{ANIMATION_APPEAR:1,ANIMATION_DISAPPEAR:2,ANIMATION_CHANGE:4,renderFunctionNames:{height:"_renderRuntimeHeight",opacity:$[370],backgroundColor:"_styleBackgroundColor",backgroundGradient:$[381]},applyFunctionNames:{height:$[498],opacity:$[370],backgroundColor:$[554],backgroundGradient:$[381]},converterByRenderType:{height:"numericPositiveRound",opacity:"factor",backgroundColor:$[6],backgroundGradient:$[129]},converter:{none:function(a){return a},round:Math.round,positive:function(a){return Math.max(0,a)},numeric:function(c,b,a){return b+(a-b)*c},numericRound:function(d,c,b){var a=c+(b-c)*d;return Math.round(a)},numericPositive:function(c,b,a){var d=a-b;return Math.max(0,b+d*c)},numericPositiveRound:function(d,c,b){var e=b-c;var a=Math.max(0,c+e*d);return Math.round(a)},factor:function(d,c,b){var a=c+(b-c)*d;return Math.max(0,Math.min(a,1))},color:function(g,c,b){var a=[];var d;var f;for(var e=0;e<3;e++){f=b[e]-c[e];d=Math.round(c[e]+f*g);a[e]=Math.max(0,Math.min(d,255))}return qx.util.ColorUtil.rgbToRgbString(a)},gradient:function(f,c,b){var g=org.eclipse.rwt.AnimationRenderer.converter.color;var h=org.eclipse.rwt.AnimationRenderer.converter.factor;var a=[];var e=Math.min(b.length,c.length);for(var d=0;d<e;d++){a[d]=[h(f,c[d][0],b[d][0]),g(f,c[d][1],b[d][1])]}return a}}}});
+qx.Class.define("org.eclipse.rwt.Animation",{extend:qx.core.Target,construct:function(){arguments.callee.base.call(this);this._renderer=[];this._duration=1000;this._transitionFunction=org.eclipse.rwt.Animation.transitions.linear;this._startOn=null;this._finishOn=null;this._totalTime=null;this._config=null;this._defaultRenderer=null;this._isRunning=false;this._inQueue=false},destruct:function(){if(this.isRunning()){this.skip()}else{this.cancel()}try{for(var b=0;b<this._renderer.length;b++){this._renderer[b].dispose()}}catch(a){throw"Could not Dispose AnimationRenderer: "+a}this._renderer=null},events:{init:$[68],finish:$[68],cancel:$[68]},members:{setDuration:function(a){this._duration=a},setTransition:function(a){this._transitionFunction=org.eclipse.rwt.Animation.transitions[a]},setProperties:function(a){this.setDuration(a[0]);this.setTransition(a[1])},getRenderer:function(a){return this._renderer[a]},getDefaultRenderer:function(a){if(this._defaultRenderer==null||this._defaultRenderer.isDisposed()){this._defaultRenderer=new org.eclipse.rwt.AnimationRenderer(this)}if(typeof a!=$[8]){this._defaultRenderer.setActive(a)}return this._defaultRenderer},getRendererLength:function(){return this._renderer.length},getRendererIndex:function(a){return this._renderer.indexOf(a)},getConfig:function(){return this._config},start:function(b){var a=false;if(!this.isStarted()){org.eclipse.rwt.Animation._addToQueue(this);this._inQueue=true;this._config=b;this._init();a=this.isStarted()}return a},restart:function(){var a=false;if(this.isStarted()){var b=this._config;this.cancel();a=this.start(b)}return a},cancel:function(){if(this.isStarted()){this._inQueue=false;this._isRunning=false;this.createDispatchDataEvent("cancel",this._config);this._config=null;org.eclipse.rwt.Animation._removeFromLoop(this)}},skip:function(){if(this.isStarted()){if(!this.isRunning()){this._render(0)}this._finish()}},setRendererActive:function(b){for(var a=0;a<this._renderer.length;a++){this._renderer[a].setActive(b)}},activateRendererOnce:function(){for(var a=0;a<this._renderer.length;a++){this._renderer[a].activateOnce()}},isStarted:function(){return this._inQueue},isRunning:function(){return this._isRunning},_addRenderer:function(a){this._renderer.push(a)},_removeRenderer:function(a){if(this.isStarted()){throw"Cannot remove AnimationRenderer: Animation already started!"}qx.lang.Array.remove(this._renderer,a)},_init:function(){this.createDispatchDataEvent("init",this._config);this._startOn=null;this._numberRenderer=this._renderer.length},_loop:function(b){if(this._startOn==null){this._startOn=new Date().getTime();this._finishOn=this._startOn+(this._duration);this._totalTime=this._duration}if(b>=this._finishOn){this._finish()}else{var a=(b-this._startOn)/this._totalTime;this._render(a)}},_render:function(a){var d=this._renderer.length;if(!this._isRunning){for(var b=0;b<this._numberRenderer;b++){this._renderer[b]._setup(this._config)}this._isRunning=true}var c=this._transitionFunction(a);for(var b=0;b<this._numberRenderer;b++){this._renderer[b]._render(c)}},_finish:function(){this._render(1);var a=this._config;this.cancel();for(var b=0;b<this._numberRenderer;b++){this._renderer[b]._finish(a)}this.createDispatchDataEvent("finish",a)}},statics:{FPS:60,_queue:[],_interval:null,_addToQueue:function(a){this._queue.push(a);if(this._interval==null){this._startLoop()}},_removeFromLoop:function(a){qx.lang.Array.remove(this._queue,a);if(this._queue.length==0){this._stopLoop()}},_startLoop:function(){this._interval=setInterval(this._mainLoop,Math.round(1000/this.FPS))},_stopLoop:function(){window.clearInterval(this._interval);this._interval=null},_mainLoop:function(){try{if(!org.eclipse.swt.EventUtil.getSuspended()){var g=new Date().getTime();var b=org.eclipse.rwt.Animation._queue;try{for(var d=0,a=b.length;d<a;d++){b[d]&&b[d]._loop(g)}}catch(f){org.eclipse.rwt.Animation._stopLoop();throw"Animation aborted: "+f}}}catch(c){org.eclipse.rwt.ErrorHandler.processJavaScriptError(c)}},blockGlobalFlushs:function(a){qx.ui.core.Widget._inFlushGlobalQueues=a;if(!a){qx.ui.core.Widget._initAutoFlush(0)}},transitions:{linear:function(a){return a},ease:function(a){var b=-Math.pow(a-1,2)+1;return(-Math.cos(b*Math.PI)/2)+0.5},easeIn:function(a){return Math.pow(a,2)},easeOut:function(a){return -Math.pow(a-1,2)+1},easeInOut:function(a){return(-Math.cos(a*Math.PI)/2)+0.5}}}});
+qx.Class.define("org.eclipse.rwt.widgets.WidgetToolTip",{type:$[33],extend:qx.ui.popup.ToolTip,include:org.eclipse.rwt.FadeAnimationMixin,construct:function(){arguments.callee.base.call(this);this._atom._createLabel();this._atom.getLabelObject().setMode("html")},members:{_applyBoundToWidget:function(c,a){arguments.callee.base.call(this,c,a);this.updateText(c);var b=qx.ui.popup.ToolTipManager.getInstance();b.setCurrentToolTip(null)},updateText:function(a){this._atom.setLabel(a.getUserData($[380]))}}});
+qx.Class.define("org.eclipse.rwt.SyncKeyEventUtil",{type:$[33],extend:qx.core.Object,construct:function(){arguments.callee.base.call(this);this._cancelEvent=false},members:{intercept:function(a,k,i,e){var c=org.eclipse.rwt.KeyEventUtil.getInstance();var g=this._getRealKeyCode(k,e);var j=c._isRelevantEvent(a,g);if(!org.eclipse.swt.EventUtil.getSuspended()&&j){var d=c._getTargetControl();var h=c._hasKeyListener(d);var f=c._hasTraverseListener(d);var b=false;if(f){b=c._isTraverseKey(g)}if(h||(f&&b)){this._cancelEvent=false;this._sendKeyDown(d,g,i,e);if(this._cancelEvent){this._cancelDomEvent(e)}}}return this._cancelEvent},cancelEvent:function(){this._cancelEvent=true},allowEvent:function(){},_getRealKeyCode:function(c,b){var a=c;if(qx.core.Variant.isSet($[0],$[122])){a=b.keyCode}return a},_cancelDomEvent:function(a){if(qx.core.Variant.isSet($[0],$[18])){a.returnValue=false;a.cancelBubble=true}else{a.__isCanceled=true;a.preventDefault();a.stopPropagation()}},_sendKeyDown:function(d,e,a,c){var b=org.eclipse.rwt.KeyEventUtil.getInstance();b._attachKeyDown(d,e,a,c);org.eclipse.swt.Request.getInstance().sendSyncronous()}}});
+qx.Mixin.define("org.eclipse.rwt.GraphicsMixin",{statics:{getSupportsShadows:function(){if(this._shadowSupport===undefined){var c=org.eclipse.rwt.Client.getEngine();var a=org.eclipse.rwt.Client.getVersion();this._shadowSupport=false;switch(c){case $[40]:this._shadowSupport=a>=1.9;break;case $[18]:this._shadowSupport=a>=7;break;case $[122]:this._shadowSupport=false;break;case $[69]:var b=org.eclipse.rwt.Client.getBrowser();this._shadowSupport=a>=532.9;break}}return this._shadowSupport}},members:{_gfxData:null,_gfxProperties:null,_gfxCanvas:null,_gfxEnabled:false,_gfxBorderEnabled:false,_gfxBackgroundEnabled:false,_gfxCanvasAppended:false,_applyBackgroundGradient:function(b,a){this.setGfxProperty($[129],b);this._handleGfxBackground()},_applyShadow:function(b,a){if(org.eclipse.rwt.GraphicsMixin.getSupportsShadows()){this.setGfxProperty($[27],b);this.setGfxProperty($[224],null);this._handleGfxShadow()}},_styleBackgroundColor:function(a){if(this._gfxBackgroundEnabled){this.setGfxProperty($[77],a);if(this.getGfxProperty($[202])==$[20]&&this._isCanvasReady()){this._renderGfxBackground()}}else{arguments.callee.base.call(this,a)}},_styleBackgroundImage:function(a){if(this._gfxBackgroundEnabled){this.setGfxProperty($[114],a);if(this.getGfxProperty($[202])==$[35]&&this._isCanvasReady()&&a!=null){this._renderGfxBackground()}else{this._handleGfxBackground()}}else{if(a==null&&this.getGfxProperty($[129])!=null){this._handleGfxBackground()}else{arguments.callee.base.call(this,a)}}},renderBorder:function(a){var b=this.__borderObject;if(b&&b.getStyle()===$[120]){this._styleGfxBorder(b.getWidths(),b.getColor(),b.getRadii())}else{if(this._gfxBorderEnabled){this._styleGfxBorder(null,null,null)}arguments.callee.base.call(this,a)}},_styleGfxBorder:function(d,b,f){var a=0;if(d){for(var c=0;c<d.length;c++){a=Math.max(a,d[c])}}var g;if(d!=null&&f!=null&&a>0){g=[];for(var c=0;c<4;c++){var e=c>0?c-1:3;if(d[c]==0||d[e]==0){g[c]=0}else{g[c]=f[c]}}}else{g=f}this.setGfxProperty($[301],d);this.setGfxProperty($[382],a);this.setGfxProperty($[363],b);this.setGfxProperty($[257],g);this.setGfxProperty($[251],null);this.setGfxProperty($[224],null);this._handleGfxBorder()},setGfxProperty:function(a,b){if(this._gfxProperties===null){this._gfxProperties={}}this._gfxProperties[a]=b},getGfxProperty:function(a){var b=this._gfxProperties!==null?this._gfxProperties[a]:null;return typeof b!=$[8]?b:null},_handleGfxBorder:function(){var b=this.getGfxProperty($[257])!=null&&this.getGfxProperty($[301])!=null&&this.getGfxProperty($[363])!=null;var a=(this._gfxBorderEnabled!=b);if(a){if(b){this._gfxBorderEnabled=true}else{this._gfxBorderEnabled=false;this._resetTargetNode()}this._handleGfxBackground();this._handleGfxStatus()}if(this._isCanvasReady()&&b){this._renderGfxBorder();if(!this._willBeLayouted()){this._layoutShapes()}}else{if(a&&!b){this._prepareBackgroundShape()}}},_handleGfxBackground:function(){var f=this.getBackgroundImage()!=null;var d=false;if(f){this.setGfxProperty($[202],$[35])}else{d=this.getGfxProperty($[129])!=null;if(d){this.setGfxProperty($[202],$[129])}else{this.setGfxProperty($[202],$[20])}}var b=(d||this._gfxBorderEnabled);var a=(this._gfxBackgroundEnabled!=b);if(a){if(b){var c=this.getStyleProperty($[77]);this.removeStyleProperty($[77]);this.setGfxProperty($[77],c);var e=this.getBackgroundImage();this.setGfxProperty($[114],e);this.removeStyleProperty($[114]);this._gfxBackgroundEnabled=true}else{this._gfxBackgroundEnabled=false;this._applyBackgroundColor(this.getBackgroundColor());this.setGfxProperty($[77],null);this._applyBackgroundImage(this.getBackgroundImage());this.setGfxProperty($[114],null)}this._handleGfxStatus()}if(this._isCanvasReady()&&b){this._renderGfxBackground();if(a&&!this._gfxBorderEnabled&&!this._willBeLayouted()){this._layoutShapes()}}else{if(a&&!b){this._prepareBackgroundShape()}}},_handleGfxShadow:function(){var a=this.getGfxProperty($[27])!=null;this._gfxShadowEnabled=a;this._handleGfxStatus();if(this._isCanvasReady()&&a){this._renderGfxShadow();if(!this._willBeLayouted()){this._layoutShapes()}}else{if(!this._gfxShadowEnabled&&this._gfxData&&this._gfxData.shadowInsert){this._prepareShadowShape()}}},_handleGfxStatus:function(){var a=this._gfxBorderEnabled||this._gfxBackgroundEnabled||this._gfxShadowEnabled;if(a!=this._gfxEnabled){if(a){this._gfxEnabled=true;this.addEventListener($[354],this._gfxOnElementChanged,this);this.addEventListener("flush",this._gfxOnFlush,this)}else{this._gfxEnabled=false;this.removeEventListener($[354],this._gfxOnElementChanged,this);this.removeEventListener("flush",this._gfxOnFlush,this)}this._targetNodeEnabled=(this._innerStyle||a)&&!this._gfxBorderEnabled}},_gfxOnElementChanged:function(a){if(a.getValue()==null&&this._gfxCanvasAppended){this._removeCanvas()}if(a.getValue()!=null&&this._isCanvasReady()){if(this._gfxBackgroundEnabled){this._renderGfxBackground()}if(this._gfxShadowEnabled){this._renderGfxShadow()}}},_gfxOnFlush:function(b){var a=b.getData();if(a.paddingRight||a.paddingBottom){this.setGfxProperty($[251],null);this.setGfxProperty($[224],null)}this._layoutShapes()},_layoutShapes:function(){if(this._gfxBackgroundEnabled){this._layoutBackgroundShape()}if(this._gfxShadowEnabled){this._layoutShadowShape()}},_layoutTargetNode:function(){if(this._innerStyle&&this._gfxBorderEnabled){var c=this.getGfxProperty($[251]);var b=this.getGfxProperty($[301]);var a=this._innerStyle;a.top=b[0]+"px";a.left=b[3]+"px";a.width=Math.max(0,c[0]-b[3]-b[1])+"px";a.height=Math.max(0,c[1]-b[0]-b[2])+"px"}},_resetTargetNode:function(){if(this._innerStyle){this._innerStyle.left="0px";this._innerStyle.top="0px";if(qx.core.Variant.isSet($[0],$[18])){this._innerStyle.width="";this._innerStyle.height="";this.addToQueue($[19]);this.addToQueue($[39])}else{this._innerStyle.width="100%";this._innerStyle.height="100%"}}},_isCanvasReady:function(){var a=false;if(this._isCreated){if(this._gfxEnabled&&this._gfxCanvasAppended){a=true}else{if(this._gfxEnabled&&!this._gfxCanvasAppended){if(this._gfxCanvas==null){this._createCanvas()}this._appendCanvas();a=true}else{if(!this._gfxEnabled&&this._gfxCanvasAppended){this._removeCanvas()}}}}return a},_createCanvas:function(){if(!this._innerStyle){var a=null;if(qx.core.Variant.isSet($[0],$[69])){a=this.getStyleProperty($[115]);this.removeStyleProperty($[115]);this.__outerElementStyleProperties.outline=true}if(qx.core.Variant.isSet($[0],$[18])){this.__outerElementStyleProperties.filter=true}else{this.__outerElementStyleProperties.opacity=true;if(qx.core.Variant.isSet($[0],$[40])){this.__outerElementStyleProperties.MozOpacity=true}}this.prepareEnhancedBorder();if(a){this.setStyleProperty($[115],a)}this._applyOpacity(this.getOpacity())}this._gfxData={};this._gfxCanvas=org.eclipse.rwt.GraphicsUtil.createCanvas();this._prepareBackgroundShape()},_appendCanvas:function(){var b=this.getElement();var a=org.eclipse.rwt.GraphicsUtil.getCanvasNode(this._gfxCanvas);if(a!=null){b.insertBefore(a,b.firstChild)}this._gfxCanvasAppended=true;this.addEventListener($[228],this._onCanvasAppear);if(this.isSeeable()){this._onCanvasAppear()}},_removeCanvas:function(){var a=org.eclipse.rwt.GraphicsUtil.getCanvasNode(this._gfxCanvas);if(a!=null){a.parentNode.removeChild(a);this._gfxCanvasAppended=false;this.removeEventListener($[228],this._onCanvasAppear)}},_onCanvasAppear:function(){if(this._gfxCanvasAppended){org.eclipse.rwt.GraphicsUtil.handleAppear(this._gfxCanvas)}},_prepareBackgroundShape:function(){var a=org.eclipse.rwt.GraphicsUtil;if(this._gfxData){var c=this._gfxData.backgroundShape;if(this._gfxBackgroundEnabled){if(c===undefined){this._gfxData.backgroundShape=a.createShape($[173])}if(!this._gfxData.backgroundInsert){var b=this._gfxData.backgroundShape;a.addToCanvas(this._gfxCanvas,b);this._gfxData.backgroundInsert=true}}else{if(this._gfxData.backgroundInsert){a.removeFromCanvas(this._gfxCanvas,c);this._gfxData.backgroundInsert=false}}}},_renderGfxBackground:function(){this._prepareBackgroundShape();var f=this.getGfxProperty($[202]);var a=org.eclipse.rwt.GraphicsUtil;if(f==$[129]){var e=this.getGfxProperty($[129]);a.setFillGradient(this._gfxData.backgroundShape,e)}else{if(f==$[35]){var d=this.getGfxProperty($[114]);d=typeof d==$[8]?null:d;var c=this._getImageSize(d);a.setFillPattern(this._gfxData.backgroundShape,d,c[0],c[1])}else{var b=this.getGfxProperty($[77]);b=b==""?null:b;a.setFillColor(this._gfxData.backgroundShape,b)}}},_renderGfxBorder:function(){this._prepareBackgroundShape();this._style.borderWidth=0;var c=this._innerStyle;c.borderWidth=0;var b=this._gfxData.backgroundShape;var d=this.getGfxProperty($[382]);var a=this.getGfxProperty($[363]);org.eclipse.rwt.GraphicsUtil.setStroke(b,a,d)},_layoutBackgroundShape:function(){var b=[this.getBoxWidth(),this.getBoxHeight()];var k=this.getGfxProperty($[251]);var d=!k||(b[0]!==k[0]);var c=!k||(b[1]!==k[1]);if(d||c){this.setGfxProperty($[251],b);this._layoutTargetNode();var b=[this.getBoxWidth(),this.getBoxHeight()];var g;var m;var e;var o;var h;if(this._gfxBorderEnabled){h=this.getGfxProperty($[257]);var a=this.getGfxProperty($[301]);var q=this.getGfxProperty($[382]);var f=0;var p=0;var n=0;var l=0;if(q>0){f=(a[0]==0?-q-1:q);p=(a[1]==0?-q-1:q);n=(a[2]==0?-q-1:q);l=(a[3]==0?-q-1:q)}g=b[0]-(l*0.5+p*0.5);m=b[1]-(f*0.5+n*0.5);e=l*0.5;o=f*0.5}else{e=0;o=0;g=b[0]-this._cachedBorderLeft-this._cachedBorderRight;m=b[1]-this._cachedBorderTop-this._cachedBorderBottom;h=[0,0,0,0]}g=Math.max(0,g);m=Math.max(0,m);var j=this._gfxData.backgroundShape;var i=org.eclipse.rwt.GraphicsUtil;i.setRoundRectLayout(j,e,o,g,m,h)}},_prepareShadowShape:function(){var a=org.eclipse.rwt.GraphicsUtil;if(this._gfxData){if(this._gfxShadowEnabled){if(this._gfxData.shadowShape===undefined){this._createShadowShape();var c=a.getCanvasNode(this._gfxCanvas);org.eclipse.rwt.HtmlUtil.setPointerEvents(c,"none")}var b=this._gfxData.shadowShape;if(!this._gfxData.shadowInsert){var d=null;if(this._gfxData.backgroundInsert){d=this._gfxData.backgroundShape}a.addToCanvas(this._gfxCanvas,b,d);this._gfxData.shadowInsert=true}}else{if(this._gfxData.shadowInsert){a.removeFromCanvas(this._gfxCanvas,this._gfxData.shadowShape);a.enableOverflow(this._gfxCanvas,0,0,null,null);delete this._gfxData.shadowInsert}}}},_createShadowShape:function(){var b=null;var a=org.eclipse.rwt.GraphicsUtil;var b=a.createShape($[173]);this._gfxData.shadowShape=b;return b},_renderGfxShadow:function(){this._prepareShadowShape();if(this._gfxShadowEnabled){var a=org.eclipse.rwt.GraphicsUtil;var c=this.getGfxProperty($[27]);var b=this._gfxData.shadowShape;a.setBlur(b,c[3]);a.setFillColor(b,c[5]);a.setOpacity(b,c[6])}},_layoutShadowShape:function(){var a=org.eclipse.rwt.GraphicsUtil;var c=[this.getBoxWidth(),this.getBoxHeight()];var l=[this.getBoxWidth(),this.getBoxHeight()];var n=this.getGfxProperty($[224]);var s=!n||(l[0]!==n[0]);var q=!n||(l[1]!==n[1]);if(s||q){var d=this._gfxData.shadowShape;this.setGfxProperty($[224],l);var h=this.getGfxProperty($[27]);var k=this.getGfxProperty($[257]);k=k===null?[0,0,0,0]:k;var f=h[1];var i=h[2];var m=c[0];var j=c[1];var p=h[3];var o=f<0?Math.abs(f)+p:0;var r=i<0?Math.abs(i)+p:0;var e=Math.max(0,p+f);var b=Math.max(0,p+i);var t=m+e;var g=j+b;a.enableOverflow(this._gfxCanvas,o,r,t,g);a.setRoundRectLayout(d,f,i,m,j,k)}},_getImageSize:function(c){var a=this.getUserData($[287]);if(a==null){var b=org.eclipse.swt.theme.ThemeStore.getInstance();a=b.getImageSize(c)}return a},_willBeLayouted:function(){return this._jobQueue!=undefined||!qx.lang.Object.isEmpty(this._layoutChanges)}}});
 qx.Class.define("org.eclipse.rwt.GraphicsUtil",{statics:{_renderClass:null,init:function(){if(this._renderClass==null){if(org.eclipse.rwt.Client.supportsVml()){this._renderClass=org.eclipse.rwt.VML}else{if(org.eclipse.rwt.Client.supportsSvg()){this._renderClass=org.eclipse.rwt.SVG}}if(this._renderClass!=null){this._renderClass.init()}}},createCanvas:function(){var a=null;a=this._renderClass.createCanvas();return a},getCanvasNode:function(b){var a=null;a=this._renderClass.getCanvasNode(b);return a},handleAppear:function(a){this._renderClass.handleAppear(a)},enableOverflow:function(c,b,e,d,a){this._renderClass.enableOverflow(c,b,e,d,a)},createShape:function(b){var a=null;if(this._renderClass!=null){a=this._renderClass.createShape(b)}return a},addToCanvas:function(c,b,a){this._renderClass.addToCanvas(c,b,a)},removeFromCanvas:function(b,a){this._renderClass.removeFromCanvas(b,a)},setDisplay:function(a,b){this._renderClass.setDisplay(a,b)},getDisplay:function(a){return this._renderClass.getDisplay(a)},setRectBounds:function(c,b,e,d,a){this._renderClass.setRectBounds(c,b,e,d,a)},setRoundRectLayout:function(c,b,f,d,a,e){this._renderClass.setRoundRectLayout(c,b,f,d,a,e)},setFillColor:function(b,a){this._renderClass.setFillColor(b,a)},getFillColor:function(b,a){return this._renderClass.getFillColor(b)},setFillGradient:function(a,b){this._renderClass.setFillGradient(a,b)},setFillPattern:function(b,d,c,a){this._renderClass.setFillPattern(b,d,c,a)},getFillType:function(b,a){return this._renderClass.getFillType(b)},setStroke:function(b,a,c){this._renderClass.setStroke(b,a,c)},getStrokeWidth:function(a){return this._renderClass.getStrokeWidth(a)},getStrokeColor:function(a){return this._renderClass.getStrokeColor(a)},setOpacity:function(a,b){this._renderClass.setOpacity(a,b)},getOpacity:function(a){return this._renderClass.getOpacity(a)},setBlur:function(b,a){this._renderClass.setBlur(b,a)},getBlur:function(a){return this._renderClass.getBlur(a)}}});
-qx.Class.define("org.eclipse.rwt.VML",{statics:{init:function(){document.namespaces.add("v","urn:schemas-microsoft-com:vml");document.namespaces.add("o","urn:schemas-microsoft-com:office:office");var a=document.createStyleSheet();a.cssText="v\\:* { behavior:url(#default#VML);display:inline-block; } o\\:* { behavior: url(#default#VML);}";this._vmlEnabled=true},createCanvas:function(){var a={};a.type="vmlCanvas";var b=document.createElement("div");b.style.position=$[27];b.style.width="10px";b.style.height="10px";b.style.top="0";b.style.left="0";b.style.fontSize="0";b.style.lineHeight="0";a.node=b;a.children={};return a},clearCanvas:function(a){for(var b in a.children){a.node.removeChild(a.children[b].node)}a.children={}},getCanvasNode:function(a){return a.node},handleAppear:function(a){var b=a.children;for(var c in b){this._handleAppearShape(b[c])}},createShape:function(b){var a=null;switch(b){case"rect":a=this._createRect();break;case $[178]:case"custom":a=this._createCustomShape();a.blurRadius=0;break;case $[35]:a=this._createImage();break;default:throw"VML does not support shape "+b;break}a.restoreData={fill:{}};a.node.stroked=false;var c=this._createNode("fill");c.method="sigma";a.node.appendChild(c);a.fill=c;this.setFillColor(a,null);return a},addToCanvas:function(c,b,a){var d=qx.core.Object.toHashCode(b);c.children[d]=b;if(a){c.node.insertBefore(b.node,a.node)}else{c.node.appendChild(b.node)}},enableOverflow:function(a){},removeFromCanvas:function(b,a){var c=qx.core.Object.toHashCode(a);delete b.children[c];b.node.removeChild(a.node)},setDisplay:function(a,b){a.node.style.display=b?"":"none"},getDisplay:function(b){var a=b.node.style.display=="none"?false:true;return a},setRectBounds:function(c,b,f,d,a){var e=c.node;e.style.width=this._convertNumeric(d,false);e.style.height=this._convertNumeric(a,false);e.style.left=this._convertNumeric(b,true);e.style.top=this._convertNumeric(f,true)},setImageData:function(c,g,b,h,e,a,d){var f=c.node;f.src=g;if(typeof d!=$[8]){f.cropTop=d[0];f.cropRight=d[1];f.cropBottom=d[2];f.cropLeft=d[3]}f.style.width=e;f.style.height=a;f.style.left=b;f.style.top=h},setRoundRectLayout:function(k,o,n,e,p,j){var g=this._VMLDEGREE*90;var c=this._convertNumeric(j[0],false);var h=this._convertNumeric(j[1],false);var b=this._convertNumeric(j[2],false);var a=this._convertNumeric(j[3],false);var d=this._getBlurOffsets(k.blurRadius);var f=this._convertNumeric(o-d[1],true);var m=this._convertNumeric(n-d[1],true);var i=this._convertNumeric(e-d[2],false);var l=this._convertNumeric(p-d[2],false);if((c+h)>i||(b+a)>i||(c+a)>l||(b+h)>l){c=0;h=0;b=0;a=0}var q=[];if(c>0){q.push("AL",f+c,m+c);q.push(c,c,2*g,g)}else{q.push("M",f,m+c)}if(h>0){q.push("AE",f+i-h);q.push(m+h);q.push(h,h,3*g,g)}else{q.push("L",f+i,m)}if(b>0){q.push("AE",f+i-b);q.push(m+l-b);q.push(b,b,0,g)}else{q.push("L",f+i,m+l)}if(a>0){q.push("AE",f+a);q.push(m+l-a);q.push(a,a,g,g)}else{q.push("L",f,m+l)}q.push("X E");k.node.path=q.join(" ")},applyDrawingContext:function(b,d,g){var c=d.globalAlpha;if(c!=1){this.setOpacity(b,c)}if(g){var g=d.fillStyle;if(g instanceof Array){this.setFillGradient(b,d.fillStyle)}else{this.setFillColor(b,d.fillStyle)}this.setStroke(b,null,0)}else{this.setFillColor(b,null);this.setStroke(b,d.strokeStyle,d.lineWidth);var f=d.lineCap=="butt"?"flat":d.lineCap;var e=d.lineJoin;var a=d.miterLimit;this._setStrokeStyle(b,e,a,f)}b.node.path=this._convertPath(d._currentPath)},createShapeFromContext:function(b,c){var a=this.createShape("custom");this.applyDrawingContext(a,b,c);return a},setFillColor:function(b,a){var c=b.fill;c.type=$[20];if(a!=null){this._setFillEnabled(b,true);c.color=a;b.restoreData.fill.color=a}else{this._setFillEnabled(b,false);delete b.restoreData.fill.color}},getFillColor:function(b){var a=null;if(this.getFillType(b)==$[6]){a=b.restoreData.fill.color}return a},setFillGradient:function(e,i){var k=e.fill;if(i!=null){e.node.removeChild(e.fill);this._setFillEnabled(e,true);delete e.restoreData.fill.color;k.type=$[128];var f=i[0][1];k.color2=i[i.length-1][1];k.angle=i.horizontal?270:180;var h="0% "+f;var c=qx.util.ColorUtil.stringToRgb(f);var b=null;var a=0;var g=null;for(var j=1;j<i.length;j++){var d=i[j][1];b=qx.util.ColorUtil.stringToRgb(d);nextOffset=i[j][0];h+=", ";h+=this._transitionColors(c,b,a,nextOffset,3);h+=", "+(nextOffset*100)+"% "+d;c=b;a=nextOffset}k.colors=h;e.node.appendChild(k)}else{this._setFillEnabled(e,true)}},setFillPattern:function(b,d,c,a){var e=b.fill;if(d!=null){b.node.removeChild(b.fill);this._setFillEnabled(b,true);e.type="tile";e.src=d;e.size=(c*0.75)+"pt,"+(a*0.75)+"pt";b.node.appendChild(e)}else{this._setFillEnabled(b,false)}},getFillType:function(c){var b=c.fill.on;var a=!b?null:c.fill.type;if(a==$[20]){a=$[6]}if(a=="tile"){a="pattern"}return a},setStroke:function(b,a,c){if(c>0){b.node.stroked=true;b.node.strokecolor=a;b.node.strokeweight=c+"px";b.restoreData.strokecolor=a;b.restoreData.strokeweight=c+"px"}else{b.node.stroked=false;delete b.restoreData.strokecolor;delete b.restoreData.strokeweight}},getStrokeWidth:function(b){var a=false;if(b.node.stroked){a=b.node.strokeweight;var c=typeof a==$[77]||a.search("pt")!=-1;a=parseFloat(a);a=c?a/0.75:a}return a},getStrokeColor:function(a){return a.node.strokecolor.value},setOpacity:function(a,b){a.opacity=b;this._renderFilter(a);this._setAntiAlias(a,b<1)},getOpacity:function(b){var a=1;if(typeof b.opacity===$[77]&&b.opacity<1){a=b.opacity}return a},setBlur:function(b,a){b.blurRadius=a;this._renderFilter(b)},getBlur:function(c,b){var a=0;if(typeof c.blurRadius===$[77]&&c.blurRadius>0){a=c.blurRadius}return a},_renderFilter:function(a){var d=[];var b=this.getOpacity(a);var c=this.getBlur(a);if(b<1){d.push($[533]);d.push(Math.round(b*100));d.push(")")}if(c>0){d.push("progid:DXImageTransform.Microsoft.Blur(pixelradius=");d.push(this._getBlurOffsets(c)[0]);d.push(")")}if(d.length>0){a.node.style.filter=d.join("")}else{org.eclipse.rwt.HtmlUtil.removeCssFilter(a.node)}},_VMLFACTOR:10,_VMLDEGREE:-65535,_VMLRAD:-65535*(180/Math.PI),_createNode:function(a){return document.createElement("v:"+a)},_createRect:function(){var a={};a.type="vmlRect";var b=this._createNode("rect");b.style.position=$[27];b.style.width=0;b.style.height=0;b.style.top=0;b.style.left=0;b.style.antialias=false;a.node=b;return a},_createImage:function(){var a={};a.type="vmlImage";var b=this._createNode($[35]);b.style.position=$[27];a.node=b;return a},_createCustomShape:function(){var a={};var c=this._createNode("shape");var b=100*this._VMLFACTOR+", "+100*this._VMLFACTOR;c.coordsize=b;c.coordorigin="0 0";c.style.position=$[27];c.style.width=100;c.style.height=100;c.style.top=0;c.style.left=0;a.node=c;return a},_setFillEnabled:function(a,b){a.fill.on=b;a.restoreData.fill.on=b},_ensureStrokeNode:function(a){if(!a.stroke){var b=this._createNode($[237]);a.node.appendChild(b);a.stroke=b}},_setStrokeStyle:function(b,d,a,c){this._ensureStrokeNode(b);b.stroke.joinstyle=d;b.stroke.miterlimit=a;b.stroke.endcap=c},_transitionColors:function(l,k,a,f,g){var j=f-a;var b=j/(g+1);var d=[];var h=[];var e;for(var c=1;c<=g;c++){e=c*(1/(g+1));h[0]=this._transitionColorPart(l[0],k[0],e);h[1]=this._transitionColorPart(l[1],k[1],e);h[2]=this._transitionColorPart(l[2],k[2],e);d.push(Math.round(((a+(c*b))*100))+"% RGB("+h.join()+")")}return d.join(" ,")},_copyData:function(c,d){if(!c||!d){throw"VML._copyData: source or target missing!"}for(var a in c){var b=c[a];if(typeof b===$[10]){this._copyData(b,d[a])}else{d[a]=b}}},_handleAppearShape:function(a){this._copyData(a.restoreData,a.node)},_transitionColorPart:function(b,a,d){var c=parseInt(b)+((a-b)*d);return Math.round(c)},_convertNumeric:function(c,b){var a;if(typeof c==$[77]){a=(b?c-0.5:c)*this._VMLFACTOR;a=Math.round(a)}else{a=c}return a},_convertPath:function(f){var b=[];for(var d=0;d<f.length;d++){var e=f[d];switch(e.type){case"moveTo":b.push("M");b.push(this._convertNumeric(e.x,true));b.push(this._convertNumeric(e.y,true));break;case"lineTo":b.push("L");b.push(this._convertNumeric(e.x,true));b.push(this._convertNumeric(e.y,true));break;case"close":b.push("X");e=null;break;case $[482]:b.push("QB");b.push(this._convertNumeric(e.cp1x,true));b.push(this._convertNumeric(e.cp1y,true));b.push("L");b.push(this._convertNumeric(e.x,true));b.push(this._convertNumeric(e.y,true));break;case $[428]:b.push("C");b.push(this._convertNumeric(e.cp1x,true));b.push(this._convertNumeric(e.cp1y,true));b.push(this._convertNumeric(e.cp2x,true));b.push(this._convertNumeric(e.cp2y,true));b.push(this._convertNumeric(e.x,true));b.push(this._convertNumeric(e.y,true));break;case"arc":b.push("AE");var c=Math.round(e.startAngle*this._VMLRAD);var a=Math.round(e.endAngle*this._VMLRAD);b.push(this._convertNumeric(e.centerX,true));b.push(this._convertNumeric(e.centerY,true));b.push(this._convertNumeric(e.radiusX,false));b.push(this._convertNumeric(e.radiusY,false));b.push(c);b.push(a-c);break}}return b.join(" ")},_setAntiAlias:function(a,b){a.node.style.antialias=b},_getBlurOffsets:function(c){var a;var b=this._BLUROFFSETS[c];if(b!==undefined){a=b}else{a=[c,c,1]}return a},_BLUROFFSETS:[[0,0,0],[2,2,1],[3,3,1],[4,4,1]]}});
-qx.Class.define("org.eclipse.rwt.SVG",{statics:{init:function(){},createCanvas:function(){var b={};var c=this._createNode("svg");c.style.position=$[27];c.style.left="0px";c.style.top="0px";c.style.width="100%";c.style.height="100%";var a=this._createNode("defs");c.appendChild(a);b.type="svgCanvas";b.node=c;b.group=c;b.defsNode=a;return b},getCanvasNode:function(a){return a.node},handleAppear:function(a){},enableOverflow:function(c,b,g,d,a){if(c.group===c.node){var e=c.node;var f=this._createNode("g");c.group=f;while(e.firstChild){f.appendChild(e.firstChild)}e.appendChild(f)}c.node.style.left=(b*-1)+"px";c.node.style.top=(g*-1)+"px";if(d){c.node.style.width=(b+d)+"px"}else{c.node.style.width="100%"}if(a){c.node.style.height=(g+a)+"px"}else{c.node.style.height="100%"}if(b===0&&g===0){c.group.setAttribute("transform","")}else{c.group.setAttribute("transform","translate("+b+","+g+")")}},createShape:function(b){var a;switch(b){case"rect":a=this._createRect();break;case $[178]:a=this._createRoundRect();break;default:throw"invalid shape "+b;break}a.node.setAttribute($[237],"none");a.node.setAttribute($[367],"0px");a.node.setAttribute("fill","none");a.defNodes={};a.parent=null;return a},addToCanvas:function(c,b,a){b.parent=c;if(a){c.group.insertBefore(b.node,a.node)}else{c.group.appendChild(b.node)}this._attachDefinitions(b)},removeFromCanvas:function(b,a){this._detachDefinitions(a);b.group.removeChild(a.node);a.parent=null},setDisplay:function(a,b){a.node.setAttribute($[180],b?"inline":"none")},getDisplay:function(b){var c=b.node.getAttribute($[180]);var a=c=="none"?false:true;return a},setRectBounds:function(c,b,f,d,a){var e=c.node;e.setAttribute($[19],this._convertNumeric(d));e.setAttribute($[36],this._convertNumeric(a));e.setAttribute("x",this._convertNumeric(b));e.setAttribute("y",this._convertNumeric(f))},setRoundRectLayout:function(g,i,h,d,j,f){var c=f[0];var e=f[1];var b=f[2];var a=f[3];if((c+e)>d||(b+a)>d||(c+a)>j||(b+e)>j){c=0;e=0;b=0;a=0}var k=[];k.push("M",i,h+c);if(c>0){k.push("A",c,c,0,0,1);k.push(i+c,h)}k.push("L",i+d-e,h);if(e>0){k.push("A",e,e,0,0,1)}k.push(i+d,h+e);k.push("L",i+d,h+j-b);if(b>0){k.push("A",b,b,0,0,1)}k.push(i+d-b,h+j);k.push("L",i+a,h+j);if(a>0){k.push("A",a,a,0,0,1)}k.push(i,h+j-a);k.push("Z");g.node.setAttribute("d",k.join(" "))},setFillColor:function(b,a){this.setFillGradient(b,null);if(a!=null){b.node.setAttribute("fill",a)}else{b.node.setAttribute("fill","none")}},getFillColor:function(b){var a=null;if(this.getFillType(b)==$[6]){a=b.node.getAttribute("fill")}return a},setFillGradient:function(d,f){if(f!=null){var g="gradient_"+qx.core.Object.toHashCode(d);var a;var c=f.horizontal===true;if(typeof d.defNodes[g]==$[8]){a=this._createNode("linearGradient");a.setAttribute("id",g);a.setAttribute("x1",0);a.setAttribute("y1",0);this._addNewDefinition(d,a,g)}else{a=d.defNodes[g]}a.setAttribute("x2",c?1:0);a.setAttribute("y2",c?0:1);var b=null;while(b=a.childNodes[0]){a.removeChild(b)}for(var e=0;e<f.length;e++){b=this._createNode("stop");b.setAttribute("offset",f[e][0]);b.setAttribute("stop-color",f[e][1]);a.appendChild(b)}d.node.setAttribute("fill","url(#"+g+")")}else{d.node.setAttribute("fill","none")}},setFillPattern:function(d,f,e,b){if(f!=null){var g=qx.core.Object.toHashCode(d);var c="pattern_"+g;var a;var h;if(typeof d.defNodes[c]==$[8]){a=this._createNode("pattern");a.setAttribute("id",c);a.setAttribute("x",0);a.setAttribute("y",0);a.setAttribute("patternUnits","userSpaceOnUse");h=this._createNode($[35]);h.setAttribute("x",0);h.setAttribute("y",0);h.setAttribute("preserveAspectRatio","none");a.appendChild(h);this._addNewDefinition(d,a,c)}else{a=d.defNodes[c];h=a.firstChild}a.setAttribute($[19],e);a.setAttribute($[36],b);h.setAttribute($[19],e);h.setAttribute($[36],b);d.node.setAttribute("fill","url(#"+c+")");if(org.eclipse.rwt.Client.getEngine()==$[71]){this._onImageLoad(f,function(){if(d.parent!==null&&d.parent.node.parentNode){org.eclipse.rwt.SVG._setXLink(h,f);org.eclipse.rwt.SVG._redrawWebkit(d)}})}else{this._setXLink(h,f)}}else{d.node.setAttribute("fill","none")}},getFillType:function(b){var a=b.node.getAttribute("fill");if(a.search("pattern_")!=-1){a="pattern"}else{if(a.search("gradient_")!=-1){a=$[128]}else{if(a=="none"){a=null}else{a=$[6]}}}return a},setStroke:function(b,a,c){b.node.setAttribute($[367],c+"px");if(c==0){b.node.setAttribute($[237],"none")}else{b.node.setAttribute($[237],a!=null?a:"none")}},getStrokeWidth:function(a){return parseFloat(a.node.getAttribute($[367]))},getStrokeColor:function(a){return a.node.getAttribute($[237])},setOpacity:function(a,b){a.node.setAttribute($[42],b)},getOpacity:function(b){var a=b.node.getAttribute($[42]);return a?a:0},setBlur:function(a,c){if(c>0){var d="filter_"+qx.core.Object.toHashCode(a);var b;if(typeof a.defNodes[d]===$[8]){b=this._createNode($[134]);b.setAttribute("id",d);b.appendChild(this._createNode("feGaussianBlur"));this._addNewDefinition(a,b,d)}else{b=a.defNodes[d]}b.firstChild.setAttribute($[544],c/2);a.node.setAttribute($[134],"url(#"+d+")")}else{a.node.setAttribute($[134],"none")}},getBlur:function(b){var a=0;var c=b.node.getAttribute($[134]);if(c&&c!=="none"){var e="filter_"+qx.core.Object.toHashCode(b);var d=b.defNodes[e];a=d.firstChild.getAttribute($[544])*2}return a},_onImageLoad:function(c,b){var a=new Image();a.src=c;a.onload=function(d){if(arguments.callee.caller!=null){org.eclipse.rwt.SVG._onImageLoad(c,b)}else{b()}}},_createNode:function(a){return document.createElementNS("http://www.w3.org/2000/svg",a)},_createRect:function(){var a={};a.type="svgRect";var b=this._createNode("rect");b.setAttribute($[19],"0");b.setAttribute($[36],"0");b.setAttribute("x","0");b.setAttribute("y","0");a.node=b;return a},_setXLink:function(a,b){a.setAttributeNS("http://www.w3.org/1999/xlink","href",b)},_createRoundRect:function(){var a={};a.type="svgRoundRect";var b=this._createNode("path");a.node=b;return a},_addNewDefinition:function(a,b,c){a.defNodes[c]=b;if(a.parent!=null){a.parent.defsNode.appendChild(b)}},_attachDefinitions:function(a){for(var c in a.defNodes){var b=a.defNodes[c];a.parent.defsNode.appendChild(b)}},_detachDefinitions:function(a){for(var c in a.defNodes){var b=a.defNodes[c];b.parentNode.removeChild(b)}},_convertNumeric:function(a){return typeof a==$[13]?a:a+"px"},_redrawWebkit:function(a){var b=function(){org.eclipse.rwt.SVG._redrawWebkitCore(a)};window.setTimeout(b,10)},_redrawWebkitCore:function(a){if(a.parent!=null){a.node.style.webkitTransform="scale(1)"}},_dummyNode:null,_getDummyNode:function(){if(this._dummyNode==null){this._dummyNode=this._createNode("rect")}return this._dummyNode}}});
-qx.Class.define("org.eclipse.swt.WidgetUtil",{statics:{setPropertyParam:function(d,b,a){var f=org.eclipse.swt.WidgetManager.getInstance();var e=f.findIdByWidget(d);var c=org.eclipse.swt.Request.getInstance();c.addParameter(e+"."+b,a)},fixIEBoxHeight:function(a){if(qx.core.Variant.isSet($[0],$[18])){a.setStyleProperty($[194],"0");a.setStyleProperty($[343],"0")}},_fakeMouseEvent:function(b,d){var f=b._getTargetNode();var a=org.eclipse.rwt.EventHandlerUtil;var g=a.getTargetObject(null,b,true);var c={type:d,target:f,button:0,wheelData:0,detail:0,pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0,shiftKey:false,ctrlKey:false,altKey:false,metaKey:false,preventDefault:function(){}};var e=new qx.event.type.MouseEvent(d,c,f,g,b,null);g.dispatchEvent(e)}}});
-qx.Class.define("org.eclipse.swt.theme.ThemeStore",{type:$[33],extend:qx.core.Object,construct:function(){this._values={dimensions:{},boxdims:{},images:{},gradients:{},fonts:{},colors:{},borders:{},cursors:{},animations:{},shadows:{}};this._cssValues={};this._statesMap={"*":{hover:"over"},"DateTime-Calendar-Day":{unfocused:$[89]},"List-Item":{unfocused:$[89]},Text:{"read-only":$[338]},TreeItem:{unfocused:$[89]},TreeColumn:{hover:$[9]},Shell:{inactive:$[223]},"Shell-Titlebar":{inactive:$[223]},"Shell-MinButton":{inactive:$[223]},"Shell-MaxButton":{inactive:$[223]},"Shell-CloseButton":{inactive:$[223]},TableColumn:{hover:$[9]},TableItem:{unfocused:$[89]},TabItem:{selected:$[199]}};this._namedColors={}},members:{defineValues:function(a){for(var b in this._values){if(b in a){for(key in a[b]){if(!(key in this._values[b])){this._values[b][key]=a[b][key]}}}}},setThemeCssValues:function(c,a,b){if(this._cssValues[c]===undefined){this._cssValues[c]=a}if(b){this.defaultTheme=c}this._fillNamedColors(c)},getColor:function(c,a,d,e){var b=this._getCssValue(c,a,d,e);return this._values.colors[b]},getNamedColor:function(b){var a=this._namedColors[b];return a?a:b},getDimension:function(c,a,d,e){var b=this._getCssValue(c,a,d,e);return this._values.dimensions[b]},getBoxDimensions:function(c,a,d,e){var b=this._getCssValue(c,a,d,e);return this._values.boxdims[b]},getBoolean:function(b,a,c,d){return this._getCssValue(b,a,c,d)},getFloat:function(b,a,c,d){return parseFloat(this._getCssValue(b,a,c,d))},getIdentifier:function(b,a,c,d){return this._getCssValue(b,a,c,d)},getImage:function(c,a,e,f){var b=this._getCssValue(c,a,e,f);var d=this._values.images[b];if(d!=null){result=$[326]+b}else{result=org.eclipse.swt.theme.ThemeValues.NONE_IMAGE}return result},getSizedImage:function(d,b,f,g){var c=this._getCssValue(d,b,f,g);var e=this._values.images[c];var a;if(e!=null){a=[$[326]+c].concat(e)}else{a=org.eclipse.swt.theme.ThemeValues.NONE_IMAGE_SIZED}return a},getCursor:function(d,b,e,f){var c=this._getCssValue(d,b,e,f);var a=this._values.cursors[c];if(c===null){a="rwt-resources/themes/cursors/"+c}return a},getAnimation:function(c,a,d,e){var b=this._getCssValue(c,a,d,e);return this._values.animations[b]},getFont:function(d,b,f,g){var c=this._getCssValue(d,b,f,g);var e=this._values.fonts[c];if(!(e instanceof qx.ui.core.Font)){var a=new qx.ui.core.Font();a.setSize(e.size);a.setFamily(e.family);a.setBold(e.bold);a.setItalic(e.italic);this._values.fonts[c]=a}return this._values.fonts[c]},getBorder:function(j,o,l,i){var g;var m=this._getCssValue(j,o,l,i);var k=this._values.borders[m];var n=k instanceof org.eclipse.rwt.Border;var b=n?k.getStyle():k.style;if(b===$[20]||b==="none"||b===null){var a=this._getCssValue(j,o,$[396],i);var h=this._values.boxdims[a];if(h!=null&&(h.join("")!=="0000")){var d=m+"#"+a;var e=this._values.borders[d];if(!e){var c=n?k.getWidthTop():k.width;var f=n?k.getColorTop():k.color;g=new org.eclipse.rwt.Border(c,$[114],f,h);this._values.borders[d]=g}else{g=e}}}if(!g){if(n){g=k}else{g=this._getBorderFromValue(k);this._values.borders[m]=g}}return g},getShadow:function(c,a,d,e){var b=this._getCssValue(c,a,d,e);return this._values.shadows[b]},getNamedBorder:function(c){var d="_"+c;var a=this._values.borders[d];if(!a){var f=org.eclipse.swt.theme.BorderDefinitions.getDefinition(c);if(f){var b=this._resolveNamedColors(f.color);var e=this._resolveNamedColors(f.innerColor);a=new org.eclipse.rwt.Border(f.width,$[242],b,e);this._values.borders[d]=a}else{a=null}}return a},getGradient:function(c,h,f,b){var j=null;var g=this._getCssValue(c,h,f,b);var e=this._values.gradients[g];if(e){if(e.colors&&e.percents){var d=new Array();for(var a=0;a<e.colors.length;a++){d[a]=[e.percents[a]/100,e.colors[a]]}d.horizontal=!e.vertical;this._values.gradients[g]=d}j=this._values.gradients[g]}return j},getImageSize:function(b){var a=b.slice($[326].length);var c=this._values.images[a];return c!=null?[c[0],c[1]]:[0,0]},_getCssValue:function(e,c,g,h){var a;if(h==null){h=qx.theme.manager.Meta.getInstance().getTheme().name}if(this._cssValues[h]!==undefined&&this._cssValues[h][e]!==undefined&&this._cssValues[h][e][g]!==undefined){var b=this._cssValues[h][e][g];var f=false;for(var d=0;d<b.length&&!f;d++){if(this._matches(c,e,b[d][0])){a=b[d][1];f=true}}}if(a===undefined&&h!=this.defaultTheme){a=this._getCssValue(e,c,g,this.defaultTheme)}return a},_matches:function(b,e,j){var a=true;for(var d=0;d<j.length&&a;d++){var f=j[d];if(f.length>0){var h=f.charAt(0);if(h=="."){a=$[54]+f.substr(1) in b}else{if(h==":"){var g=this._translateState(f.substr(1),e);if(g.charAt(0)=="!"){a=!(g.substr(1) in b)}else{a=g in b}}else{if(h=="["){a="rwt_"+f.substr(1) in b}}}}}return a},_translateState:function(c,b){var a=c;if(b in this._statesMap&&c in this._statesMap[b]){a=this._statesMap[b][c]}else{if(c in this._statesMap["*"]){a=this._statesMap["*"][c]}}return a},_resolveNamedColors:function(c){var a=null;if(c){a=[];for(var b=0;b<c.length;b++){a[b]=this.getNamedColor(c[b])}}return a},_fillNamedColors:function(a){this._namedColors[$[243]]=this.getColor($[214],{},"rwt-darkshadow-color",a);this._namedColors[$[49]]=this.getColor($[214],{},"rwt-highlight-color",a);this._namedColors[$[153]]=this.getColor($[214],{},"rwt-lightshadow-color",a);this._namedColors[$[28]]=this.getColor($[214],{},"rwt-shadow-color",a);this._namedColors[$[371]]=this.getColor($[214],{},"rwt-thinborder-color",a);this._namedColors["selection-marker"]=this.getColor($[214],{},"rwt-selectionmarker-color",a);this._namedColors[$[190]]=this.getColor("*",{},$[5],a);this._namedColors.foreground=this.getColor("*",{},$[6],a);this._namedColors["info.foreground"]=this.getColor($[106],{},$[6],a)},_getBorderFromValue:function(b){var a=null;if(b.color==null){if(b.width==1){if(b.style=="outset"){a=this.getNamedBorder($[395])}else{if(b.style=="inset"){a=this.getNamedBorder($[324])}}}else{if(b.width==2){a=this.getNamedBorder(b.style)}}}if(a===null){a=new org.eclipse.rwt.Border(b.width,b.style,b.color)}return a}}});
-qx.Class.define("org.eclipse.rwt.widgets.MultiCellWidget",{extend:qx.ui.basic.Terminator,construct:function(a){arguments.callee.base.call(this);this.__cellData=null;this.__cellNodes=null;this.__cellCount=null;this.__computedTotalSpacing=null;this.__styleRegExp=/([a-z])([A-Z])/g;this.__createCellData(a);this.__paddingCache=[0,0,0,0];this.__fontCache={};this.__colorCache="";this._flexibleCell=-1;this.initWidth();this.initHeight();this.addToQueue($[473]);this.setOverflow($[17]);this.initSelectable();this.initCursor();this.initTextColor()},destruct:function(){this._disposeObjectDeep("__cellData",0);this._disposeObjectDeep("__cellNodes",0);this._disposeObjectDeep("__paddingCache",0);this._disposeObjectDeep("_fontCache",0)},properties:{spacing:{check:$[22],init:4,themeable:true,apply:$[552],event:$[538]},horizontalChildrenAlign:{check:["left",$[38],$[23]],init:$[38],themeable:true,apply:$[512]},verticalChildrenAlign:{check:["top",$[32],$[48]],init:$[32],themeable:true,apply:$[551]},selectable:{refine:true,init:false},textColor:{refine:true,init:$[258]},cursor:{refine:true,init:$[39]},allowStretchX:{refine:true,init:false},allowStretchY:{refine:true,init:false},textColor:{refine:true,init:$[258]},cursor:{refine:true,init:$[39]},appearance:{refine:true,init:"atom"},width:{refine:true,init:"auto"},height:{refine:true,init:"auto"}},members:{setCellContent:function(a,b){this.__updateComputedCellDimension(a);if(this._cellHasContent(a)!=(b!=null)){this._invalidateTotalSpacing();this.addToQueue($[473])}else{this.addToQueue("updateContent")}var c=b;if(this._isImageCell(a)){c=qx.io.Alias.getInstance().resolve(c)}this.__cellData[a][1]=c},setCellDimension:function(b,c,a){this.setCellWidth(b,c);this.setCellHeight(b,a)},setCellVisible:function(a,b){this.__cellData[a][6]=b;if(this.getCellNode(a)){this.getCellNode(a).style.display=b?"":"none"}},isCellVisible:function(a){return this.__cellData[a][6]},getCellNode:function(a){return this.__cellNodes[a]},getCellContent:function(a){return this.__cellData[a][1]},setCellWidth:function(a,b){if(this._getCellWidth(a)!==b){this._setCellWidth(a,b);this._invalidateTotalSpacing();this._invalidatePreferredInnerWidth();this._scheduleLayoutX()}},setCellHeight:function(b,a){this._setCellHeight(b,a);this._invalidateTotalSpacing();this._invalidatePreferredInnerHeight();this._scheduleLayoutY()},setFlexibleCell:function(a){this._flexibleCell=a},getCellDimension:function(b){var c=this.getCellWidth(b);var a=this.getCellHeight(b);return[c,a]},getCellWidth:function(a,b){var f=this.__cellData[a];var e=this._flexibleCell===a&&b!==true;var c=(f[2]!=null?f[2]:f[4]);if(c==null||(e&&f[3]===null)){var d=this.__computeCellDimension(f);c=d[0]}if(e){c=this._limitCellWidth(a,c)}return c},getCellHeight:function(b,c){var g=this.__cellData[b];var f=this._flexibleCell===b&&c!==true;var a=(g[3]!=null?g[3]:g[5]);if(a==null||(f&&g[3]===null)){var e=f?this.getCellWidth(b):null;var d=this.__computeCellDimension(g,e);a=d[1]}if(f){a=this._limitCellHeight(b,a)}return a},_applyElement:function(b,a){arguments.callee.base.call(this,b,a);if(b){this._createSubelements();this._catchSubelements()}},_createSubelements:function(){var b="";for(var a=0;a<this.__cellCount;a++){this.__setCellNode(a,null);if(this._cellHasContent(a)){if(this._isTextCell(a)){b+=this._getLabelHtml(a)}else{if(this._isImageCell(a)){b+=this._getImageHtml(a)}}}}this._getTargetNode().innerHTML=b},_catchSubelements:function(){var b=this._getTargetNode();var c=0;for(var a=0;a<this.__cellCount;a++){if(this._cellHasContent(a)){this.__setCellNode(a,b.childNodes[c]);c++}}if(this.getEnabled()==false){this._applyEnabled(false)}},_applySpacing:function(b,a){this._invalidateTotalSpacing();this._scheduleLayoutX()},_applyHorizontalChildrenAlign:function(b,a){this._scheduleLayoutX()},_applyVerticalChildrenAlign:function(b,a){this._scheduleLayoutY()},_applyPaddingTop:function(b,a){this.addToLayoutChanges($[209]);this.__paddingCache[0]=b;this._invalidateFrameHeight()},_applyPaddingRight:function(b,a){this.addToLayoutChanges($[220]);this.__paddingCache[1]=b;this._invalidateFrameWidth()},_applyPaddingBottom:function(b,a){this.addToLayoutChanges($[234]);this.__paddingCache[2]=b;this._invalidateFrameHeight()},_applyPaddingLeft:function(b,a){this.addToLayoutChanges($[239]);this.__paddingCache[3]=b;this._invalidateFrameWidth()},_applyEnabled:function(b,a){arguments.callee.base.call(this,b,a);this._styleAllImagesEnabled()},_scheduleLayoutX:function(){this.addToQueue("layoutX");this._afterScheduleLayoutX()},_scheduleLayoutY:function(){this.addToQueue("layoutY");this._afterScheduleLayoutY()},_afterScheduleLayoutX:qx.lang.Function.returnTrue,_afterScheduleLayoutY:qx.lang.Function.returnTrue,_beforeComputeInnerWidth:qx.lang.Function.returnTrue,_beforeComputeInnerHeight:qx.lang.Function.returnTrue,_beforeRenderLayout:qx.lang.Function.returnTrue,_afterRenderLayout:qx.lang.Function.returnTrue,_cellHasContent:function(a){var b=this.__cellData[a][1];return b!=null},_isImageCell:function(a){var b=this.__cellData[a][0];return b==$[35]},_isTextCell:function(a){var b=this.__cellData[a][0];return b==$[82]},_setCellWidth:function(a,b){this.__cellData[a][2]=b},_getCellWidth:function(a){return this.__cellData[a][2]},_setCellHeight:function(b,a){this.__cellData[b][3]=a},__setCellNode:function(a,b){this.__cellNodes[a]=b;if(b!==null&&!this.isCellVisible(a)){b.style.display="none"}},__cellHasNode:function(a){return this.__cellNodes[a]!=null},__createCellData:function(b){var d=[];var a=[];this.__cellCount=b.length;for(var c=0;c<this.__cellCount;c++){a[c]=null;d[c]=[b[c],null,null,null,null,null,true]}this.__cellNodes=a;this.__cellData=d},__updateComputedCellDimension:function(a){var b=this.__cellData[a];b[4]=null;b[5]=null;if(b[2]==null){this._invalidatePreferredInnerWidth();this._scheduleLayoutX()}if(b[3]==null){this._invalidatePreferredInnerHeight();this._scheduleLayoutY()}},__computeCellDimension:function(b,a){var c;if(b[0]==$[82]&&b[1]!=null){c=this._computeTextDimensions(b[1],a)}else{c=[0,0]}b[4]=c[0];b[5]=c[1];return c},_isWidthEssential:qx.lang.Function.returnTrue,_isHeightEssential:qx.lang.Function.returnTrue,_computePreferredInnerWidth:function(){return this._getContentWidth($[430])},_limitCellWidth:function(b,e){var d=this.getInnerWidth();var c=this._getContentWidth($[481]);var f=Math.max(0,d-c);var a;if(e>f){a=f}else{a=e}return a},_getContentWidth:function(f){this._beforeComputeInnerWidth();var a=0;if(f===$[430]){var e=this.getTotalSpacing();var d=0;for(var b=0;b<this.__cellCount;b++){d+=this.getCellWidth(b,true)}a=e+d}else{if(f===$[481]){var g=this.getSpacing();for(var b=0;b<this.__cellCount;b++){if(b!==this._flexibleCell){var c=this.getCellWidth(b);a+=c;if(c>0){a+=g}}}}else{if(f==="flexible"){var e=this.getTotalSpacing();var d=0;for(var b=0;b<this.__cellCount;b++){d+=this.getCellWidth(b)}a=e+d}else{throw new Error("unkown hint")}}}return a},_computePreferredInnerHeight:function(){this._beforeComputeInnerHeight();var b=0;for(var a=0;a<this.__cellCount;a++){b=Math.max(b,this.getCellHeight(a,true))}return b},_limitCellHeight:function(b,c){var d=this.getInnerHeight();var a;if(c>d){a=d}else{a=c}return a},getTotalSpacing:function(){if(this.__computedTotalSpacing==null){var a=Math.max(0,(this.getTotalVisibleCells()-1));this.__computedTotalSpacing=a*this.getSpacing()}return this.__computedTotalSpacing},getTotalVisibleCells:function(){var a=0;for(var b=0;b<this.__cellCount;b++){if(this.cellIsDisplayable(b)){a++}}return a},cellIsDisplayable:function(a){return(this.getCellWidth(a,true)>0)},_invalidateTotalSpacing:function(){this.__computedTotalSpacing=null;this._invalidatePreferredInnerWidth()},renderPadding:function(a){},_layoutPost:function(a){if(a.createContent){this._createSubelements();this._catchSubelements()}if(a.updateContent&&!a.createContent){this._updateAllImages();this._updateAllLabels()}a.layoutX=a.width||a.layoutX||a.frameWidth||a.initial;a.layoutY=a.height||a.layoutY||a.frameHeight||a.initial;this._beforeRenderLayout(a);if(a.layoutX){this._renderLayoutX()}if(a.layoutY){this._renderLayoutY()}this._afterRenderLayout(a);arguments.callee.base.call(this,a)},_renderLayoutX:function(){var a=this.getSpacing();var d=this.__paddingCache;var g=this.getHorizontalChildrenAlign();var h=this._getContentWidth("flexible");var k=this.getInnerWidth();var j=null;switch(g){default:case"left":j=d[3];break;case $[38]:j=Math.round(d[3]+k*0.5-h*0.5);break;case $[23]:j=d[3]+k-h;break}var e=j;var c=null;var b=null;for(var f=0;f<this.__cellCount;f++){if(this.cellIsDisplayable(f)){c=this.getCellWidth(f);if(this._cellHasContent(f)){b=this.getCellNode(f).style;b.left=e;b.width=c}e+=(c+a)}}},_renderLayoutY:function(){for(var a=0;a<this.__cellCount;a++){if(this._cellHasContent(a)){this._renderCellLayoutY(a)}}},_renderCellLayoutY:function(b){var g=this.getVerticalChildrenAlign();var f=this.__paddingCache;var c=this.getInnerHeight();var a=this.getCellHeight(b);var e=null;switch(g){default:case"top":e=f[0];break;case $[32]:e=Math.round(f[0]+c*0.5-a*0.5);break;case $[48]:e=f[0]+c-a;break}var d=this.getCellNode(b).style;d.top=e;d.height=a},_getImageHtml:qx.core.Variant.select($[0],{mshtml:function(a){if(org.eclipse.rwt.Client.getVersion()<7){var c=this.getCellContent(a);var b="";if(c){b="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+c+$[416]}return'<div style="position:absolute;border:0 none;line-height:0px;font-size:0px;'+b+'"></div>'}else{var c=this.getCellContent(a);var b="";if(c){b=$[508]+c+")"}return"<div style='position:absolute;border:0 none;line-height:0px;font-size:0px;"+b+$[475]}},"default":function(a){var c=this.getCellContent(a);var b="";if(c){b=$[508]+c+")"}return"<div style='position:absolute;border:0 none;"+b+$[475]}}),_updateImage:function(a){var c=this.getCellNode(a);var d=this.getCellContent(a);var b=this.getEnabled()?1:0.3;org.eclipse.rwt.HtmlUtil.setBackgroundImage(c,d,b)},_updateAllImages:function(){for(var a=0;a<this.__cellCount;a++){if(this._isImageCell(a)&&this._cellHasContent(a)){this._updateImage(a)}}},_styleAllImagesEnabled:function(){for(var a=0;a<this.__cellCount;a++){if(this._isImageCell(a)&&this.__cellHasNode(a)){this._updateImage(a)}}},_getLabelHtml:function(a){return"<div style='position:absolute;border:0 none;overflow:hidden;"+this._joinStyleProperties(this.__fontCache)+"'>"+this.getCellContent(a)+"</div>"},_joinStyleProperties:function(d){var e=[];var c;for(var b in d){c=d[b];if(c){e.push(b,":",c,";")}}var a=e.join("");return a.replace(this.__styleRegExp,"$1-$2").toLowerCase()},_applyFont:function(b,a){qx.theme.manager.Font.getInstance().connect(this._styleFont,this,b)},_styleFont:function(a){if(a){a.renderStyle(this.__fontCache)}else{qx.ui.core.Font.resetStyle(this.__fontCache)}for(var b=0;b<this.__cellCount;b++){if(this._isTextCell(b)&&this._cellHasContent(b)){if(this.__cellHasNode(b)){if(a){a.renderStyle(this.getCellNode(b).style)}else{qx.ui.core.Font.resetStyle(this.getCellNode(b).style)}}this.__updateComputedCellDimension(b)}}},_applyTextColor:function(b,a){if(b){this.setStyleProperty($[6],b)}else{this.removeStyleProperty($[6])}},_updateLabel:function(a){this.getCellNode(a).innerHTML=this.getCellContent(a)},_updateAllLabels:function(){for(var a=0;a<this.__cellCount;a++){if(this._isTextCell(a)&&this._cellHasContent(a)){this._updateLabel(a)}}},_computeTextDimensions:function(g,e){var b=qx.ui.basic.Label._getMeasureNode();var c=b.style;var f=this.__fontCache;c.fontFamily=f.fontFamily||"";c.fontSize=f.fontSize||"";c.fontWeight=f.fontWeight||"";c.fontStyle=f.fontStyle||"";b.innerHTML=g;if(e){c.width=e+"px"}var a;if(b.getBoundingClientRect){var d=b.getBoundingClientRect();if(d.width!=null&&d.height!=null){a=[Math.ceil(d.width),Math.ceil(d.height)]}else{a=[b.scrollWidth,b.scrollHeight]}}else{a=[b.scrollWidth,b.scrollHeight]}c.width="auto";return a}}});
+qx.Class.define("org.eclipse.rwt.VML",{statics:{init:function(){document.namespaces.add("v","urn:schemas-microsoft-com:vml");document.namespaces.add("o","urn:schemas-microsoft-com:office:office");var a=document.createStyleSheet();a.cssText="v\\:* { behavior:url(#default#VML);display:inline-block; } o\\:* { behavior: url(#default#VML);}";this._vmlEnabled=true},createCanvas:function(){var a={};a.type="vmlCanvas";var b=document.createElement("div");b.style.position=$[28];b.style.width="10px";b.style.height="10px";b.style.top="0";b.style.left="0";b.style.fontSize="0";b.style.lineHeight="0";a.node=b;a.children={};return a},clearCanvas:function(a){for(var b in a.children){a.node.removeChild(a.children[b].node)}a.children={}},getCanvasNode:function(a){return a.node},handleAppear:function(a){var b=a.children;for(var c in b){this._handleAppearShape(b[c])}},createShape:function(b){var a=null;switch(b){case"rect":a=this._createRect();break;case $[173]:case"custom":a=this._createCustomShape();a.blurRadius=0;break;case $[35]:a=this._createImage();break;default:throw"VML does not support shape "+b;break}a.restoreData={fill:{}};a.node.stroked=false;var c=this._createNode("fill");c.method="sigma";a.node.appendChild(c);a.fill=c;this.setFillColor(a,null);return a},addToCanvas:function(c,b,a){var d=qx.core.Object.toHashCode(b);c.children[d]=b;if(a){c.node.insertBefore(b.node,a.node)}else{c.node.appendChild(b.node)}},enableOverflow:function(a){},removeFromCanvas:function(b,a){var c=qx.core.Object.toHashCode(a);delete b.children[c];b.node.removeChild(a.node)},setDisplay:function(a,b){a.node.style.display=b?"":"none"},getDisplay:function(b){var a=b.node.style.display=="none"?false:true;return a},setRectBounds:function(c,b,f,d,a){var e=c.node;e.style.width=this._convertNumeric(d,false);e.style.height=this._convertNumeric(a,false);e.style.left=this._convertNumeric(b,true);e.style.top=this._convertNumeric(f,true)},setImageData:function(c,g,b,h,e,a,d){var f=c.node;f.src=g;if(typeof d!=$[8]){f.cropTop=d[0];f.cropRight=d[1];f.cropBottom=d[2];f.cropLeft=d[3]}f.style.width=e;f.style.height=a;f.style.left=b;f.style.top=h},setRoundRectLayout:function(k,o,n,e,p,j){var g=this._VMLDEGREE*90;var c=this._convertNumeric(j[0],false);var h=this._convertNumeric(j[1],false);var b=this._convertNumeric(j[2],false);var a=this._convertNumeric(j[3],false);var d=this._getBlurOffsets(k.blurRadius);var f=this._convertNumeric(o-d[1],true);var m=this._convertNumeric(n-d[1],true);var i=this._convertNumeric(e-d[2],false);var l=this._convertNumeric(p-d[2],false);if((c+h)>i||(b+a)>i||(c+a)>l||(b+h)>l){c=0;h=0;b=0;a=0}var q=[];if(c>0){q.push("AL",f+c,m+c);q.push(c,c,2*g,g)}else{q.push("M",f,m+c)}if(h>0){q.push("AE",f+i-h);q.push(m+h);q.push(h,h,3*g,g)}else{q.push("L",f+i,m)}if(b>0){q.push("AE",f+i-b);q.push(m+l-b);q.push(b,b,0,g)}else{q.push("L",f+i,m+l)}if(a>0){q.push("AE",f+a);q.push(m+l-a);q.push(a,a,g,g)}else{q.push("L",f,m+l)}q.push("X E");k.node.path=q.join(" ")},applyDrawingContext:function(b,d,g){var c=d.globalAlpha;if(c!=1){this.setOpacity(b,c)}if(g){var g=d.fillStyle;if(g instanceof Array){this.setFillGradient(b,d.fillStyle)}else{this.setFillColor(b,d.fillStyle)}this.setStroke(b,null,0)}else{this.setFillColor(b,null);this.setStroke(b,d.strokeStyle,d.lineWidth);var f=d.lineCap=="butt"?"flat":d.lineCap;var e=d.lineJoin;var a=d.miterLimit;this._setStrokeStyle(b,e,a,f)}b.node.path=this._convertPath(d._currentPath)},createShapeFromContext:function(b,c){var a=this.createShape("custom");this.applyDrawingContext(a,b,c);return a},setFillColor:function(b,a){var c=b.fill;c.type=$[20];if(a!=null){this._setFillEnabled(b,true);c.color=a;b.restoreData.fill.color=a}else{this._setFillEnabled(b,false);delete b.restoreData.fill.color}},getFillColor:function(b){var a=null;if(this.getFillType(b)==$[6]){a=b.restoreData.fill.color}return a},setFillGradient:function(e,i){var k=e.fill;if(i!=null){e.node.removeChild(e.fill);this._setFillEnabled(e,true);delete e.restoreData.fill.color;k.type=$[129];var f=i[0][1];k.color2=i[i.length-1][1];k.angle=i.horizontal?270:180;var h="0% "+f;var c=qx.util.ColorUtil.stringToRgb(f);var b=null;var a=0;var g=null;for(var j=1;j<i.length;j++){var d=i[j][1];b=qx.util.ColorUtil.stringToRgb(d);nextOffset=i[j][0];h+=", ";h+=this._transitionColors(c,b,a,nextOffset,3);h+=", "+(nextOffset*100)+"% "+d;c=b;a=nextOffset}k.colors=h;e.node.appendChild(k)}else{this._setFillEnabled(e,true)}},setFillPattern:function(b,d,c,a){var e=b.fill;if(d!=null){b.node.removeChild(b.fill);this._setFillEnabled(b,true);e.type="tile";e.src=d;e.size=(c*0.75)+"pt,"+(a*0.75)+"pt";b.node.appendChild(e)}else{this._setFillEnabled(b,false)}},getFillType:function(c){var b=c.fill.on;var a=!b?null:c.fill.type;if(a==$[20]){a=$[6]}if(a=="tile"){a="pattern"}return a},setStroke:function(b,a,c){if(c>0){b.node.stroked=true;b.node.strokecolor=a;b.node.strokeweight=c+"px";b.restoreData.strokecolor=a;b.restoreData.strokeweight=c+"px"}else{b.node.stroked=false;delete b.restoreData.strokecolor;delete b.restoreData.strokeweight}},getStrokeWidth:function(b){var a=false;if(b.node.stroked){a=b.node.strokeweight;var c=typeof a==$[78]||a.search("pt")!=-1;a=parseFloat(a);a=c?a/0.75:a}return a},getStrokeColor:function(a){return a.node.strokecolor.value},setOpacity:function(a,b){a.opacity=b;this._renderFilter(a);this._setAntiAlias(a,b<1)},getOpacity:function(b){var a=1;if(typeof b.opacity===$[78]&&b.opacity<1){a=b.opacity}return a},setBlur:function(b,a){b.blurRadius=a;this._renderFilter(b)},getBlur:function(c,b){var a=0;if(typeof c.blurRadius===$[78]&&c.blurRadius>0){a=c.blurRadius}return a},_renderFilter:function(a){var d=[];var b=this.getOpacity(a);var c=this.getBlur(a);if(b<1){d.push($[571]);d.push(Math.round(b*100));d.push(")")}if(c>0){d.push("progid:DXImageTransform.Microsoft.Blur(pixelradius=");d.push(this._getBlurOffsets(c)[0]);d.push(")")}if(d.length>0){a.node.style.filter=d.join("")}else{org.eclipse.rwt.HtmlUtil.removeCssFilter(a.node)}},_VMLFACTOR:10,_VMLDEGREE:-65535,_VMLRAD:-65535*(180/Math.PI),_createNode:function(a){return document.createElement("v:"+a)},_createRect:function(){var a={};a.type="vmlRect";var b=this._createNode("rect");b.style.position=$[28];b.style.width=0;b.style.height=0;b.style.top=0;b.style.left=0;b.style.antialias=false;a.node=b;return a},_createImage:function(){var a={};a.type="vmlImage";var b=this._createNode($[35]);b.style.position=$[28];a.node=b;return a},_createCustomShape:function(){var a={};var c=this._createNode("shape");var b=100*this._VMLFACTOR+", "+100*this._VMLFACTOR;c.coordsize=b;c.coordorigin="0 0";c.style.position=$[28];c.style.width=100;c.style.height=100;c.style.top=0;c.style.left=0;a.node=c;return a},_setFillEnabled:function(a,b){a.fill.on=b;a.restoreData.fill.on=b},_ensureStrokeNode:function(a){if(!a.stroke){var b=this._createNode($[249]);a.node.appendChild(b);a.stroke=b}},_setStrokeStyle:function(b,d,a,c){this._ensureStrokeNode(b);b.stroke.joinstyle=d;b.stroke.miterlimit=a;b.stroke.endcap=c},_transitionColors:function(l,k,a,f,g){var j=f-a;var b=j/(g+1);var d=[];var h=[];var e;for(var c=1;c<=g;c++){e=c*(1/(g+1));h[0]=this._transitionColorPart(l[0],k[0],e);h[1]=this._transitionColorPart(l[1],k[1],e);h[2]=this._transitionColorPart(l[2],k[2],e);d.push(Math.round(((a+(c*b))*100))+"% RGB("+h.join()+")")}return d.join(" ,")},_copyData:function(d,e){try{if(!d||!e){throw"VML._copyData: source or target missing!"}for(var b in d){var c=d[b];if(typeof c===$[10]){this._copyData(c,e[b])}else{e[b]=c}}}catch(a){}},_handleAppearShape:function(a){this._copyData(a.restoreData,a.node)},_transitionColorPart:function(b,a,d){var c=parseInt(b)+((a-b)*d);return Math.round(c)},_convertNumeric:function(c,b){var a;if(typeof c==$[78]){a=(b?c-0.5:c)*this._VMLFACTOR;a=Math.round(a)}else{a=c}return a},_convertPath:function(f){var b=[];for(var d=0;d<f.length;d++){var e=f[d];switch(e.type){case"moveTo":b.push("M");b.push(this._convertNumeric(e.x,true));b.push(this._convertNumeric(e.y,true));break;case"lineTo":b.push("L");b.push(this._convertNumeric(e.x,true));b.push(this._convertNumeric(e.y,true));break;case"close":b.push("X");e=null;break;case $[450]:b.push("QB");b.push(this._convertNumeric(e.cp1x,true));b.push(this._convertNumeric(e.cp1y,true));b.push("L");b.push(this._convertNumeric(e.x,true));b.push(this._convertNumeric(e.y,true));break;case $[455]:b.push("C");b.push(this._convertNumeric(e.cp1x,true));b.push(this._convertNumeric(e.cp1y,true));b.push(this._convertNumeric(e.cp2x,true));b.push(this._convertNumeric(e.cp2y,true));b.push(this._convertNumeric(e.x,true));b.push(this._convertNumeric(e.y,true));break;case"arc":b.push("AE");var c=Math.round(e.startAngle*this._VMLRAD);var a=Math.round(e.endAngle*this._VMLRAD);b.push(this._convertNumeric(e.centerX,true));b.push(this._convertNumeric(e.centerY,true));b.push(this._convertNumeric(e.radiusX,false));b.push(this._convertNumeric(e.radiusY,false));b.push(c);b.push(a-c);break}}return b.join(" ")},_setAntiAlias:function(a,b){a.node.style.antialias=b},_getBlurOffsets:function(c){var a;var b=this._BLUROFFSETS[c];if(b!==undefined){a=b}else{a=[c,c,1]}return a},_BLUROFFSETS:[[0,0,0],[2,2,1],[3,3,1],[4,4,1]]}});
+qx.Class.define("org.eclipse.rwt.SVG",{statics:{init:function(){},createCanvas:function(){var b={};var c=this._createNode("svg");c.style.position=$[28];c.style.left="0px";c.style.top="0px";c.style.width="100%";c.style.height="100%";var a=this._createNode("defs");c.appendChild(a);b.type="svgCanvas";b.node=c;b.group=c;b.defsNode=a;return b},getCanvasNode:function(a){return a.node},handleAppear:function(a){},enableOverflow:function(c,b,g,d,a){if(c.group===c.node){var e=c.node;var f=this._createNode("g");c.group=f;while(e.firstChild){f.appendChild(e.firstChild)}e.appendChild(f)}c.node.style.left=(b*-1)+"px";c.node.style.top=(g*-1)+"px";if(d){c.node.style.width=(b+d)+"px"}else{c.node.style.width="100%"}if(a){c.node.style.height=(g+a)+"px"}else{c.node.style.height="100%"}if(b===0&&g===0){c.group.setAttribute("transform","")}else{c.group.setAttribute("transform","translate("+b+","+g+")")}},createShape:function(b){var a;switch(b){case"rect":a=this._createRect();break;case $[173]:a=this._createRoundRect();break;default:throw"invalid shape "+b;break}a.node.setAttribute($[249],"none");a.node.setAttribute($[334],"0px");a.node.setAttribute("fill","none");a.defNodes={};a.parent=null;return a},addToCanvas:function(c,b,a){b.parent=c;if(a){c.group.insertBefore(b.node,a.node)}else{c.group.appendChild(b.node)}this._attachDefinitions(b)},removeFromCanvas:function(b,a){this._detachDefinitions(a);b.group.removeChild(a.node);a.parent=null},setDisplay:function(a,b){a.node.setAttribute($[183],b?"inline":"none")},getDisplay:function(b){var c=b.node.getAttribute($[183]);var a=c=="none"?false:true;return a},setRectBounds:function(c,b,f,d,a){var e=c.node;e.setAttribute($[19],this._convertNumeric(d));e.setAttribute($[39],this._convertNumeric(a));e.setAttribute("x",this._convertNumeric(b));e.setAttribute("y",this._convertNumeric(f))},setRoundRectLayout:function(g,i,h,d,j,f){var c=f[0];var e=f[1];var b=f[2];var a=f[3];if((c+e)>d||(b+a)>d||(c+a)>j||(b+e)>j){c=0;e=0;b=0;a=0}var k=[];k.push("M",i,h+c);if(c>0){k.push("A",c,c,0,0,1);k.push(i+c,h)}k.push("L",i+d-e,h);if(e>0){k.push("A",e,e,0,0,1)}k.push(i+d,h+e);k.push("L",i+d,h+j-b);if(b>0){k.push("A",b,b,0,0,1)}k.push(i+d-b,h+j);k.push("L",i+a,h+j);if(a>0){k.push("A",a,a,0,0,1)}k.push(i,h+j-a);k.push("Z");g.node.setAttribute("d",k.join(" "))},setFillColor:function(b,a){this.setFillGradient(b,null);if(a!=null){b.node.setAttribute("fill",a)}else{b.node.setAttribute("fill","none")}},getFillColor:function(b){var a=null;if(this.getFillType(b)==$[6]){a=b.node.getAttribute("fill")}return a},setFillGradient:function(d,f){if(f!=null){var g="gradient_"+qx.core.Object.toHashCode(d);var a;var c=f.horizontal===true;if(typeof d.defNodes[g]==$[8]){a=this._createNode("linearGradient");a.setAttribute("id",g);a.setAttribute("x1",0);a.setAttribute("y1",0);this._addNewDefinition(d,a,g)}else{a=d.defNodes[g]}a.setAttribute("x2",c?1:0);a.setAttribute("y2",c?0:1);var b=null;while(b=a.childNodes[0]){a.removeChild(b)}for(var e=0;e<f.length;e++){b=this._createNode("stop");b.setAttribute("offset",f[e][0]);b.setAttribute("stop-color",f[e][1]);a.appendChild(b)}d.node.setAttribute("fill","url(#"+g+")")}else{d.node.setAttribute("fill","none")}},setFillPattern:function(d,f,e,b){if(f!=null){var g=qx.core.Object.toHashCode(d);var c="pattern_"+g;var a;var h;if(typeof d.defNodes[c]==$[8]){a=this._createNode("pattern");a.setAttribute("id",c);a.setAttribute("x",0);a.setAttribute("y",0);a.setAttribute("patternUnits","userSpaceOnUse");h=this._createNode($[35]);h.setAttribute("x",0);h.setAttribute("y",0);h.setAttribute("preserveAspectRatio","none");a.appendChild(h);this._addNewDefinition(d,a,c)}else{a=d.defNodes[c];h=a.firstChild}a.setAttribute($[19],e);a.setAttribute($[39],b);h.setAttribute($[19],e);h.setAttribute($[39],b);d.node.setAttribute("fill","url(#"+c+")");if(org.eclipse.rwt.Client.getEngine()==$[69]){this._onImageLoad(f,function(){if(d.parent!==null&&d.parent.node.parentNode){org.eclipse.rwt.SVG._setXLink(h,f);org.eclipse.rwt.SVG._redrawWebkit(d)}})}else{this._setXLink(h,f)}}else{d.node.setAttribute("fill","none")}},getFillType:function(b){var a=b.node.getAttribute("fill");if(a.search("pattern_")!=-1){a="pattern"}else{if(a.search("gradient_")!=-1){a=$[129]}else{if(a=="none"){a=null}else{a=$[6]}}}return a},setStroke:function(b,a,c){b.node.setAttribute($[334],c+"px");if(c==0){b.node.setAttribute($[249],"none")}else{b.node.setAttribute($[249],a!=null?a:"none")}},getStrokeWidth:function(a){return parseFloat(a.node.getAttribute($[334]))},getStrokeColor:function(a){return a.node.getAttribute($[249])},setOpacity:function(a,b){a.node.setAttribute($[43],b)},getOpacity:function(b){var a=b.node.getAttribute($[43]);return a?a:0},setBlur:function(a,c){if(c>0){var d="filter_"+qx.core.Object.toHashCode(a);var b;if(typeof a.defNodes[d]===$[8]){b=this._createNode($[128]);b.setAttribute("id",d);b.appendChild(this._createNode("feGaussianBlur"));this._addNewDefinition(a,b,d)}else{b=a.defNodes[d]}b.firstChild.setAttribute($[572],c/2);a.node.setAttribute($[128],"url(#"+d+")")}else{a.node.setAttribute($[128],"none")}},getBlur:function(b){var a=0;var c=b.node.getAttribute($[128]);if(c&&c!=="none"){var e="filter_"+qx.core.Object.toHashCode(b);var d=b.defNodes[e];a=d.firstChild.getAttribute($[572])*2}return a},_onImageLoad:function(c,b){var a=new Image();a.src=c;a.onload=function(d){if(arguments.callee.caller!=null){org.eclipse.rwt.SVG._onImageLoad(c,b)}else{b()}}},_createNode:function(a){return document.createElementNS("http://www.w3.org/2000/svg",a)},_createRect:function(){var a={};a.type="svgRect";var b=this._createNode("rect");b.setAttribute($[19],"0");b.setAttribute($[39],"0");b.setAttribute("x","0");b.setAttribute("y","0");a.node=b;return a},_setXLink:function(a,b){a.setAttributeNS("http://www.w3.org/1999/xlink","href",b)},_createRoundRect:function(){var a={};a.type="svgRoundRect";var b=this._createNode("path");a.node=b;return a},_addNewDefinition:function(a,b,c){a.defNodes[c]=b;if(a.parent!=null){a.parent.defsNode.appendChild(b)}},_attachDefinitions:function(a){for(var c in a.defNodes){var b=a.defNodes[c];a.parent.defsNode.appendChild(b)}},_detachDefinitions:function(a){for(var c in a.defNodes){var b=a.defNodes[c];b.parentNode.removeChild(b)}},_convertNumeric:function(a){return typeof a==$[13]?a:a+"px"},_redrawWebkit:function(a){var b=function(){org.eclipse.rwt.SVG._redrawWebkitCore(a)};window.setTimeout(b,10)},_redrawWebkitCore:function(a){if(a.parent!=null){a.node.style.webkitTransform="scale(1)"}},_dummyNode:null,_getDummyNode:function(){if(this._dummyNode==null){this._dummyNode=this._createNode("rect")}return this._dummyNode}}});
+qx.Class.define("org.eclipse.swt.WidgetUtil",{statics:{setPropertyParam:function(d,b,a){var f=org.eclipse.swt.WidgetManager.getInstance();var e=f.findIdByWidget(d);var c=org.eclipse.swt.Request.getInstance();c.addParameter(e+"."+b,a)},fixIEBoxHeight:function(a){if(qx.core.Variant.isSet($[0],$[18])){a.setStyleProperty($[211],"0");a.setStyleProperty($[337],"0")}},getControl:function(b){var c=org.eclipse.swt.WidgetManager.getInstance();var a=b;while(a!=null&&!c.isControl(a)){a=a.getParent?a.getParent():null}return a},_fakeMouseEvent:function(b,d){var f=b._getTargetNode();var a=org.eclipse.rwt.EventHandlerUtil;var g=a.getTargetObject(null,b,true);var c={type:d,target:f,button:0,wheelData:0,detail:0,pageX:0,pageY:0,clientX:0,clientY:0,screenX:0,screenY:0,shiftKey:false,ctrlKey:false,altKey:false,metaKey:false,preventDefault:function(){}};var e=new qx.event.type.MouseEvent(d,c,f,g,b,null);g.dispatchEvent(e)}}});
+qx.Class.define("org.eclipse.swt.theme.ThemeStore",{type:$[33],extend:qx.core.Object,construct:function(){this._values={dimensions:{},boxdims:{},images:{},gradients:{},fonts:{},colors:{},borders:{},cursors:{},animations:{},shadows:{}};this._cssValues={};this._statesMap={"*":{hover:"over"},"DateTime-Calendar-Day":{unfocused:$[87]},"List-Item":{unfocused:$[87]},Text:{"read-only":$[335]},TreeItem:{unfocused:$[87]},TreeColumn:{hover:$[9]},Shell:{inactive:$[231]},"Shell-Titlebar":{inactive:$[231]},"Shell-MinButton":{inactive:$[231]},"Shell-MaxButton":{inactive:$[231]},"Shell-CloseButton":{inactive:$[231]},TableColumn:{hover:$[9]},TableItem:{unfocused:$[87]},TabItem:{selected:$[203]}};this._namedColors={}},members:{defineValues:function(a){for(var b in this._values){if(b in a){for(key in a[b]){if(!(key in this._values[b])){this._values[b][key]=a[b][key]}}}}},setThemeCssValues:function(c,a,b){if(this._cssValues[c]===undefined){this._cssValues[c]=a}if(b){this.defaultTheme=c}this._fillNamedColors(c)},getColor:function(c,a,d,e){var b=this._getCssValue(c,a,d,e);return this._values.colors[b]},getNamedColor:function(b){var a=this._namedColors[b];return a?a:b},getDimension:function(c,a,d,e){var b=this._getCssValue(c,a,d,e);return this._values.dimensions[b]},getBoxDimensions:function(c,a,d,e){var b=this._getCssValue(c,a,d,e);return this._values.boxdims[b]},getBoolean:function(b,a,c,d){return this._getCssValue(b,a,c,d)},getFloat:function(b,a,c,d){return parseFloat(this._getCssValue(b,a,c,d))},getIdentifier:function(b,a,c,d){return this._getCssValue(b,a,c,d)},getImage:function(c,a,e,f){var b=this._getCssValue(c,a,e,f);var d=this._values.images[b];if(d!=null){result=$[347]+b}else{result=org.eclipse.swt.theme.ThemeValues.NONE_IMAGE}return result},getSizedImage:function(d,b,f,g){var c=this._getCssValue(d,b,f,g);var e=this._values.images[c];var a;if(e!=null){a=[$[347]+c].concat(e)}else{a=org.eclipse.swt.theme.ThemeValues.NONE_IMAGE_SIZED}return a},getCursor:function(d,b,e,f){var c=this._getCssValue(d,b,e,f);var a=this._values.cursors[c];if(c===null){a="rwt-resources/themes/cursors/"+c}return a},getAnimation:function(c,a,d,e){var b=this._getCssValue(c,a,d,e);return this._values.animations[b]},getFont:function(d,b,f,g){var c=this._getCssValue(d,b,f,g);var e=this._values.fonts[c];if(!(e instanceof qx.ui.core.Font)){var a=new qx.ui.core.Font();a.setSize(e.size);a.setFamily(e.family);a.setBold(e.bold);a.setItalic(e.italic);this._values.fonts[c]=a}return this._values.fonts[c]},getBorder:function(j,o,l,i){var g;var m=this._getCssValue(j,o,l,i);var k=this._values.borders[m];var n=k instanceof org.eclipse.rwt.Border;var b=n?k.getStyle():k.style;if(b===$[20]||b==="none"||b===null){var a=this._getCssValue(j,o,$[391],i);var h=this._values.boxdims[a];if(h!=null&&(h.join("")!=="0000")){var d=m+"#"+a;var e=this._values.borders[d];if(!e){var c=n?k.getWidthTop():k.width;var f=n?k.getColorTop():k.color;g=new org.eclipse.rwt.Border(c,$[120],f,h);this._values.borders[d]=g}else{g=e}}}if(!g){if(n){g=k}else{g=this._getBorderFromValue(k);this._values.borders[m]=g}}return g},getShadow:function(c,a,d,e){var b=this._getCssValue(c,a,d,e);return this._values.shadows[b]},getNamedBorder:function(c){var d="_"+c;var a=this._values.borders[d];if(!a){var f=org.eclipse.swt.theme.BorderDefinitions.getDefinition(c);if(f){var b=this._resolveNamedColors(f.color);var e=this._resolveNamedColors(f.innerColor);a=new org.eclipse.rwt.Border(f.width,$[225],b,e);this._values.borders[d]=a}else{a=null}}return a},getGradient:function(c,h,f,b){var j=null;var g=this._getCssValue(c,h,f,b);var e=this._values.gradients[g];if(e){if(e.colors&&e.percents){var d=new Array();for(var a=0;a<e.colors.length;a++){d[a]=[e.percents[a]/100,e.colors[a]]}d.horizontal=!e.vertical;this._values.gradients[g]=d}j=this._values.gradients[g]}return j},getImageSize:function(b){var a=b.slice($[347].length);var c=this._values.images[a];return c!=null?[c[0],c[1]]:[0,0]},_getCssValue:function(e,c,g,h){var a;if(h==null){h=qx.theme.manager.Meta.getInstance().getTheme().name}if(this._cssValues[h]!==undefined&&this._cssValues[h][e]!==undefined&&this._cssValues[h][e][g]!==undefined){var b=this._cssValues[h][e][g];var f=false;for(var d=0;d<b.length&&!f;d++){if(this._matches(c,e,b[d][0])){a=b[d][1];f=true}}}if(a===undefined&&h!=this.defaultTheme){a=this._getCssValue(e,c,g,this.defaultTheme)}return a},_matches:function(b,e,j){var a=true;for(var d=0;d<j.length&&a;d++){var f=j[d];if(f.length>0){var h=f.charAt(0);if(h=="."){a=$[53]+f.substr(1) in b}else{if(h==":"){var g=this._translateState(f.substr(1),e);if(g.charAt(0)=="!"){a=!(g.substr(1) in b)}else{a=g in b}}else{if(h=="["){a="rwt_"+f.substr(1) in b}}}}}return a},_translateState:function(c,b){var a=c;if(b in this._statesMap&&c in this._statesMap[b]){a=this._statesMap[b][c]}else{if(c in this._statesMap["*"]){a=this._statesMap["*"][c]}}return a},_resolveNamedColors:function(c){var a=null;if(c){a=[];for(var b=0;b<c.length;b++){a[b]=this.getNamedColor(c[b])}}return a},_fillNamedColors:function(a){this._namedColors[$[255]]=this.getColor($[201],{},"rwt-darkshadow-color",a);this._namedColors[$[48]]=this.getColor($[201],{},"rwt-highlight-color",a);this._namedColors[$[163]]=this.getColor($[201],{},"rwt-lightshadow-color",a);this._namedColors[$[27]]=this.getColor($[201],{},"rwt-shadow-color",a);this._namedColors[$[379]]=this.getColor($[201],{},"rwt-thinborder-color",a);this._namedColors["selection-marker"]=this.getColor($[201],{},"rwt-selectionmarker-color",a);this._namedColors[$[189]]=this.getColor("*",{},$[5],a);this._namedColors.foreground=this.getColor("*",{},$[6],a);this._namedColors["info.foreground"]=this.getColor($[99],{},$[6],a)},_getBorderFromValue:function(b){var a=null;if(b.color==null){if(b.width==1){if(b.style=="outset"){a=this.getNamedBorder($[383])}else{if(b.style=="inset"){a=this.getNamedBorder($[361])}}}else{if(b.width==2){a=this.getNamedBorder(b.style)}}}if(a===null){a=new org.eclipse.rwt.Border(b.width,b.style,b.color)}return a}}});
+qx.Class.define("org.eclipse.rwt.widgets.MultiCellWidget",{extend:qx.ui.basic.Terminator,construct:function(a){arguments.callee.base.call(this);this.__cellData=null;this.__cellNodes=null;this.__cellCount=null;this.__computedTotalSpacing=null;this.__styleRegExp=/([a-z])([A-Z])/g;this.__createCellData(a);this.__paddingCache=[0,0,0,0];this.__fontCache={};this.__colorCache="";this._flexibleCell=-1;this.initWidth();this.initHeight();this.addToQueue($[424]);this.setOverflow($[17]);this.initSelectable();this.initCursor();this.initTextColor()},destruct:function(){this._disposeObjectDeep("__cellData",0);this._disposeObjectDeep("__cellNodes",0);this._disposeObjectDeep("__paddingCache",0);this._disposeObjectDeep("_fontCache",0)},properties:{spacing:{check:$[22],init:4,themeable:true,apply:$[535],event:$[439]},horizontalChildrenAlign:{check:["left",$[37],$[24]],init:$[37],themeable:true,apply:$[538]},verticalChildrenAlign:{check:["top",$[32],$[50]],init:$[32],themeable:true,apply:$[524]},selectable:{refine:true,init:false},textColor:{refine:true,init:$[305]},cursor:{refine:true,init:$[38]},allowStretchX:{refine:true,init:false},allowStretchY:{refine:true,init:false},textColor:{refine:true,init:$[305]},cursor:{refine:true,init:$[38]},appearance:{refine:true,init:"atom"},width:{refine:true,init:"auto"},height:{refine:true,init:"auto"}},members:{setCellContent:function(a,b){this.__updateComputedCellDimension(a);if(this._cellHasContent(a)!=(b!=null)){this._invalidateTotalSpacing();this.addToQueue($[424])}else{this.addToQueue("updateContent")}var c=b;if(this._isImageCell(a)){c=qx.io.Alias.getInstance().resolve(c)}this.__cellData[a][1]=c},setCellDimension:function(b,c,a){this.setCellWidth(b,c);this.setCellHeight(b,a)},setCellVisible:function(a,b){this.__cellData[a][6]=b;if(this.getCellNode(a)){this.getCellNode(a).style.display=b?"":"none"}},isCellVisible:function(a){return this.__cellData[a][6]},getCellNode:function(a){return this.__cellNodes[a]},getCellContent:function(a){return this.__cellData[a][1]},setCellWidth:function(a,b){if(this._getCellWidth(a)!==b){this._setCellWidth(a,b);this._invalidateTotalSpacing();this._invalidatePreferredInnerWidth();this._scheduleLayoutX()}},setCellHeight:function(b,a){this._setCellHeight(b,a);this._invalidateTotalSpacing();this._invalidatePreferredInnerHeight();this._scheduleLayoutY()},setFlexibleCell:function(a){this._flexibleCell=a},getCellDimension:function(b){var c=this.getCellWidth(b);var a=this.getCellHeight(b);return[c,a]},getCellWidth:function(a,b){var f=this.__cellData[a];var e=this._flexibleCell===a&&b!==true;var c=(f[2]!=null?f[2]:f[4]);if(c==null||(e&&f[3]===null)){var d=this.__computeCellDimension(f);c=d[0]}if(e){c=this._limitCellWidth(a,c)}return c},getCellHeight:function(b,c){var g=this.__cellData[b];var f=this._flexibleCell===b&&c!==true;var a=(g[3]!=null?g[3]:g[5]);if(a==null||(f&&g[3]===null)){var e=f?this.getCellWidth(b):null;var d=this.__computeCellDimension(g,e);a=d[1]}if(f){a=this._limitCellHeight(b,a)}return a},_applyElement:function(b,a){arguments.callee.base.call(this,b,a);if(b){this._createSubelements();this._catchSubelements()}},_createSubelements:function(){var b="";for(var a=0;a<this.__cellCount;a++){this.__setCellNode(a,null);if(this._cellHasContent(a)){if(this._isTextCell(a)){b+=this._getLabelHtml(a)}else{if(this._isImageCell(a)){b+=this._getImageHtml(a)}}}}this._getTargetNode().innerHTML=b},_catchSubelements:function(){var b=this._getTargetNode();var c=0;for(var a=0;a<this.__cellCount;a++){if(this._cellHasContent(a)){this.__setCellNode(a,b.childNodes[c]);c++}}if(this.getEnabled()==false){this._applyEnabled(false)}},_applySpacing:function(b,a){this._invalidateTotalSpacing();this._scheduleLayoutX()},_applyHorizontalChildrenAlign:function(b,a){this._scheduleLayoutX()},_applyVerticalChildrenAlign:function(b,a){this._scheduleLayoutY()},_applyPaddingTop:function(b,a){this.addToLayoutChanges($[199]);this.__paddingCache[0]=b;this._invalidateFrameHeight()},_applyPaddingRight:function(b,a){this.addToLayoutChanges($[256]);this.__paddingCache[1]=b;this._invalidateFrameWidth()},_applyPaddingBottom:function(b,a){this.addToLayoutChanges($[236]);this.__paddingCache[2]=b;this._invalidateFrameHeight()},_applyPaddingLeft:function(b,a){this.addToLayoutChanges($[221]);this.__paddingCache[3]=b;this._invalidateFrameWidth()},_applyEnabled:function(b,a){arguments.callee.base.call(this,b,a);this._styleAllImagesEnabled()},_scheduleLayoutX:function(){this.addToQueue("layoutX");this._afterScheduleLayoutX()},_scheduleLayoutY:function(){this.addToQueue("layoutY");this._afterScheduleLayoutY()},_afterScheduleLayoutX:qx.lang.Function.returnTrue,_afterScheduleLayoutY:qx.lang.Function.returnTrue,_beforeComputeInnerWidth:qx.lang.Function.returnTrue,_beforeComputeInnerHeight:qx.lang.Function.returnTrue,_beforeRenderLayout:qx.lang.Function.returnTrue,_afterRenderLayout:qx.lang.Function.returnTrue,_cellHasContent:function(a){var b=this.__cellData[a][1];return b!=null},_isImageCell:function(a){var b=this.__cellData[a][0];return b==$[35]},_isTextCell:function(a){var b=this.__cellData[a][0];return b==$[85]},_setCellWidth:function(a,b){this.__cellData[a][2]=b},_getCellWidth:function(a){return this.__cellData[a][2]},_setCellHeight:function(b,a){this.__cellData[b][3]=a},__setCellNode:function(a,b){this.__cellNodes[a]=b;if(b!==null&&!this.isCellVisible(a)){b.style.display="none"}},__cellHasNode:function(a){return this.__cellNodes[a]!=null},__createCellData:function(b){var d=[];var a=[];this.__cellCount=b.length;for(var c=0;c<this.__cellCount;c++){a[c]=null;d[c]=[b[c],null,null,null,null,null,true]}this.__cellNodes=a;this.__cellData=d},__updateComputedCellDimension:function(a){var b=this.__cellData[a];b[4]=null;b[5]=null;if(b[2]==null){this._invalidatePreferredInnerWidth();this._scheduleLayoutX()}if(b[3]==null){this._invalidatePreferredInnerHeight();this._scheduleLayoutY()}},__computeCellDimension:function(b,a){var c;if(b[0]==$[85]&&b[1]!=null){c=this._computeTextDimensions(b[1],a)}else{c=[0,0]}b[4]=c[0];b[5]=c[1];return c},_isWidthEssential:qx.lang.Function.returnTrue,_isHeightEssential:qx.lang.Function.returnTrue,_computePreferredInnerWidth:function(){return this._getContentWidth($[490])},_limitCellWidth:function(b,e){var d=this.getInnerWidth();var c=this._getContentWidth($[442]);var f=Math.max(0,d-c);var a;if(e>f){a=f}else{a=e}return a},_getContentWidth:function(f){this._beforeComputeInnerWidth();var a=0;if(f===$[490]){var e=this.getTotalSpacing();var d=0;for(var b=0;b<this.__cellCount;b++){d+=this.getCellWidth(b,true)}a=e+d}else{if(f===$[442]){var g=this.getSpacing();for(var b=0;b<this.__cellCount;b++){if(b!==this._flexibleCell){var c=this.getCellWidth(b);a+=c;if(c>0){a+=g}}}}else{if(f==="flexible"){var e=this.getTotalSpacing();var d=0;for(var b=0;b<this.__cellCount;b++){d+=this.getCellWidth(b)}a=e+d}else{throw new Error("unkown hint")}}}return a},_computePreferredInnerHeight:function(){this._beforeComputeInnerHeight();var b=0;for(var a=0;a<this.__cellCount;a++){b=Math.max(b,this.getCellHeight(a,true))}return b},_limitCellHeight:function(b,c){var d=this.getInnerHeight();var a;if(c>d){a=d}else{a=c}return a},getTotalSpacing:function(){if(this.__computedTotalSpacing==null){var a=Math.max(0,(this.getTotalVisibleCells()-1));this.__computedTotalSpacing=a*this.getSpacing()}return this.__computedTotalSpacing},getTotalVisibleCells:function(){var a=0;for(var b=0;b<this.__cellCount;b++){if(this.cellIsDisplayable(b)){a++}}return a},cellIsDisplayable:function(a){return(this.getCellWidth(a,true)>0)},_invalidateTotalSpacing:function(){this.__computedTotalSpacing=null;this._invalidatePreferredInnerWidth()},renderPadding:function(a){},_layoutPost:function(a){if(a.createContent){this._createSubelements();this._catchSubelements()}if(a.updateContent&&!a.createContent){this._updateAllImages();this._updateAllLabels()}a.layoutX=a.width||a.layoutX||a.frameWidth||a.initial;a.layoutY=a.height||a.layoutY||a.frameHeight||a.initial;this._beforeRenderLayout(a);if(a.layoutX){this._renderLayoutX()}if(a.layoutY){this._renderLayoutY()}this._afterRenderLayout(a);arguments.callee.base.call(this,a)},_renderLayoutX:function(){var a=this.getSpacing();var d=this.__paddingCache;var g=this.getHorizontalChildrenAlign();var h=this._getContentWidth("flexible");var k=this.getInnerWidth();var j=null;switch(g){default:case"left":j=d[3];break;case $[37]:j=Math.round(d[3]+k*0.5-h*0.5);break;case $[24]:j=d[3]+k-h;break}var e=j;var c=null;var b=null;for(var f=0;f<this.__cellCount;f++){if(this.cellIsDisplayable(f)){c=this.getCellWidth(f);if(this._cellHasContent(f)){b=this.getCellNode(f).style;b.left=e;b.width=c}e+=(c+a)}}},_renderLayoutY:function(){for(var a=0;a<this.__cellCount;a++){if(this._cellHasContent(a)){this._renderCellLayoutY(a)}}},_renderCellLayoutY:function(b){var g=this.getVerticalChildrenAlign();var f=this.__paddingCache;var c=this.getInnerHeight();var a=this.getCellHeight(b);var e=null;switch(g){default:case"top":e=f[0];break;case $[32]:e=Math.round(f[0]+c*0.5-a*0.5);break;case $[50]:e=f[0]+c-a;break}var d=this.getCellNode(b).style;d.top=e;d.height=a},_getImageHtml:qx.core.Variant.select($[0],{mshtml:function(a){if(org.eclipse.rwt.Client.getVersion()<7){var c=this.getCellContent(a);var b="";if(c){b="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+c+$[534]}return'<div style="position:absolute;border:0 none;line-height:0px;font-size:0px;'+b+'"></div>'}else{var c=this.getCellContent(a);var b="";if(c){b=$[555]+c+")"}return"<div style='position:absolute;border:0 none;line-height:0px;font-size:0px;"+b+$[458]}},"default":function(a){var c=this.getCellContent(a);var b="";if(c){b=$[555]+c+")"}return"<div style='position:absolute;border:0 none;"+b+$[458]}}),_updateImage:function(a){var c=this.getCellNode(a);var d=this.getCellContent(a);var b=this.getEnabled()?1:0.3;org.eclipse.rwt.HtmlUtil.setBackgroundImage(c,d,b)},_updateAllImages:function(){for(var a=0;a<this.__cellCount;a++){if(this._isImageCell(a)&&this._cellHasContent(a)){this._updateImage(a)}}},_styleAllImagesEnabled:function(){for(var a=0;a<this.__cellCount;a++){if(this._isImageCell(a)&&this.__cellHasNode(a)){this._updateImage(a)}}},_getLabelHtml:function(a){return"<div style='position:absolute;border:0 none;overflow:hidden;"+this._joinStyleProperties(this.__fontCache)+"'>"+this.getCellContent(a)+"</div>"},_joinStyleProperties:function(d){var e=[];var c;for(var b in d){c=d[b];if(c){e.push(b,":",c,";")}}var a=e.join("");return a.replace(this.__styleRegExp,"$1-$2").toLowerCase()},_applyFont:function(b,a){qx.theme.manager.Font.getInstance().connect(this._styleFont,this,b)},_styleFont:function(a){if(a){a.renderStyle(this.__fontCache)}else{qx.ui.core.Font.resetStyle(this.__fontCache)}for(var b=0;b<this.__cellCount;b++){if(this._isTextCell(b)&&this._cellHasContent(b)){if(this.__cellHasNode(b)){if(a){a.renderStyle(this.getCellNode(b).style)}else{qx.ui.core.Font.resetStyle(this.getCellNode(b).style)}}this.__updateComputedCellDimension(b)}}},_applyTextColor:function(b,a){if(b){this.setStyleProperty($[6],b)}else{this.removeStyleProperty($[6])}},_updateLabel:function(a){this.getCellNode(a).innerHTML=this.getCellContent(a)},_updateAllLabels:function(){for(var a=0;a<this.__cellCount;a++){if(this._isTextCell(a)&&this._cellHasContent(a)){this._updateLabel(a)}}},_computeTextDimensions:function(g,e){var b=qx.ui.basic.Label._getMeasureNode();var c=b.style;var f=this.__fontCache;c.fontFamily=f.fontFamily||"";c.fontSize=f.fontSize||"";c.fontWeight=f.fontWeight||"";c.fontStyle=f.fontStyle||"";b.innerHTML=g;if(e){c.width=e+"px"}var a;if(b.getBoundingClientRect){var d=b.getBoundingClientRect();if(d.width!=null&&d.height!=null){a=[Math.ceil(d.width),Math.ceil(d.height)]}else{a=[b.scrollWidth,b.scrollHeight]}}else{a=[b.scrollWidth,b.scrollHeight]}c.width="auto";return a}}});
 qx.Mixin.define("org.eclipse.rwt.DomEventPatch",{members:{setDomEvent:function(a){arguments.callee.base.call(this,a);org.eclipse.swt.EventUtil._shiftKey=a.shiftKey;org.eclipse.swt.EventUtil._ctrlKey=a.ctrlKey;org.eclipse.swt.EventUtil._altKey=a.altKey;org.eclipse.swt.EventUtil._metaKey=a.metaKey}}});
-qx.Class.define("org.eclipse.rwt.widgets.Menu",{extend:qx.ui.popup.Popup,construct:function(){arguments.callee.base.call(this);this._layout=null;this._preItem=null;this._hasListener=false;this._maxCellWidths=null;this._menuLayoutScheduled=false;this._opener=null;this._hoverItem=null;this._openTimer=null;this._closeTimer=null;this._openItem=null;this._itemsHiddenFlag=false;this._hoverFirstItemFlag=false;this.setHeight("auto");this.setWidth("auto");this._maxCellWidths=[null,null,null,null];this._layout=new qx.ui.layout.VerticalBoxLayout();this._layout.set({top:0,right:0,bottom:0,left:0,anonymous:true});this.add(this._layout);this.addEventListener($[2],this._unhoverSubMenu);this.addEventListener($[14],this._onMouseOut);this.addEventListener($[9],this._onMouseOver);this.addEventListener($[12],this._onKeyPress);this._openTimer=new qx.client.Timer(250);this._openTimer.addEventListener($[50],this._onopentimer,this);this._closeTimer=new qx.client.Timer(250);this._closeTimer.addEventListener($[50],this._onclosetimer,this);this._renderAppearance();this.addToDocument()},destruct:function(){this._disposeObjects("_openTimer","_closeTimer","_preItem","_animation");this._disposeFields("_lastActive","_lastFocus","_layout","_opener","_hoverItem","_openItem")},statics:{contextMenuHandler:function(b){var c=b.getCurrentTarget();var a=c.getContextMenu();if(a!=null){b.stopPropagation();a.setLocation(b.getPageX(),b.getPageY());a.setOpener(this);a.show()}},getAllowContextMenu:function(d,c){var a=false;switch(d.classname){case $[480]:case $[558]:case"qx.ui.form.TextArea":if(d.getEnabled()!=false){var b=typeof c.tagName==$[13]?c.tagName:"";if(b.toUpperCase()!="DIV"){a=d.getContextMenu()==null}}break}return a}},properties:{appearance:{refine:true,init:"menu"},animation:{check:$[110],nullable:false,init:null,apply:$[345],themeable:true}},members:{setOpener:function(a){this._opener=a},getOpener:function(a){return this._opener},getFocusRoot:function(){var a=null;if(this._opener){a=this._opener.getFocusRoot()}else{if(this._hasParent){a=this.getParent().getFocusRoot()}}return a},addMenuItemAt:function(b,a){if(b.setParentMenu){b.setParentMenu(this)}this._layout.addAt(b,a)},scheduleMenuLayout:function(){if(this._menuLayoutScheduled!=true){this._menuLayoutScheduled=true;var b=this._layout.getChildren();var c=b.length;for(var a=0;a<c;a++){b[a]._invalidatePreferredInnerWidth();b[a].addToQueue("layoutX")}this.addToQueue("menuLayout")}},_layoutPost:function(a){arguments.callee.base.call(this,a);if(a.menuLayout){this._menuLayoutScheduled=false;if(this.isSeeable()){this._afterAppear()}}},getMaxCellWidth:function(b){if(this._maxCellWidths[b]==null){var a=0;var d=this._layout.getChildren();var e=d.length;for(var c=0;c<e;c++){if(d[c].getPreferredCellWidth){a=Math.max(a,d[c].getPreferredCellWidth(b))}}this._maxCellWidths[b]=a}if(b==0&&this._maxCellWidths[0]==0&&this.getMaxCellWidth(1)==0){this._maxCellWidths[b]=13}return this._maxCellWidths[b]},invalidateMaxCellWidth:function(a){this._maxCellWidths[a]=null},invalidateAllMaxCellWidths:function(){for(var a=0;a<4;a++){this._maxCellWidths[a]=null}},isSubElement:function(b,e){var f=false;if((b.getParent()===this._layout)||((!e)&&(b===this))){f=true}if(!f){var d=this._layout.getChildren(),c=d.length;for(var g=0;g<c;g++){if(this.hasSubmenu(d[g])&&d[g].getMenu().isSubElement(b,e)){f=true}}}return f},setHoverItem:function(b,c){var a=b?b:this._openItem;if(this._hoverItem&&this._hoverItem!=a){this._hoverItem.removeState("over")}if(a){a.addState("over")}this._hoverItem=a;if(!c){this._openTimer.setEnabled(false);if(this.hasSubmenu(a)&&(this._openItem!=a)){this._openTimer.setEnabled(true)}if(this._openItem){if(this._openItem==a||a==null){this._closeTimer.setEnabled(false)}else{if(a!=null){this._closeTimer.setEnabled(true)}}}}},getHoverItem:function(a){return this._hoverItem},hoverFirstItem:function(){if(this._isDisplayable&&!this._itemsHiddenFlag){this.setHoverItem(null,true);this._hoverNextItem();this.removeState($[515])}else{this.addState($[515])}},_hoverNextItem:function(){var d;var c=null;var b=this._layout.getVisibleChildren();var a=b.indexOf(this._hoverItem);var e=a;do{a++;if(a>b.length){a=-1}d=a>=0?b[a]:null;if(d&&d.isEnabled()&&d.classname==$[399]){c=d}}while(!c&&(a!=e));this.setHoverItem(c,true)},_hoverPreviousItem:function(){var d;var c=null;var b=this._layout.getVisibleChildren();var a=b.indexOf(this._hoverItem);var e=a;do{a--;if(a<-1){a=b.length}d=a>=0?b[a]:null;if(d&&d.isEnabled()&&d.classname==$[399]){c=d}}while(!c&&(a!=e));this.setHoverItem(c,true)},_makeActive:function(){this._lastActive=this.getFocusRoot().getActiveChild();this._lastFocus=this.getFocusRoot().getFocusedChild();this.getFocusRoot().setActiveChild(this)},_makeInactive:function(){var a=this.getFocusRoot();a.setActiveChild(this._lastActive);a.setFocusedChild(this._lastFocus)},_beforeAppear:function(){qx.ui.layout.CanvasLayout.prototype._beforeAppear.call(this);org.eclipse.rwt.MenuManager.getInstance().add(this);this.bringToFront();this._makeActive();this._menuShown()},_beforeDisappear:function(){qx.ui.layout.CanvasLayout.prototype._beforeDisappear.call(this);org.eclipse.rwt.MenuManager.getInstance().remove(this);if(this.getFocusRoot()){this._makeInactive()}this.setOpenItem(null);this.setHoverItem(null);if(this._opener instanceof org.eclipse.rwt.widgets.MenuItem){var a=this._opener.getParentMenu();if(a instanceof org.eclipse.rwt.widgets.MenuBar){this._opener.removeState($[21]);if(a.getOpenItem()==this._opener){a.setOpenItem(null)}}}this._menuHidden()},hasSubmenu:function(a){return a&&a.getMenu&&a.getMenu()},_onopentimer:function(a){this._openTimer.stop();this.setOpenItem(this._hoverItem);this._closeTimer.stop()},_onclosetimer:function(a){this._closeTimer.stop();this.setOpenItem(null)},setOpenItem:function(d){if(this._openItem&&this._openItem.getMenu()){this._openItem.setSubMenuOpen(false);var a=this._openItem.getMenu();a.hide()}this._openItem=d;if(d&&d.getMenu()){var b=d.getMenu();d.setSubMenuOpen(true);b.setOpener(d);var e=d.getElement();var c=this.getElement();b.setTop(qx.bom.element.Location.getTop(e)-2);b.setLeft(qx.bom.element.Location.getLeft(c)+qx.html.Dimension.getBoxWidth(c)-3);b.show()}},_onMouseOut:function(a){var c=a.getTarget();var b=a.getRelatedTarget();if(c==this||(b!=this&&!this.contains(b))){this.setHoverItem(null)}},_onMouseOver:function(a){var b=a.getTarget();if(b!=this){this.setHoverItem(b)}this._unhoverSubMenu()},_unhoverSubMenu:function(){if(this._openItem){var a=this._openItem.getMenu();a.setOpenItem(null);a.setHoverItem(null)}},_onKeyPress:function(a){switch(a.getKeyIdentifier()){case"Up":this._handleKeyUp(a);break;case"Down":this._handleKeyDown(a);break;case"Left":this._handleKeyLeft(a);break;case $[53]:this._handleKeyRight(a);break;case $[68]:this._handleKeyEnter(a);break}},_handleKeyUp:function(a){if(this._openItem){this._openItem.getMenu()._hoverPreviousItem()}else{this._hoverPreviousItem()}a.preventDefault();a.stopPropagation()},_handleKeyDown:function(a){if(this._openItem){this._openItem.getMenu()._hoverNextItem()}else{this._hoverNextItem()}a.preventDefault();a.stopPropagation()},_handleKeyLeft:function(c){var a=this._opener?this._opener.getParentMenu():null;if(a instanceof org.eclipse.rwt.widgets.Menu){var b=this._opener;a.setOpenItem(null);a.setHoverItem(b,true);c.preventDefault();c.stopPropagation()}},_handleKeyRight:function(a){if(this.hasSubmenu(this._hoverItem)){this._onopentimer();this.setHoverItem(null,true);this._openItem.getMenu().hoverFirstItem();a.preventDefault();a.stopPropagation()}},_handleKeyEnter:function(a){if(this.hasSubmenu(this._hoverItem)){this._onopentimer();this.setHoverItem(null,true);this._openItem.getMenu().hoverFirstItem()}else{if(this._hoverItem){this._hoverItem.execute();org.eclipse.rwt.MenuManager.getInstance().update()}}a.preventDefault();a.stopPropagation()},setHasMenuListener:function(a){this._hasListener=a},_menuShown:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){if(this._hasListener){if(this._preItem==null){this._preItem=new org.eclipse.rwt.widgets.MenuItem("push");this._preItem.setText("...");this._preItem.setEnabled(false);this.addMenuItemAt(this._preItem,0)}var a=this._layout.getChildren();for(var b=0;b<a.length;b++){var d=a[b];d.setDisplay(false)}this._preItem.setDisplay(true);this._itemsHiddenFlag=true;if(this.getWidth()<60){this.setWidth(60)}var e=org.eclipse.swt.WidgetManager.getInstance();var g=e.findIdByWidget(this);var c=org.eclipse.swt.Request.getInstance();c.addEvent("org.eclipse.swt.events.menuShown",g);c.send()}else{var f=this._layout.getChildren().length!=0;this.setDisplay(f);if(f){if(this._hoverFirstItemFlag){this.hoverFirstItem()}}}}},_menuHidden:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){if(this._hasListener){var b=org.eclipse.swt.WidgetManager.getInstance();var c=b.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addEvent("org.eclipse.swt.events.menuHidden",c);a.send()}}},unhideItems:function(c){if(c){var a=this._layout.getChildren();for(var b=0;b<a.length;b++){a[b].setDisplay(true)}if(this._preItem){this._preItem.setDisplay(false)}this._itemsHiddenFlag=false;if(this._hoverFirstItemFlag){this.hoverFirstItem()}}else{this.hide()}this._hoverFirstItemFlag=false},showMenu:function(b,a,c){if(b!=null){b._renderAppearance();b.setLocation(a,c);b.show()}},_applyAnimation:function(d,a){var b=0;if(d.slideIn){b|=org.eclipse.rwt.AnimationRenderer.ANIMATION_APPEAR;b|=org.eclipse.rwt.AnimationRenderer.ANIMATION_CHANGE}if(d.slideOut){b|=org.eclipse.rwt.AnimationRenderer.ANIMATION_DISAPPEAR}if(b!=0){if(this._animation==null){this._animation=new org.eclipse.rwt.Animation()}var c=this._animation.getDefaultRenderer();c.animate(this,$[36],b);this._animation.addEventListener("init",this._initAnimation,this);this._animation.addEventListener("cancel",this._finishAnimation,this)}else{if(this._animation!=null){this._animation.setEnabled(false)}}},_initAnimation:function(a){this.setContainerOverflow(false);if(a.getData()==$[318]){this._animation.setProperties(this.getAnimation()["slideOut"])}else{this._animation.setProperties(this.getAnimation()["slideIn"])}},_finishAnimation:function(a){this.setContainerOverflow(true)}}});
+qx.Class.define("org.eclipse.rwt.widgets.Menu",{extend:qx.ui.popup.Popup,construct:function(){arguments.callee.base.call(this);this._layout=null;this._preItem=null;this._hasListener=false;this._maxCellWidths=null;this._menuLayoutScheduled=false;this._opener=null;this._hoverItem=null;this._openTimer=null;this._closeTimer=null;this._openItem=null;this._itemsHiddenFlag=false;this._hoverFirstItemFlag=false;this.setHeight("auto");this.setWidth("auto");this._maxCellWidths=[null,null,null,null];this._layout=new qx.ui.layout.VerticalBoxLayout();this._layout.set({top:0,right:0,bottom:0,left:0,anonymous:true});this.add(this._layout);this.addEventListener($[2],this._unhoverSubMenu);this.addEventListener($[14],this._onMouseOut);this.addEventListener($[9],this._onMouseOver);this.addEventListener($[12],this._onKeyPress);this._openTimer=new qx.client.Timer(250);this._openTimer.addEventListener($[49],this._onopentimer,this);this._closeTimer=new qx.client.Timer(250);this._closeTimer.addEventListener($[49],this._onclosetimer,this);this._renderAppearance();this.addToDocument()},destruct:function(){this._disposeObjects("_openTimer","_closeTimer","_preItem","_animation");this._disposeFields("_lastActive","_lastFocus","_layout","_opener","_hoverItem","_openItem")},statics:{contextMenuHandler:function(b){var c=org.eclipse.swt.WidgetUtil.getControl(b.getTarget());var a=c?c.getContextMenu():null;if(a!=null){b.stopPropagation();a.setLocation(b.getPageX(),b.getPageY());a.setOpener(this);a.show()}},getAllowContextMenu:function(d,c){var a=false;switch(d.classname){case $[481]:case $[422]:case"qx.ui.form.TextArea":if(d.getEnabled()!=false){var b=typeof c.tagName==$[13]?c.tagName:"";if(b.toUpperCase()!="DIV"){a=d.getContextMenu()==null}}break}return a}},properties:{appearance:{refine:true,init:"menu"},animation:{check:$[111],nullable:false,init:null,apply:$[375],themeable:true}},members:{setOpener:function(a){this._opener=a},getOpener:function(a){return this._opener},getFocusRoot:function(){var a=null;if(this._opener){a=this._opener.getFocusRoot()}else{if(this._hasParent){a=this.getParent().getFocusRoot()}}return a},addMenuItemAt:function(b,a){if(b.setParentMenu){b.setParentMenu(this)}this._layout.addAt(b,a)},scheduleMenuLayout:function(){if(this._menuLayoutScheduled!=true){this._menuLayoutScheduled=true;var b=this._layout.getChildren();var c=b.length;for(var a=0;a<c;a++){b[a]._invalidatePreferredInnerWidth();b[a].addToQueue("layoutX")}this.addToQueue("menuLayout")}},_layoutPost:function(a){arguments.callee.base.call(this,a);if(a.menuLayout){this._menuLayoutScheduled=false;if(this.isSeeable()){this._afterAppear()}}},getMaxCellWidth:function(b){if(this._maxCellWidths[b]==null){var a=0;var d=this._layout.getChildren();var e=d.length;for(var c=0;c<e;c++){if(d[c].getPreferredCellWidth){a=Math.max(a,d[c].getPreferredCellWidth(b))}}this._maxCellWidths[b]=a}if(b==0&&this._maxCellWidths[0]==0&&this.getMaxCellWidth(1)==0){this._maxCellWidths[b]=13}return this._maxCellWidths[b]},invalidateMaxCellWidth:function(a){this._maxCellWidths[a]=null},invalidateAllMaxCellWidths:function(){for(var a=0;a<4;a++){this._maxCellWidths[a]=null}},isSubElement:function(b,e){var f=false;if((b.getParent()===this._layout)||((!e)&&(b===this))){f=true}if(!f){var d=this._layout.getChildren(),c=d.length;for(var g=0;g<c;g++){if(this.hasSubmenu(d[g])&&d[g].getMenu().isSubElement(b,e)){f=true}}}return f},setHoverItem:function(b,c){var a=b?b:this._openItem;if(this._hoverItem&&this._hoverItem!=a){this._hoverItem.removeState("over")}if(a){a.addState("over")}this._hoverItem=a;if(!c){this._openTimer.setEnabled(false);if(this.hasSubmenu(a)&&(this._openItem!=a)){this._openTimer.setEnabled(true)}if(this._openItem){if(this._openItem==a||a==null){this._closeTimer.setEnabled(false)}else{if(a!=null){this._closeTimer.setEnabled(true)}}}}},getHoverItem:function(a){return this._hoverItem},hoverFirstItem:function(){if(this._isDisplayable&&!this._itemsHiddenFlag){this.setHoverItem(null,true);this._hoverNextItem();this.removeState($[542])}else{this.addState($[542])}},_hoverNextItem:function(){var d;var c=null;var b=this._layout.getVisibleChildren();var a=b.indexOf(this._hoverItem);var e=a;do{a++;if(a>b.length){a=-1}d=a>=0?b[a]:null;if(d&&d.isEnabled()&&d.classname==$[344]){c=d}}while(!c&&(a!=e));this.setHoverItem(c,true)},_hoverPreviousItem:function(){var d;var c=null;var b=this._layout.getVisibleChildren();var a=b.indexOf(this._hoverItem);var e=a;do{a--;if(a<-1){a=b.length}d=a>=0?b[a]:null;if(d&&d.isEnabled()&&d.classname==$[344]){c=d}}while(!c&&(a!=e));this.setHoverItem(c,true)},_makeActive:function(){this._lastActive=this.getFocusRoot().getActiveChild();this._lastFocus=this.getFocusRoot().getFocusedChild();this.getFocusRoot().setActiveChild(this)},_makeInactive:function(){var a=this.getFocusRoot();a.setActiveChild(this._lastActive);a.setFocusedChild(this._lastFocus)},_beforeAppear:function(){qx.ui.layout.CanvasLayout.prototype._beforeAppear.call(this);org.eclipse.rwt.MenuManager.getInstance().add(this);this.bringToFront();this._makeActive();this._menuShown()},_beforeDisappear:function(){qx.ui.layout.CanvasLayout.prototype._beforeDisappear.call(this);org.eclipse.rwt.MenuManager.getInstance().remove(this);if(this.getFocusRoot()){this._makeInactive()}this.setOpenItem(null);this.setHoverItem(null);if(this._opener instanceof org.eclipse.rwt.widgets.MenuItem){var a=this._opener.getParentMenu();if(a instanceof org.eclipse.rwt.widgets.MenuBar){this._opener.removeState($[21]);if(a.getOpenItem()==this._opener){a.setOpenItem(null)}}}this._menuHidden()},hasSubmenu:function(a){return a&&a.getMenu&&a.getMenu()},_onopentimer:function(a){this._openTimer.stop();this.setOpenItem(this._hoverItem);this._closeTimer.stop()},_onclosetimer:function(a){this._closeTimer.stop();this.setOpenItem(null)},setOpenItem:function(d){if(this._openItem&&this._openItem.getMenu()){this._openItem.setSubMenuOpen(false);var a=this._openItem.getMenu();a.hide()}this._openItem=d;if(d&&d.getMenu()){var b=d.getMenu();d.setSubMenuOpen(true);b.setOpener(d);var e=d.getElement();var c=this.getElement();b.setTop(qx.bom.element.Location.getTop(e)-2);b.setLeft(qx.bom.element.Location.getLeft(c)+qx.html.Dimension.getBoxWidth(c)-3);b.show()}},_onMouseOut:function(a){var c=a.getTarget();var b=a.getRelatedTarget();if(c==this||(b!=this&&!this.contains(b))){this.setHoverItem(null)}},_onMouseOver:function(a){var b=a.getTarget();if(b!=this){this.setHoverItem(b)}this._unhoverSubMenu()},_unhoverSubMenu:function(){if(this._openItem){var a=this._openItem.getMenu();a.setOpenItem(null);a.setHoverItem(null)}},_onKeyPress:function(a){switch(a.getKeyIdentifier()){case"Up":this._handleKeyUp(a);break;case"Down":this._handleKeyDown(a);break;case"Left":this._handleKeyLeft(a);break;case $[51]:this._handleKeyRight(a);break;case $[71]:this._handleKeyEnter(a);break}},_handleKeyUp:function(a){if(this._openItem){this._openItem.getMenu()._hoverPreviousItem()}else{this._hoverPreviousItem()}a.preventDefault();a.stopPropagation()},_handleKeyDown:function(a){if(this._openItem){this._openItem.getMenu()._hoverNextItem()}else{this._hoverNextItem()}a.preventDefault();a.stopPropagation()},_handleKeyLeft:function(c){var a=this._opener?this._opener.getParentMenu():null;if(a instanceof org.eclipse.rwt.widgets.Menu){var b=this._opener;a.setOpenItem(null);a.setHoverItem(b,true);c.preventDefault();c.stopPropagation()}},_handleKeyRight:function(a){if(this.hasSubmenu(this._hoverItem)){this._onopentimer();this.setHoverItem(null,true);this._openItem.getMenu().hoverFirstItem();a.preventDefault();a.stopPropagation()}},_handleKeyEnter:function(a){if(this.hasSubmenu(this._hoverItem)){this._onopentimer();this.setHoverItem(null,true);this._openItem.getMenu().hoverFirstItem()}else{if(this._hoverItem){this._hoverItem.execute();org.eclipse.rwt.MenuManager.getInstance().update()}}a.preventDefault();a.stopPropagation()},setHasMenuListener:function(a){this._hasListener=a},_menuShown:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){if(this._hasListener){if(this._preItem==null){this._preItem=new org.eclipse.rwt.widgets.MenuItem("push");this._preItem.setText("...");this._preItem.setEnabled(false);this.addMenuItemAt(this._preItem,0)}var a=this._layout.getChildren();for(var b=0;b<a.length;b++){var d=a[b];d.setDisplay(false)}this._preItem.setDisplay(true);this._itemsHiddenFlag=true;if(this.getWidth()<60){this.setWidth(60)}var e=org.eclipse.swt.WidgetManager.getInstance();var g=e.findIdByWidget(this);var c=org.eclipse.swt.Request.getInstance();c.addEvent("org.eclipse.swt.events.menuShown",g);c.send()}else{var f=this._layout.getChildren().length!=0;this.setDisplay(f);if(f){if(this._hoverFirstItemFlag){this.hoverFirstItem()}}}}},_menuHidden:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){if(this._hasListener){var b=org.eclipse.swt.WidgetManager.getInstance();var c=b.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addEvent("org.eclipse.swt.events.menuHidden",c);a.send()}}},unhideItems:function(c){if(c){var a=this._layout.getChildren();for(var b=0;b<a.length;b++){a[b].setDisplay(true)}if(this._preItem){this._preItem.setDisplay(false)}this._itemsHiddenFlag=false;if(this._hoverFirstItemFlag){this.hoverFirstItem()}}else{this.hide()}this._hoverFirstItemFlag=false},showMenu:function(b,a,c){if(b!=null){b._renderAppearance();b.setLocation(a,c);b.show()}},_applyAnimation:function(d,a){var b=0;if(d.slideIn){b|=org.eclipse.rwt.AnimationRenderer.ANIMATION_APPEAR;b|=org.eclipse.rwt.AnimationRenderer.ANIMATION_CHANGE}if(d.slideOut){b|=org.eclipse.rwt.AnimationRenderer.ANIMATION_DISAPPEAR}if(b!=0){if(this._animation==null){this._animation=new org.eclipse.rwt.Animation()}var c=this._animation.getDefaultRenderer();c.animate(this,$[39],b);this._animation.addEventListener("init",this._initAnimation,this);this._animation.addEventListener("cancel",this._finishAnimation,this)}else{if(this._animation!=null){this._animation.setEnabled(false)}}},_initAnimation:function(a){this.setContainerOverflow(false);if(a.getData()==$[312]){this._animation.setProperties(this.getAnimation()["slideOut"])}else{this._animation.setProperties(this.getAnimation()["slideIn"])}},_finishAnimation:function(a){this.setContainerOverflow(true)}}});
 qx.Class.define("org.eclipse.rwt.MenuManager",{type:$[33],extend:qx.util.manager.Object,members:{update:function(j,a){var f=this.getAll();var d=a==$[2];var o=a==$[15];var l=d||o;var e=j!=null;var n=e&&j.getMenu&&j.getMenu()!=null;var m=this._getMenuBar(j);for(var g in f){var b=f[g];var h=false;if(b.getAutoHide()){var i=b.getOpener()===j;var c=!(b.getOpener() instanceof org.eclipse.rwt.widgets.MenuItem);var k=m!=this._getMenuBar(b);if(!e||!l){h=true}if(d&&k){h=true}if(d&&c&&i){h=true}if(!n&&!i){if(d&&!b.isSubElement(j)){h=true}if(o&&b.isSubElement(j,true)){h=true}}}if(h){b.hide()}}},_getMenuBar:function(c){var d=null;var b=null;if(c instanceof org.eclipse.rwt.widgets.MenuItem){d=c.getParentMenu()}else{if(c instanceof org.eclipse.rwt.widgets.Menu||c instanceof org.eclipse.rwt.widgets.MenuBar){d=c}}while(b==null&&d!=null){if(d instanceof org.eclipse.rwt.widgets.MenuBar){b=d}else{var a=d.getOpener() instanceof org.eclipse.rwt.widgets.MenuItem;var d=a?d.getOpener().getParentMenu():null}}return b}}});
-qx.Class.define($[399],{extend:org.eclipse.rwt.widgets.MultiCellWidget,construct:function(a){arguments.callee.base.call(this,[$[35],$[35],$[82],$[35]]);this._hasSelectionListener=false;this._selected=false;this._parentMenu=null;this._subMenu=null;this._subMenuOpen=false;this._preferredCellWidths=null;this.initTabIndex();this.set({width:"auto",paddingTop:2,paddingBottom:2,paddingLeft:4,paddingRight:4,horizontalChildrenAlign:"left",verticalChildrenAlign:$[32]});this.addEventListener($[15],this.execute);this.addEventListener($[84],this._onFontChange);this.addState(a);switch(a){case"bar":this._isSelectable=false;this._isDeselectable=false;this._sendEvent=false;this.addState("rwt_BAR");break;case"push":this._isSelectable=false;this._isDeselectable=false;this._sendEvent=true;this.addState("rwt_PUSH");break;case"check":this._isSelectable=true;this._isDeselectable=true;this._sendEvent=true;this.addState("rwt_CHECK");break;case"cascade":this._isSelectable=false;this._isDeselectable=false;this._sendEvent=false;this.addState("rwt_CASCADE");break;case"radio":this._isSelectable=true;this._sendEvent=false;this.setNoRadioGroup(false);this.addState("rwt_RADIO");org.eclipse.rwt.RadioButtonUtil.registerExecute(this);break;default:throw ("Unkown menuItem type "+a);break}this._preferredCellWidths=[0,0,0,13];if(this._isSelectable){this.setCellContent(0,"")}},destruct:function(){this._disposeFields("_parentMenu","_subMenu")},properties:{selectionIndicator:{apply:$[519],nullable:true,themeable:true},arrow:{apply:"_applyArrow",nullable:true,themeable:true},appearance:{refine:true,init:"menu-item"},tabIndex:{refine:true,init:1}},members:{setParentMenu:function(a){this._parentMenu=a},getParentMenu:function(){return this._parentMenu},setSubMenuOpen:function(a){this._subMenuOpen=a},setMenu:function(a){this._subMenu=a},getMenu:function(){return this._subMenu},_applySelectionIndicator:function(f,b){var c=f?f[0]:null;var d=f?f[1]:0;var a=f?f[2]:0;if(c==null){var e=this._isSelectable?"":null;this.setCellContent(0,e)}else{this.setCellContent(0,c)}this.setCellHeight(0,a);this._setPreferredCellWidth(0,d)},_setPreferredCellWidth:function(a,b){this._preferredCellWidths[a]=b;if(this._parentMenu instanceof org.eclipse.rwt.widgets.Menu){this._parentMenu.invalidateMaxCellWidth(a)}this._scheduleLayoutX()},_afterScheduleLayoutX:function(){if(this._parentMenu instanceof org.eclipse.rwt.widgets.Menu){this._parentMenu.scheduleMenuLayout()}},getPreferredCellWidth:function(a){return this._preferredCellWidths[a]},setImage:function(c,b,a){this.setCellContent(1,c);this.setCellHeight(1,a);this._setPreferredCellWidth(1,b)},setText:function(a){this.setCellContent(2,a);this.setCellDimension(2,null,null);this._setPreferredCellWidth(2,this.getCellWidth(2))},_onFontChange:function(){this.setCellDimension(2,null,null);this._setPreferredCellWidth(2,this.getCellWidth(2))},_applyArrow:function(e,b){var c=e?e[0]:null;var d=e?e[1]:13;var a=e?e[2]:0;this.setCellContent(3,c);this.setCellHeight(3,a);this._setPreferredCellWidth(3,d)},_beforeComputeInnerWidth:function(){if(this._parentMenu instanceof org.eclipse.rwt.widgets.Menu){for(var a=0;a<4;a++){this._setCellWidth(a,this._parentMenu.getMaxCellWidth(a))}}},_beforeAppear:function(){arguments.callee.base.call(this);if(this._parentMenu instanceof org.eclipse.rwt.widgets.Menu){this._parentMenu.invalidateAllMaxCellWidths();this._parentMenu.scheduleMenuLayout()}},setHasSelectionListener:function(a){this._hasSelectionListener=a},setSubMenu:function(a){this._subMenu=a},setNoRadioGroup:function(a){if(this.hasState("radio")){this._noRadioGroup=a;this._isDeselectable=a}},getNoRadioGroup:function(){return this._noRadioGroup},execute:function(){arguments.callee.base.call(this);if(this._isSelectable){this.setSelection(!(this._selected&&this._isDeselectable))}this._sendChanges()},setSelection:function(b){if(this._selected!=b||this._selected){this._selected=b;if(this._selected){this.addState($[30])}else{this.removeState($[30])}if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addParameter(c+$[144],this._selected);org.eclipse.swt.EventUtil.addWidgetSelectedModifier()}}},_sendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()&&this._hasSelectionListener){var a=org.eclipse.swt.Request.getInstance();if(this._sendEvent){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);a.addEvent($[64],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier()}a.send()}},_onmouseup:function(a){this.execute()}}});
-qx.Class.define("org.eclipse.rwt.RadioButtonUtil",{statics:{registerExecute:function(a){a.addEventListener($[137],this._onSelection,this)},registerKeypress:function(a){a.addEventListener($[12],this._onKeypress,this)},_onKeypress:function(a){var b=a.getTarget();switch(a.getKeyIdentifier()){case"Left":case"Up":this._setNextOrPrevious(b,"previous");b._sendChanges();a.preventDefault();a.stopPropagation();break;case $[53]:case"Down":this._setNextOrPrevious(b,"next");b._sendChanges();a.preventDefault();a.stopPropagation();break;case"Home":case"End":case $[55]:case $[58]:evt.preventDefault();evt.stopPropagation();break}},_onSelection:function(a){this._unselectSiblings(a.getTarget())},_isRadioElement:function(a){return a.hasState("radio")},_getRadioGroup:function(d){var e=[];if(!d.getNoRadioGroup()){var f=d.getParent().getChildren();var c=f.length;if(d.classname==$[563]){for(var a=0;a<c;a++){if(this._isRadioElement(f[a])){e.push(f[a])}}}else{var b=false;var a=0;while(a<c&&(!b||this._isRadioElement(f[a]))){if(!b){b=f[a]==d}if(this._isRadioElement(f[a])){e.push(f[a])}else{e=[]}a++}}}return e},_setNextOrPrevious:function(e,g){var a=this._getRadioGroup(e);if(a.length>0){var d;for(var c=0;c<a.length;c++){if(a[c]==e){d=c}}var f=d;if(g=="next"){f=d+1;if(f>=a.length){f=0}}if(g=="previous"){f=d-1;if(f<0){f=a.length-1}}var b=a[f];this._unselectSiblings(b);b.setSelection(true);b.setFocused(true)}},_unselectSiblings:function(b){var c=this._getRadioGroup(b);for(var a=0;a<c.length;a++){if(c[a]!=b){c[a].setSelection(false)}}}}});
+qx.Class.define($[344],{extend:org.eclipse.rwt.widgets.MultiCellWidget,construct:function(a){arguments.callee.base.call(this,[$[35],$[35],$[85],$[35]]);this._hasSelectionListener=false;this._selected=false;this._parentMenu=null;this._subMenu=null;this._subMenuOpen=false;this._preferredCellWidths=null;this.initTabIndex();this.set({width:"auto",paddingTop:2,paddingBottom:2,paddingLeft:4,paddingRight:4,horizontalChildrenAlign:"left",verticalChildrenAlign:$[32]});this.addEventListener($[15],this.execute);this.addEventListener($[83],this._onFontChange);this.addState(a);switch(a){case"bar":this._isSelectable=false;this._isDeselectable=false;this._sendEvent=false;this.addState("rwt_BAR");break;case"push":this._isSelectable=false;this._isDeselectable=false;this._sendEvent=true;this.addState("rwt_PUSH");break;case"check":this._isSelectable=true;this._isDeselectable=true;this._sendEvent=true;this.addState("rwt_CHECK");break;case"cascade":this._isSelectable=false;this._isDeselectable=false;this._sendEvent=false;this.addState("rwt_CASCADE");break;case"radio":this._isSelectable=true;this._sendEvent=false;this.setNoRadioGroup(false);this.addState("rwt_RADIO");org.eclipse.rwt.RadioButtonUtil.registerExecute(this);break;default:throw ("Unkown menuItem type "+a);break}this._preferredCellWidths=[0,0,0,13];if(this._isSelectable){this.setCellContent(0,"")}},destruct:function(){this._disposeFields("_parentMenu","_subMenu")},properties:{selectionIndicator:{apply:$[445],nullable:true,themeable:true},arrow:{apply:"_applyArrow",nullable:true,themeable:true},appearance:{refine:true,init:"menu-item"},tabIndex:{refine:true,init:1}},members:{setParentMenu:function(a){this._parentMenu=a},getParentMenu:function(){return this._parentMenu},setSubMenuOpen:function(a){this._subMenuOpen=a},setMenu:function(a){this._subMenu=a},getMenu:function(){return this._subMenu},_applySelectionIndicator:function(f,b){var c=f?f[0]:null;var d=f?f[1]:0;var a=f?f[2]:0;if(c==null){var e=this._isSelectable?"":null;this.setCellContent(0,e)}else{this.setCellContent(0,c)}this.setCellHeight(0,a);this._setPreferredCellWidth(0,d)},_setPreferredCellWidth:function(a,b){this._preferredCellWidths[a]=b;if(this._parentMenu instanceof org.eclipse.rwt.widgets.Menu){this._parentMenu.invalidateMaxCellWidth(a)}this._scheduleLayoutX()},_afterScheduleLayoutX:function(){if(this._parentMenu instanceof org.eclipse.rwt.widgets.Menu){this._parentMenu.scheduleMenuLayout()}},getPreferredCellWidth:function(a){return this._preferredCellWidths[a]},setImage:function(c,b,a){this.setCellContent(1,c);this.setCellHeight(1,a);this._setPreferredCellWidth(1,b)},setText:function(a){this.setCellContent(2,a);this.setCellDimension(2,null,null);this._setPreferredCellWidth(2,this.getCellWidth(2))},_onFontChange:function(){this.setCellDimension(2,null,null);this._setPreferredCellWidth(2,this.getCellWidth(2))},_applyArrow:function(e,b){var c=e?e[0]:null;var d=e?e[1]:13;var a=e?e[2]:0;this.setCellContent(3,c);this.setCellHeight(3,a);this._setPreferredCellWidth(3,d)},_beforeComputeInnerWidth:function(){if(this._parentMenu instanceof org.eclipse.rwt.widgets.Menu){for(var a=0;a<4;a++){this._setCellWidth(a,this._parentMenu.getMaxCellWidth(a))}}},_beforeAppear:function(){arguments.callee.base.call(this);if(this._parentMenu instanceof org.eclipse.rwt.widgets.Menu){this._parentMenu.invalidateAllMaxCellWidths();this._parentMenu.scheduleMenuLayout()}},setHasSelectionListener:function(a){this._hasSelectionListener=a},setSubMenu:function(a){this._subMenu=a},setNoRadioGroup:function(a){if(this.hasState("radio")){this._noRadioGroup=a;this._isDeselectable=a}},getNoRadioGroup:function(){return this._noRadioGroup},execute:function(){arguments.callee.base.call(this);if(this._isSelectable){this.setSelection(!(this._selected&&this._isDeselectable))}this._sendChanges()},setSelection:function(b){if(this._selected!=b||this._selected){this._selected=b;if(this._selected){this.addState($[30])}else{this.removeState($[30])}if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addParameter(c+$[143],this._selected);org.eclipse.swt.EventUtil.addWidgetSelectedModifier()}}},_sendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()&&this._hasSelectionListener){var a=org.eclipse.swt.Request.getInstance();if(this._sendEvent){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);a.addEvent($[61],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier()}a.send()}},_onmouseup:function(a){this.execute()}}});
+qx.Class.define("org.eclipse.rwt.RadioButtonUtil",{statics:{registerExecute:function(a){a.addEventListener($[137],this._onSelection,this)},registerKeypress:function(a){a.addEventListener($[12],this._onKeypress,this)},_onKeypress:function(a){var b=a.getTarget();switch(a.getKeyIdentifier()){case"Left":case"Up":this._setNextOrPrevious(b,"previous");b._sendChanges();a.preventDefault();a.stopPropagation();break;case $[51]:case"Down":this._setNextOrPrevious(b,"next");b._sendChanges();a.preventDefault();a.stopPropagation();break;case"Home":case"End":case $[58]:case $[57]:evt.preventDefault();evt.stopPropagation();break}},_onSelection:function(a){this._unselectSiblings(a.getTarget())},_isRadioElement:function(a){return a.hasState("radio")},_getRadioGroup:function(d){var e=[];if(!d.getNoRadioGroup()){var f=d.getParent().getChildren();var c=f.length;if(d.classname==$[467]){for(var a=0;a<c;a++){if(this._isRadioElement(f[a])){e.push(f[a])}}}else{var b=false;var a=0;while(a<c&&(!b||this._isRadioElement(f[a]))){if(!b){b=f[a]==d}if(this._isRadioElement(f[a])){e.push(f[a])}else{e=[]}a++}}}return e},_setNextOrPrevious:function(e,g){var a=this._getRadioGroup(e);if(a.length>0){var d;for(var c=0;c<a.length;c++){if(a[c]==e){d=c}}var f=d;if(g=="next"){f=d+1;if(f>=a.length){f=0}}if(g=="previous"){f=d-1;if(f<0){f=a.length-1}}var b=a[f];this._unselectSiblings(b);b.setSelection(true);b.setFocused(true)}},_unselectSiblings:function(b){var c=this._getRadioGroup(b);for(var a=0;a<c.length;a++){if(c[a]!=b){c[a].setSelection(false)}}}}});
 qx.Class.define("org.eclipse.rwt.widgets.MenuBar",{extend:qx.ui.layout.HorizontalBoxLayout,construct:function(){arguments.callee.base.call(this);this._hoverItem=null;this._openItem=null;this.addEventListener($[2],this._onMouseDown);this.addEventListener($[9],this._onMouseOver);this.addEventListener($[14],this._onMouseOut)},properties:{appearance:{refine:true,init:"toolbar"}},members:{addMenuItemAt:function(b,a){b.setParentMenu(this);this.addAt(b,a)},_onMouseOver:function(b){var c=b.getTarget();var a=c==this?null:c;this.setHoverItem(a)},_onMouseOut:function(a){var c=a.getTarget();var b=a.getRelatedTarget();if(c==this||!this.contains(b)){this.setHoverItem(null)}},_onMouseDown:function(a){var b=a.getTarget();if(b!=this){this.setOpenItem(b)}},setHoverItem:function(a){if(this._hoverItem!=null&&this._hoverItem!=a){this._hoverItem.removeState("over")}if(a!=null){a.addState("over");if(this._openItem!=null&&this._openItem!=a){this.setOpenItem(a)}}this._hoverItem=a},setOpenItem:function(b){var c=this._openItem;if(c!=null&&c.getMenu()!=null){c.setSubMenuOpen(false);c.getMenu().hide()}if(b!=null&&b!=c&&b.getMenu()!=null){this._openItem=b;b.addState($[21]);var a=b.getMenu();b.setSubMenuOpen(true);a.setOpener(b);var d=b.getElement();a.setTop(qx.bom.element.Location.getTop(d)+qx.html.Dimension.getBoxHeight(d));a.setLeft(qx.bom.element.Location.getLeft(d));a.show()}else{this._openItem=null}},getOpenItem:function(){return this._openItem},setHasMenuListener:function(a){}}});
-qx.Class.define("org.eclipse.rwt.TableDNDFeedback",{extend:qx.core.Object,construct:function(a){arguments.callee.base.call(this);this._table=a;this._feedback=null;this._currentRow=null;this._scrollTimer=null},destruct:function(){this._renderFeedback(this._currentRow,false);if(this._scrollTimer!=null){this._scrollTimer.dispose();this._scrollTimer=null}this._table=null;this._feedback=null;this._currentRow=null},members:{setFeedback:function(a){this._renderFeedback(this._currentRow,false);this._feedback=a;this._renderFeedback(this._currentRow,true)},renderFeedback:function(a){this._renderFeedback(this._currentRow,false);this._renderFeedback(a,true);this._currentRow=a},isFeedbackNode:function(a){return false},_renderFeedback:function(b,a){if(this._feedback!=null&&b!=null){if(this._feedback.select){this._renderFeedbackSelect(b,a)}if(this._feedback[$[26]]){this._renderFeedbackScroll(b,a)}}},_renderFeedbackSelect:function(b,a){if(a){b.addState($[30]);b.removeState($[89])}else{this._table.updateItem(b.getItemIndex(),false);if(!this._table.getFocused()){b.addState($[89])}}},_renderFeedbackScroll:function(b,a){if(a){this._startScrollTimer()}else{this._stopScrollTimer()}},_startScrollTimer:function(){if(this._scrollTimer==null){this._scrollTimer=new qx.client.Timer(250);this._scrollTimer.addEventListener($[50],this._onScrollTimer,this)}this._scrollTimer.setEnabled(true)},_stopScrollTimer:function(){if(this._scrollTimer!=null){this._scrollTimer.stop()}},_getScrollDirection:function(b){var a=0;if(!this._table._isItemFullyVisible(b)){a=1}else{if(b>0&&b<(this._table._itemCount-1)){if(!this._table._isItemFullyVisible(b+1)){a=1}else{if(!this._table._isItemFullyVisible(b-1)){a=-1}}}}return a},_onScrollTimer:function(c){this._stopScrollTimer();var a=this._currentRow.getItemIndex();if(a!=-1){var e=this._getScrollDirection(a);if(e!=0){var d=this._table._topIndex+e;this._table._internalSetTopIndex(d,true);var h=a+e;var g=this._table._getRowIndexFromItemIndex(h);var i=this._table._rows[g];var f=this._currentRow;var b=function(){this._targetUpdateCheck(f,i)};qx.client.Timer.once(b,this,1)}}},_targetUpdateCheck:function(a,b){if(!this.isDisposed()){if(b!=this._currentRow&&a==this._currentRow){var c=org.eclipse.rwt.DNDSupport.getInstance();c.setCurrentTargetWidget(b)}}}}});
-qx.Class.define("org.eclipse.rwt.DNDSupport",{type:$[33],extend:qx.core.Object,construct:function(){arguments.callee.base.call(this);this._dragSources={};this._dropTargets={};this._dropTargetEventQueue={};this._requestScheduled=false;this._currentDragSource=null;this._currentDropTarget=null;this._currentTargetWidget=null;this._currentMousePosition={x:0,y:0};this._actionOverwrite=null;this._dataTypeOverwrite=null;this._dropFeedbackRenderer=null;this._dropFeedbackFlags=0;this._dragFeedbackWidget=null;this._blockDrag=false},members:{registerDragSource:function(b,a){b.addEventListener($[75],this._dragStartHandler,this);b.addEventListener($[292],this._dragEndHandler,this);var c=b.toHashCode();this._dragSources[c]={dataTypes:[],actions:this._operationsToActions(a)}},setDragSourceTransferTypes:function(b,a){var c=b.toHashCode();this._dragSources[c]["dataTypes"]=a},deregisterDragSource:function(a){a.removeEventListener($[75],this._dragStartHandler,this);a.removeEventListener($[292],this._dragEndHandler,this);var b=a.toHashCode();delete this._dragSources[b]},isDragSource:function(a){var b=a.toHashCode();return typeof this._dragSources[b]!=$[8]},_dragStartHandler:function(a){var m=org.eclipse.swt.WidgetManager.getInstance();var g=a.getCurrentTarget();var c=m.findControl(a.getTarget());if(c==g&&!this._blockDrag){var d=g.toHashCode();var j=this._dragSources[d].dataTypes;if(j.length>0){for(var e=0;e<j.length;e++){a.addData(j[e],true)}this._actionOverwrite=null;this._currentDragSource=g;var b=qx.event.handler.DragAndDropHandler.getInstance();b.clearActions();var k=qx.ui.core.ClientDocument.getInstance();k.addEventListener($[9],this._onMouseOver,this);k.addEventListener($[24],this._onKeyEvent,this);k.addEventListener($[60],this._onKeyEvent,this);this.setCurrentTargetWidget(a.getOriginalTarget());var l=org.eclipse.swt.WidgetUtil;l._fakeMouseEvent(this._currentTargetWidget,$[14]);var h=b.__dragCache.sourceWidget;var f=this._getFeedbackWidget(c,h);b.setFeedbackWidget(f,10,20);a.startDrag();a.stopPropagation()}this._sendDragSourceEvent(g,"dragStart",a.getMouseEvent())}},_dragEndHandler:function(b){var c=b.getCurrentTarget();var d=b.getMouseEvent();this._blockDrag=true;if(!this._requestScheduled){var a=org.eclipse.swt.Request.getInstance();a.addEventListener("send",this._onSend,this)}this._sendDragSourceEvent(c,$[527],d);this._cleanUp();b.stopPropagation()},_sendDragSourceEvent:function(c,e,g){var h=org.eclipse.swt.Request.getInstance();var j=org.eclipse.swt.WidgetManager.getInstance();var a=j.findIdByWidget(c);var i=0;var f=0;if(g instanceof qx.event.type.MouseEvent){i=g.getPageX();f=g.getPageY()}var d=$[513]+e;h.addEvent(d,a);h.addParameter(d+".x",i);h.addParameter(d+".y",f);var b=org.eclipse.swt.EventUtil.eventTimestamp();h.addParameter(d+".time",b);h.send()},registerDropTarget:function(b,a){b.addEventListener($[152],this._dragOverHandler,this);b.addEventListener($[270],this._dragMoveHandler,this);b.addEventListener($[311],this._dragOutHandler,this);b.addEventListener($[226],this._dragDropHandler,this);var c=b.toHashCode();this._dropTargets[c]={actions:this._operationsToActions(a)};b.setSupportsDropMethod(qx.lang.Function.returnTrue)},setDropTargetTransferTypes:function(b,a){b.setDropDataTypes(a)},deregisterDropTarget:function(a){a.setDropDataTypes([]);a.removeEventListener($[152],this._dragOverHandler,this);a.removeEventListener($[270],this._dragMoveHandler,this);a.removeEventListener($[311],this._dragOutHandler,this);a.removeEventListener($[226],this._dragDropHandler,this);var b=a.toHashCode();delete this._dropTargets[b];a.setSupportsDropMethod(null)},_dragOverHandler:function(a){var d=a.getCurrentTarget();var c=d.toHashCode();var e=a.getMouseEvent();this._currentDropTarget=d;var b=this._computeCurrentAction(e,d);this._setAction(b,null);this._sendDropTargetEvent(d,$[352],e,b);a.stopPropagation()},_dragMoveHandler:function(a){var c=a.getCurrentTarget();var d=a.getMouseEvent();this._currentMousePosition.x=d.getPageX();this._currentMousePosition.y=d.getPageY();var b=this._computeCurrentAction(d,c);this._setAction(b,d);this._sendDropTargetEvent(c,"dragOver",d,b);a.stopPropagation()},_dragOutHandler:function(b){var c=b.getCurrentTarget();var d=b.getMouseEvent();if(this._currentTargetWidget!==d.getTarget()){this._onMouseOver(d)}var a=qx.event.handler.DragAndDropHandler.getInstance();a.clearActions();this.setFeedback(c,null,0);this._currentDropTarget=null;this._actionOverwrite=null;this._dataTypeOverwrite=null;if(this._isDropTargetEventScheduled($[352])){this._cancelDropTargetEvent($[352]);this._cancelDropTargetEvent("dragOver")}else{this._sendDropTargetEvent(c,"dragLeave",d,"none")}b.stopPropagation()},_dragDropHandler:function(a){var c=a.getCurrentTarget();var d=a.getMouseEvent();var b=this._computeCurrentAction(d,c);this._sendDropTargetEvent(c,"dropAccept",d,b);a.stopPropagation()},_sendDropTargetEvent:function(h,j,n,g){var p=org.eclipse.swt.WidgetManager.getInstance();var c=p.findIdByWidget(h);var q=this._getCurrentItemTarget();var m=q!=null?p.findIdByWidget(q):null;var o=0;var l=0;if(n instanceof qx.event.type.MouseEvent){o=n.getPageX();l=n.getPageY()}else{o=this._currentMousePosition.x;l=this._currentMousePosition.y}var a=p.findIdByWidget(this._currentDragSource);var e=org.eclipse.swt.EventUtil.eventTimestamp();var f=g==$[100]?"link":g;var i=$[513]+j;var b={};b.id=c;b.eventName=i;var d={};d[i+".x"]=o;d[i+".y"]=l;d[i+".item"]=m;d[i+".operation"]=f;d[i+".feedback"]=this._dropFeedbackFlags;d[i+".dataType"]=this._dataTypeOverwrite;d[i+".source"]=a;d[i+".time"]=e;b.param=d;this._dropTargetEventQueue[j]=b;if(!this._requestScheduled){var k=org.eclipse.swt.Request.getInstance();k.addEventListener("send",this._onSend,this);this._requestScheduled=true;qx.client.Timer.once(k.send,k,200)}},_isDropTargetEventScheduled:function(a){return typeof this._dropTargetEventQueue[a]!=$[8]},_cancelDropTargetEvent:function(a){delete this._dropTargetEventQueue[a]},_setPropertyRetroactively:function(g,f,e){var d=org.eclipse.swt.WidgetManager.getInstance();for(var b in this._dropTargetEventQueue){var c=this._dropTargetEventQueue[b];if(c.id==d.findIdByWidget(g)){var a=c.eventName;c.param[a+"."+f]=e}}},_attachTropTargetEvents:function(){var e=org.eclipse.swt.Request.getInstance();var b=this._dropTargetEventQueue;for(var c in b){var d=b[c];e.addEvent(d.eventName,d.id);for(var a in d.param){e.addParameter(a,d.param[a])}}this._dropTargetEventQueue={}},_getCurrentItemTarget:function(){var b=null;var e=this._getCurrentFeedbackTarget();if(e instanceof org.eclipse.swt.widgets.TableRow){var d=this._currentDropTarget;var c=e.getItemIndex();b=d._items[c]}if(e instanceof org.eclipse.rwt.widgets.TreeRow){var a=this._currentDropTarget;b=a._findItemByRow(e)}else{b=e}return b},_setAction:function(d,a){var b=qx.event.handler.DragAndDropHandler.getInstance();var c=b.getCurrentAction();if(c!=d){b.clearActions();b.setAction(d);if(a!=null){this._sendDropTargetEvent(this._currentDropTarget,"dragOperationChanged",a,d)}}},_operationsToActions:function(b){var a={};for(var c=0;c<b.length;c++){var d=b[c]=="link"?$[100]:b[c];a[d]=d!=null}return a},_computeCurrentAction:function(f,g){var j;if(this._actionOverwrite!=null){j=this._actionOverwrite}else{j="move";var b=f.isShiftPressed();var a=f.isCtrlPressed();var d=f.isAltPressed();if(a&&!b&&!d){j="copy"}else{if(d&&!b&&!a){j=$[100]}else{if(!d&&b&&a){j=$[100]}}}var i=g.toHashCode();var e=this._dropTargets[i].actions;var h=this._currentDragSource.toHashCode();var c=this._dragSources[h].actions;if(!c[j]||!e[j]){j="none"}}return j},_createFeedback:function(a){if(this._dropFeedbackRenderer==null){if(a instanceof org.eclipse.rwt.widgets.Tree){this._dropFeedbackRenderer=new org.eclipse.rwt.TreeDNDFeedback(a)}else{if(a instanceof org.eclipse.swt.widgets.Table){this._dropFeedbackRenderer=new org.eclipse.rwt.TableDNDFeedback(a)}}}},_renderFeedback:function(){if(this._dropFeedbackRenderer!=null){var a=this._getCurrentFeedbackTarget();this._dropFeedbackRenderer.renderFeedback(a)}},_getCurrentFeedbackTarget:function(){var a=null;var b=this._currentTargetWidget;if(b instanceof org.eclipse.swt.widgets.TableRow||b instanceof org.eclipse.rwt.widgets.TreeRow){if(this._currentDropTarget&&this._currentDropTarget.contains(b)){a=b}}return a},_getFeedbackWidget:function(c,b){var a=b;var d=false;if(this._dragFeedbackWidget==null){this._dragFeedbackWidget=new org.eclipse.rwt.widgets.MultiCellWidget([$[35],$[82]]);this._dragFeedbackWidget.setOpacity(0.7);this._dragFeedbackWidget.setEnabled(false);this._dragFeedbackWidget.setPadding(2)}while(!d&&a!=c){if(a instanceof org.eclipse.rwt.widgets.TreeRow){d=true;this._configureTreeRowFeedback(a)}else{if(a instanceof org.eclipse.swt.widgets.TableRow){d=true;this.configureTableRowFeedback(a)}}if(!d){a=a.getParent()}}return d?this._dragFeedbackWidget:null},_configureTreeRowFeedback:function(h){var f=this._dragFeedbackWidget;var a=this._currentDragSource;var e=a._findItemByRow(h);if(e!=null){var g=e.getImage(a._treeColumn);if(g!=null){f.setCellContent(0,g);var c=a.getItemImageWidth(e,a._treeColumn);f.setCellDimension(0,c,a.getItemHeight())}var b=e.getCellBackground(a._treeColumn);var d=e.getCellForeground(a._treeColumn);f.setBackgroundColor(b);f.setTextColor(d);f.setCellContent(1,e.getText(a._treeColumn));f.setFont(a.getFont())}},configureTableRowFeedback:function(c){var d=this._dragFeedbackWidget;if(c.getElement().childNodes.length>0){var b=c.getElement();var a=b.childNodes[0];d.setCellContent(1,a.innerHTML);d.setFont(c.getFont());if(a.style.backgroundColor!=""){d.setBackgroundColor(a.style.backgroundColor)}else{d.setBackgroundColor(b.style.backgroundColor)}if(a.style.color!=""){d.setTextColor(a.style.color)}else{d.setTextColor(b.style.color)}}},_resetFeedbackWidget:function(){if(this._dragFeedbackWidget!=null){this._dragFeedbackWidget.setParent(null);this._dragFeedbackWidget.setFont(null);this._dragFeedbackWidget.setCellContent(0,null);this._dragFeedbackWidget.setCellDimension(0,null,null);this._dragFeedbackWidget.setCellContent(1,null);this._dragFeedbackWidget.setBackgroundColor(null)}},_onSend:function(b){this._attachTropTargetEvents();this._requestScheduled=false;this._blockDrag=false;var a=org.eclipse.swt.Request.getInstance();a.removeEventListener("send",this._onSend,this)},_onMouseOver:function(b){var c=b.getTarget();if(this._dropFeedbackRenderer!=null){var a=b.getDomTarget();if(!this._dropFeedbackRenderer.isFeedbackNode(a)){this.setCurrentTargetWidget(c)}}else{this.setCurrentTargetWidget(c)}},setCurrentTargetWidget:function(a){this._currentTargetWidget=a;this._renderFeedback()},_onKeyEvent:function(b){if(b.getType()==$[60]&&b.getKeyIdentifier()=="Alt"){this._sendDragSourceEvent(this._currentDragSource,$[527],b);this.cancel()}else{if(this._currentDropTarget!=null){var a=qx.event.handler.DragAndDropHandler.getInstance();var c=this._computeCurrentAction(b,this._currentDropTarget);this._setAction(c,b);a._renderCursor()}}},_cleanUp:function(){var b=org.eclipse.swt.WidgetUtil;b._fakeMouseEvent(this._currentTargetWidget,$[9]);this.setCurrentTargetWidget(null);if(this._currentDropTarget!=null){this.setFeedback(this._currentDropTarget,null,0);this._currentDropTarget=null}var a=qx.event.handler.DragAndDropHandler.getInstance();a.setFeedbackWidget(null);this._resetFeedbackWidget();this._currentDragSource=null;this._dataTypeOverwrite=null;this._currentMousePosition.x=0;this._currentMousePosition.y=0;var c=qx.ui.core.ClientDocument.getInstance();c.removeEventListener($[9],this._onMouseOver,this);c.removeEventListener($[24],this._onKeyEvent,this);c.removeEventListener($[60],this._onKeyEvent,this)},cancel:function(){if(this._currentDragSource!=null){var a=qx.event.handler.DragAndDropHandler.getInstance();a.globalCancelDrag();this._cleanUp()}},setOperationOverwrite:function(d,a){if(d==this._currentDropTarget){var c=a=="link"?$[100]:a;var b=qx.event.handler.DragAndDropHandler.getInstance();this._actionOverwrite=c;this._setAction(c,null);b._renderCursor()}this._setPropertyRetroactively(d,"operation",a)},setFeedback:function(e,b,a){if(e==this._currentDropTarget){if(b!=null){this._createFeedback(e);if(this._dropFeedbackRenderer!=null){var d={};for(var c=0;c<b.length;c++){d[b[c]]=true}this._dropFeedbackRenderer.setFeedback(d);this._renderFeedback()}}else{if(this._dropFeedbackRenderer!=null){this._dropFeedbackRenderer.dispose();this._dropFeedbackRenderer=null}}this._dropFeedbackFlags=a}},setDataType:function(b,a){if(b==this._currentDropTarget){this._dataTypeOverwrite=a}this._setPropertyRetroactively(b,"dataType",a)}}});
-qx.Class.define("org.eclipse.swt.widgets.TableRow",{extend:qx.ui.embed.HtmlEmbed,construct:function(){arguments.callee.base.call(this);this.setAppearance("table-row");this.setSelectable(false);this._itemIndex=-1;this._variant=null;this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[14],this._onMouseOut,this);this.addEventListener($[84],this._onChangeFont,this);var a={};a.over=true;var d=new org.eclipse.swt.theme.ThemeValues(a);var b=d.getCssColor($[246],$[5]);var c=d.getCssColor($[246],$[6]);this._hasHoverColorsDefined=b!=$[8]||c!=$[8];d.dispose()},destruct:function(){this.removeEventListener($[9],this._onMouseOver,this);this.removeEventListener($[14],this._onMouseOut,this);this.removeEventListener($[84],this._onChangeFont,this)},events:{changeOverState:$[358]},properties:{textDecoration:{check:$[25],nullable:false,init:"",themeable:true,apply:"_applyTextDecoration"}},members:{setLinesVisible:function(a){if(a){this.addState($[154])}else{this.removeState($[154])}},setItemIndex:function(a){if(a!=this._itemIndex){this._itemIndex=a;if(a%2==0){this.addState("even")}else{this.removeState("even")}if(a==-1){this.removeState("over")}}},getItemIndex:function(){return this._itemIndex},setVariant:function(a){if(this._variant!=null&&this._variant!=a){this.removeState(this._variant)}if(a!=null&&a!=this._variant){this.addState(a)}this._variant=a},addState:function(a){var b=this.hasState("over");arguments.callee.base.call(this,a);if(a==="over"&&!b){this.createDispatchChangeEvent($[305],true,false)}},removeState:function(a){var b=this.hasState("over");arguments.callee.base.call(this,a);if(a==="over"&&b){this.createDispatchChangeEvent($[305],false,true)}},hasHoverColorsDefined:function(){return this._hasHoverColorsDefined},_applyTextDecoration:function(b,a){this.setStyleProperty($[379],b==="none"?"":b)},_onChangeFont:function(a){this._applyTextDecoration(this.getTextDecoration())},_onMouseOver:function(a){if(this._itemIndex!=-1){this.addState("over")}},_onMouseOut:function(a){this.removeState("over")},_applyStateStyleFocus:qx.core.Variant.select($[0],{mshtml:function(a){},gecko:function(a){if(a.itemFocused){this.setStyleProperty("MozOutline",$[322])}else{this.removeStyleProperty("MozOutline")}},"default":function(a){if(a.itemFocused){this.setStyleProperty($[120],$[322])}else{this.removeStyleProperty($[120])}}})}});
+qx.Class.define("org.eclipse.rwt.TableDNDFeedback",{extend:qx.core.Object,construct:function(a){arguments.callee.base.call(this);this._table=a;this._feedback=null;this._currentRow=null;this._scrollTimer=null},destruct:function(){this._renderFeedback(this._currentRow,false);if(this._scrollTimer!=null){this._scrollTimer.dispose();this._scrollTimer=null}this._table=null;this._feedback=null;this._currentRow=null},members:{setFeedback:function(a){this._renderFeedback(this._currentRow,false);this._feedback=a;this._renderFeedback(this._currentRow,true)},renderFeedback:function(a){this._renderFeedback(this._currentRow,false);this._renderFeedback(a,true);this._currentRow=a},isFeedbackNode:function(a){return false},_renderFeedback:function(b,a){if(this._feedback!=null&&b!=null){if(this._feedback.select){this._renderFeedbackSelect(b,a)}if(this._feedback[$[26]]){this._renderFeedbackScroll(b,a)}}},_renderFeedbackSelect:function(b,a){if(a){b.addState($[30]);b.removeState($[87])}else{this._table.updateItem(b.getItemIndex(),false);if(!this._table.getFocused()){b.addState($[87])}}},_renderFeedbackScroll:function(b,a){if(a){this._startScrollTimer()}else{this._stopScrollTimer()}},_startScrollTimer:function(){if(this._scrollTimer==null){this._scrollTimer=new qx.client.Timer(250);this._scrollTimer.addEventListener($[49],this._onScrollTimer,this)}this._scrollTimer.setEnabled(true)},_stopScrollTimer:function(){if(this._scrollTimer!=null){this._scrollTimer.stop()}},_getScrollDirection:function(b){var a=0;if(!this._table._isItemFullyVisible(b)){a=1}else{if(b>0&&b<(this._table._itemCount-1)){if(!this._table._isItemFullyVisible(b+1)){a=1}else{if(!this._table._isItemFullyVisible(b-1)){a=-1}}}}return a},_onScrollTimer:function(c){this._stopScrollTimer();var a=this._currentRow.getItemIndex();if(a!=-1){var e=this._getScrollDirection(a);if(e!=0){var d=this._table._topIndex+e;this._table._internalSetTopIndex(d,true);var h=a+e;var g=this._table._getRowIndexFromItemIndex(h);var i=this._table._rows[g];var f=this._currentRow;var b=function(){this._targetUpdateCheck(f,i)};qx.client.Timer.once(b,this,1)}}},_targetUpdateCheck:function(a,b){if(!this.isDisposed()){if(b!=this._currentRow&&a==this._currentRow){var c=org.eclipse.rwt.DNDSupport.getInstance();c.setCurrentTargetWidget(b)}}}}});
+qx.Class.define("org.eclipse.rwt.DNDSupport",{type:$[33],extend:qx.core.Object,construct:function(){arguments.callee.base.call(this);this._dragSources={};this._dropTargets={};this._dropTargetEventQueue={};this._requestScheduled=false;this._currentDragSource=null;this._currentDropTarget=null;this._currentTargetWidget=null;this._currentMousePosition={x:0,y:0};this._actionOverwrite=null;this._dataTypeOverwrite=null;this._dropFeedbackRenderer=null;this._dropFeedbackFlags=0;this._dragFeedbackWidget=null;this._blockDrag=false},members:{registerDragSource:function(b,a){b.addEventListener($[72],this._dragStartHandler,this);b.addEventListener($[289],this._dragEndHandler,this);var c=b.toHashCode();this._dragSources[c]={dataTypes:[],actions:this._operationsToActions(a)}},setDragSourceTransferTypes:function(b,a){var c=b.toHashCode();this._dragSources[c]["dataTypes"]=a},deregisterDragSource:function(a){a.removeEventListener($[72],this._dragStartHandler,this);a.removeEventListener($[289],this._dragEndHandler,this);var b=a.toHashCode();delete this._dragSources[b]},isDragSource:function(a){var b=a.toHashCode();return typeof this._dragSources[b]!=$[8]},_dragStartHandler:function(a){var m=org.eclipse.swt.WidgetManager.getInstance();var g=a.getCurrentTarget();var c=m.findControl(a.getTarget());if(c==g&&!this._blockDrag){var d=g.toHashCode();var j=this._dragSources[d].dataTypes;if(j.length>0){for(var e=0;e<j.length;e++){a.addData(j[e],true)}this._actionOverwrite=null;this._currentDragSource=g;var b=qx.event.handler.DragAndDropHandler.getInstance();b.clearActions();var k=qx.ui.core.ClientDocument.getInstance();k.addEventListener($[9],this._onMouseOver,this);k.addEventListener($[23],this._onKeyEvent,this);k.addEventListener($[60],this._onKeyEvent,this);this.setCurrentTargetWidget(a.getOriginalTarget());var l=org.eclipse.swt.WidgetUtil;l._fakeMouseEvent(this._currentTargetWidget,$[14]);var h=b.__dragCache.sourceWidget;var f=this._getFeedbackWidget(c,h);b.setFeedbackWidget(f,10,20);a.startDrag();a.stopPropagation()}this._sendDragSourceEvent(g,"dragStart",a.getMouseEvent())}},_dragEndHandler:function(b){var c=b.getCurrentTarget();var d=b.getMouseEvent();this._blockDrag=true;if(!this._requestScheduled){var a=org.eclipse.swt.Request.getInstance();a.addEventListener("send",this._onSend,this)}this._sendDragSourceEvent(c,$[561],d);this._cleanUp();b.stopPropagation()},_sendDragSourceEvent:function(c,e,g){var h=org.eclipse.swt.Request.getInstance();var j=org.eclipse.swt.WidgetManager.getInstance();var a=j.findIdByWidget(c);var i=0;var f=0;if(g instanceof qx.event.type.MouseEvent){i=g.getPageX();f=g.getPageY()}var d=$[405]+e;h.addEvent(d,a);h.addParameter(d+".x",i);h.addParameter(d+".y",f);var b=org.eclipse.swt.EventUtil.eventTimestamp();h.addParameter(d+".time",b);h.send()},registerDropTarget:function(b,a){b.addEventListener($[138],this._dragOverHandler,this);b.addEventListener($[267],this._dragMoveHandler,this);b.addEventListener($[292],this._dragOutHandler,this);b.addEventListener($[244],this._dragDropHandler,this);var c=b.toHashCode();this._dropTargets[c]={actions:this._operationsToActions(a)};b.setSupportsDropMethod(qx.lang.Function.returnTrue)},setDropTargetTransferTypes:function(b,a){b.setDropDataTypes(a)},deregisterDropTarget:function(a){a.setDropDataTypes([]);a.removeEventListener($[138],this._dragOverHandler,this);a.removeEventListener($[267],this._dragMoveHandler,this);a.removeEventListener($[292],this._dragOutHandler,this);a.removeEventListener($[244],this._dragDropHandler,this);var b=a.toHashCode();delete this._dropTargets[b];a.setSupportsDropMethod(null)},_dragOverHandler:function(a){var d=a.getCurrentTarget();var c=d.toHashCode();var e=a.getMouseEvent();this._currentDropTarget=d;var b=this._computeCurrentAction(e,d);this._setAction(b,null);this._sendDropTargetEvent(d,$[362],e,b);a.stopPropagation()},_dragMoveHandler:function(a){var c=a.getCurrentTarget();var d=a.getMouseEvent();this._currentMousePosition.x=d.getPageX();this._currentMousePosition.y=d.getPageY();var b=this._computeCurrentAction(d,c);this._setAction(b,d);this._sendDropTargetEvent(c,"dragOver",d,b);a.stopPropagation()},_dragOutHandler:function(b){var c=b.getCurrentTarget();var d=b.getMouseEvent();if(this._currentTargetWidget!==d.getTarget()){this._onMouseOver(d)}var a=qx.event.handler.DragAndDropHandler.getInstance();a.clearActions();this.setFeedback(c,null,0);this._currentDropTarget=null;this._actionOverwrite=null;this._dataTypeOverwrite=null;if(this._isDropTargetEventScheduled($[362])){this._cancelDropTargetEvent($[362]);this._cancelDropTargetEvent("dragOver")}else{this._sendDropTargetEvent(c,"dragLeave",d,"none")}b.stopPropagation()},_dragDropHandler:function(a){var c=a.getCurrentTarget();var d=a.getMouseEvent();var b=this._computeCurrentAction(d,c);this._sendDropTargetEvent(c,"dropAccept",d,b);a.stopPropagation()},_sendDropTargetEvent:function(h,j,n,g){var p=org.eclipse.swt.WidgetManager.getInstance();var c=p.findIdByWidget(h);var q=this._getCurrentItemTarget();var m=q!=null?p.findIdByWidget(q):null;var o=0;var l=0;if(n instanceof qx.event.type.MouseEvent){o=n.getPageX();l=n.getPageY()}else{o=this._currentMousePosition.x;l=this._currentMousePosition.y}var a=p.findIdByWidget(this._currentDragSource);var e=org.eclipse.swt.EventUtil.eventTimestamp();var f=g==$[109]?"link":g;var i=$[405]+j;var b={};b.id=c;b.eventName=i;var d={};d[i+".x"]=o;d[i+".y"]=l;d[i+".item"]=m;d[i+".operation"]=f;d[i+".feedback"]=this._dropFeedbackFlags;d[i+".dataType"]=this._dataTypeOverwrite;d[i+".source"]=a;d[i+".time"]=e;b.param=d;this._dropTargetEventQueue[j]=b;if(!this._requestScheduled){var k=org.eclipse.swt.Request.getInstance();k.addEventListener("send",this._onSend,this);this._requestScheduled=true;qx.client.Timer.once(k.send,k,200)}},_isDropTargetEventScheduled:function(a){return typeof this._dropTargetEventQueue[a]!=$[8]},_cancelDropTargetEvent:function(a){delete this._dropTargetEventQueue[a]},_setPropertyRetroactively:function(g,f,e){var d=org.eclipse.swt.WidgetManager.getInstance();for(var b in this._dropTargetEventQueue){var c=this._dropTargetEventQueue[b];if(c.id==d.findIdByWidget(g)){var a=c.eventName;c.param[a+"."+f]=e}}},_attachTropTargetEvents:function(){var e=org.eclipse.swt.Request.getInstance();var b=this._dropTargetEventQueue;for(var c in b){var d=b[c];e.addEvent(d.eventName,d.id);for(var a in d.param){e.addParameter(a,d.param[a])}}this._dropTargetEventQueue={}},_getCurrentItemTarget:function(){var b=null;var e=this._getCurrentFeedbackTarget();if(e instanceof org.eclipse.swt.widgets.TableRow){var d=this._currentDropTarget;var c=e.getItemIndex();b=d._items[c]}if(e instanceof org.eclipse.rwt.widgets.TreeRow){var a=this._currentDropTarget;b=a._findItemByRow(e)}else{b=e}return b},_setAction:function(d,a){var b=qx.event.handler.DragAndDropHandler.getInstance();var c=b.getCurrentAction();if(c!=d){b.clearActions();b.setAction(d);if(a!=null){this._sendDropTargetEvent(this._currentDropTarget,"dragOperationChanged",a,d)}}},_operationsToActions:function(b){var a={};for(var c=0;c<b.length;c++){var d=b[c]=="link"?$[109]:b[c];a[d]=d!=null}return a},_computeCurrentAction:function(f,g){var j;if(this._actionOverwrite!=null){j=this._actionOverwrite}else{j="move";var b=f.isShiftPressed();var a=f.isCtrlPressed();var d=f.isAltPressed();if(a&&!b&&!d){j="copy"}else{if(d&&!b&&!a){j=$[109]}else{if(!d&&b&&a){j=$[109]}}}var i=g.toHashCode();var e=this._dropTargets[i].actions;var h=this._currentDragSource.toHashCode();var c=this._dragSources[h].actions;if(!c[j]||!e[j]){j="none"}}return j},_createFeedback:function(a){if(this._dropFeedbackRenderer==null){if(a instanceof org.eclipse.rwt.widgets.Tree){this._dropFeedbackRenderer=new org.eclipse.rwt.TreeDNDFeedback(a)}else{if(a instanceof org.eclipse.swt.widgets.Table){this._dropFeedbackRenderer=new org.eclipse.rwt.TableDNDFeedback(a)}}}},_renderFeedback:function(){if(this._dropFeedbackRenderer!=null){var a=this._getCurrentFeedbackTarget();this._dropFeedbackRenderer.renderFeedback(a)}},_getCurrentFeedbackTarget:function(){var a=null;var b=this._currentTargetWidget;if(b instanceof org.eclipse.swt.widgets.TableRow||b instanceof org.eclipse.rwt.widgets.TreeRow){if(this._currentDropTarget&&this._currentDropTarget.contains(b)){a=b}}return a},_getFeedbackWidget:function(c,b){var a=b;var d=false;if(this._dragFeedbackWidget==null){this._dragFeedbackWidget=new org.eclipse.rwt.widgets.MultiCellWidget([$[35],$[85]]);this._dragFeedbackWidget.setOpacity(0.7);this._dragFeedbackWidget.setEnabled(false);this._dragFeedbackWidget.setPadding(2)}while(!d&&a!=c){if(a instanceof org.eclipse.rwt.widgets.TreeRow){d=true;this._configureTreeRowFeedback(a)}else{if(a instanceof org.eclipse.swt.widgets.TableRow){d=true;this.configureTableRowFeedback(a)}}if(!d){a=a.getParent()}}return d?this._dragFeedbackWidget:null},_configureTreeRowFeedback:function(h){var f=this._dragFeedbackWidget;var a=this._currentDragSource;var e=a._findItemByRow(h);if(e!=null){var g=e.getImage(a._treeColumn);if(g!=null){f.setCellContent(0,g);var c=a.getItemImageWidth(e,a._treeColumn);f.setCellDimension(0,c,a.getItemHeight())}var b=e.getCellBackground(a._treeColumn);var d=e.getCellForeground(a._treeColumn);f.setBackgroundColor(b);f.setTextColor(d);f.setCellContent(1,e.getText(a._treeColumn));f.setFont(a.getFont())}},configureTableRowFeedback:function(c){var d=this._dragFeedbackWidget;if(c.getElement().childNodes.length>0){var b=c.getElement();var a=b.childNodes[0];d.setCellContent(1,a.innerHTML);d.setFont(c.getFont());if(a.style.backgroundColor!=""){d.setBackgroundColor(a.style.backgroundColor)}else{d.setBackgroundColor(b.style.backgroundColor)}if(a.style.color!=""){d.setTextColor(a.style.color)}else{d.setTextColor(b.style.color)}}},_resetFeedbackWidget:function(){if(this._dragFeedbackWidget!=null){this._dragFeedbackWidget.setParent(null);this._dragFeedbackWidget.setFont(null);this._dragFeedbackWidget.setCellContent(0,null);this._dragFeedbackWidget.setCellDimension(0,null,null);this._dragFeedbackWidget.setCellContent(1,null);this._dragFeedbackWidget.setBackgroundColor(null)}},_onSend:function(b){this._attachTropTargetEvents();this._requestScheduled=false;this._blockDrag=false;var a=org.eclipse.swt.Request.getInstance();a.removeEventListener("send",this._onSend,this)},_onMouseOver:function(b){var c=b.getTarget();if(this._dropFeedbackRenderer!=null){var a=b.getDomTarget();if(!this._dropFeedbackRenderer.isFeedbackNode(a)){this.setCurrentTargetWidget(c)}}else{this.setCurrentTargetWidget(c)}},setCurrentTargetWidget:function(a){this._currentTargetWidget=a;this._renderFeedback()},_onKeyEvent:function(b){if(b.getType()==$[60]&&b.getKeyIdentifier()=="Alt"){this._sendDragSourceEvent(this._currentDragSource,$[561],b);this.cancel()}else{if(this._currentDropTarget!=null){var a=qx.event.handler.DragAndDropHandler.getInstance();var c=this._computeCurrentAction(b,this._currentDropTarget);this._setAction(c,b);a._renderCursor()}}},_cleanUp:function(){var b=org.eclipse.swt.WidgetUtil;b._fakeMouseEvent(this._currentTargetWidget,$[9]);this.setCurrentTargetWidget(null);if(this._currentDropTarget!=null){this.setFeedback(this._currentDropTarget,null,0);this._currentDropTarget=null}var a=qx.event.handler.DragAndDropHandler.getInstance();a.setFeedbackWidget(null);this._resetFeedbackWidget();this._currentDragSource=null;this._dataTypeOverwrite=null;this._currentMousePosition.x=0;this._currentMousePosition.y=0;var c=qx.ui.core.ClientDocument.getInstance();c.removeEventListener($[9],this._onMouseOver,this);c.removeEventListener($[23],this._onKeyEvent,this);c.removeEventListener($[60],this._onKeyEvent,this)},cancel:function(){if(this._currentDragSource!=null){var a=qx.event.handler.DragAndDropHandler.getInstance();a.globalCancelDrag();this._cleanUp()}},setOperationOverwrite:function(d,a){if(d==this._currentDropTarget){var c=a=="link"?$[109]:a;var b=qx.event.handler.DragAndDropHandler.getInstance();this._actionOverwrite=c;this._setAction(c,null);b._renderCursor()}this._setPropertyRetroactively(d,"operation",a)},setFeedback:function(e,b,a){if(e==this._currentDropTarget){if(b!=null){this._createFeedback(e);if(this._dropFeedbackRenderer!=null){var d={};for(var c=0;c<b.length;c++){d[b[c]]=true}this._dropFeedbackRenderer.setFeedback(d);this._renderFeedback()}}else{if(this._dropFeedbackRenderer!=null){this._dropFeedbackRenderer.dispose();this._dropFeedbackRenderer=null}}this._dropFeedbackFlags=a}},setDataType:function(b,a){if(b==this._currentDropTarget){this._dataTypeOverwrite=a}this._setPropertyRetroactively(b,"dataType",a)}}});
+qx.Class.define("org.eclipse.swt.widgets.TableRow",{extend:qx.ui.embed.HtmlEmbed,construct:function(){arguments.callee.base.call(this);this.setAppearance("table-row");this.setSelectable(false);this._itemIndex=-1;this._variant=null;this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[14],this._onMouseOut,this);this.addEventListener($[83],this._onChangeFont,this);var a={};a.over=true;var d=new org.eclipse.swt.theme.ThemeValues(a);var b=d.getCssColor($[240],$[5]);var c=d.getCssColor($[240],$[6]);this._hasHoverColorsDefined=b!=$[8]||c!=$[8];d.dispose()},destruct:function(){this.removeEventListener($[9],this._onMouseOver,this);this.removeEventListener($[14],this._onMouseOut,this);this.removeEventListener($[83],this._onChangeFont,this)},events:{changeOverState:$[399]},properties:{textDecoration:{check:$[25],nullable:false,init:"",themeable:true,apply:"_applyTextDecoration"}},members:{setLinesVisible:function(a){if(a){this.addState($[179])}else{this.removeState($[179])}},setItemIndex:function(a){if(a!=this._itemIndex){this._itemIndex=a;if(a%2==0){this.addState("even")}else{this.removeState("even")}if(a==-1){this.removeState("over")}}},getItemIndex:function(){return this._itemIndex},setVariant:function(a){if(this._variant!=null&&this._variant!=a){this.removeState(this._variant)}if(a!=null&&a!=this._variant){this.addState(a)}this._variant=a},addState:function(a){var b=this.hasState("over");arguments.callee.base.call(this,a);if(a==="over"&&!b){this.createDispatchChangeEvent($[303],true,false)}},removeState:function(a){var b=this.hasState("over");arguments.callee.base.call(this,a);if(a==="over"&&b){this.createDispatchChangeEvent($[303],false,true)}},hasHoverColorsDefined:function(){return this._hasHoverColorsDefined},_applyTextDecoration:function(b,a){this.setStyleProperty($[331],b==="none"?"":b)},_onChangeFont:function(a){this._applyTextDecoration(this.getTextDecoration())},_onMouseOver:function(a){if(this._itemIndex!=-1){this.addState("over")}},_onMouseOut:function(a){this.removeState("over")},_applyStateStyleFocus:qx.core.Variant.select($[0],{mshtml:function(a){},gecko:function(a){if(a.itemFocused){this.setStyleProperty("MozOutline",$[358])}else{this.removeStyleProperty("MozOutline")}},"default":function(a){if(a.itemFocused){this.setStyleProperty($[115],$[358])}else{this.removeStyleProperty($[115])}}})}});
 qx.Class.define("org.eclipse.swt.theme.ThemeValues",{extend:qx.core.Object,construct:function(a){if(a===undefined){throw new Error("no states given")}this._states=a;this._store=org.eclipse.swt.theme.ThemeStore.getInstance()},statics:{NONE_IMAGE:null,NONE_IMAGE_SIZED:[null,0,0]},members:{getCssBorder:function(b,a){return this._store.getBorder(b,this._states,a)},getCssNamedBorder:function(a){return this._store.getNamedBorder(a)},getCssColor:function(b,a){return this._store.getColor(b,this._states,a)},getCssNamedColor:function(a){return this._store.getNamedColor(a)},getCssFont:function(b,a){return this._store.getFont(b,this._states,a)},getCssDimension:function(b,a){return this._store.getDimension(b,this._states,a)},getCssBoxDimensions:function(b,a){return this._store.getBoxDimensions(b,this._states,a)},getCssBoolean:function(b,a){return this._store.getBoolean(b,this._states,a)},getCssFloat:function(b,a){return this._store.getFloat(b,this._states,a)},getCssIdentifier:function(b,a){return this._store.getIdentifier(b,this._states,a)},getCssImage:function(b,a){return this._store.getImage(b,this._states,a)},getCssSizedImage:function(b,a){return this._store.getSizedImage(b,this._states,a)},getCssGradient:function(b,a){return this._store.getGradient(b,this._states,a)},getCssCursor:function(b,a){return this._store.getCursor(b,this._states,a)},getCssAnimation:function(b,a){return this._store.getAnimation(b,this._states,a)},getCssShadow:function(b,a){return this._store.getShadow(b,this._states,a)}}});
-qx.Class.define("org.eclipse.rwt.widgets.Tree",{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this._rootItem=new org.eclipse.rwt.widgets.TreeItem();this._rootItem.setExpanded(true);this._hasCheckBoxes=false;this._hasFullSelection=false;this._isVirtual=false;this._hasMultiSelection=false;this._topItem=null;this._leadItem=null;this._topItemIndex=0;this._selection=[];this._focusItem=null;this._hoverItem=null;this._hoverElement=null;this._renderQueue={};this._resizeLine=null;this._linesVisible=false;this._selectionTimestamp=null;this._delayedSelection=false;this._headerHeight=0;this._itemHeight=16;this._checkBoxLeft=null;this._checkBoxWidth=null;this._hasSelectionListeners=false;this._selectionPadding=null;this._alignment=[];this._itemLeft=[];this._itemWidth=[];this._itemImageLeft=[];this._itemImageWidth=[];this._itemTextLeft=[];this._itemTextWidth=[];this._indentionWidth=16;this._columnCount=0;this._treeColumn=0;this._mergeEventsTimer=new qx.client.Timer(50);this._sendRequestTimer=null;this._vertGridBorder=null;this._horzGridBorder=null;this._clientArea=new qx.ui.layout.VerticalBoxLayout();this._columnArea=new qx.ui.layout.CanvasLayout();this._dummyColumn=new qx.ui.basic.Atom();this._horzScrollBar=new org.eclipse.rwt.widgets.ScrollBar(true);this._vertScrollBar=new org.eclipse.rwt.widgets.ScrollBar(false);this._hasScrollBarsSelectionListener=false;this._rows=this._clientArea.getChildren();this._vertGridLines=[];this.add(this._columnArea);this.add(this._clientArea);this.add(this._horzScrollBar);this.add(this._vertScrollBar);this._cellToolTip=null;this.setCursor($[39]);this.setOverflow($[17]);this.setAppearance("tree");this._configureAreas();this._configureScrollBars();this._registerListeners()},destruct:function(){this._rootItem.removeEventListener("update",this._onItemUpdate,this);this._rootItem.dispose();this._rootItem=null;if(this._sendRequestTimer!=null){this._sendRequestTimer.dispose();this._sendRequestTimer=null}this._mergeEventsTimer.dispose();this._mergeEventsTimer=null;this._dummyColumn=null;this._clientArea=null;this._columnArea=null;this._horzScrollBar=null;this._vertScrollBar=null;this._rows=null;this._topItem=null;this._leadItem=null;this._focusItem=null;this._hoverItem=null;this._hoverElement=null;this._resizeLine=null;if(this._cellToolTip){this._cellToolTip.destroy();this._cellToolTip=null}},members:{_registerListeners:function(){this._rootItem.addEventListener("update",this._onItemUpdate,this);this.addEventListener($[282],this._scheduleUpdate,this);this.addEventListener($[84],this._scheduleUpdate,this);this.addEventListener($[132],this._scheduleUpdate,this);this.addEventListener($[2],this._onMouseDown,this);this.addEventListener($[15],this._onMouseUp,this);this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[14],this._onMouseOut,this);this.addEventListener($[264],this._onElementChange,this);this.addEventListener("elementOut",this._onElementChange,this);this.addEventListener($[12],this._onKeyPress,this);this._clientArea.addEventListener($[56],this._onClientAreaMouseWheel,this);this._mergeEventsTimer.addEventListener($[50],this._updateTopItemIndex,this);this._horzScrollBar.addEventListener($[80],this._onHorzScrollBarChangeValue,this);this._vertScrollBar.addEventListener($[80],this._onVertScrollBarChangeValue,this)},_configureScrollBars:function(){var a=function(b){b.stopPropagation()};this._horzScrollBar.setZIndex(100000000);this._horzScrollBar.setVisibility(false);this._horzScrollBar.setLeft(0);this._horzScrollBar.setMergeEvents(false);this._horzScrollBar.addEventListener($[75],a);this._vertScrollBar.setZIndex(100000000);this._vertScrollBar.setVisibility(false);this._vertScrollBar.setIncrement(16);this._vertScrollBar.setMergeEvents(false);this._vertScrollBar.addEventListener($[75],a)},_configureAreas:function(){this._clientArea.setOverflow($[17]);this._clientArea.addEventListener($[31],this._onClientAreaAppear,this);this._columnArea.setOverflow($[17]);this._columnArea.addEventListener($[31],this._onColumnAreaAppear,this);this._columnArea.setTop(0);this._columnArea.setLeft(0);this._columnArea.setDisplay(false);var a=function(b){b.stopPropagation()};this._columnArea.addEventListener($[75],a);this._dummyColumn.setAppearance($[393]);this._dummyColumn.setHeight("100%");this._dummyColumn.setLabel("&nbsp;");this._dummyColumn.addState("dummy");this._columnArea.add(this._dummyColumn)},_createSendRequestTimer:function(){if(this._sendRequestTimer===null){var b=new qx.client.Timer(400);var a=org.eclipse.swt.Request.getInstance();b.addEventListener($[50],a.send,a);a.addEventListener("send",b.stop,b);this._sendRequestTimer=b}},setCheckBoxMetrics:function(b,a){this._checkBoxLeft=b;this._checkBoxWidth=a},setHasCheckBoxes:function(a){this._hasCheckBoxes=a},setHasFullSelection:function(a){this._hasFullSelection=a},setHasMultiSelection:function(a){this._hasMultiSelection=a},setHasNoScroll:function(a){if(a){this._clientArea.removeEventListener($[56],this._onClientAreaMouseWheel,this)}},setIndentionWidth:function(a){this._indentionWidth=a},setSelectionPadding:function(b,a){this._selectionPadding=[b,a]},setIsVirtual:function(a){this._isVirtual=a;if(a){this._createSendRequestTimer()}},setItemCount:function(a){this._rootItem.setItemCount(a)},setHeaderVisible:function(a){this._columnArea.setDisplay(a);this._layoutX();this._layoutY();this._scheduleUpdate(true)},setHeaderHeight:function(a){this._headerHeight=a;this._layoutX();this._layoutY();this._scheduleUpdate(true)},setItemHeight:function(a){this._itemHeight=a;this._vertScrollBar.setIncrement(a);for(var b=0;b<this._rows.length;b++){this._rows[b].setHeight(a)}this._scheduleUpdate(true,true)},setColumnCount:function(a){this._columnCount=a;this._scheduleUpdate();this._updateScrollWidth();this._renderGridVertical()},setItemMetrics:function(e,f,d,b,c,a,g){this._itemLeft[e]=f;this._itemWidth[e]=d;this._itemImageLeft[e]=b;this._itemImageWidth[e]=c;this._itemTextLeft[e]=a;this._itemTextWidth[e]=g;this._scheduleUpdate();this._renderGridVertical();this._updateScrollWidth()},setTreeColumn:function(a){this._treeColumn=a},setTopItemIndex:function(a){this._updateScrollHeight();this._vertScrollBar.setValue(a*this._itemHeight)},setScrollLeft:function(a){this._horzScrollBar.setValue(a)},selectItem:function(a){this._selectItem(a,false);this._scheduleItemUpdate(a)},deselectItem:function(a){this._deselectItem(a,false);this._scheduleItemUpdate(a)},setFocusItem:function(a){this._focusItem=a},setScrollBarsVisible:function(b,a){if(!b){this._horzScrollBar.setValue(0)}this._horzScrollBar.setVisibility(b);if(!a){this._vertScrollBar.setValue(0)}this._vertScrollBar.setVisibility(a);this._layoutX();this._layoutY()},setHasSelectionListeners:function(a){this._hasSelectionListeners=a},setAlignment:function(a,b){this._alignment[a]=b;this._scheduleUpdate()},setLinesVisible:function(b){this._linesVisible=b;if(b){this.addState($[154])}else{this.removeState($[154])}for(var a=0;a<this._rows.length;a++){this._rows[a].updateGridlinesState(b)}this._scheduleUpdate();this._renderGridHorizontal();this._renderGridVertical()},hasNoColumns:function(){return this._columnCount===0},getSelectionPadding:function(){return this._selectionPadding},getItemHeight:function(){return this._itemHeight},getLinesVisible:function(){return this._linesVisible},getItemLeft:function(c,b,d){var a=this._itemLeft[b];if(d&&this.isTreeColumn(b)){a=this._correctOffset(a,c)}return a},getItemWidth:function(c,b,d){var a=this._itemWidth[b];if(d&&this.isTreeColumn(b)){a-=this.getIndentionOffset(1)}return a},getItemImageLeft:function(c,b){var a=this._itemImageLeft[b];if(this.isTreeColumn(b)){a=this._correctOffset(a,c)}return a},getItemImageWidth:function(c,b){var a=this._itemImageWidth[b];if(this.isTreeColumn(b)){var d=this.getItemImageLeft(c,b);a=this._correctWidth(a,d,c,b)}return a},getItemTextLeft:function(c,b){var a=this._itemTextLeft[b];if(this.isTreeColumn(b)){a=this._correctOffset(a,c)}return a},getItemTextWidth:function(c,b){var a=this._itemTextWidth[b];if(this.isTreeColumn(b)){var d=this.getItemTextLeft(c,b);a=this._correctWidth(a,d,c,b)}return a},getIndentionOffset:function(a){return this._indentionWidth*a},getHasCheckBoxes:function(){return this._hasCheckBoxes},getHasFullSelection:function(){return this._hasFullSelection},getHasMultiSelection:function(){return this._hasMultiSelection},getIsVirtual:function(){return this._isVirtual},getCheckBoxLeft:function(a){return this._correctOffset(this._checkBoxLeft,a)},getCheckBoxWidth:function(b){var a=this._checkBoxWidth;var c=this.getCheckBoxLeft(b);return this._correctWidth(a,c,b,0)},getColumnCount:function(){return Math.max(1,this._columnCount)},getColumns:function(){return this._columnArea.getChildren().slice(1)},getRootItem:function(){return this._rootItem},isTreeColumn:function(a){return a===this._treeColumn},getTreeColumnWidth:function(){return this._itemWidth[this._treeColumn]},isFocusItem:function(a){return this._focusItem===a},isHoverItem:function(a){return this._hoverItem===a},isHoverElement:function(a){return a!==null&&this._hoverElement===a},isItemSelected:function(a){return this._selection.indexOf(a)!=-1},getAlignment:function(a){return this._alignment[a]?this._alignment[a]:"left"},getStatesCopy:function(){if(!this.__states){this.__states={}}var b={};for(var a in this.__states){b[a]=true}return b},_addColumn:function(a){a.setHeight("100%");a.addEventListener($[57],this._updateScrollWidth,this);this._hookColumnMove(a);this._columnArea.add(a)},_hookColumnMove:function(a){a.addEventListener($[145],this._updateScrollWidth,this)},_unhookColumnMove:function(a){a.removeEventListener($[145],this._updateScrollWidth,this)},_removeColumn:function(a){this._unhookColumnMove(a);a.removeEventListener($[57],this._updateScrollWidth,this);this._columnArea.remove(a);this._updateScrollWidth();this._updateRows()},_onColumnChangeSize:function(a){this._updateScrollWidth()},_showResizeLine:function(b){if(this._resizeLine===null){this._resizeLine=new qx.ui.basic.Terminator();this._resizeLine.setAppearance($[411]);this.add(this._resizeLine);qx.ui.core.Widget.flushGlobalQueues()}var d=this._clientArea.getTop();this._resizeLine._renderRuntimeTop(d);var c=b-2-this._horzScrollBar.getValue();this._resizeLine._renderRuntimeLeft(c);var a=this._clientArea.getHeight();this._resizeLine._renderRuntimeHeight(a);this._resizeLine.removeStyleProperty($[115])},_hideResizeLine:function(){this._resizeLine.setStyleProperty($[115],$[17])},_onItemUpdate:function(b){var a=b.getTarget();if(b.getData()===$[312]){if(this._isChildOf(this._focusItem,a)){this.setFocusItem(a)}}if(b.getData()===$[247]){this._topItem=null;this.addToQueue($[562])}this._sendItemChange(a,b);this._renderItemChange(a,b)},_onVertScrollBarChangeValue:function(){if(this._vertScrollBar._internalValueChange){this._mergeEventsTimer.start()}else{this._updateTopItemIndex()}},_updateTopItemIndex:function(){this._mergeEventsTimer.stop();var a=this._vertScrollBar.getValue();var b=this._topItemIndex;this._topItemIndex=Math.ceil(a/this._itemHeight);this._updateTopItem(b);if(this._inServerResponse()){this._updateRowsEvenState();this._scheduleUpdate()}else{this._sendTopItemIndexChange();this._scrollContentVertical(b)}},_updateRowsEvenState:function(){for(var a=0;a<this._rows.length;a++){this._rows[a].updateEvenState(this._topItemIndex+a)}},_onHorzScrollBarChangeValue:function(){if(this._clientArea.isSeeable()){this._clientArea.setScrollLeft(this._horzScrollBar.getValue())}if(this._columnArea.isSeeable()){this._columnArea.setScrollLeft(this._horzScrollBar.getValue())}this._renderGridVertical();this._sendScrollLeftChange()},_onMouseDown:function(a){this._delayedSelection=false;var b=a.getOriginalTarget();if(b instanceof org.eclipse.rwt.widgets.TreeRow){this._onRowMouseDown(b,a)}},_onMouseUp:function(a){if(this._delayedSelection){this._onMouseDown(a)}},_onRowMouseDown:function(d,c){var b=this._findItemByRow(d);if(b!=null){if(d.isExpandSymbolTarget(c)&&b.hasChildren()){var a=!b.isExpanded();if(!a){this._deselectVisibleChildren(b)}b.setExpanded(a)}else{if(d.isCheckBoxTarget(c)){b.setChecked(!b.isChecked());this._sendItemCheckedChange(b)}else{if(d.isSelectionClick(c)){this._onSelectionClick(c,b)}}}}},_onSelectionClick:function(b,a){var c=this._isDoubleClicked(b,a);if(c){this._sendSelectionEvent(a,true,null)}else{if(this._hasMultiSelection){if(!this._delayMultiSelect(b,a)){this._multiSelectItem(b,a)}}else{this._singleSelectItem(a)}}},_delayMultiSelect:function(b,a){if(this._isDragSource()&&this.isItemSelected(a)&&b.getType()===$[2]){this._delayedSelection=true}return this._delayedSelection},_onMouseOver:function(a){var b=a.getOriginalTarget();if(b instanceof org.eclipse.rwt.widgets.TreeRow){this._onRowOver(b)}},_onMouseOut:function(a){var b=a.getOriginalTarget();this._delayedSelection=false;if(b instanceof org.eclipse.rwt.widgets.TreeRow){this._onRowOver(null)}},_onElementChange:function(c){var e=c.getType()===$[264];this._hoverElement=e?c.getDomTarget():null;var d=c.getTarget();var a=d===c.getRelatedTarget();if(a&&d instanceof org.eclipse.rwt.widgets.TreeRow){var b=d.isCheckBoxTarget(c)||d.isExpandSymbolTarget(c);if(this._hoverItem!==null&&b){d.renderItem(this._hoverItem)}}},_onRowOver:function(b){var a=this._hoverItem;this._hoverItem=this._findItemByRow(b);this._renderItem(a);if(b!=null){b.renderItem(this._hoverItem)}},_onClientAreaMouseWheel:function(a){a.preventDefault();a.stopPropagation();var b=a.getWheelDelta()*this._itemHeight*2;this._vertScrollBar.setValue(this._vertScrollBar.getValue()-b)},_onKeyPress:function(a){if(this._focusItem!=null){switch(a.getKeyIdentifier()){case $[68]:this._handleKeyEnter(a);break;case $[92]:this._handleKeySpace(a);break;case"Up":this._handleKeyUp(a);break;case"Down":this._handleKeyDown(a);break;case $[58]:this._handleKeyPageUp(a);break;case $[55]:this._handleKeyPageDown(a);break;case"Home":this._handleKeyHome(a);break;case"End":this._handleKeyEnd(a);break;case"Left":this._handleKeyLeft(a);break;case $[53]:this._handleKeyRight(a);break}}},_onClientAreaAppear:function(){this._clientArea.setScrollLeft(this._horzScrollBar.getValue())},_onColumnAreaAppear:function(){this._columnArea.setScrollLeft(this._horzScrollBar.getValue())},_handleKeyEnter:function(a){this._sendSelectionEvent(this._focusItem,true,null)},_handleKeySpace:function(b){var a=this._findIndexByItem(this._focusItem);this._handleKeyboardSelect(b,this._focusItem,a)},_handleKeyUp:function(c){var b=this._getPreviousItem(this._focusItem);if(b!=null){var a=this._findIndexByItem(b);this._handleKeyboardSelect(c,b,a)}},_handleKeyDown:function(c){var b=this._getNextItem(this._focusItem);if(b!=null){var a=this._findIndexByItem(b);this._handleKeyboardSelect(c,b,a)}},_handleKeyPageUp:function(d){var f=this._findIndexByItem(this._focusItem);var e=this._rows.length-2;var a=Math.max(0,f-e);var c=this._findItemByIndex(a);var b=this._findIndexByItem(c);this._handleKeyboardSelect(d,c,b)},_handleKeyPageDown:function(e){var g=this._findIndexByItem(this._focusItem);var f=this._rows.length-2;var a=this.getRootItem().getVisibleChildrenCount()-1;var b=Math.min(a,g+f);var d=this._findItemByIndex(b,this._topItem,this._topItemIndex);var c=this._findIndexByItem(d);this._handleKeyboardSelect(e,d,c)},_handleKeyHome:function(b){var a=this.getRootItem().getChild(0);this._handleKeyboardSelect(b,a,0)},_handleKeyEnd:function(c){var b=this.getRootItem().getLastChild();var a=this.getRootItem().getVisibleChildrenCount()-1;this._handleKeyboardSelect(c,b,a)},_handleKeyLeft:function(c){if(this._focusItem.isExpanded()){this._focusItem.setExpanded(false)}else{if(!this._focusItem.getParent().isRootItem()){var b=this._focusItem.getParent();var a=this._findIndexByItem(b);this._handleKeyboardSelect(c,b,a,true)}}},_handleKeyRight:function(c){if(this._focusItem.hasChildren()){if(!this._focusItem.isExpanded()){this._focusItem.setExpanded(true)}else{var b=this._focusItem.getChild(0);var a=this._findIndexByItem(b);this._handleKeyboardSelect(c,b,a,true)}}},_handleKeyboardSelect:function(d,c,b,a){this._scrollIntoView(b);if(this._hasMultiSelection&&!a){this._multiSelectItem(d,c)}else{this._singleSelectItem(c)}},_renderItemChange:function(b,a){if(b.isDisplayable()){switch(a.getData()){case $[265]:case $[312]:this._scheduleUpdate(false,true);break;case"add":case $[247]:if(b.isExpanded()){this._scheduleUpdate(false,true)}else{this._scheduleItemUpdate(b)}break;default:if(this._inServerResponse()){this._scheduleItemUpdate(b)}else{this._renderItem(b)}break}}},_scheduleItemUpdate:function(a){this._renderQueue[a.toHashCode()]=true;this.addToQueue($[353])},_scheduleUpdate:function(a,b){if(a===true){this._updateRowCount()}if(b===true){this.addToQueue($[522])}this._renderQueue.allItems=true;this.addToQueue($[353])},_layoutPost:function(a){arguments.callee.base.call(this,a);if(a[$[562]]){this._checkDisposedItems()}if(a[$[522]]){this._updateScrollHeight()}if(a[$[353]]){if(this._renderQueue.allItems){this._updateAllRows()}else{this._updateQueuedItems()}this._renderQueue={}}},_updateRowCount:function(){var a=this._clientArea.getHeight();var c=Math.ceil(a/this._itemHeight);var b=this._getRowWidth();while(this._rows.length<c){var d=new org.eclipse.rwt.widgets.TreeRow(this);d.setHeight(this._itemHeight);d.setWidth(b);d.updateGridlinesState(this._linesVisible);this._clientArea.add(d)}while(this._rows.length>c){this._rows[this._rows.length-1].destroy()}this._renderGridHorizontal();this._updateRowsEvenState()},_updateAllRows:function(){var a=(new Date()).getTime();this._updateRows(0,this._rows.length);this._vertScrollBar.autoEnableMerge((new Date()).getTime()-a)},_updateQueuedItems:function(){var a=this._getTopItem();var b=0;while(a!=null&&b<this._rows.length){if(this._renderQueue[a.toHashCode()]){this._rows[b].renderItem(a)}a=this._getNextItem(a);b++}},_updateRows:function(f,e){var b=this._getTopItem();var d=f+e;var c=0;while(b!=null&&c<this._rows.length){if(c>=f&&c<=d){this._rows[c].renderItem(b)}b=this._getNextItem(b);c++}for(var a=c;a<this._rows.length;a++){this._rows[a].renderItem(null)}},_renderItem:function(a){if(this._isCreated&&a!=null){var b=this._findRowByItem(a);if(b!=null){b.renderItem(a)}}},_getTopItem:function(){if(this._topItem===null){this._updateTopItem()}return this._topItem},_updateScrollHeight:function(){var b=this.getRootItem().getVisibleChildrenCount();var a=b*this._itemHeight;if(this._vertScrollBar.getMaximum()!=a){if(!this._vertScrollBar.getDisposed()){this._vertScrollBar.setMaximum(a)}this._topItem=null}},_updateTopItem:function(a){if(typeof a==$[77]){this._topItem=this._findItemByIndex(this._topItemIndex,this._topItem,a)}else{this._topItem=this._findItemByIndex(this._topItemIndex)}},_updateScrollWidth:function(){var c=this._getItemWidth();var a=this._getRowWidth();for(var b=0;b<this._rows.length;b++){this._rows[b].setWidth(a)}if(!this._horzScrollBar.getDisposed()){this._horzScrollBar.setMaximum(c)}if(this._columnArea.getVisibility()){this._renderDummyColumn()}},_renderDummyColumn:function(){var b=this._getDummyColumnLeft();var a=this._columnArea.getWidth();var c=Math.max(0,a-b);if(this._vertScrollBar.getVisibility()){c=Math.max(c,this._vertScrollBar.getWidth())}this._dummyColumn.setLeft(b);this._dummyColumn.setWidth(c)},_getDummyColumnLeft:function(){var c=this._columnArea.getChildren();var a=0;for(var b=0;b<c.length;b++){if(c[b]!==this._dummyColumn){var d=c[b].getLeft()+c[b].getWidth();a=Math.max(a,d)}}return a},_scrollIntoView:function(a){if(a<this._topItemIndex){this.setTopItemIndex(a)}else{if(a>(this._topItemIndex+this._rows.length-2)){this.setTopItemIndex(a-this._rows.length+2)}}},_scrollContentVertical:function(a){var f=this._topItemIndex-a;var e=f>0;f=Math.abs(f);if(f>=this._rows.length){this._updateRowsEvenState();this._updateAllRows()}else{var d=this._rows.length-f;var c=e?d:0;var b=e?f:d;this._switchRows(b);this._updateRowsEvenState();this._updateRows(c,f)}},_switchRows:function(c){var a=this._rows.slice(c);this._rows=a.concat(this._rows.slice(0,c));this._clientArea._children=this._rows;this._clientArea._invalidateVisibleChildren();var e=this._clientArea.getLayoutImpl();var d={locationY:true};for(var b=0;b<this._rows.length;b++){e.layoutChild(this._rows[b],d)}},setHasScrollBarsSelectionListener:function(a){this._hasScrollBarsSelectionListener=a;if(a){this._createSendRequestTimer()}},_sendSelectionChange:function(c){if(!this._inServerResponse()){var b=org.eclipse.swt.Request.getInstance();var d=org.eclipse.swt.WidgetManager.getInstance();var e=d.findIdByWidget(this);var a=this._getSelectionIndices();b.addParameter(e+$[144],a);this._sendSelectionEvent(c,false,null)}},_sendItemCheckedChange:function(b){if(!this._inServerResponse()){var a=org.eclipse.swt.Request.getInstance();var c=org.eclipse.swt.WidgetManager.getInstance();var d=c.findIdByWidget(b);a.addParameter(d+".checked",b.isChecked());this._sendSelectionEvent(b,false,"check")}},_sendTopItemIndexChange:function(){var a=org.eclipse.swt.Request.getInstance();var b=org.eclipse.swt.WidgetManager.getInstance();var c=b.findIdByWidget(this);a.addParameter(c+".topItemIndex",this._topItemIndex);if(this._isVirtual||this._hasScrollBarsSelectionListener){this._sendRequestTimer.start()}},_sendScrollLeftChange:function(){var a=org.eclipse.swt.Request.getInstance();var b=org.eclipse.swt.WidgetManager.getInstance();var c=b.findIdByWidget(this);a.addParameter(c+".scrollLeft",this._horzScrollBar.getValue());if(this._isVirtual||this._hasScrollBarsSelectionListener){this._sendRequestTimer.start()}},_sendItemChange:function(b,a){if(!this._inServerResponse()){switch(a.getData()){case $[265]:this._sendItemEvent(b,"org.eclipse.swt.events.treeExpanded");break;case $[312]:this._sendItemEvent(b,"org.eclipse.swt.events.treeCollapsed");break;default:}}},_sendItemEvent:function(c,a){var d=org.eclipse.swt.WidgetManager.getInstance();var e=d.findIdByWidget(c);var b=org.eclipse.swt.Request.getInstance();b.addEvent(a,e);b.send()},_sendSelectionEvent:function(e,c,b){if(this._hasSelectionListeners){var d=org.eclipse.swt.Request.getInstance();var f=org.eclipse.swt.WidgetManager.getInstance();var h=f.findIdByWidget(this);var a="org.eclipse.swt.events.widget";a+=c?"DefaultSelected":"Selected";var g=f.findIdByWidget(e);d.addEvent(a,h);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();d.addParameter(a+".item",g);if(b!=null){d.addParameter(a+".detail",b)}d.send()}},_isDoubleClicked:function(e,d){var a=false;var b=e.getType()===$[2];var g=e.getButton()==="left";if(g&&b&&this.isFocusItem(d)&&this._selectionTimestamp!=null){var c=new Date();var f=org.eclipse.swt.EventUtil.DOUBLE_CLICK_TIME;if(c.getTime()-this._selectionTimestamp.getTime()<f){a=true}}if(b&&g&&!a){this._selectionTimestamp=new Date()}else{if(b){this._selectionTimestamp=null}}return a},_getSelectionIndices:function(){var c=org.eclipse.swt.WidgetManager.getInstance();var a=[];for(var b=0;b<this._selection.length;b++){a.push(c.findIdByWidget(this._selection[b]))}return a.join()},_singleSelectItem:function(a){this._deselectAll();this._leadItem=null;this._selectItem(a,true);this._sendSelectionChange(a);this.setFocusItem(a)},_multiSelectItem:function(b,a){if(b instanceof qx.event.type.MouseEvent&&b.isRightButtonPressed()){if(!this.isItemSelected(a)){this._singleSelectItem(a)}}else{if(b.isCtrlPressed()){if(b instanceof qx.event.type.KeyEvent&&a!=this._focusItem){this.setFocusItem(a)}else{this._ctrlSelectItem(a)}}else{if(b.isShiftPressed()){if(this._focusItem!=null){this._shiftSelectItem(a)}else{this._singleSelectItem(a)}}else{this._singleSelectItem(a)}}}},_ctrlSelectItem:function(a){if(!this.isItemSelected(a)){this._selectItem(a,true)}else{this._deselectItem(a,true)}this._sendSelectionChange(a);this.setFocusItem(a)},_shiftSelectItem:function(c){this._deselectAll();var b=this._leadItem!=null?this._leadItem:this._focusItem;this._leadItem=b;var e=c;var f=this._findIndexByItem(b);var d=this._findIndexByItem(e);if(f>d){var a=b;b=e;e=a}this._selectItem(b,true);while(b!==e){b=this._getNextItem(b);this._selectItem(b,true)}this._sendSelectionChange(c);this.setFocusItem(c)},_selectItem:function(b,a){if(!this.isItemSelected(b)){this._selection.push(b)}if(a){this._renderItem(b)}},_deselectItem:function(b,a){if(this.isItemSelected(b)){this._selection.splice(this._selection.indexOf(b),1)}if(a){this._renderItem(b)}},_deselectAll:function(){var a=this._selection;this._selection=[];for(var b=0;b<a.length;b++){this._renderItem(a[b])}},_deselectVisibleChildren:function(b){var a=this._getNextItem(b);var c=this._getNextItem(b,true);while(a!==c){this._deselectItem(a,false);a=this._getNextItem(a,false)}},_applyFocused:function(b,a){arguments.callee.base.call(this,b,a);this._scheduleUpdate()},_checkDisposedItems:function(){if(this._focusItem&&this._focusItem.isDisposed()){this._focusItem=null}if(this._hoverItem&&this._hoverItem.isDisposed()){this._hoverItem=null}if(this._leadItem&&this._leadItem.isDisposed()){this._leadItem=null}var a=0;while(a<this._selection.length){if(this._selection[a].isDisposed()){this._deselectItem(this._selection[a],false)}else{a++}}},_applyBackgroundColor:function(a){this._clientArea.setBackgroundColor(a)},_applyBackgroundImage:function(a){this._clientArea.setBackgroundImage(a)},_applyWidth:function(b,a){arguments.callee.base.call(this,b,a);this._layoutX()},_applyHeight:function(b,a){arguments.callee.base.call(this,b,a);this._layoutY()},_applyBorder:function(b,a){arguments.callee.base.call(this,b,a);this._layoutX();this._layoutY()},_renderGridVertical:function(){var b=0;if(this._linesVisible){for(var a=0;a<this._columnCount;a++){b=this._renderVerticalGridline(a,b)}}while(this._vertGridLines.length>b){this._vertGridLines.pop().destroy()}},_renderVerticalGridline:function(b,c){var e=c;var f=this._clientArea.getWidth();var d=this._itemLeft[b]+this._itemWidth[b]-1;d-=this._horzScrollBar.getValue();if(d>0&&d<f){var a=this._getVerticalGridline(c);a.setLeft(d);a.setTop(this._clientArea.getTop());a.setHeight(this._clientArea.getHeight());e++}return e},_getVerticalGridline:function(b){if(typeof this._vertGridLines[b]===$[8]){var a=new qx.ui.basic.Terminator();a.setZIndex(1);a.setWidth(0);a.setBorder(this._getVerticalGridBorder());this._vertGridLines[b]=a;this.add(a)}return this._vertGridLines[b]},_renderGridHorizontal:function(){var a=this._linesVisible?this._getHorizontalGridBorder():null;for(var b=0;b<this._rows.length;b++){this._rows[b].setBorder(a)}},_getHorizontalGridBorder:function(){if(this._horzGridBorder===null){this._horzGridBorder=this._getGridBorder({horizontal:true})}return this._horzGridBorder},_getVerticalGridBorder:function(){if(this._vertGridBorder===null){this._vertGridBorder=this._getGridBorder({vertical:true})}return this._vertGridBorder},_getGridBorder:function(c){var a=new org.eclipse.swt.theme.ThemeValues(c);var b=a.getCssColor($[412],$[6]);a.dispose();var d=[0,0,0,0];b=b==$[8]?$[156]:b;if(c.horizontal){d[2]=1}else{if(c.vertical){d[1]=1}}return new org.eclipse.rwt.Border(d,$[20],b)},_layoutX:function(){var a=this.getWidth()-this.getFrameWidth();if(this._columnArea.getDisplay()){this._columnArea.setWidth(a)}if(this._vertScrollBar.getVisibility()){a-=this._vertScrollBar.getWidth();this._vertScrollBar.setLeft(a)}this._horzScrollBar.setWidth(a);this._clientArea.setWidth(a);this._updateScrollWidth();this._renderGridVertical()},_layoutY:function(){var a=this.getHeight()-this.getFrameHeight();var b=0;if(this._columnArea.getDisplay()){b=this._headerHeight;a-=this._headerHeight;this._columnArea.setHeight(this._headerHeight)}if(this._horzScrollBar.getVisibility()){a-=this._horzScrollBar.getHeight();this._horzScrollBar.setTop(b+a)}a=Math.max(0,a);this._vertScrollBar.setHeight(a);this._vertScrollBar.setTop(b);this._clientArea.setTop(b);this._clientArea.setHeight(a);this._renderGridVertical();this._scheduleUpdate(true)},_getItemWidth:function(){var a=0;if(this._itemLeft.length>0){for(var b=0;b<this.getColumnCount();b++){a=Math.max(a,this._itemLeft[b]+this._itemWidth[b])}}return a},_getRowWidth:function(){var b=this._clientArea.getWidth();var a=Math.max(this._getItemWidth(),b);return a},_getNextItem:function(c,b){var a=null;if(!b&&c.hasChildren()&&c.isExpanded()){a=c.getChild(0)}else{if(c.hasNextSibling()){a=c.getNextSibling()}else{if(c.getLevel()>0){a=this._getNextItem(c.getParent(),true)}}}return a},_getPreviousItem:function(b){var a=null;if(b.hasPreviousSibling()){a=b.getPreviousSibling();while(a.hasChildren()&&a.isExpanded()){a=a.getLastChild()}}else{if(b.getLevel()>0){a=b.getParent()}}return a},_findItemByRow:function(b){var a=null;if(b!=null){var c=this._getTopItem();var d=0;while(c!=null&&a==null){if(this._rows[d]===b){a=c}c=this._getNextItem(c);d++}}return a},_findRowIndexByItem:function(b){var a=this._getTopItem();var c=0;while(a!=b&&a!=null&&c<this._rows.length){a=this._getNextItem(a);c++}return a!=null&&c<this._rows.length?c:null},_findRowByItem:function(b){var a=this._findRowIndexByItem(b);return a!=null?this._rows[a]:null},_findItemByIndex:function(e,d,f){var a;var c=d?d:this.getRootItem().getChild(0);var b=f?f:0;if(e>=b){a=this._findItemByIndexForwards(e,c,b)}else{a=this._findItemByIndexBackwards(e,c,b)}return a},_findItemByIndexForwards:function(b,a,f){var c=f;var d=a;while(c!=b&&d!=null){var e=c+d.getVisibleChildrenCount()+1;if(e<=b){c=e;d=this._getNextItem(d,true)}else{d=this._getNextItem(d,false);c++}}return d},_findItemByIndexBackwards:function(c,b,g){var d=g;var f=b;while(d!=c&&f!=null){if(f.hasPreviousSibling()){var e=f.getPreviousSibling();var a=d-(e.getVisibleChildrenCount()+1);if(a>=c){d=a;f=e}else{f=this._getPreviousItem(f);d--}}else{f=this._getPreviousItem(f);d--}}return f},_findIndexByItem:function(b){var f=this._getTopItem();var e=this._getTopItem();var d=this._topItemIndex;var c=this._topItemIndex;while(f!==b&&e!==b){if(f!=null){f=this._getNextItem(f);d++}if(e!=null){e=this._getPreviousItem(e);c--}if(e===null&&f===null){throw"Tree._findIndexByItem failed!"}}var a;if(f===b){a=d}else{a=c}return a},_isChildOf:function(d,b){var a=false;var c=d;while(c!=null&&!a){c=c.getParent();a=c===b}return a},_correctOffset:function(b,a){return b+this.getIndentionOffset(a.getLevel()+1)},_correctWidth:function(d,g,e,c){var a=d;var f=this._itemLeft[c]+this._itemWidth[c];var b=g+a;if(b>f){a=Math.max(0,f-g)}return a},_inServerResponse:function(){return org.eclipse.swt.EventUtil.getSuspended()},_isDragSource:function(){return this.hasEventListeners($[75])},setEnableCellToolTip:function(a){if(a){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);this._cellToolTip=new org.eclipse.swt.widgets.TableCellToolTip(b);this._clientArea.addEventListener($[45],this._onClientAreaMouseMove,this);this._clientArea.setToolTip(this._cellToolTip)}else{this._clientArea.removeEventListener($[45],this._onClientAreaMouseMove,this);this._clientArea.setToolTip(null);this._cellToolTip.destroy();this._cellToolTip=null}},_onClientAreaMouseMove:function(k){if(this._cellToolTip!=null){var d=k.getPageX();var c=k.getPageY();if(this._hoverItem){var h=org.eclipse.swt.WidgetManager.getInstance();var j=h.findIdByWidget(this._hoverItem);var b=this.getColumns();var g=b.length==0?0:-1;var f=this._clientArea.getElement();var a=qx.bom.element.Location.getLeft(f);for(var e=0;g==-1&&e<b.length;e++){var l=a+this._itemLeft[e];if(d>=l&&d<l+this._itemWidth[e]){g=e}}this._cellToolTip.setCell(j,g)}}},setCellToolTipText:function(a){if(this._cellToolTip!=null){this._cellToolTip.setText(a)}}}});
-qx.Class.define("org.eclipse.rwt.widgets.TreeItem",{extend:qx.core.Target,construct:function(b,a,c){this._autoDispose=false;arguments.callee.base.call(this);this._parent=b;this._level=-1;this._children=[];this._visibleChildrenCount=0;this._expanded=false;this._texts=c?["..."]:[];this._images=[];this._cached=!c;this._font=null;this._cellFonts=[];this._foreground=null;this._cellForegrounds=[];this._background=null;this._cellBackgrounds=[];this._checked=false;this._grayed=false;this._variant=null;if(this._parent!=null){this._level=this._parent.getLevel()+1;this._parent._add(this,a)}this.addEventListener("update",this._onUpdate,this)},destruct:function(){if(this._parent!=null){this._parent._remove(this)}org.eclipse.swt.WidgetManager.getInstance().remove(this)},statics:{createItem:function(c,b,e){var a=this._getItem(c);var d;if(a.isChildCreated(b)&&!a.isChildCached(b)){d=a.getChild(b);d.markCached()}else{d=new org.eclipse.rwt.widgets.TreeItem(a,b,false)}org.eclipse.swt.WidgetManager.getInstance().add(d,e,false)},_getItem:function(b){var a;if(b instanceof org.eclipse.rwt.widgets.Tree){a=b.getRootItem()}else{a=b}return a}},events:{update:$[11]},members:{setItemCount:function(a){var b=this._children.length>a?$[247]:"add";this._children.length=a;this._update(b)},isCached:function(){return this._cached},markCached:function(){this._cached=true;this._texts=[]},setTexts:function(a){this._texts=a;this._update()},getText:function(b){var a=this._texts[b];return typeof a===$[13]?a:""},setFont:function(a){this._font=a;this._update()},getCellFont:function(b){var a=this._cellFonts[b];return typeof a===$[13]&&a!=""?a:this._font},setCellFonts:function(a){this._cellFonts=a;this._update()},setForeground:function(a){this._foreground=a;this._update()},getCellForeground:function(b){var a=this._cellForegrounds[b];return typeof a===$[13]?a:this._foreground},setCellForegrounds:function(a){this._cellForegrounds=a;this._update()},setBackground:function(a){this._background=a;this._update()},getCellBackground:function(b){var a=this._cellBackgrounds[b];return typeof a===$[13]?a:null},getBackground:function(){return this._background},setCellBackgrounds:function(a){this._cellBackgrounds=a;this._update()},setImages:function(a){this._images=a;this._update()},getImage:function(b){var a=this._images[b];return typeof a===$[13]?a:null},getLevel:function(){return this._level},getParent:function(){return this._parent},getVisibleChildrenCount:function(){if(this._visibleChildrenCount==null){this._computeVisibleChildrenCount()}return this._visibleChildrenCount},setVariant:function(a){this._variant=a},getVariant:function(){return this._variant},_add:function(b,a){if(a===this._children.length||a===undefined){this._children.push(b);this._update("add",b)}else{if(this._children[a]){this._children.splice(a,0,b);this._children.pop();this._update("add",b)}else{this._children[a]=b;b._update()}}},_remove:function(c){var b=this._children;var a=b.indexOf(c);this._children.splice(a,1);this._children.push(undefined);this._update($[247],c)},hasChildren:function(){return this._children.length>0},getChild:function(b){var a=this._children[b];if(!a){if(b>=0&&b<this._children.length){a=new org.eclipse.rwt.widgets.TreeItem(this,b,true)}else{a=null}}return a},isChildCreated:function(a){return this._children[a]!==undefined},isChildCached:function(a){return this._children[a].isCached()},getLastChild:function(){return this.getChild(this._children.length-1)},getIndexOfChild:function(a){return this._children.indexOf(a)},setExpanded:function(a){if(this._expanded!=a){this._expanded=a;this._update(a?$[265]:$[312])}},isExpanded:function(){return this._expanded},hasPreviousSibling:function(){var b=this._parent._children;var a=b.indexOf(this)-1;return a>=0},hasNextSibling:function(){var b=this._parent._children;var a=b.indexOf(this)+1;return a<b.length},getPreviousSibling:function(){var a=this._parent.getIndexOfChild(this)-1;return this._parent.getChild(a)},getNextSibling:function(){var a=this._parent.getIndexOfChild(this)+1;return this._parent.getChild(a)},isRootItem:function(){return this._level<0},setChecked:function(a){this._checked=a;this._update()},isChecked:function(){return this._checked},setGrayed:function(a){this._grayed=a;this._update()},isGrayed:function(){return this._grayed},isDisplayable:function(){var a=false;if(this.isRootItem()||this._parent.isRootItem()){a=true}else{a=this._parent.isExpanded()&&this._parent.isDisplayable()}return a},getEnabled:function(){return true},_update:function(c,b){var a=new qx.event.type.DataEvent("update");a.setData(typeof c!=$[8]?c:null);a.setBubbles(true);a.setPropagationStopped(false);if(b){a.setRelatedTarget(b)}this.dispatchEvent(a,true)},_onUpdate:function(){this._visibleChildrenCount=null},_computeVisibleChildrenCount:function(){var a=0;if(this.isExpanded()||this.isRootItem()){a=this._children.length;for(var b=0;b<this._children.length;b++){if(this.isChildCreated(b)){a+=this.getChild(b).getVisibleChildrenCount()}}}this._visibleChildrenCount=a},toString:function(){return"TreeItem "+this._texts.join()}}});
-qx.Class.define("org.eclipse.rwt.TreeDNDFeedback",{extend:qx.core.Object,construct:function(a){arguments.callee.base.call(this);this._tree=a;this._feedback=null;this._currentRow=null;this._insertIndicator=null;this._expandTimer=null;this._scrollTimer=null},destruct:function(){this._renderFeedback(this._currentRow,false);if(this._expandTimer!=null){this._expandTimer.dispose();this._expandTimer=null}if(this._scrollTimer!=null){this._scrollTimer.dispose();this._scrollTimer=null}this._tree=null;this._feedback=null;this._insertIndicator=null;this._currentRow=null},members:{setFeedback:function(a){this._renderFeedback(this._currentRow,false);this._feedback=a;this._renderFeedback(this._currentRow,true)},renderFeedback:function(a){this._renderFeedback(this._currentRow,false);this._renderFeedback(a,true);this._currentRow=a},isFeedbackNode:function(b){var a=false;if(this._insertIndicator!=null&&this._insertIndicator==b){a=true}return a},_renderFeedback:function(b,a){if(this._feedback!=null&&b!=null){if(this._feedback.select){this._renderFeedbackSelect(b,a)}else{if(this._feedback.before){this._renderFeedbackBefore(b,a)}else{if(this._feedback.after){this._renderFeedbackAfter(b,a)}}}if(this._feedback.expand){this._renderFeedbackExpand(b,a)}if(this._feedback[$[26]]){this._renderFeedbackScroll(b,a)}}},_renderFeedbackSelect:function(c,b){c._setState($[378],b);var a=this._tree._findItemByRow(c);this._tree._renderItem(a)},_renderFeedbackBefore:function(c,b){if(b){var a=this._getRowLocation(c);a.y--;this._showInsertIndicator(a.x,a.y)}else{this._hideInsertIndicator()}},_renderFeedbackAfter:function(d,c){if(c){var b=this._getRowLocation(d);var a=d.getHeightValue();b.y=b.y+(a-1);this._showInsertIndicator(b.x,b.y)}else{this._hideInsertIndicator()}},_renderFeedbackExpand:function(c,b){var a=this._tree._findItemByRow(c);if(a!=null&&a.hasChildren()){if(b&&!a.isExpanded()){this._startExpandTimer()}else{this._stopExpandTimer()}}},_renderFeedbackScroll:function(b,a){if(a){this._startScrollTimer()}else{this._stopScrollTimer()}},_getRowLocation:function(d){var a={x:0,y:0};var b=d.getElement();var c=this._tree._getTargetNode();while(b!=c){a.x+=parseInt(b.style.left||0);a.y+=parseInt(b.style.top||0);b=b.parentNode}return a},_showInsertIndicator:function(a,e){if(this._insertIndicator==null){var d=document.createElement("div");d.style.position=$[27];d.style.borderTopStyle=$[20];d.style.borderTopColor="black";d.style.borderTopWidth="2px";d.style.zIndex=100000;d.style.height="2px";this._insertIndicator=d}var b=this._tree.getWidthValue()-(a+6);this._insertIndicator.style.left=a+"px";this._insertIndicator.style.top=e+"px";this._insertIndicator.style.width=b+"px";var c=this._tree._getTargetNode();c.appendChild(this._insertIndicator)},_hideInsertIndicator:function(){var a=this._tree._getTargetNode();a.removeChild(this._insertIndicator)},_startExpandTimer:function(){if(this._expandTimer==null){this._expandTimer=new qx.client.Timer(750);this._expandTimer.addEventListener($[50],this._onExpandTimer,this)}this._expandTimer.setEnabled(true)},_stopExpandTimer:function(){if(this._expandTimer!=null){this._expandTimer.stop()}},_onExpandTimer:function(b){this._stopExpandTimer();var a=this._tree._findItemByRow(this._currentRow);a.setExpanded(true)},_startScrollTimer:function(){if(this._scrollTimer==null){this._scrollTimer=new qx.client.Timer(250);this._scrollTimer.addEventListener($[50],this._onScrollTimer,this)}this._scrollTimer.setEnabled(true)},_stopScrollTimer:function(){if(this._scrollTimer!=null){this._scrollTimer.stop()}},_getScrollDirection:function(b){var a=0;var c=this._tree._topItemIndex;if(b===c){a=-1}else{if(b>=(c+this._tree._rows.length-2)){a=1}}return a},_onScrollTimer:function(b){this._stopScrollTimer();var i=this._tree._findItemByRow(this._currentRow);var f=this._tree._findIndexByItem(i);var d=this._getScrollDirection(f);if(d!=0){var h=f+d;var e=this._tree._findItemByIndex(h);if(e!=null){var c=this._tree._topItemIndex+d;this._tree.setTopItemIndex(c);var j=this._tree._findRowByItem(e);var g=this._currentRow;var a=function(){this._targetUpdateCheck(g,j)};qx.client.Timer.once(a,this,1)}}},_targetUpdateCheck:function(a,b){if(!this.isDisposed()){if(b!=this._currentRow&&a==this._currentRow){var c=org.eclipse.rwt.DNDSupport.getInstance();c.setCurrentTargetWidget(b)}}}}});
-qx.Class.define("org.eclipse.swt.widgets.Table",{extend:qx.ui.layout.CanvasLayout,construct:function(f,b){arguments.callee.base.call(this);this.setAppearance("table");this.setHideFocus(true);this.setTabIndex(1);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this._suspendClicksOnRow=null;this._alwaysHideSelection=false;this._hideSelection=qx.lang.String.contains(b,"hideSelection");this._linesVisible=false;this._borderWidth=0;this._defaultColumnWidth=0;this._topIndex=0;this._topIndexChanging=false;this._topIndexChanged=false;this._leftOffsetChanged=false;this._hasScrollBarsSelectionListener=false;this._readyToSendChanges=true;this._resolveItemsFor=null;this._itemHeight=0;this._rows=new Array();this._items=new Array();this._gridLines=new Array();this._itemCount=0;this._unresolvedItems=null;this._checkBoxes=null;if(qx.lang.String.contains(b,"check")){this._checkBoxes=new Array()}this._multiSelect=qx.lang.String.contains(b,"multi");this._selected=new Array();this._selectionStart=-1;this._focusIndex=-1;this._emptyItem=new org.eclipse.swt.widgets.TableItem(this,-1);this._virtualItem=new org.eclipse.swt.widgets.TableItem(this,-1);this._virtualItem.setTexts(["..."]);this._resizeLine=null;this._itemLeft=new Array();this._itemWidth=new Array();this._itemImageLeft=new Array();this._itemImageWidth=new Array();this._itemTextLeft=new Array();this._itemTextWidth=new Array();this._columnArea=new qx.ui.layout.CanvasLayout();this._columnArea.setTop(0);this._columnArea.setLeft(0);this._columnArea.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this._columnArea.setZIndex(20000);var d=new qx.ui.basic.Atom();d.setLabel("&nbsp;");d.getLabelObject().setMode(qx.constant.Style.LABEL_MODE_HTML);d.setAppearance($[336]);d.addState("dummy");this._columnArea.add(d);this.add(this._columnArea);this._clientArea=new qx.ui.layout.CanvasLayout();this._clientArea.setAppearance("table-client-area");this._clientArea.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this._clientArea.setTop(20);this._clientArea.setLeft(0);this._noScroll=qx.lang.String.contains(b,"noScroll");if(!this._noScroll){this._clientArea.addEventListener($[56],this._onClientAreaMouseWheel,this)}this._clientArea.addEventListener($[31],this._onClientAppear,this);var a=function(g){g.stopPropagation()};this._horzScrollBar=new org.eclipse.rwt.widgets.ScrollBar(true);this._horzScrollBar.addEventListener($[75],a);this._horzScrollBar.setZIndex(100000000);this._horzScrollBar.setMergeEvents(true);this.add(this._horzScrollBar);this._horzScrollBar.addEventListener($[80],this._onHorzScrollBarChangeValue,this);this._vertScrollBar=new org.eclipse.rwt.widgets.ScrollBar(false);this._vertScrollBar.addEventListener($[75],a);this._vertScrollBar.setZIndex(100000000);this._vertScrollBar.setMergeEvents(false);this.add(this._vertScrollBar);this._vertScrollBar.addEventListener($[80],this._onVertScrollBarChangeValue,this);this.addEventListener($[57],this._onChangeSize,this);this.addEventListener($[66],this._onChangeSize,this);this.addEventListener($[132],this._onChangeEnabled,this);this.addEventListener($[74],this._onFocusIn,this);this.addEventListener("blur",this._onFocusOut,this);this._keyboardSelecionChanged=false;this.addEventListener($[24],this._onKeyDown,this);this.addEventListener($[12],this._onKeyPress,this);this.addEventListener($[60],this._onKeyUp,this);var c=org.eclipse.swt.Request.getInstance();c.addEventListener("send",this._onSendRequest,this);var e=org.eclipse.swt.WidgetManager.getInstance();e.add(this._clientArea,f+"_clientArea",false);this.add(this._clientArea);this._cellToolTip=null;qx.ui.core.Widget.disableScrolling(this);this._clickDelayed=false;this.addEventListener($[75],this._onDragStart,this)},destruct:function(){var b=org.eclipse.swt.Request.getInstance();b.removeEventListener("send",this._onSendRequest,this);this.removeEventListener($[57],this._onChangeSize,this);this.removeEventListener($[66],this._onChangeSize,this);this.removeEventListener($[132],this._onChangeEnabled,this);this.removeEventListener($[74],this._onFocusIn,this);this.removeEventListener("blur",this._onFocusOut,this);this.removeEventListener($[24],this._onKeyDown,this);this.removeEventListener($[12],this._onKeyPress,this);this.removeEventListener($[60],this._onKeyUp,this);this.removeEventListener($[75],this._onDragStart,this);this._virtualItem.dispose();this._emptyItem.dispose();for(var a=0;a<this._items.length;a++){if(this._items[a]){this._items[a].dispose()}}this._items=null;var b=org.eclipse.swt.Request.getInstance();if(this._horzScrollBar){this._horzScrollBar.removeEventListener($[80],this._onHorzScrollBarChangeValue,this);this._horzScrollBar.dispose();this._horzScrollBar=null}if(this._vertScrollBar){this._vertScrollBar.removeEventListener($[80],this._onVertScrollBarChangeValue,this);this._vertScrollBar.dispose();this._vertScrollBar=null}for(var a=0;a<this._gridLines.length;a++){this._gridLines[a].removeEventListener($[2],this._onRowMouseDown,this);this._gridLines[a].removeEventListener($[15],this._onRowMouseUp,this);this._gridLines[a].dispose();this._gridLines[a]=null}if(this._clientArea){if(!this._noScroll){this._clientArea.removeEventListener($[56],this._onClientAreaMouseWheel,this)}this._clientArea.removeEventListener($[31],this._onClientAppear,this);if(this._cellToolTip){this._clientArea.removeEventListener($[45],this._onClientAreaMouseMove,this)}org.eclipse.swt.WidgetManager.getInstance().remove(this._clientArea);this._clientArea.dispose();this._clientArea=null}if(this._cellToolTip){this._cellToolTip.destroy();this._cellToolTip=null}if(this._columnArea){this._columnArea.dispose();this._columnArea=null}if(this._resizeLine){this._resizeLine.setParent(null);this._resizeLine.dispose()}if(this._rows){for(var a=0;a<this._rows.length;a++){this._rows[a].dispose()}this._rows=null}if(this._checkBoxes!==null){for(var a=0;a<this._checkBoxes.length;a++){this._checkBoxes[a].dispose()}this._checkBoxes=null}this._itemLeft=null;this._itemWidth=null;this._itemImageLeft=null;this._itemImageWidth=null;this._itemTextLeft=null;this._itemTextWidth=null},events:{itemselected:$[70],itemdefaultselected:$[70],itemchecked:$[70]},properties:{checkWidth:{check:$[22],init:21,themeable:true},checkHeight:{check:$[22],init:13,themeable:true}},statics:{_isShiftOnlyPressed:function(a){return a.isShiftPressed()&&!a.isCtrlPressed()&&!a.isAltPressed()&&!a.isMetaPressed()},_isCtrlOnlyPressed:function(a){return a.isCtrlOrCommandPressed()&&!a.isShiftPressed()&&!a.isAltPressed()},_isCtrlShiftOnlyPressed:function(a){return a.isCtrlOrCommandPressed()&&a.isShiftPressed()&&!a.isAltPressed()},_isMetaOnlyPressed:function(a){return a.isAltPressed()&&!a.isShiftPressed()&&!a.isCtrlPressed()},_isNoModifierPressed:function(a){return !a.isCtrlPressed()&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isMetaPressed()}},members:{_isRelevantEvent:function(a){var b=a.getTarget();var c=this._columnArea.getChildren()[0];return b===this||b===c||b instanceof org.eclipse.swt.widgets.TableRow||b instanceof org.eclipse.swt.widgets.TableColumn},setCursor:function(c){this._columnArea.setCursor(c);this._clientArea.setCursor(c);var b=this._columnArea.getChildren();for(var a=0;a<b.length;a++){b[a].setCursor(c)}for(var a=0;a<this._rows.length;a++){this._rows[a].setCursor(c)}if(this._checkBoxes!==null){for(var a=0;a<this._checkBoxes.length;a++){this._checkBoxes[a].setCursor(c)}}},resetCursor:function(){this._columnArea.resetCursor();this._clientArea.resetCursor();var b=this._columnArea.getChildren();for(var a=0;a<b.length;a++){b[a].resetCursor()}for(var a=0;a<this._rows.length;a++){this._rows[a].resetCursor()}if(this._checkBoxes!==null){for(var a=0;a<this._checkBoxes.length;a++){this._checkBoxes[a].resetCursor()}}},setTextColor:function(a){this._clientArea.setTextColor(a)},resetTextColor:function(){this._clientArea.resetTextColor()},setBackgroundImage:function(a){this._clientArea.setBackgroundImage(a)},resetBackgroundImage:function(){this._clientArea.resetBackgroundImage()},setBackgroundColor:function(a){this._clientArea.setBackgroundColor(a)},resetBackgroundColor:function(){this._clientArea.resetBackgroundColor()},setHeaderHeight:function(c){this._columnArea.setHeight(c);var b=this._columnArea.getChildren();for(var a=0;a<b.length;a++){b[a].setHeight(c)}this._updateClientAreaSize()},setHeaderVisible:function(a){this._columnArea.setVisibility(a);this._updateClientAreaSize();this._updateGridLines()},setItemHeight:function(a){this._itemHeight=a;this._updateScrollHeight();if(this._updateRowCount()){this._updateRows()}this._vertScrollBar.setIncrement(a)},getItemHeight:function(){return this._itemHeight},setAlwaysHideSelection:function(a){this._alwaysHideSelection=a},shouldHideSelection:function(){return this._alwaysHideSelection||(this._hideSelection&&!this.getFocused())},setItemMetrics:function(e,f,d,b,c,a,g){this._itemLeft[e]=f;this._itemWidth[e]=d;this._itemImageLeft[e]=b;this._itemImageWidth[e]=c;this._itemTextLeft[e]=a;this._itemTextWidth[e]=g},setScrollBarsVisibile:function(b,a){if(!b){this._horzScrollBar.setValue(0)}this._horzScrollBar.setVisibility(b);if(!a){this._vertScrollBar.setValue(0)}this._vertScrollBar.setVisibility(a);this._updateClientAreaSize()},updateRows:function(){this._updateRows()},getItemLeft:function(a){return this._itemLeft[a]},getItemWidth:function(a){return this._itemWidth[a]},getItemImageLeft:function(a){return this._itemImageLeft[a]},getItemImageWidth:function(a){return this._itemImageWidth[a]},getItemTextLeft:function(a){return this._itemTextLeft[a]},getItemTextWidth:function(a){return this._itemTextWidth[a]},setTopIndex:function(a){this._internalSetTopIndex(a,true);this._topIndexChanged=false},_internalSetTopIndex:function(b,a){if(this._topIndex!==b){this._topIndexChanging=true;if(a){this._vertScrollBar.setValue(b*this._itemHeight)}var c=b-this._topIndex;this._topIndex=b;this._scrollRowsVertical(c);this._topIndexChanged=true;this._topIndexChanging=false}},setLeftOffset:function(a){this._horzScrollBar.setValue(a);this._leftOffsetChanged=false},setBorderWidth:function(a){this._borderWidth=a},getColumn:function(a){return this._columnArea.getChildren()[a+1]},getColumnCount:function(){return this._columnArea.getChildrenLength()-1},getColumns:function(){return this._columnArea.getChildren().slice(1)},getColumnsWidth:function(){var a=0;var c=this._columnArea.getChildren();for(var b=1;b<c.length;b++){a+=c[b].getWidth()}return a},setDefaultColumnWidth:function(a){this._defaultColumnWidth=a;this._updateScrollWidth()},getDefaultColumnWidth:function(){return this._defaultColumnWidth},setLinesVisible:function(b){this._linesVisible=b;if(b){this.addState($[154])}else{this.removeState($[154])}for(var a=0;a<this._rows.length;a++){this._rows[a].setLinesVisible(b)}this._updateGridLines()},getLinesVisible:function(){return this._linesVisible},hasCheckBoxes:function(){return this._checkBoxes!==null},setFocusIndex:function(c){if(c!==this._focusIndex){var a=this._focusIndex;this._focusIndex=c;if(a!==-1){this.updateItem(a,false)}if(this._focusIndex!==-1){this.updateItem(this._focusIndex,false)}if(org.eclipse.swt.EventUtil.getSuspended()){this._selectionStart=-1}else{var b=org.eclipse.swt.Request.getInstance();var d=org.eclipse.swt.WidgetManager.getInstance().findIdByWidget(this);b.addParameter(d+$[539],c)}}},getFocusIndex:function(){return this._focusIndex},setItemCount:function(a){this._itemCount=a;this._updateScrollHeight();this._updateRows()},_onChangeEnabled:function(a){this._updateRows()},_onCheckBoxClick:function(a){var c=this._checkBoxes.indexOf(a.getTarget());var b=this._getItemIndexFromRowIndex(c);this._toggleCheckState(b)},_onCheckBoxOver:function(a){var c=this._checkBoxes.indexOf(a.getTarget());var b=this._checkBoxes[c];b.addState("over");this._rows[c].addState("over")},_onCheckBoxOut:function(a){var c=this._checkBoxes.indexOf(a.getTarget());var b=this._checkBoxes[c];b.removeState("over");this._rows[c].removeState("over")},_onRowMouseDown:function(a){var c=this._getRowFromEvent(a);if(c!=null){var b=this._topIndex+this._rows.indexOf(c);if(this._isDragSource()&&this._isItemSelected(b)){if(this._isValidMouseEvent(c,b)){this.setFocusIndex(b);this._clickDelayed=true}}else{this._rowClicked(a,c)}}},_onRowMouseUp:function(a){if(this._clickDelayed){this._clickDelayed=false;var b=this._getRowFromEvent(a);if(b!=null){this._rowClicked(a,b)}}},_getRowFromEvent:function(b){var c=b.getTarget();var a=null;if(c instanceof org.eclipse.swt.widgets.TableRow){a=c}else{a=this._getRowAtPoint(b.getPageX(),b.getPageY())}return a},_isDragSource:function(){return org.eclipse.rwt.DNDSupport.getInstance().isDragSource(this)},_onDragStart:function(a){this._clickDelayed=false},_isValidMouseEvent:function(c,b){var a=b>=0&&b<this._itemCount&&this._items[b]&&this._suspendClicksOnRow!=c;return a},_rowClicked:function(a,c){var b=this._topIndex+this._rows.indexOf(c);if(this._isValidMouseEvent(c,b)){this._suspendClicksOnRow=c;qx.client.Timer.once(this._resumeClicks,this,org.eclipse.swt.EventUtil.DOUBLE_CLICK_TIME);if(this._multiSelect){this._multiSelectRowClicked(a,b)}else{this._setSingleSelection(b)}this.setFocusIndex(b);this._makeItemFullyVisible(b);this._updateSelectionParam();this.createDispatchDataEvent($[494],b)}},_multiSelectRowClicked:function(b,d){if(b.isRightButtonPressed()){if(!this._isItemSelected(d)){this._setSingleSelection(d);this._selectionStart=-1}}else{if(org.eclipse.swt.widgets.Table._isCtrlOnlyPressed(b)){if(this._isItemSelected(d)){this._deselectItem(d,true)}else{this._selectItem(d)}}if(org.eclipse.swt.widgets.Table._isShiftOnlyPressed(b)||org.eclipse.swt.widgets.Table._isCtrlShiftOnlyPressed(b)){if(org.eclipse.swt.widgets.Table._isShiftOnlyPressed(b)&&this._selectionStart!==-1){this._clearSelection()}var e=this._selectionStart!==-1?this._selectionStart:this._focusIndex;if(e!==-1){var f=Math.min(e,d);var a=Math.max(e,d);for(var c=f;c<=a;c++){this._selectItem(c)}}else{this._selectItem(d)}}if(org.eclipse.swt.widgets.Table._isNoModifierPressed(b)||org.eclipse.swt.widgets.Table._isMetaOnlyPressed(b)){this._setSingleSelection(d)}if(org.eclipse.swt.widgets.Table._isCtrlOnlyPressed(b)||org.eclipse.swt.widgets.Table._isCtrlShiftOnlyPressed(b)){this._selectionStart=d}else{this._selectionStart=-1}}},_setSingleSelection:function(a){this._clearSelection();this._selectItem(a)},_resumeClicks:function(){this._suspendClicksOnRow=null},_onRowDblClick:function(a){var c=this._rows.indexOf(a.getTarget());var b=this._getItemIndexFromRowIndex(c);if(b!==-1){this.createDispatchDataEvent($[572],b)}},_onRowContextMenu:function(a){if(org.eclipse.swt.widgets.Table._isNoModifierPressed(a)||org.eclipse.swt.widgets.Table._isMetaOnlyPressed(a)){var c=a.getTarget();var b=this.getContextMenu();if(b!==null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show()}}},_onRowChangeOverState:function(a){var d=a.getTarget();if(d.hasState("over")){for(var b=0;b<this._rows.length;b++){if(this._rows[b]!==d){this._rows[b].removeState("over")}}}var c=d.getItemIndex();if(c!=-1){this._renderItem(d,this._items[c])}},_toggleCheckState:function(a){if(this._checkBoxes!=null){var b=this._items[a];if(a>=0&&a<this._itemCount&&b){b.setChecked(!b.getChecked());var c=this._getRowIndexFromItemIndex(a);if(c!==-1){this._updateRow(c,a)}this._updateCheckParam(b);this.createDispatchDataEvent("itemchecked",a)}}},_updateSelectionParam:function(){var e=org.eclipse.swt.WidgetManager.getInstance();var d=e.findIdByWidget(this);var c=org.eclipse.swt.Request.getInstance();var b="";for(var a=0;a<this._selected.length;a++){if(b!==""){b+=","}b+=this._selected[a].toString()}c.addParameter(d+$[144],b)},_updateCheckParam:function(b){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(b);var a=org.eclipse.swt.Request.getInstance();a.addParameter(c+".checked",b.getChecked())},_onClientAreaMouseWheel:function(a){if(this._isRelevantEvent(a)){a.preventDefault();a.stopPropagation();var b=a.getWheelDelta()*this._itemHeight*2;this._vertScrollBar.setValue(this._vertScrollBar.getValue()-b)}},_onChangeSize:function(a){if(this._clientArea.isSeeable()){this._updateClientAreaSize()}},_onClientAppear:function(a){this._updateClientAreaSize()},_onKeyDown:function(a){if(this._isRelevantEvent(a)){switch(a.getKeyIdentifier()){case $[92]:this._toggleCheckState(this._focusIndex);break;case $[68]:var d=-1;var c=-1;for(var b=0;b<this._selected.length;b++){if(this._focusIndex===this._selected[b]){d=this._selected[b]}if(c===-1){c=this._selected[b]}else{c=Math.min(c,this._selected[b])}}if(d===-1){d=c}this.createDispatchDataEvent($[572],d);break}}},_onKeyPress:function(b){var f=b.getKeyIdentifier();if(this._isRelevantEvent(b)&&org.eclipse.swt.widgets.Table._isNoModifierPressed(b)&&(f==="Up"||f==="Down"||f===$[58]||f===$[55]||f==="Home"||f==="End")){b.preventDefault();b.stopPropagation();var e=this._calcGotoIndex(this._focusIndex,f);if(e!==this._focusIndex&&e>=0&&e<this._itemCount){var c=this._focusIndex;this._setSingleSelection(e);if(!this._isItemFullyVisible(e)){var d;if(e===this._itemCount-1){d=e-this._getFullyVisibleRowCount()+1}else{d=e>=this._topIndex+this._getFullyVisibleRowCount()?e-this._getFullyVisibleRowCount()+1:e}if(d<0){d=0}else{if(d>this._itemCount){d=this._itemCount}}var a=this._itemCount-this._getFullyVisibleRowCount();if(e>a&&e<this._itemCount&&f===$[55]){d=a}this._internalSetTopIndex(d,true)}this.setFocusIndex(e);this._keyboardSelecionChanged=true}}if(this._isRelevantEvent(b)&&org.eclipse.swt.widgets.Table._isNoModifierPressed(b)&&(f==="Left"||f===$[53])){b.preventDefault();b.stopPropagation()}},_calcGotoIndex:function(b,c){var a=b;switch(c){case"Home":a=0;break;case"End":a=this._itemCount-1;break;case"Up":a=b-1;break;case"Down":a=b+1;break;case $[58]:a=b-this._getFullyVisibleRowCount();if(a<0){a=0}break;case $[55]:a=b+this._getFullyVisibleRowCount();if(a>this._itemCount-1){a=this._itemCount-1}break}return a},_getFullyVisibleRowCount:function(){return Math.floor(this._clientArea.getHeight()/this._itemHeight)},_onKeyUp:function(a){if(this._keyboardSelecionChanged){this._keyboardSelecionChanged=false;this._updateSelectionParam();this.createDispatchDataEvent($[494],this._focusIndex)}},_onVertScrollBarChangeValue:function(){if(!this._topIndexChanging){var b=0;if(this._itemHeight!==0){var a=this._clientArea.isCreated()?this._vertScrollBar.getValue():0;b=Math.floor(a/this._itemHeight)}this._internalSetTopIndex(b,false)}if(this._readyToSendChanges&&this._hasScrollBarsSelectionListener){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,500)}},_onHorzScrollBarChangeValue:function(){this._columnArea.setLeft(0-this._horzScrollBar.getValue());this._updateRowBounds();this._updateGridLines();this._leftOffsetChanged=true;if(this._readyToSendChanges&&this._hasScrollBarsSelectionListener){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,500)}},setHasScrollBarsSelectionListener:function(a){this._hasScrollBarsSelectionListener=a},_addItem:function(b,a){if(this._items[a]){this._items.splice(a,0,b)}else{this._items[a]=b}this._adjustSelectedIndices(a,true);this._updateScrollHeight()},_removeItem:function(b){var a=this._items.indexOf(b);this._items.splice(a,1);if(a===this._focusIndex){this._focusIndex=-1}this._deselectItem(a,false);this._adjustSelectedIndices(a,false);this._updateScrollHeight()},_selectItem:function(a){if(!this._isItemSelected(a)){this._selected.push(a);this.updateItem(a,true)}},_deselectItem:function(b,c){var a=this._selected.indexOf(b);if(a!=-1){this._selected.splice(a,1);if(c){this.updateItem(b,true)}}},_isItemSelected:function(a){return this._selected.indexOf(a)!==-1},_clearSelection:function(){while(this._selected.length>0){this._deselectItem(this._selected[0],true)}},_adjustSelectedIndices:function(d,a){for(var c=0;c<this._selected.length;c++){var b=this._selected[c];if(a){if(d<=b){this._selected[c]=b+1}}else{if(d<b){this._selected[c]=b-1}}}},_resetSelectionStart:function(){this._selectionStart=-1},_isItemVisible:function(a){return a>=this._topIndex&&a<this._topIndex+this._rows.length},_isItemFullyVisible:function(a){return a>=this._topIndex&&a<this._topIndex+this._getFullyVisibleRowCount()},_makeItemFullyVisible:function(a){var c=this._getRowIndexFromItemIndex(a);var b=c===-1?null:this._rows[c];if(b!==null&&b.getTop()+b.getHeight()>this._clientArea.getHeight()){this._internalSetTopIndex(this._topIndex+1,true)}},updateItem:function(b,a){var c=this._getRowIndexFromItemIndex(b);if(c!==-1){if(a){this._updateRow(c,b)}else{this._updateRowState(c,b)}}},_getRowIndexFromItemIndex:function(b){var a=-1;if(b>=this._topIndex&&b<this._topIndex+this._rows.length){a=b-this._topIndex}return a},_getItemIndexFromRowIndex:function(b){var a=this._topIndex+b;if(a<0||a>this._itemCount-1){a=-1}return a},_isItemHovered:function(b){var a=false;var d=this._getRowIndexFromItemIndex(b);if(d>=0){var c=this._rows[d];a=c.hasState("over")&&c.hasHoverColorsDefined()}return a},_addColumn:function(a){a.setHeight(this._columnArea.getHeight());this._hookColumnMove(a);a.addEventListener($[57],this._onColumnChangeSize,this);this._columnArea.add(a);this._updateScrollWidth()},_hookColumnMove:function(a){a.addEventListener($[145],this._onColumnChangeSize,this)},_unhookColumnMove:function(a){a.removeEventListener($[145],this._onColumnChangeSize,this)},_removeColumn:function(a){this._unhookColumnMove(a);a.removeEventListener($[57],this._onColumnChangeSize,this);this._columnArea.remove(a);this._updateScrollWidth();this._updateRows()},_onColumnChangeSize:function(a){this._updateScrollWidth()},_updateScrollHeight:function(){var a=this._itemHeight+this._itemCount*this._itemHeight;if(!this._vertScrollBar.getDisposed()){this._vertScrollBar.setMaximum(a)}},_updateScrollWidth:function(){var a;if(this.getColumnCount()===0){a=this.getDefaultColumnWidth();if(this._checkBoxes!==null){a+=this.getCheckWidth()}}else{a=this.getColumnsWidth()}this._horzScrollBar.setMaximum(a);this._updateColumnHeader();this._updateGridLines()},_updateColumnHeader:function(){var e=this.getWidth()-2*this._borderWidth;var d=this._columnArea.getChildren()[0];var b=this._vertScrollBar.getVisibility()?this._vertScrollBar.getWidth():0;var a;if(this.getColumnCount()===0){var c=this.getDefaultColumnWidth();if(this._checkBoxes!==null){c+=this.getCheckWidth()}a=Math.max(c+b,e);d.setLeft(0);d.setWidth(a)}else{var c=this.getColumnsWidth();a=Math.max(c+b,e);d.setLeft(c);d.setWidth(Math.max(a-c,0))}this._columnArea.setWidth(a)},_updateClientAreaSize:function(){var d=0;if(this._columnArea.getVisibility()){d=this._columnArea.getHeight()}var c=this._horzScrollBar.getVisibility()?this._horzScrollBar.getHeight():0;var b=this._vertScrollBar.getVisibility()?this._vertScrollBar.getWidth():0;var a=this.getHeight()-d-c-(2*this._borderWidth);var e=this.getWidth()-b-(2*this._borderWidth);this._vertScrollBar.setLeft(this.getWidth()-b-(2*this._borderWidth));this._vertScrollBar.setTop(d);this._vertScrollBar.setHeight(a);this._horzScrollBar.setLeft(0);this._horzScrollBar.setTop(this.getHeight()-c-(2*this._borderWidth));this._horzScrollBar.setWidth(e);this._clientArea.setTop(d);this._clientArea.setHeight(a);this._clientArea.setWidth(e);this._updateColumnHeader();if(this._updateRowCount()){this._updateRows()}else{this._updateRowBounds();this._updateRowTop()}this._updateGridLines()},_updateRowCount:function(){var b=false;if(this._clientArea.isCreated()){var e=0;var a=this._clientArea.getHeight();if(this._itemHeight!==0&&a>0){e=Math.ceil(a/this._itemHeight)}if(e!=this._rows.length){while(this._rows.length>e){if(this._checkBoxes!=null){var d=this._checkBoxes.shift();d.removeEventListener($[500],this._onCheckBoxClick,this);d.removeEventListener($[9],this._onCheckBoxOver,this);d.removeEventListener($[14],this._onCheckBoxOut,this);d.setParent(null);d.dispose()}var f=this._rows.shift();this._unhookRowEventListener(f);f.setParent(null);f.dispose()}if(this._rows.length<e){while(this._rows.length<e){var c=new org.eclipse.swt.widgets.TableRow();this._hookRowEventListener(c);c.setLinesVisible(this._linesVisible);this._clientArea.add(c);this._rows.push(c);if(this._checkBoxes!=null){var d=new qx.ui.basic.Image();d.addEventListener($[29],this._onCheckBoxClick,this);d.addEventListener($[9],this._onCheckBoxOver,this);d.addEventListener($[14],this._onCheckBoxOut,this);d.setAppearance("table-check-box");this._clientArea.add(d);this._checkBoxes.push(d)}}}this._updateRowBounds();this._updateRowTop();this._updateRowsState();b=true}}return b},_hookRowEventListener:function(a){a.addEventListener($[2],this._onRowMouseDown,this);a.addEventListener($[15],this._onRowMouseUp,this);a.addEventListener($[61],this._onRowDblClick,this);a.addEventListener($[41],this._onRowContextMenu,this);a.addEventListener($[305],this._onRowChangeOverState,this)},_unhookRowEventListener:function(a){a.removeEventListener($[2],this._onRowMouseDown,this);a.removeEventListener($[15],this._onRowMouseUp,this);a.removeEventListener($[61],this._onRowDblClick,this);a.removeEventListener($[41],this._onRowContextMenu,this);a.removeEventListener($[305],this._onRowChangeOverState,this)},_updateRowTop:function(){var c=this._itemHeight/2-this.getCheckHeight()/2;var b=0;for(var a=0;a<this._rows.length;a++){if(this._checkBoxes!==null){this._checkBoxes[a].setTop(b+c)}this._rows[a].setTop(b);b+=this._itemHeight}},_updateRowBounds:function(){var f=0-this._horzScrollBar.getValue();var d=0;var b=0;if(this._checkBoxes!==null){b=this.getCheckWidth();d=this.getCheckHeight()}var e;if(this.getColumnCount()===0){e=this.getDefaultColumnWidth()+b}else{e=this.getColumnsWidth()}if(this._clientArea.getWidth()>e){e=this._clientArea.getWidth()}for(var c=0;c<this._rows.length;c++){if(this._checkBoxes!==null){var a=this._checkBoxes[c];a.setLeft(f);a.setWidth(b);a.setHeight(d)}var g=this._rows[c];g.setLeft(f);g.setWidth(e);g.setHeight(this._itemHeight)}},_scrollRowsVertical:function(h){if(Math.abs(h)>this._rows.length){this._updateRows()}else{var e=new Array();var b=this._checkBoxes!==null?new Array():null;var g=this._rows.length;for(var d=0;d<g;d++){var a=(g+d+h)%g;e.push(this._rows[a]);if(this._checkBoxes!==null){b.push(this._checkBoxes[a])}}this._rows=e;this._checkBoxes=b;this._updateRowTop();for(var d=0;d<g;d++){var c=this._getItemIndexFromRowIndex(d);var f=this._rows[d].getItemIndex();if(f!==c){this._updateRow(d,c)}}}},_updateRows:function(){var b=(new Date()).getTime();for(var a=0;a<this._rows.length;a++){this._updateRow(a,this._getItemIndexFromRowIndex(a))}this._vertScrollBar.autoEnableMerge((new Date()).getTime()-b)},_updateRow:function(d,a){var c=this._rows[d];if(a>=0&&a<this._itemCount){var b=this._items[a];if(b===undefined||(b!==null&&!b.getCached())){this._scheduleResolveItems();this._renderItem(c,this._virtualItem);c.setItemIndex(-1)}else{this._renderItem(c,b);c.setItemIndex(a)}}else{this._renderItem(c,this._emptyItem);c.setItemIndex(-1)}this._updateRowState(d,a)},_renderItem:function(c,a){if(c.isCreated()){a._render(c)}else{var b=function(){a._render(c);c.removeEventListener($[105],b)};c.addEventListener($[105],b)}},_updateRowsState:function(){for(var a=0;a<this._rows.length;a++){this._updateRowState(a,this._getItemIndexFromRowIndex(a))}},_updateRowState:function(e,b){var d=this._rows[e];if(b===-1){d.removeState($[30]);d.removeState($[361]);if(this._checkBoxes!==null){this._checkBoxes[e].setVisibility(false)}}else{if(this._isItemSelected(b)&&!this.shouldHideSelection()){d.addState($[30])}else{d.removeState($[30])}if(this._focusIndex===b){d.addState($[361])}else{d.removeState($[361])}if(this._checkBoxes!==null){var c=this._items[b];var a=this._checkBoxes[e];if(c!==null&&c!==undefined){if(c.getChecked()){a.addState($[199])}else{a.removeState($[199])}if(c.getGrayed()){a.addState($[227])}else{a.removeState($[227])}a.setVisibility(true)}else{a.setVisibility(false)}}}if(this.getFocused()){d.removeState($[89])}else{d.addState($[89])}},_scheduleResolveItems:function(){if(this._resolveItemsFor===null){qx.client.Timer.once(this._sendResolveItemsRequest,this,500)}this._resolveItemsFor=this._topIndex},_sendResolveItemsRequest:function(h){if(!this.isDisposed()){var g=Math.abs(this._topIndex-this._resolveItemsFor);this._resolveItemsFor=null;if(g>this._rows.length-2){this._scheduleResolveItems()}else{var d=[];for(var b=0;b<this._rows.length;b++){var c=this._getItemIndexFromRowIndex(b);if(c>=0&&c<this._itemCount){var k=this._items[c];if(k===undefined||(k!==null&&!k.getCached())){d.push(c)}}}if(d.length>0){var j=d.join(",");var e=org.eclipse.swt.WidgetManager.getInstance();var a=e.findIdByWidget(this);var f=org.eclipse.swt.Request.getInstance();f.addParameter("org.eclipse.swt.events.setData.index",j);f.addEvent("org.eclipse.swt.events.setData",a);f.send()}}}},_showResizeLine:function(b){if(this._resizeLine===null){this._resizeLine=new qx.ui.basic.Terminator();this._resizeLine.setAppearance($[411]);this.add(this._resizeLine);qx.ui.core.Widget.flushGlobalQueues()}var d=this._clientArea.getTop();this._resizeLine._renderRuntimeTop(d);var c=b-2-this._horzScrollBar.getValue();this._resizeLine._renderRuntimeLeft(c);var a=this._clientArea.getHeight();this._resizeLine._renderRuntimeHeight(a);this._resizeLine.removeStyleProperty($[115])},_hideResizeLine:function(){this._resizeLine.setStyleProperty($[115],$[17])},_updateGridLines:function(){if(this.getLinesVisible()){var d=this.getColumns();this._showGridLines(d.length);var a=this._clientArea.getHeight();var f=this._columnArea.getLeft();for(var c=0;c<d.length;c++){var b=this._gridLines[c];var e=f+d[c].getLeft()+d[c].getWidth();b.setSpace(e-1,2,0,a);b.removeStyleProperty($[115])}}else{this._showGridLines(0)}},_showGridLines:function(c){for(var b=this._gridLines.length;b<c;b++){var a=new qx.ui.basic.Terminator();a.setAppearance("table-gridline-vertical");a.addState($[46]);a.setZIndex(100000);a.addEventListener($[2],this._onRowMouseDown,this);a.addEventListener($[15],this._onRowMouseUp,this);this._gridLines.push(a);this._clientArea.add(a)}for(var b=c;b<this._gridLines.length;b++){var a=this._gridLines[b];a.setStyleProperty($[115],$[17])}},_getRowAtPoint:function(g,e){var a=null;for(var d=0;a===null&&d<this._rows.length;d++){var h=this._rows[d];var c=h.getElement();var f=qx.bom.element.Location.getLeft(c);var b=qx.bom.element.Location.getTop(c);if(g>=f&&g<f+h.getWidth()&&e>=b&&e<b+h.getHeight()){a=h}}return a},_onFocusIn:function(a){this._updateRowsState()},_onFocusOut:function(a){this._updateRowsState()},onItemSelected:function(a){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(a.getTarget());var b=org.eclipse.swt.Request.getInstance();b.addEvent($[64],c);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.addParameter($[276],a.getData());b.send()},onItemDefaultSelected:function(a){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(a.getTarget());var b=org.eclipse.swt.Request.getInstance();b.addEvent($[165],c);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.addParameter($[276],a.getData());b.send()},onItemChecked:function(a){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(a.getTarget());var b=org.eclipse.swt.Request.getInstance();b.addEvent($[64],c);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.addParameter($[276],a.getData());b.addParameter($[346],"check");b.send()},_onSendRequest:function(a){if(this._topIndexChanged||this._leftOffsetChanged){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();if(this._topIndexChanged){b.addParameter(c+".topIndex",this._topIndex);this._topIndexChanged=false}if(this._leftOffsetChanged){b.addParameter(c+".leftOffset",this._horzScrollBar.getValue());this._leftOffsetChanged=false}}},_sendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var a=org.eclipse.swt.Request.getInstance();a.send()}this._readyToSendChanges=true},setEnableCellToolTip:function(a){if(a){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);this._cellToolTip=new org.eclipse.swt.widgets.TableCellToolTip(b);this._clientArea.addEventListener($[45],this._onClientAreaMouseMove,this);this._clientArea.setToolTip(this._cellToolTip)}else{this._clientArea.removeEventListener($[45],this._onClientAreaMouseMove,this);this._clientArea.setToolTip(null);this._cellToolTip.destroy();this._cellToolTip=null}},_onClientAreaMouseMove:function(l){if(this._cellToolTip!=null){var e=l.getPageX();var d=l.getPageY();var n=this._getRowAtPoint(e,d);if(n!=null){var a=n.getItemIndex();if(a!=-1){var j=org.eclipse.swt.WidgetManager.getInstance();var k=j.findIdByWidget(this._items[a]);var c=this.getColumns();var h=c.length==0?0:-1;var g=this._clientArea.getElement();var b=qx.bom.element.Location.getLeft(g);for(var f=0;h==-1&&f<c.length;f++){var m=b+this._itemLeft[f];if(e>=m&&e<m+this._itemWidth[f]){h=f}}this._cellToolTip.setCell(k,h)}}}},setCellToolTipText:function(a){if(this._cellToolTip!=null){this._cellToolTip.setText(a)}}}});
-qx.Class.define("org.eclipse.swt.widgets.TableItem",{extend:qx.core.Object,construct:function(b,a){arguments.callee.base.call(this);this._parent=b;this._cached=true;this._checked=false;this._grayed=false;this._texts=new Array();this._images=new Array();this._background=null;this._foreground=null;this._font=null;this._cellBackgrounds=null;this._cellForegrounds=null;this._cellFonts=null;if(a>=0){b._addItem(this,a)}},statics:{PX:"px"},members:{dispose:function(){arguments.callee.base.call(this);if(!this._parent.getDisposed()&&!qx.core.Object.inGlobalDispose()){this._parent._removeItem(this)}org.eclipse.swt.WidgetManager.getInstance().remove(this)},getCached:function(){return this._cached},setChecked:function(a){if(this._checked!=a){this._checked=a}},getChecked:function(){return this._checked},setGrayed:function(a){if(this._grayed!=a){this._grayed=a}},getGrayed:function(){return this._grayed},setSelection:function(b){var a=this._getIndex();if(b){this._parent._selectItem(a,false);this._parent._resetSelectionStart()}else{this._parent._deselectItem(a,false)}},setTexts:function(a){this._texts=a},setImages:function(a){this._images=a},setBackground:function(a){this._background=a},setForeground:function(a){this._foreground=a},setFont:function(a){this._font=a},setCellBackgrounds:function(a){this._cellBackgrounds=a},setCellForegrounds:function(a){this._cellForegrounds=a},setCellFonts:function(a){this._cellFonts=a},setVariant:function(a){this._variant=a},update:function(){this._cached=true;this._parent.updateItem(this._getIndex(),true)},clear:function(){this._cached=false;this._checked=false;this._grayed=false;this._texts=new Array();this._images=new Array();this._background=null;this._foreground=null;this._font=null;this._cellBackgrounds=null;this._cellForegrounds=null;this._cellFonts=null;this._variant=null},_render:function(f){var b=f.getElement();var h=this._parent;var e=0;var d=0;var n=0;var m=this._parent.getItemHeight()-1;if(m<0){m=0}var s=h.getColumnCount();var g=this._drawColors();if(s==0){s=1}var j=0;if(h.hasCheckBoxes()){j=h.getCheckWidth()}f.setVariant(this._variant);if(g&&this._background!=null){f.setBackgroundColor(this._background)}else{f.resetBackgroundColor()}for(var q=0;q<s;q++){var k="";var l="";var a="";var r=null;if(this._cellFonts&&this._cellFonts[q]){l=this._cellFonts[q]}else{if(this._font!=null){l=this._font}}if(g){if(this._cellForegrounds&&this._cellForegrounds[q]){a=this._cellForegrounds[q]}else{if(this._foreground!=null){a=this._foreground}}if(this._cellBackgrounds&&this._cellBackgrounds[q]){r=this._cellBackgrounds[q]}}if(r!=null){var o=this._getChildNode(b,e);e++;d=h.getItemLeft(q);n=h.getItemWidth(q)-1;if(n<0){n=0}this._renderBackground(o,d,n,m,r)}if(this._images&&this._images[q]){var o=this._getChildNode(b,e);e++;d=h.getItemImageLeft(q);n=h.getItemImageWidth(q);this._renderImage(o,d,n,m,this._images[q])}var o=this._getChildNode(b,e);e++;d=h.getItemTextLeft(q);n=h.getItemTextWidth(q);if(this._texts[q]!==undefined){k=this._texts[q]}var p=qx.constant.Layout.ALIGN_LEFT;var c=h.getColumn(q);if(c){p=c.getHorizontalChildrenAlign()}this._renderText(o,d,n,m,k,p,l,a)}this._deleteRemainingChildNodes(b,e)},_getChildNode:function(b,c){var a;if(b.childNodes.length>c){a=b.childNodes[c]}else{a=document.createElement("div");b.appendChild(a)}return a},_deleteRemainingChildNodes:function(b,c){for(var a=b.childNodes.length-1;a>=c;a--){b.removeChild(b.childNodes[a])}},_drawColors:function(){var a=this._parent.getEnabled();var c=this._parent._isItemSelected(this._getIndex());var b=this._parent._isItemHovered(this._getIndex());return a&&(this._parent.shouldHideSelection()||!c)&&!b},_renderBackground:function(d,e,c,a,b){d.innerHTML="&nbsp;";d.style.position=$[27];d.style.top="0px";d.style.left=e+org.eclipse.swt.widgets.TableItem.PX;d.style.width=c+org.eclipse.swt.widgets.TableItem.PX;d.style.height=a+org.eclipse.swt.widgets.TableItem.PX;d.style.backgroundImage="none";d.style.backgroundColor=b;d.style.fontSize="0";d.style.lineHeight="0";if(qx.core.Variant.isSet($[0],$[18])){d.style.filter=""}else{d.style.opacity="";d.style.KhtmlOpacity="";d.style.MozOpacity=""}},_renderImage:function(e,g,d,a,f){e.innerHTML="";e.style.position=$[27];e.style.overflow=$[17];e.style.top="0px";e.style.left=g+org.eclipse.swt.widgets.TableItem.PX;e.style.width=d+org.eclipse.swt.widgets.TableItem.PX;e.style.height=a+org.eclipse.swt.widgets.TableItem.PX;e.style.lineHeight=a+org.eclipse.swt.widgets.TableItem.PX;e.style.backgroundColor="";var c=qx.io.Alias.getInstance().resolve(f);e.style.backgroundImage="url("+c+")";e.style.backgroundRepeat=$[350];e.style.backgroundPosition=$[38];if(qx.core.Variant.isSet($[0],$[18])){e.style.filter=this._parent.getEnabled()?"":"Alpha(Opacity=30)"}else{var b=this._parent.getEnabled()?"":0.3;e.style.opacity=b;e.style.KhtmlOpacity=b;e.style.MozOpacity=b}},_renderText:function(d,f,c,a,g,h,b,e){if(d.innerHTML!=g){d.innerHTML=g}d.style.position=$[27];d.style.overflow=$[17];d.style.top="0px";d.style.textAlign=h;d.style.verticalAlign=$[32];d.style.whiteSpace="nowrap";if(qx.core.Variant.isSet($[0],$[121])){d.style.textDecoration=$[133]}d.style.left=f+org.eclipse.swt.widgets.TableItem.PX;d.style.width=c+org.eclipse.swt.widgets.TableItem.PX;d.style.height=a+org.eclipse.swt.widgets.TableItem.PX;if(b==""||b==null){if(!qx.core.Variant.isSet($[0],$[18])){d.style.font=b}d.style.fontFamily="";d.style.fontSize="";d.style.fontVariant="";d.style.fontStyle="";d.style.fontWeight=""}else{d.style.font=b}d.style.lineHeight=a+org.eclipse.swt.widgets.TableItem.PX;d.style.color=e;d.style.backgroundColor="";d.style.backgroundImage="none";if(qx.core.Variant.isSet($[0],$[18])){d.style.filter=""}else{d.style.opacity="";d.style.KhtmlOpacity="";d.style.MozOpacity=""}},_getIndex:function(){return this._parent._items.indexOf(this)}}});
+qx.Class.define("org.eclipse.rwt.widgets.Tree",{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this._rootItem=new org.eclipse.rwt.widgets.TreeItem();this._rootItem.setExpanded(true);this._hasCheckBoxes=false;this._hasFullSelection=false;this._isVirtual=false;this._hasMultiSelection=false;this._topItem=null;this._leadItem=null;this._topItemIndex=0;this._selection=[];this._focusItem=null;this._hoverItem=null;this._hoverElement=null;this._renderQueue={};this._resizeLine=null;this._linesVisible=false;this._selectionTimestamp=null;this._delayedSelection=false;this._headerHeight=0;this._itemHeight=16;this._checkBoxLeft=null;this._checkBoxWidth=null;this._hasSelectionListeners=false;this._selectionPadding=null;this._alignment=[];this._itemLeft=[];this._itemWidth=[];this._itemImageLeft=[];this._itemImageWidth=[];this._itemTextLeft=[];this._itemTextWidth=[];this._indentionWidth=16;this._columnCount=0;this._treeColumn=0;this._mergeEventsTimer=new qx.client.Timer(50);this._sendRequestTimer=null;this._vertGridBorder=null;this._horzGridBorder=null;this._clientArea=new qx.ui.layout.VerticalBoxLayout();this._columnArea=new qx.ui.layout.CanvasLayout();this._dummyColumn=new qx.ui.basic.Atom();this._horzScrollBar=new org.eclipse.rwt.widgets.ScrollBar(true);this._vertScrollBar=new org.eclipse.rwt.widgets.ScrollBar(false);this._hasScrollBarsSelectionListener=false;this._rows=this._clientArea.getChildren();this._vertGridLines=[];this.add(this._columnArea);this.add(this._clientArea);this.add(this._horzScrollBar);this.add(this._vertScrollBar);this._cellToolTip=null;this.setCursor($[38]);this.setOverflow($[17]);this.setAppearance("tree");this._configureAreas();this._configureScrollBars();this._registerListeners()},destruct:function(){this._rootItem.removeEventListener("update",this._onItemUpdate,this);this._rootItem.dispose();this._rootItem=null;if(this._sendRequestTimer!=null){this._sendRequestTimer.dispose();this._sendRequestTimer=null}this._mergeEventsTimer.dispose();this._mergeEventsTimer=null;this._dummyColumn=null;this._clientArea=null;this._columnArea=null;this._horzScrollBar=null;this._vertScrollBar=null;this._rows=null;this._topItem=null;this._leadItem=null;this._focusItem=null;this._hoverItem=null;this._hoverElement=null;this._resizeLine=null;if(this._cellToolTip){this._cellToolTip.destroy();this._cellToolTip=null}},members:{_registerListeners:function(){this._rootItem.addEventListener("update",this._onItemUpdate,this);this.addEventListener($[268],this._scheduleUpdate,this);this.addEventListener($[83],this._scheduleUpdate,this);this.addEventListener($[131],this._scheduleUpdate,this);this.addEventListener($[2],this._onMouseDown,this);this.addEventListener($[15],this._onMouseUp,this);this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[14],this._onMouseOut,this);this.addEventListener($[307],this._onElementChange,this);this.addEventListener("elementOut",this._onElementChange,this);this.addEventListener($[12],this._onKeyPress,this);this._clientArea.addEventListener($[55],this._onClientAreaMouseWheel,this);this._mergeEventsTimer.addEventListener($[49],this._updateTopItemIndex,this);this._horzScrollBar.addEventListener($[80],this._onHorzScrollBarChangeValue,this);this._vertScrollBar.addEventListener($[80],this._onVertScrollBarChangeValue,this)},_configureScrollBars:function(){var a=function(b){b.stopPropagation()};this._horzScrollBar.setZIndex(100000000);this._horzScrollBar.setVisibility(false);this._horzScrollBar.setLeft(0);this._horzScrollBar.setMergeEvents(false);this._horzScrollBar.addEventListener($[72],a);this._vertScrollBar.setZIndex(100000000);this._vertScrollBar.setVisibility(false);this._vertScrollBar.setIncrement(16);this._vertScrollBar.setMergeEvents(false);this._vertScrollBar.addEventListener($[72],a)},_configureAreas:function(){this._clientArea.setOverflow($[17]);this._clientArea.addEventListener($[31],this._onClientAreaAppear,this);this._columnArea.setOverflow($[17]);this._columnArea.addEventListener($[31],this._onColumnAreaAppear,this);this._columnArea.setTop(0);this._columnArea.setLeft(0);this._columnArea.setDisplay(false);var a=function(b){b.stopPropagation()};this._columnArea.addEventListener($[72],a);this._dummyColumn.setAppearance($[329]);this._dummyColumn.setHeight("100%");this._dummyColumn.setLabel("&nbsp;");this._dummyColumn.addState("dummy");this._columnArea.add(this._dummyColumn)},_createSendRequestTimer:function(){if(this._sendRequestTimer===null){var b=new qx.client.Timer(400);var a=org.eclipse.swt.Request.getInstance();b.addEventListener($[49],a.send,a);a.addEventListener("send",b.stop,b);this._sendRequestTimer=b}},setCheckBoxMetrics:function(b,a){this._checkBoxLeft=b;this._checkBoxWidth=a},setHasCheckBoxes:function(a){this._hasCheckBoxes=a},setHasFullSelection:function(a){this._hasFullSelection=a},setHasMultiSelection:function(a){this._hasMultiSelection=a},setHasNoScroll:function(a){if(a){this._clientArea.removeEventListener($[55],this._onClientAreaMouseWheel,this)}},setIndentionWidth:function(a){this._indentionWidth=a},setSelectionPadding:function(b,a){this._selectionPadding=[b,a]},setIsVirtual:function(a){this._isVirtual=a;if(a){this._createSendRequestTimer()}},setItemCount:function(a){this._rootItem.setItemCount(a)},setHeaderVisible:function(a){this._columnArea.setDisplay(a);this._layoutX();this._layoutY();this._scheduleUpdate(true)},setHeaderHeight:function(a){this._headerHeight=a;this._layoutX();this._layoutY();this._scheduleUpdate(true)},setItemHeight:function(a){this._itemHeight=a;this._vertScrollBar.setIncrement(a);for(var b=0;b<this._rows.length;b++){this._rows[b].setHeight(a)}this._scheduleUpdate(true,true)},setColumnCount:function(a){this._columnCount=a;this._scheduleUpdate();this._updateScrollWidth();this._renderGridVertical()},setItemMetrics:function(e,f,d,b,c,a,g){this._itemLeft[e]=f;this._itemWidth[e]=d;this._itemImageLeft[e]=b;this._itemImageWidth[e]=c;this._itemTextLeft[e]=a;this._itemTextWidth[e]=g;this._scheduleUpdate();this._renderGridVertical();this._updateScrollWidth()},setTreeColumn:function(a){this._treeColumn=a},setTopItemIndex:function(a){this._updateScrollHeight();this._vertScrollBar.setValue(a*this._itemHeight)},setScrollLeft:function(a){this._horzScrollBar.setValue(a)},selectItem:function(a){this._selectItem(a,false);this._scheduleItemUpdate(a)},deselectItem:function(a){this._deselectItem(a,false);this._scheduleItemUpdate(a)},setFocusItem:function(a){this._focusItem=a},setScrollBarsVisible:function(b,a){if(!b){this._horzScrollBar.setValue(0)}this._horzScrollBar.setVisibility(b);if(!a){this._vertScrollBar.setValue(0)}this._vertScrollBar.setVisibility(a);this._layoutX();this._layoutY()},setHasSelectionListeners:function(a){this._hasSelectionListeners=a},setAlignment:function(a,b){this._alignment[a]=b;this._scheduleUpdate()},setLinesVisible:function(b){this._linesVisible=b;if(b){this.addState($[179])}else{this.removeState($[179])}for(var a=0;a<this._rows.length;a++){this._rows[a].updateGridlinesState(b)}this._scheduleUpdate();this._renderGridHorizontal();this._renderGridVertical()},hasNoColumns:function(){return this._columnCount===0},getSelectionPadding:function(){return this._selectionPadding},getItemHeight:function(){return this._itemHeight},getLinesVisible:function(){return this._linesVisible},getItemLeft:function(c,b,d){var a=this._itemLeft[b];if(d&&this.isTreeColumn(b)){a=this._correctOffset(a,c)}return a},getItemWidth:function(c,b,d){var a=this._itemWidth[b];if(d&&this.isTreeColumn(b)){a-=this.getIndentionOffset(1)}return a},getItemImageLeft:function(c,b){var a=this._itemImageLeft[b];if(this.isTreeColumn(b)){a=this._correctOffset(a,c)}return a},getItemImageWidth:function(c,b){var a=this._itemImageWidth[b];if(this.isTreeColumn(b)){var d=this.getItemImageLeft(c,b);a=this._correctWidth(a,d,c,b)}return a},getItemTextLeft:function(c,b){var a=this._itemTextLeft[b];if(this.isTreeColumn(b)){a=this._correctOffset(a,c)}return a},getItemTextWidth:function(c,b){var a=this._itemTextWidth[b];if(this.isTreeColumn(b)){var d=this.getItemTextLeft(c,b);a=this._correctWidth(a,d,c,b)}return a},getIndentionOffset:function(a){return this._indentionWidth*a},getHasCheckBoxes:function(){return this._hasCheckBoxes},getHasFullSelection:function(){return this._hasFullSelection},getHasMultiSelection:function(){return this._hasMultiSelection},getIsVirtual:function(){return this._isVirtual},getCheckBoxLeft:function(a){return this._correctOffset(this._checkBoxLeft,a)},getCheckBoxWidth:function(b){var a=this._checkBoxWidth;var c=this.getCheckBoxLeft(b);return this._correctWidth(a,c,b,0)},getColumnCount:function(){return Math.max(1,this._columnCount)},getColumns:function(){return this._columnArea.getChildren().slice(1)},getRootItem:function(){return this._rootItem},isTreeColumn:function(a){return a===this._treeColumn},getTreeColumnWidth:function(){return this._itemWidth[this._treeColumn]},isFocusItem:function(a){return this._focusItem===a},isHoverItem:function(a){return this._hoverItem===a},isHoverElement:function(a){return a!==null&&this._hoverElement===a},isItemSelected:function(a){return this._selection.indexOf(a)!=-1},getAlignment:function(a){return this._alignment[a]?this._alignment[a]:"left"},getStatesCopy:function(){if(!this.__states){this.__states={}}var b={};for(var a in this.__states){b[a]=true}return b},_addColumn:function(a){a.setHeight("100%");a.addEventListener($[56],this._updateScrollWidth,this);this._hookColumnMove(a);this._columnArea.add(a)},_hookColumnMove:function(a){a.addEventListener($[149],this._updateScrollWidth,this)},_unhookColumnMove:function(a){a.removeEventListener($[149],this._updateScrollWidth,this)},_removeColumn:function(a){this._unhookColumnMove(a);a.removeEventListener($[56],this._updateScrollWidth,this);this._columnArea.remove(a);this._updateScrollWidth();this._updateRows()},_onColumnChangeSize:function(a){this._updateScrollWidth()},_showResizeLine:function(b){if(this._resizeLine===null){this._resizeLine=new qx.ui.basic.Terminator();this._resizeLine.setAppearance($[432]);this.add(this._resizeLine);qx.ui.core.Widget.flushGlobalQueues()}var d=this._clientArea.getTop();this._resizeLine._renderRuntimeTop(d);var c=b-2-this._horzScrollBar.getValue();this._resizeLine._renderRuntimeLeft(c);var a=this._clientArea.getHeight();this._resizeLine._renderRuntimeHeight(a);this._resizeLine.removeStyleProperty($[113])},_hideResizeLine:function(){this._resizeLine.setStyleProperty($[113],$[17])},_onItemUpdate:function(b){var a=b.getTarget();if(b.getData()===$[311]){if(this._isChildOf(this._focusItem,a)){this.setFocusItem(a)}}if(b.getData()===$[246]){this._topItem=null;this.addToQueue($[480])}this._sendItemChange(a,b);this._renderItemChange(a,b)},_onVertScrollBarChangeValue:function(){if(this._vertScrollBar._internalValueChange){this._mergeEventsTimer.start()}else{this._updateTopItemIndex()}},_updateTopItemIndex:function(){this._mergeEventsTimer.stop();var a=this._vertScrollBar.getValue();var b=this._topItemIndex;this._topItemIndex=Math.ceil(a/this._itemHeight);this._updateTopItem(b);if(this._inServerResponse()){this._updateRowsEvenState();this._scheduleUpdate()}else{this._sendTopItemIndexChange();this._scrollContentVertical(b)}},_updateRowsEvenState:function(){for(var a=0;a<this._rows.length;a++){this._rows[a].updateEvenState(this._topItemIndex+a)}},_onHorzScrollBarChangeValue:function(){if(this._clientArea.isSeeable()){this._clientArea.setScrollLeft(this._horzScrollBar.getValue())}if(this._columnArea.isSeeable()){this._columnArea.setScrollLeft(this._horzScrollBar.getValue())}this._renderGridVertical();this._sendScrollLeftChange()},_onMouseDown:function(a){this._delayedSelection=false;var b=a.getOriginalTarget();if(b instanceof org.eclipse.rwt.widgets.TreeRow){this._onRowMouseDown(b,a)}},_onMouseUp:function(a){if(this._delayedSelection){this._onMouseDown(a)}},_onRowMouseDown:function(d,c){var b=this._findItemByRow(d);if(b!=null){if(d.isExpandSymbolTarget(c)&&b.hasChildren()){var a=!b.isExpanded();if(!a){this._deselectVisibleChildren(b)}b.setExpanded(a)}else{if(d.isCheckBoxTarget(c)){b.setChecked(!b.isChecked());this._sendItemCheckedChange(b)}else{if(d.isSelectionClick(c)){this._onSelectionClick(c,b)}}}}},_onSelectionClick:function(b,a){var c=this._isDoubleClicked(b,a);if(c){this._sendSelectionEvent(a,true,null)}else{if(this._hasMultiSelection){if(!this._delayMultiSelect(b,a)){this._multiSelectItem(b,a)}}else{this._singleSelectItem(a)}}},_delayMultiSelect:function(b,a){if(this._isDragSource()&&this.isItemSelected(a)&&b.getType()===$[2]){this._delayedSelection=true}return this._delayedSelection},_onMouseOver:function(a){var b=a.getOriginalTarget();if(b instanceof org.eclipse.rwt.widgets.TreeRow){this._onRowOver(b)}},_onMouseOut:function(a){var b=a.getOriginalTarget();this._delayedSelection=false;if(b instanceof org.eclipse.rwt.widgets.TreeRow){this._onRowOver(null)}},_onElementChange:function(c){var e=c.getType()===$[307];this._hoverElement=e?c.getDomTarget():null;var d=c.getTarget();var a=d===c.getRelatedTarget();if(a&&d instanceof org.eclipse.rwt.widgets.TreeRow){var b=d.isCheckBoxTarget(c)||d.isExpandSymbolTarget(c);if(this._hoverItem!==null&&b){d.renderItem(this._hoverItem)}}},_onRowOver:function(b){var a=this._hoverItem;this._hoverItem=this._findItemByRow(b);this._renderItem(a);if(b!=null){b.renderItem(this._hoverItem)}},_onClientAreaMouseWheel:function(a){a.preventDefault();a.stopPropagation();var b=a.getWheelDelta()*this._itemHeight*2;this._vertScrollBar.setValue(this._vertScrollBar.getValue()-b)},_onKeyPress:function(a){if(this._focusItem!=null){switch(a.getKeyIdentifier()){case $[71]:this._handleKeyEnter(a);break;case $[91]:this._handleKeySpace(a);break;case"Up":this._handleKeyUp(a);break;case"Down":this._handleKeyDown(a);break;case $[57]:this._handleKeyPageUp(a);break;case $[58]:this._handleKeyPageDown(a);break;case"Home":this._handleKeyHome(a);break;case"End":this._handleKeyEnd(a);break;case"Left":this._handleKeyLeft(a);break;case $[51]:this._handleKeyRight(a);break}}},_onClientAreaAppear:function(){this._clientArea.setScrollLeft(this._horzScrollBar.getValue())},_onColumnAreaAppear:function(){this._columnArea.setScrollLeft(this._horzScrollBar.getValue())},_handleKeyEnter:function(a){this._sendSelectionEvent(this._focusItem,true,null)},_handleKeySpace:function(b){var a=this._findIndexByItem(this._focusItem);this._handleKeyboardSelect(b,this._focusItem,a)},_handleKeyUp:function(c){var b=this._getPreviousItem(this._focusItem);if(b!=null){var a=this._findIndexByItem(b);this._handleKeyboardSelect(c,b,a)}},_handleKeyDown:function(c){var b=this._getNextItem(this._focusItem);if(b!=null){var a=this._findIndexByItem(b);this._handleKeyboardSelect(c,b,a)}},_handleKeyPageUp:function(d){var f=this._findIndexByItem(this._focusItem);var e=this._rows.length-2;var a=Math.max(0,f-e);var c=this._findItemByIndex(a);var b=this._findIndexByItem(c);this._handleKeyboardSelect(d,c,b)},_handleKeyPageDown:function(e){var g=this._findIndexByItem(this._focusItem);var f=this._rows.length-2;var a=this.getRootItem().getVisibleChildrenCount()-1;var b=Math.min(a,g+f);var d=this._findItemByIndex(b,this._topItem,this._topItemIndex);var c=this._findIndexByItem(d);this._handleKeyboardSelect(e,d,c)},_handleKeyHome:function(b){var a=this.getRootItem().getChild(0);this._handleKeyboardSelect(b,a,0)},_handleKeyEnd:function(c){var b=this.getRootItem().getLastChild();var a=this.getRootItem().getVisibleChildrenCount()-1;this._handleKeyboardSelect(c,b,a)},_handleKeyLeft:function(c){if(this._focusItem.isExpanded()){this._focusItem.setExpanded(false)}else{if(!this._focusItem.getParent().isRootItem()){var b=this._focusItem.getParent();var a=this._findIndexByItem(b);this._handleKeyboardSelect(c,b,a,true)}}},_handleKeyRight:function(c){if(this._focusItem.hasChildren()){if(!this._focusItem.isExpanded()){this._focusItem.setExpanded(true)}else{var b=this._focusItem.getChild(0);var a=this._findIndexByItem(b);this._handleKeyboardSelect(c,b,a,true)}}},_handleKeyboardSelect:function(d,c,b,a){this._scrollIntoView(b);if(this._hasMultiSelection&&!a){this._multiSelectItem(d,c)}else{this._singleSelectItem(c)}},_renderItemChange:function(b,a){if(b.isDisplayable()){switch(a.getData()){case $[279]:case $[311]:this._scheduleUpdate(false,true);break;case"add":case $[246]:if(b.isExpanded()){this._scheduleUpdate(false,true)}else{this._scheduleItemUpdate(b)}break;default:if(this._inServerResponse()){this._scheduleItemUpdate(b)}else{this._renderItem(b)}break}}},_scheduleItemUpdate:function(a){this._renderQueue[a.toHashCode()]=true;this.addToQueue($[365])},_scheduleUpdate:function(a,b){if(a===true){this._updateRowCount()}if(b===true){this.addToQueue($[514])}this._renderQueue.allItems=true;this.addToQueue($[365])},_layoutPost:function(a){arguments.callee.base.call(this,a);if(a[$[480]]){this._checkDisposedItems()}if(a[$[514]]){this._updateScrollHeight()}if(a[$[365]]){if(this._renderQueue.allItems){this._updateAllRows()}else{this._updateQueuedItems()}this._renderQueue={}}},_updateRowCount:function(){var a=this._clientArea.getHeight();var c=Math.ceil(a/this._itemHeight);var b=this._getRowWidth();while(this._rows.length<c){var d=new org.eclipse.rwt.widgets.TreeRow(this);d.setHeight(this._itemHeight);d.setWidth(b);d.updateGridlinesState(this._linesVisible);this._clientArea.add(d)}while(this._rows.length>c){this._rows[this._rows.length-1].destroy()}this._renderGridHorizontal();this._updateRowsEvenState()},_updateAllRows:function(){var a=(new Date()).getTime();this._updateRows(0,this._rows.length);this._vertScrollBar.autoEnableMerge((new Date()).getTime()-a)},_updateQueuedItems:function(){var a=this._getTopItem();var b=0;while(a!=null&&b<this._rows.length){if(this._renderQueue[a.toHashCode()]){this._rows[b].renderItem(a)}a=this._getNextItem(a);b++}},_updateRows:function(f,e){var b=this._getTopItem();var d=f+e;var c=0;while(b!=null&&c<this._rows.length){if(c>=f&&c<=d){this._rows[c].renderItem(b)}b=this._getNextItem(b);c++}for(var a=c;a<this._rows.length;a++){this._rows[a].renderItem(null)}},_renderItem:function(a){if(this._isCreated&&a!=null){var b=this._findRowByItem(a);if(b!=null){b.renderItem(a)}}},_getTopItem:function(){if(this._topItem===null){this._updateTopItem()}return this._topItem},_updateScrollHeight:function(){var b=this.getRootItem().getVisibleChildrenCount();var a=b*this._itemHeight;if(this._vertScrollBar.getMaximum()!=a){if(!this._vertScrollBar.getDisposed()){this._vertScrollBar.setMaximum(a)}this._topItem=null}},_updateTopItem:function(a){if(typeof a==$[78]){this._topItem=this._findItemByIndex(this._topItemIndex,this._topItem,a)}else{this._topItem=this._findItemByIndex(this._topItemIndex)}},_updateScrollWidth:function(){var c=this._getItemWidth();var a=this._getRowWidth();for(var b=0;b<this._rows.length;b++){this._rows[b].setWidth(a)}if(!this._horzScrollBar.getDisposed()){this._horzScrollBar.setMaximum(c)}if(this._columnArea.getVisibility()){this._renderDummyColumn()}},_renderDummyColumn:function(){var b=this._getDummyColumnLeft();var a=this._columnArea.getWidth();var c=Math.max(0,a-b);if(this._vertScrollBar.getVisibility()){c=Math.max(c,this._vertScrollBar.getWidth())}this._dummyColumn.setLeft(b);this._dummyColumn.setWidth(c)},_getDummyColumnLeft:function(){var c=this._columnArea.getChildren();var a=0;for(var b=0;b<c.length;b++){if(c[b]!==this._dummyColumn){var d=c[b].getLeft()+c[b].getWidth();a=Math.max(a,d)}}return a},_scrollIntoView:function(a){if(a<this._topItemIndex){this.setTopItemIndex(a)}else{if(a>(this._topItemIndex+this._rows.length-2)){this.setTopItemIndex(a-this._rows.length+2)}}},_scrollContentVertical:function(a){var f=this._topItemIndex-a;var e=f>0;f=Math.abs(f);if(f>=this._rows.length){this._updateRowsEvenState();this._updateAllRows()}else{var d=this._rows.length-f;var c=e?d:0;var b=e?f:d;this._switchRows(b);this._updateRowsEvenState();this._updateRows(c,f)}},_switchRows:function(c){var a=this._rows.slice(c);this._rows=a.concat(this._rows.slice(0,c));this._clientArea._children=this._rows;this._clientArea._invalidateVisibleChildren();var e=this._clientArea.getLayoutImpl();var d={locationY:true};for(var b=0;b<this._rows.length;b++){e.layoutChild(this._rows[b],d)}},setHasScrollBarsSelectionListener:function(a){this._hasScrollBarsSelectionListener=a;if(a){this._createSendRequestTimer()}},_sendSelectionChange:function(c){if(!this._inServerResponse()){var b=org.eclipse.swt.Request.getInstance();var d=org.eclipse.swt.WidgetManager.getInstance();var e=d.findIdByWidget(this);var a=this._getSelectionIndices();b.addParameter(e+$[143],a);this._sendSelectionEvent(c,false,null)}},_sendItemCheckedChange:function(b){if(!this._inServerResponse()){var a=org.eclipse.swt.Request.getInstance();var c=org.eclipse.swt.WidgetManager.getInstance();var d=c.findIdByWidget(b);a.addParameter(d+".checked",b.isChecked());this._sendSelectionEvent(b,false,"check")}},_sendTopItemIndexChange:function(){var a=org.eclipse.swt.Request.getInstance();var b=org.eclipse.swt.WidgetManager.getInstance();var c=b.findIdByWidget(this);a.addParameter(c+".topItemIndex",this._topItemIndex);if(this._isVirtual||this._hasScrollBarsSelectionListener){this._sendRequestTimer.start()}},_sendScrollLeftChange:function(){var a=org.eclipse.swt.Request.getInstance();var b=org.eclipse.swt.WidgetManager.getInstance();var c=b.findIdByWidget(this);a.addParameter(c+".scrollLeft",this._horzScrollBar.getValue());if(this._isVirtual||this._hasScrollBarsSelectionListener){this._sendRequestTimer.start()}},_sendItemChange:function(b,a){if(!this._inServerResponse()){switch(a.getData()){case $[279]:this._sendItemEvent(b,"org.eclipse.swt.events.treeExpanded");break;case $[311]:this._sendItemEvent(b,"org.eclipse.swt.events.treeCollapsed");break;default:}}},_sendItemEvent:function(c,a){var d=org.eclipse.swt.WidgetManager.getInstance();var e=d.findIdByWidget(c);var b=org.eclipse.swt.Request.getInstance();b.addEvent(a,e);b.send()},_sendSelectionEvent:function(e,c,b){if(this._hasSelectionListeners){var d=org.eclipse.swt.Request.getInstance();var f=org.eclipse.swt.WidgetManager.getInstance();var h=f.findIdByWidget(this);var a="org.eclipse.swt.events.widget";a+=c?"DefaultSelected":"Selected";var g=f.findIdByWidget(e);d.addEvent(a,h);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();d.addParameter(a+".item",g);if(b!=null){d.addParameter(a+".detail",b)}d.send()}},_isDoubleClicked:function(e,d){var a=false;var b=e.getType()===$[2];var g=e.getButton()==="left";if(g&&b&&this.isFocusItem(d)&&this._selectionTimestamp!=null){var c=new Date();var f=org.eclipse.swt.EventUtil.DOUBLE_CLICK_TIME;if(c.getTime()-this._selectionTimestamp.getTime()<f){a=true}}if(b&&g&&!a){this._selectionTimestamp=new Date()}else{if(b){this._selectionTimestamp=null}}return a},_getSelectionIndices:function(){var c=org.eclipse.swt.WidgetManager.getInstance();var a=[];for(var b=0;b<this._selection.length;b++){a.push(c.findIdByWidget(this._selection[b]))}return a.join()},_singleSelectItem:function(a){this._deselectAll();this._leadItem=null;this._selectItem(a,true);this._sendSelectionChange(a);this.setFocusItem(a)},_multiSelectItem:function(b,a){if(b instanceof qx.event.type.MouseEvent&&b.isRightButtonPressed()){if(!this.isItemSelected(a)){this._singleSelectItem(a)}}else{if(b.isCtrlPressed()){if(b instanceof qx.event.type.KeyEvent&&a!=this._focusItem){this.setFocusItem(a)}else{this._ctrlSelectItem(a)}}else{if(b.isShiftPressed()){if(this._focusItem!=null){this._shiftSelectItem(a)}else{this._singleSelectItem(a)}}else{this._singleSelectItem(a)}}}},_ctrlSelectItem:function(a){if(!this.isItemSelected(a)){this._selectItem(a,true)}else{this._deselectItem(a,true)}this._sendSelectionChange(a);this.setFocusItem(a)},_shiftSelectItem:function(c){this._deselectAll();var b=this._leadItem!=null?this._leadItem:this._focusItem;this._leadItem=b;var e=c;var f=this._findIndexByItem(b);var d=this._findIndexByItem(e);if(f>d){var a=b;b=e;e=a}this._selectItem(b,true);while(b!==e){b=this._getNextItem(b);this._selectItem(b,true)}this._sendSelectionChange(c);this.setFocusItem(c)},_selectItem:function(b,a){if(!this.isItemSelected(b)){this._selection.push(b)}if(a){this._renderItem(b)}},_deselectItem:function(b,a){if(this.isItemSelected(b)){this._selection.splice(this._selection.indexOf(b),1)}if(a){this._renderItem(b)}},_deselectAll:function(){var a=this._selection;this._selection=[];for(var b=0;b<a.length;b++){this._renderItem(a[b])}},_deselectVisibleChildren:function(b){var a=this._getNextItem(b);var c=this._getNextItem(b,true);while(a!==c){this._deselectItem(a,false);a=this._getNextItem(a,false)}},_applyFocused:function(b,a){arguments.callee.base.call(this,b,a);this._scheduleUpdate()},_checkDisposedItems:function(){if(this._focusItem&&this._focusItem.isDisposed()){this._focusItem=null}if(this._hoverItem&&this._hoverItem.isDisposed()){this._hoverItem=null}if(this._leadItem&&this._leadItem.isDisposed()){this._leadItem=null}var a=0;while(a<this._selection.length){if(this._selection[a].isDisposed()){this._deselectItem(this._selection[a],false)}else{a++}}},_applyBackgroundColor:function(a){this._clientArea.setBackgroundColor(a)},_applyBackgroundImage:function(a){this._clientArea.setBackgroundImage(a)},_applyWidth:function(b,a){arguments.callee.base.call(this,b,a);this._layoutX()},_applyHeight:function(b,a){arguments.callee.base.call(this,b,a);this._layoutY()},_applyBorder:function(b,a){arguments.callee.base.call(this,b,a);this._layoutX();this._layoutY()},_renderGridVertical:function(){var b=0;if(this._linesVisible){for(var a=0;a<this._columnCount;a++){b=this._renderVerticalGridline(a,b)}}while(this._vertGridLines.length>b){this._vertGridLines.pop().destroy()}},_renderVerticalGridline:function(b,c){var e=c;var f=this._clientArea.getWidth();var d=this._itemLeft[b]+this._itemWidth[b]-1;d-=this._horzScrollBar.getValue();if(d>0&&d<f){var a=this._getVerticalGridline(c);a.setLeft(d);a.setTop(this._clientArea.getTop());a.setHeight(this._clientArea.getHeight());e++}return e},_getVerticalGridline:function(b){if(typeof this._vertGridLines[b]===$[8]){var a=new qx.ui.basic.Terminator();a.setZIndex(1);a.setWidth(0);a.setBorder(this._getVerticalGridBorder());this._vertGridLines[b]=a;this.add(a)}return this._vertGridLines[b]},_renderGridHorizontal:function(){var a=this._linesVisible?this._getHorizontalGridBorder():null;for(var b=0;b<this._rows.length;b++){this._rows[b].setBorder(a)}},_getHorizontalGridBorder:function(){if(this._horzGridBorder===null){this._horzGridBorder=this._getGridBorder({horizontal:true})}return this._horzGridBorder},_getVerticalGridBorder:function(){if(this._vertGridBorder===null){this._vertGridBorder=this._getGridBorder({vertical:true})}return this._vertGridBorder},_getGridBorder:function(c){var a=new org.eclipse.swt.theme.ThemeValues(c);var b=a.getCssColor($[452],$[6]);a.dispose();var d=[0,0,0,0];b=b==$[8]?$[155]:b;if(c.horizontal){d[2]=1}else{if(c.vertical){d[1]=1}}return new org.eclipse.rwt.Border(d,$[20],b)},_layoutX:function(){var a=this.getWidth()-this.getFrameWidth();if(this._columnArea.getDisplay()){this._columnArea.setWidth(a)}if(this._vertScrollBar.getVisibility()){a-=this._vertScrollBar.getWidth();this._vertScrollBar.setLeft(a)}this._horzScrollBar.setWidth(a);this._clientArea.setWidth(a);this._updateScrollWidth();this._renderGridVertical()},_layoutY:function(){var a=this.getHeight()-this.getFrameHeight();var b=0;if(this._columnArea.getDisplay()){b=this._headerHeight;a-=this._headerHeight;this._columnArea.setHeight(this._headerHeight)}if(this._horzScrollBar.getVisibility()){a-=this._horzScrollBar.getHeight();this._horzScrollBar.setTop(b+a)}a=Math.max(0,a);this._vertScrollBar.setHeight(a);this._vertScrollBar.setTop(b);this._clientArea.setTop(b);this._clientArea.setHeight(a);this._renderGridVertical();this._scheduleUpdate(true)},_getItemWidth:function(){var a=0;if(this._itemLeft.length>0){for(var b=0;b<this.getColumnCount();b++){a=Math.max(a,this._itemLeft[b]+this._itemWidth[b])}}return a},_getRowWidth:function(){var b=this._clientArea.getWidth();var a=Math.max(this._getItemWidth(),b);return a},_getNextItem:function(c,b){var a=null;if(!b&&c.hasChildren()&&c.isExpanded()){a=c.getChild(0)}else{if(c.hasNextSibling()){a=c.getNextSibling()}else{if(c.getLevel()>0){a=this._getNextItem(c.getParent(),true)}}}return a},_getPreviousItem:function(b){var a=null;if(b.hasPreviousSibling()){a=b.getPreviousSibling();while(a.hasChildren()&&a.isExpanded()){a=a.getLastChild()}}else{if(b.getLevel()>0){a=b.getParent()}}return a},_findItemByRow:function(b){var a=null;if(b!=null){var c=this._getTopItem();var d=0;while(c!=null&&a==null){if(this._rows[d]===b){a=c}c=this._getNextItem(c);d++}}return a},_findRowIndexByItem:function(b){var a=this._getTopItem();var c=0;while(a!=b&&a!=null&&c<this._rows.length){a=this._getNextItem(a);c++}return a!=null&&c<this._rows.length?c:null},_findRowByItem:function(b){var a=this._findRowIndexByItem(b);return a!=null?this._rows[a]:null},_findItemByIndex:function(e,d,f){var a;var c=d?d:this.getRootItem().getChild(0);var b=f?f:0;if(e>=b){a=this._findItemByIndexForwards(e,c,b)}else{a=this._findItemByIndexBackwards(e,c,b)}return a},_findItemByIndexForwards:function(b,a,f){var c=f;var d=a;while(c!=b&&d!=null){var e=c+d.getVisibleChildrenCount()+1;if(e<=b){c=e;d=this._getNextItem(d,true)}else{d=this._getNextItem(d,false);c++}}return d},_findItemByIndexBackwards:function(c,b,g){var d=g;var f=b;while(d!=c&&f!=null){if(f.hasPreviousSibling()){var e=f.getPreviousSibling();var a=d-(e.getVisibleChildrenCount()+1);if(a>=c){d=a;f=e}else{f=this._getPreviousItem(f);d--}}else{f=this._getPreviousItem(f);d--}}return f},_findIndexByItem:function(b){var f=this._getTopItem();var e=this._getTopItem();var d=this._topItemIndex;var c=this._topItemIndex;while(f!==b&&e!==b){if(f!=null){f=this._getNextItem(f);d++}if(e!=null){e=this._getPreviousItem(e);c--}if(e===null&&f===null){throw"Tree._findIndexByItem failed!"}}var a;if(f===b){a=d}else{a=c}return a},_isChildOf:function(d,b){var a=false;var c=d;while(c!=null&&!a){c=c.getParent();a=c===b}return a},_correctOffset:function(b,a){return b+this.getIndentionOffset(a.getLevel()+1)},_correctWidth:function(d,g,e,c){var a=d;var f=this._itemLeft[c]+this._itemWidth[c];var b=g+a;if(b>f){a=Math.max(0,f-g)}return a},_inServerResponse:function(){return org.eclipse.swt.EventUtil.getSuspended()},_isDragSource:function(){return this.hasEventListeners($[72])},setEnableCellToolTip:function(a){if(a){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);this._cellToolTip=new org.eclipse.swt.widgets.TableCellToolTip(b);this._clientArea.addEventListener($[45],this._onClientAreaMouseMove,this);this._clientArea.setToolTip(this._cellToolTip)}else{this._clientArea.removeEventListener($[45],this._onClientAreaMouseMove,this);this._clientArea.setToolTip(null);this._cellToolTip.destroy();this._cellToolTip=null}},_onClientAreaMouseMove:function(k){if(this._cellToolTip!=null){var d=k.getPageX();var c=k.getPageY();if(this._hoverItem){var h=org.eclipse.swt.WidgetManager.getInstance();var j=h.findIdByWidget(this._hoverItem);var b=this.getColumns();var g=b.length==0?0:-1;var f=this._clientArea.getElement();var a=qx.bom.element.Location.getLeft(f);for(var e=0;g==-1&&e<b.length;e++){var l=a+this._itemLeft[e];if(d>=l&&d<l+this._itemWidth[e]){g=e}}this._cellToolTip.setCell(j,g)}}},setCellToolTipText:function(a){if(this._cellToolTip!=null){this._cellToolTip.setText(a)}}}});
+qx.Class.define("org.eclipse.rwt.widgets.TreeItem",{extend:qx.core.Target,construct:function(b,a,c){this._autoDispose=false;arguments.callee.base.call(this);this._parent=b;this._level=-1;this._children=[];this._visibleChildrenCount=0;this._expanded=false;this._texts=c?["..."]:[];this._images=[];this._cached=!c;this._font=null;this._cellFonts=[];this._foreground=null;this._cellForegrounds=[];this._background=null;this._cellBackgrounds=[];this._checked=false;this._grayed=false;this._variant=null;if(this._parent!=null){this._level=this._parent.getLevel()+1;this._parent._add(this,a)}this.addEventListener("update",this._onUpdate,this)},destruct:function(){if(this._parent!=null){this._parent._remove(this)}org.eclipse.swt.WidgetManager.getInstance().remove(this)},statics:{createItem:function(c,b,e){var a=this._getItem(c);var d;if(a.isChildCreated(b)&&!a.isChildCached(b)){d=a.getChild(b);d.markCached()}else{d=new org.eclipse.rwt.widgets.TreeItem(a,b,false)}org.eclipse.swt.WidgetManager.getInstance().add(d,e,false)},_getItem:function(b){var a;if(b instanceof org.eclipse.rwt.widgets.Tree){a=b.getRootItem()}else{a=b}return a}},events:{update:$[11]},members:{setItemCount:function(a){var b=this._children.length>a?$[246]:"add";this._children.length=a;this._update(b)},isCached:function(){return this._cached},markCached:function(){this._cached=true;this._texts=[]},setTexts:function(a){this._texts=a;this._update()},getText:function(b){var a=this._texts[b];return typeof a===$[13]?a:""},setFont:function(a){this._font=a;this._update()},getCellFont:function(b){var a=this._cellFonts[b];return typeof a===$[13]&&a!=""?a:this._font},setCellFonts:function(a){this._cellFonts=a;this._update()},setForeground:function(a){this._foreground=a;this._update()},getCellForeground:function(b){var a=this._cellForegrounds[b];return typeof a===$[13]?a:this._foreground},setCellForegrounds:function(a){this._cellForegrounds=a;this._update()},setBackground:function(a){this._background=a;this._update()},getCellBackground:function(b){var a=this._cellBackgrounds[b];return typeof a===$[13]?a:null},getBackground:function(){return this._background},setCellBackgrounds:function(a){this._cellBackgrounds=a;this._update()},setImages:function(a){this._images=a;this._update()},getImage:function(b){var a=this._images[b];return typeof a===$[13]?a:null},getLevel:function(){return this._level},getParent:function(){return this._parent},getVisibleChildrenCount:function(){if(this._visibleChildrenCount==null){this._computeVisibleChildrenCount()}return this._visibleChildrenCount},setVariant:function(a){this._variant=a},getVariant:function(){return this._variant},_add:function(b,a){if(a===this._children.length||a===undefined){this._children.push(b);this._update("add",b)}else{if(this._children[a]){this._children.splice(a,0,b);this._children.pop();this._update("add",b)}else{this._children[a]=b;b._update()}}},_remove:function(c){var b=this._children;var a=b.indexOf(c);this._children.splice(a,1);this._children.push(undefined);this._update($[246],c)},hasChildren:function(){return this._children.length>0},getChild:function(b){var a=this._children[b];if(!a){if(b>=0&&b<this._children.length){a=new org.eclipse.rwt.widgets.TreeItem(this,b,true)}else{a=null}}return a},isChildCreated:function(a){return this._children[a]!==undefined},isChildCached:function(a){return this._children[a].isCached()},getLastChild:function(){return this.getChild(this._children.length-1)},getIndexOfChild:function(a){return this._children.indexOf(a)},setExpanded:function(a){if(this._expanded!=a){this._expanded=a;this._update(a?$[279]:$[311])}},isExpanded:function(){return this._expanded},hasPreviousSibling:function(){var b=this._parent._children;var a=b.indexOf(this)-1;return a>=0},hasNextSibling:function(){var b=this._parent._children;var a=b.indexOf(this)+1;return a<b.length},getPreviousSibling:function(){var a=this._parent.getIndexOfChild(this)-1;return this._parent.getChild(a)},getNextSibling:function(){var a=this._parent.getIndexOfChild(this)+1;return this._parent.getChild(a)},isRootItem:function(){return this._level<0},setChecked:function(a){this._checked=a;this._update()},isChecked:function(){return this._checked},setGrayed:function(a){this._grayed=a;this._update()},isGrayed:function(){return this._grayed},isDisplayable:function(){var a=false;if(this.isRootItem()||this._parent.isRootItem()){a=true}else{a=this._parent.isExpanded()&&this._parent.isDisplayable()}return a},getEnabled:function(){return true},_update:function(c,b){var a=new qx.event.type.DataEvent("update");a.setData(typeof c!=$[8]?c:null);a.setBubbles(true);a.setPropagationStopped(false);if(b){a.setRelatedTarget(b)}this.dispatchEvent(a,true)},_onUpdate:function(){this._visibleChildrenCount=null},_computeVisibleChildrenCount:function(){var a=0;if(this.isExpanded()||this.isRootItem()){a=this._children.length;for(var b=0;b<this._children.length;b++){if(this.isChildCreated(b)){a+=this.getChild(b).getVisibleChildrenCount()}}}this._visibleChildrenCount=a},toString:function(){return"TreeItem "+this._texts.join()}}});
+qx.Class.define("org.eclipse.rwt.TreeDNDFeedback",{extend:qx.core.Object,construct:function(a){arguments.callee.base.call(this);this._tree=a;this._feedback=null;this._currentRow=null;this._insertIndicator=null;this._expandTimer=null;this._scrollTimer=null},destruct:function(){this._renderFeedback(this._currentRow,false);if(this._expandTimer!=null){this._expandTimer.dispose();this._expandTimer=null}if(this._scrollTimer!=null){this._scrollTimer.dispose();this._scrollTimer=null}this._tree=null;this._feedback=null;this._insertIndicator=null;this._currentRow=null},members:{setFeedback:function(a){this._renderFeedback(this._currentRow,false);this._feedback=a;this._renderFeedback(this._currentRow,true)},renderFeedback:function(a){this._renderFeedback(this._currentRow,false);this._renderFeedback(a,true);this._currentRow=a},isFeedbackNode:function(b){var a=false;if(this._insertIndicator!=null&&this._insertIndicator==b){a=true}return a},_renderFeedback:function(b,a){if(this._feedback!=null&&b!=null){if(this._feedback.select){this._renderFeedbackSelect(b,a)}else{if(this._feedback.before){this._renderFeedbackBefore(b,a)}else{if(this._feedback.after){this._renderFeedbackAfter(b,a)}}}if(this._feedback.expand){this._renderFeedbackExpand(b,a)}if(this._feedback[$[26]]){this._renderFeedbackScroll(b,a)}}},_renderFeedbackSelect:function(c,b){c._setState($[386],b);var a=this._tree._findItemByRow(c);this._tree._renderItem(a)},_renderFeedbackBefore:function(c,b){if(b){var a=this._getRowLocation(c);a.y--;this._showInsertIndicator(a.x,a.y)}else{this._hideInsertIndicator()}},_renderFeedbackAfter:function(d,c){if(c){var b=this._getRowLocation(d);var a=d.getHeightValue();b.y=b.y+(a-1);this._showInsertIndicator(b.x,b.y)}else{this._hideInsertIndicator()}},_renderFeedbackExpand:function(c,b){var a=this._tree._findItemByRow(c);if(a!=null&&a.hasChildren()){if(b&&!a.isExpanded()){this._startExpandTimer()}else{this._stopExpandTimer()}}},_renderFeedbackScroll:function(b,a){if(a){this._startScrollTimer()}else{this._stopScrollTimer()}},_getRowLocation:function(d){var a={x:0,y:0};var b=d.getElement();var c=this._tree._getTargetNode();while(b!=c){a.x+=parseInt(b.style.left||0);a.y+=parseInt(b.style.top||0);b=b.parentNode}return a},_showInsertIndicator:function(a,e){if(this._insertIndicator==null){var d=document.createElement("div");d.style.position=$[28];d.style.borderTopStyle=$[20];d.style.borderTopColor="black";d.style.borderTopWidth="2px";d.style.zIndex=100000;d.style.height="2px";this._insertIndicator=d}var b=this._tree.getWidthValue()-(a+6);this._insertIndicator.style.left=a+"px";this._insertIndicator.style.top=e+"px";this._insertIndicator.style.width=b+"px";var c=this._tree._getTargetNode();c.appendChild(this._insertIndicator)},_hideInsertIndicator:function(){var a=this._tree._getTargetNode();a.removeChild(this._insertIndicator)},_startExpandTimer:function(){if(this._expandTimer==null){this._expandTimer=new qx.client.Timer(750);this._expandTimer.addEventListener($[49],this._onExpandTimer,this)}this._expandTimer.setEnabled(true)},_stopExpandTimer:function(){if(this._expandTimer!=null){this._expandTimer.stop()}},_onExpandTimer:function(b){this._stopExpandTimer();var a=this._tree._findItemByRow(this._currentRow);a.setExpanded(true)},_startScrollTimer:function(){if(this._scrollTimer==null){this._scrollTimer=new qx.client.Timer(250);this._scrollTimer.addEventListener($[49],this._onScrollTimer,this)}this._scrollTimer.setEnabled(true)},_stopScrollTimer:function(){if(this._scrollTimer!=null){this._scrollTimer.stop()}},_getScrollDirection:function(b){var a=0;var c=this._tree._topItemIndex;if(b===c){a=-1}else{if(b>=(c+this._tree._rows.length-2)){a=1}}return a},_onScrollTimer:function(b){this._stopScrollTimer();var i=this._tree._findItemByRow(this._currentRow);var f=this._tree._findIndexByItem(i);var d=this._getScrollDirection(f);if(d!=0){var h=f+d;var e=this._tree._findItemByIndex(h);if(e!=null){var c=this._tree._topItemIndex+d;this._tree.setTopItemIndex(c);var j=this._tree._findRowByItem(e);var g=this._currentRow;var a=function(){this._targetUpdateCheck(g,j)};qx.client.Timer.once(a,this,1)}}},_targetUpdateCheck:function(a,b){if(!this.isDisposed()){if(b!=this._currentRow&&a==this._currentRow){var c=org.eclipse.rwt.DNDSupport.getInstance();c.setCurrentTargetWidget(b)}}}}});
+qx.Class.define("org.eclipse.swt.widgets.Table",{extend:qx.ui.layout.CanvasLayout,construct:function(f,b){arguments.callee.base.call(this);this.setAppearance("table");this.setHideFocus(true);this.setTabIndex(1);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this._suspendClicksOnRow=null;this._alwaysHideSelection=false;this._hideSelection=qx.lang.String.contains(b,"hideSelection");this._linesVisible=false;this._borderWidth=0;this._defaultColumnWidth=0;this._topIndex=0;this._topIndexChanging=false;this._topIndexChanged=false;this._leftOffsetChanged=false;this._hasScrollBarsSelectionListener=false;this._readyToSendChanges=true;this._resolveItemsFor=null;this._itemHeight=0;this._rows=new Array();this._items=new Array();this._gridLines=new Array();this._itemCount=0;this._unresolvedItems=null;this._checkBoxes=null;if(qx.lang.String.contains(b,"check")){this._checkBoxes=new Array()}this._multiSelect=qx.lang.String.contains(b,"multi");this._selected=new Array();this._selectionStart=-1;this._focusIndex=-1;this._emptyItem=new org.eclipse.swt.widgets.TableItem(this,-1);this._virtualItem=new org.eclipse.swt.widgets.TableItem(this,-1);this._virtualItem.setTexts(["..."]);this._resizeLine=null;this._itemLeft=new Array();this._itemWidth=new Array();this._itemImageLeft=new Array();this._itemImageWidth=new Array();this._itemTextLeft=new Array();this._itemTextWidth=new Array();this._columnArea=new qx.ui.layout.CanvasLayout();this._columnArea.setTop(0);this._columnArea.setLeft(0);this._columnArea.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this._columnArea.setZIndex(20000);var d=new qx.ui.basic.Atom();d.setLabel("&nbsp;");d.getLabelObject().setMode(qx.constant.Style.LABEL_MODE_HTML);d.setAppearance($[332]);d.addState("dummy");this._columnArea.add(d);this.add(this._columnArea);this._clientArea=new qx.ui.layout.CanvasLayout();this._clientArea.setAppearance("table-client-area");this._clientArea.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this._clientArea.setTop(20);this._clientArea.setLeft(0);this._noScroll=qx.lang.String.contains(b,"noScroll");if(!this._noScroll){this._clientArea.addEventListener($[55],this._onClientAreaMouseWheel,this)}this._clientArea.addEventListener($[31],this._onClientAppear,this);var a=function(g){g.stopPropagation()};this._horzScrollBar=new org.eclipse.rwt.widgets.ScrollBar(true);this._horzScrollBar.addEventListener($[72],a);this._horzScrollBar.setZIndex(100000000);this._horzScrollBar.setMergeEvents(true);this.add(this._horzScrollBar);this._horzScrollBar.addEventListener($[80],this._onHorzScrollBarChangeValue,this);this._vertScrollBar=new org.eclipse.rwt.widgets.ScrollBar(false);this._vertScrollBar.addEventListener($[72],a);this._vertScrollBar.setZIndex(100000000);this._vertScrollBar.setMergeEvents(false);this.add(this._vertScrollBar);this._vertScrollBar.addEventListener($[80],this._onVertScrollBarChangeValue,this);this.addEventListener($[56],this._onChangeSize,this);this.addEventListener($[76],this._onChangeSize,this);this.addEventListener($[131],this._onChangeEnabled,this);this.addEventListener($[66],this._onFocusIn,this);this.addEventListener("blur",this._onFocusOut,this);this._keyboardSelecionChanged=false;this.addEventListener($[23],this._onKeyDown,this);this.addEventListener($[12],this._onKeyPress,this);this.addEventListener($[60],this._onKeyUp,this);var c=org.eclipse.swt.Request.getInstance();c.addEventListener("send",this._onSendRequest,this);var e=org.eclipse.swt.WidgetManager.getInstance();e.add(this._clientArea,f+"_clientArea",false);this.add(this._clientArea);this._cellToolTip=null;qx.ui.core.Widget.disableScrolling(this);this._clickDelayed=false;this.addEventListener($[72],this._onDragStart,this)},destruct:function(){var b=org.eclipse.swt.Request.getInstance();b.removeEventListener("send",this._onSendRequest,this);this.removeEventListener($[56],this._onChangeSize,this);this.removeEventListener($[76],this._onChangeSize,this);this.removeEventListener($[131],this._onChangeEnabled,this);this.removeEventListener($[66],this._onFocusIn,this);this.removeEventListener("blur",this._onFocusOut,this);this.removeEventListener($[23],this._onKeyDown,this);this.removeEventListener($[12],this._onKeyPress,this);this.removeEventListener($[60],this._onKeyUp,this);this.removeEventListener($[72],this._onDragStart,this);this._virtualItem.dispose();this._emptyItem.dispose();for(var a=0;a<this._items.length;a++){if(this._items[a]){this._items[a].dispose()}}this._items=null;var b=org.eclipse.swt.Request.getInstance();if(this._horzScrollBar){this._horzScrollBar.removeEventListener($[80],this._onHorzScrollBarChangeValue,this);this._horzScrollBar.dispose();this._horzScrollBar=null}if(this._vertScrollBar){this._vertScrollBar.removeEventListener($[80],this._onVertScrollBarChangeValue,this);this._vertScrollBar.dispose();this._vertScrollBar=null}for(var a=0;a<this._gridLines.length;a++){this._gridLines[a].removeEventListener($[2],this._onRowMouseDown,this);this._gridLines[a].removeEventListener($[15],this._onRowMouseUp,this);this._gridLines[a].dispose();this._gridLines[a]=null}if(this._clientArea){if(!this._noScroll){this._clientArea.removeEventListener($[55],this._onClientAreaMouseWheel,this)}this._clientArea.removeEventListener($[31],this._onClientAppear,this);if(this._cellToolTip){this._clientArea.removeEventListener($[45],this._onClientAreaMouseMove,this)}org.eclipse.swt.WidgetManager.getInstance().remove(this._clientArea);this._clientArea.dispose();this._clientArea=null}if(this._cellToolTip){this._cellToolTip.destroy();this._cellToolTip=null}if(this._columnArea){this._columnArea.dispose();this._columnArea=null}if(this._resizeLine){this._resizeLine.setParent(null);this._resizeLine.dispose()}if(this._rows){for(var a=0;a<this._rows.length;a++){this._rows[a].dispose()}this._rows=null}if(this._checkBoxes!==null){for(var a=0;a<this._checkBoxes.length;a++){this._checkBoxes[a].dispose()}this._checkBoxes=null}this._itemLeft=null;this._itemWidth=null;this._itemImageLeft=null;this._itemImageWidth=null;this._itemTextLeft=null;this._itemTextWidth=null},events:{itemselected:$[68],itemdefaultselected:$[68],itemchecked:$[68]},properties:{checkWidth:{check:$[22],init:21,themeable:true},checkHeight:{check:$[22],init:13,themeable:true}},statics:{_isShiftOnlyPressed:function(a){return a.isShiftPressed()&&!a.isCtrlPressed()&&!a.isAltPressed()&&!a.isMetaPressed()},_isCtrlOnlyPressed:function(a){return a.isCtrlOrCommandPressed()&&!a.isShiftPressed()&&!a.isAltPressed()},_isCtrlShiftOnlyPressed:function(a){return a.isCtrlOrCommandPressed()&&a.isShiftPressed()&&!a.isAltPressed()},_isMetaOnlyPressed:function(a){return a.isAltPressed()&&!a.isShiftPressed()&&!a.isCtrlPressed()},_isNoModifierPressed:function(a){return !a.isCtrlPressed()&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isMetaPressed()}},members:{_isRelevantEvent:function(a){var b=a.getTarget();var c=this._columnArea.getChildren()[0];return b===this||b===c||b instanceof org.eclipse.swt.widgets.TableRow||b instanceof org.eclipse.swt.widgets.TableColumn},setCursor:function(c){this._columnArea.setCursor(c);this._clientArea.setCursor(c);var b=this._columnArea.getChildren();for(var a=0;a<b.length;a++){b[a].setCursor(c)}for(var a=0;a<this._rows.length;a++){this._rows[a].setCursor(c)}if(this._checkBoxes!==null){for(var a=0;a<this._checkBoxes.length;a++){this._checkBoxes[a].setCursor(c)}}},resetCursor:function(){this._columnArea.resetCursor();this._clientArea.resetCursor();var b=this._columnArea.getChildren();for(var a=0;a<b.length;a++){b[a].resetCursor()}for(var a=0;a<this._rows.length;a++){this._rows[a].resetCursor()}if(this._checkBoxes!==null){for(var a=0;a<this._checkBoxes.length;a++){this._checkBoxes[a].resetCursor()}}},setTextColor:function(a){this._clientArea.setTextColor(a)},resetTextColor:function(){this._clientArea.resetTextColor()},setBackgroundImage:function(a){this._clientArea.setBackgroundImage(a)},resetBackgroundImage:function(){this._clientArea.resetBackgroundImage()},setBackgroundColor:function(a){this._clientArea.setBackgroundColor(a)},resetBackgroundColor:function(){this._clientArea.resetBackgroundColor()},setHeaderHeight:function(c){this._columnArea.setHeight(c);var b=this._columnArea.getChildren();for(var a=0;a<b.length;a++){b[a].setHeight(c)}this._updateClientAreaSize()},setHeaderVisible:function(a){this._columnArea.setVisibility(a);this._updateClientAreaSize();this._updateGridLines()},setItemHeight:function(a){this._itemHeight=a;this._updateScrollHeight();if(this._updateRowCount()){this._updateRows()}this._vertScrollBar.setIncrement(a)},getItemHeight:function(){return this._itemHeight},setAlwaysHideSelection:function(a){this._alwaysHideSelection=a},shouldHideSelection:function(){return this._alwaysHideSelection||(this._hideSelection&&!this.getFocused())},setItemMetrics:function(e,f,d,b,c,a,g){this._itemLeft[e]=f;this._itemWidth[e]=d;this._itemImageLeft[e]=b;this._itemImageWidth[e]=c;this._itemTextLeft[e]=a;this._itemTextWidth[e]=g},setScrollBarsVisibile:function(b,a){if(!b){this._horzScrollBar.setValue(0)}this._horzScrollBar.setVisibility(b);if(!a){this._vertScrollBar.setValue(0)}this._vertScrollBar.setVisibility(a);this._updateClientAreaSize()},updateRows:function(){this._updateRows()},getItemLeft:function(a){return this._itemLeft[a]},getItemWidth:function(a){return this._itemWidth[a]},getItemImageLeft:function(a){return this._itemImageLeft[a]},getItemImageWidth:function(a){return this._itemImageWidth[a]},getItemTextLeft:function(a){return this._itemTextLeft[a]},getItemTextWidth:function(a){return this._itemTextWidth[a]},setTopIndex:function(a){this._internalSetTopIndex(a,true);this._topIndexChanged=false},_internalSetTopIndex:function(b,a){if(this._topIndex!==b){this._topIndexChanging=true;if(a){this._vertScrollBar.setValue(b*this._itemHeight)}var c=b-this._topIndex;this._topIndex=b;this._scrollRowsVertical(c);this._topIndexChanged=true;this._topIndexChanging=false}},setLeftOffset:function(a){this._horzScrollBar.setValue(a);this._leftOffsetChanged=false},setBorderWidth:function(a){this._borderWidth=a},getColumn:function(a){return this._columnArea.getChildren()[a+1]},getColumnCount:function(){return this._columnArea.getChildrenLength()-1},getColumns:function(){return this._columnArea.getChildren().slice(1)},getColumnsWidth:function(){var a=0;var c=this._columnArea.getChildren();for(var b=1;b<c.length;b++){a+=c[b].getWidth()}return a},setDefaultColumnWidth:function(a){this._defaultColumnWidth=a;this._updateScrollWidth()},getDefaultColumnWidth:function(){return this._defaultColumnWidth},setLinesVisible:function(b){this._linesVisible=b;if(b){this.addState($[179])}else{this.removeState($[179])}for(var a=0;a<this._rows.length;a++){this._rows[a].setLinesVisible(b)}this._updateGridLines()},getLinesVisible:function(){return this._linesVisible},hasCheckBoxes:function(){return this._checkBoxes!==null},setFocusIndex:function(c){if(c!==this._focusIndex){var a=this._focusIndex;this._focusIndex=c;if(a!==-1){this.updateItem(a,false)}if(this._focusIndex!==-1){this.updateItem(this._focusIndex,false)}if(org.eclipse.swt.EventUtil.getSuspended()){this._selectionStart=-1}else{var b=org.eclipse.swt.Request.getInstance();var d=org.eclipse.swt.WidgetManager.getInstance().findIdByWidget(this);b.addParameter(d+$[437],c)}}},getFocusIndex:function(){return this._focusIndex},setItemCount:function(a){this._itemCount=a;this._updateScrollHeight();this._updateRows()},_onChangeEnabled:function(a){this._updateRows()},_onCheckBoxClick:function(a){var c=this._checkBoxes.indexOf(a.getTarget());var b=this._getItemIndexFromRowIndex(c);this._toggleCheckState(b)},_onCheckBoxOver:function(a){var c=this._checkBoxes.indexOf(a.getTarget());var b=this._checkBoxes[c];b.addState("over");this._rows[c].addState("over")},_onCheckBoxOut:function(a){var c=this._checkBoxes.indexOf(a.getTarget());var b=this._checkBoxes[c];b.removeState("over");this._rows[c].removeState("over")},_onRowMouseDown:function(a){var c=this._getRowFromEvent(a);if(c!=null){var b=this._topIndex+this._rows.indexOf(c);if(this._isDragSource()&&this._isItemSelected(b)){if(this._isValidMouseEvent(c,b)){this.setFocusIndex(b);this._clickDelayed=true}}else{this._rowClicked(a,c)}}},_onRowMouseUp:function(a){if(this._clickDelayed){this._clickDelayed=false;var b=this._getRowFromEvent(a);if(b!=null){this._rowClicked(a,b)}}},_getRowFromEvent:function(b){var c=b.getTarget();var a=null;if(c instanceof org.eclipse.swt.widgets.TableRow){a=c}else{a=this._getRowAtPoint(b.getPageX(),b.getPageY())}return a},_isDragSource:function(){return org.eclipse.rwt.DNDSupport.getInstance().isDragSource(this)},_onDragStart:function(a){this._clickDelayed=false},_isValidMouseEvent:function(c,b){var a=b>=0&&b<this._itemCount&&this._items[b]&&this._suspendClicksOnRow!=c;return a},_rowClicked:function(a,c){var b=this._topIndex+this._rows.indexOf(c);if(this._isValidMouseEvent(c,b)){this._suspendClicksOnRow=c;qx.client.Timer.once(this._resumeClicks,this,org.eclipse.swt.EventUtil.DOUBLE_CLICK_TIME);if(this._multiSelect){this._multiSelectRowClicked(a,b)}else{this._setSingleSelection(b)}this.setFocusIndex(b);this._makeItemFullyVisible(b);this._updateSelectionParam();this.createDispatchDataEvent($[464],b)}},_multiSelectRowClicked:function(b,d){if(b.isRightButtonPressed()){if(!this._isItemSelected(d)){this._setSingleSelection(d);this._selectionStart=-1}}else{if(org.eclipse.swt.widgets.Table._isCtrlOnlyPressed(b)){if(this._isItemSelected(d)){this._deselectItem(d,true)}else{this._selectItem(d)}}if(org.eclipse.swt.widgets.Table._isShiftOnlyPressed(b)||org.eclipse.swt.widgets.Table._isCtrlShiftOnlyPressed(b)){if(org.eclipse.swt.widgets.Table._isShiftOnlyPressed(b)&&this._selectionStart!==-1){this._clearSelection()}var e=this._selectionStart!==-1?this._selectionStart:this._focusIndex;if(e!==-1){var f=Math.min(e,d);var a=Math.max(e,d);for(var c=f;c<=a;c++){this._selectItem(c)}}else{this._selectItem(d)}}if(org.eclipse.swt.widgets.Table._isNoModifierPressed(b)||org.eclipse.swt.widgets.Table._isMetaOnlyPressed(b)){this._setSingleSelection(d)}if(org.eclipse.swt.widgets.Table._isCtrlOnlyPressed(b)||org.eclipse.swt.widgets.Table._isCtrlShiftOnlyPressed(b)){this._selectionStart=d}else{this._selectionStart=-1}}},_setSingleSelection:function(a){this._clearSelection();this._selectItem(a)},_resumeClicks:function(){this._suspendClicksOnRow=null},_onRowDblClick:function(a){var c=this._rows.indexOf(a.getTarget());var b=this._getItemIndexFromRowIndex(c);if(b!==-1){this.createDispatchDataEvent($[497],b)}},_onRowContextMenu:function(a){if(org.eclipse.swt.widgets.Table._isNoModifierPressed(a)||org.eclipse.swt.widgets.Table._isMetaOnlyPressed(a)){var c=a.getTarget();var b=this.getContextMenu();if(b!==null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show()}}},_onRowChangeOverState:function(a){var d=a.getTarget();if(d.hasState("over")){for(var b=0;b<this._rows.length;b++){if(this._rows[b]!==d){this._rows[b].removeState("over")}}}var c=d.getItemIndex();if(c!=-1){this._renderItem(d,this._items[c])}},_toggleCheckState:function(a){if(this._checkBoxes!=null){var b=this._items[a];if(a>=0&&a<this._itemCount&&b){b.setChecked(!b.getChecked());var c=this._getRowIndexFromItemIndex(a);if(c!==-1){this._updateRow(c,a)}this._updateCheckParam(b);this.createDispatchDataEvent("itemchecked",a)}}},_updateSelectionParam:function(){var e=org.eclipse.swt.WidgetManager.getInstance();var d=e.findIdByWidget(this);var c=org.eclipse.swt.Request.getInstance();var b="";for(var a=0;a<this._selected.length;a++){if(b!==""){b+=","}b+=this._selected[a].toString()}c.addParameter(d+$[143],b)},_updateCheckParam:function(b){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(b);var a=org.eclipse.swt.Request.getInstance();a.addParameter(c+".checked",b.getChecked())},_onClientAreaMouseWheel:function(a){if(this._isRelevantEvent(a)){a.preventDefault();a.stopPropagation();var b=a.getWheelDelta()*this._itemHeight*2;this._vertScrollBar.setValue(this._vertScrollBar.getValue()-b)}},_onChangeSize:function(a){if(this._clientArea.isSeeable()){this._updateClientAreaSize()}},_onClientAppear:function(a){this._updateClientAreaSize()},_onKeyDown:function(a){if(this._isRelevantEvent(a)){switch(a.getKeyIdentifier()){case $[91]:this._toggleCheckState(this._focusIndex);break;case $[71]:var d=-1;var c=-1;for(var b=0;b<this._selected.length;b++){if(this._focusIndex===this._selected[b]){d=this._selected[b]}if(c===-1){c=this._selected[b]}else{c=Math.min(c,this._selected[b])}}if(d===-1){d=c}this.createDispatchDataEvent($[497],d);break}}},_onKeyPress:function(b){var f=b.getKeyIdentifier();if(this._isRelevantEvent(b)&&org.eclipse.swt.widgets.Table._isNoModifierPressed(b)&&(f==="Up"||f==="Down"||f===$[57]||f===$[58]||f==="Home"||f==="End")){b.preventDefault();b.stopPropagation();var e=this._calcGotoIndex(this._focusIndex,f);if(e!==this._focusIndex&&e>=0&&e<this._itemCount){var c=this._focusIndex;this._setSingleSelection(e);if(!this._isItemFullyVisible(e)){var d;if(e===this._itemCount-1){d=e-this._getFullyVisibleRowCount()+1}else{d=e>=this._topIndex+this._getFullyVisibleRowCount()?e-this._getFullyVisibleRowCount()+1:e}if(d<0){d=0}else{if(d>this._itemCount){d=this._itemCount}}var a=this._itemCount-this._getFullyVisibleRowCount();if(e>a&&e<this._itemCount&&f===$[58]){d=a}this._internalSetTopIndex(d,true)}this.setFocusIndex(e);this._keyboardSelecionChanged=true}}if(this._isRelevantEvent(b)&&org.eclipse.swt.widgets.Table._isNoModifierPressed(b)&&(f==="Left"||f===$[51])){b.preventDefault();b.stopPropagation()}},_calcGotoIndex:function(b,c){var a=b;switch(c){case"Home":a=0;break;case"End":a=this._itemCount-1;break;case"Up":a=b-1;break;case"Down":a=b+1;break;case $[57]:a=b-this._getFullyVisibleRowCount();if(a<0){a=0}break;case $[58]:a=b+this._getFullyVisibleRowCount();if(a>this._itemCount-1){a=this._itemCount-1}break}return a},_getFullyVisibleRowCount:function(){return Math.floor(this._clientArea.getHeight()/this._itemHeight)},_onKeyUp:function(a){if(this._keyboardSelecionChanged){this._keyboardSelecionChanged=false;this._updateSelectionParam();this.createDispatchDataEvent($[464],this._focusIndex)}},_onVertScrollBarChangeValue:function(){if(!this._topIndexChanging){var b=0;if(this._itemHeight!==0){var a=this._clientArea.isCreated()?this._vertScrollBar.getValue():0;b=Math.floor(a/this._itemHeight)}this._internalSetTopIndex(b,false)}if(this._readyToSendChanges&&this._hasScrollBarsSelectionListener){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,500)}},_onHorzScrollBarChangeValue:function(){this._columnArea.setLeft(0-this._horzScrollBar.getValue());this._updateRowBounds();this._updateGridLines();this._leftOffsetChanged=true;if(this._readyToSendChanges&&this._hasScrollBarsSelectionListener){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,500)}},setHasScrollBarsSelectionListener:function(a){this._hasScrollBarsSelectionListener=a},_addItem:function(b,a){if(this._items[a]){this._items.splice(a,0,b)}else{this._items[a]=b}this._adjustSelectedIndices(a,true);this._updateScrollHeight()},_removeItem:function(b){var a=this._items.indexOf(b);this._items.splice(a,1);if(a===this._focusIndex){this._focusIndex=-1}this._deselectItem(a,false);this._adjustSelectedIndices(a,false);this._updateScrollHeight()},_selectItem:function(a){if(!this._isItemSelected(a)){this._selected.push(a);this.updateItem(a,true)}},_deselectItem:function(b,c){var a=this._selected.indexOf(b);if(a!=-1){this._selected.splice(a,1);if(c){this.updateItem(b,true)}}},_isItemSelected:function(a){return this._selected.indexOf(a)!==-1},_clearSelection:function(){while(this._selected.length>0){this._deselectItem(this._selected[0],true)}},_adjustSelectedIndices:function(d,a){for(var c=0;c<this._selected.length;c++){var b=this._selected[c];if(a){if(d<=b){this._selected[c]=b+1}}else{if(d<b){this._selected[c]=b-1}}}},_resetSelectionStart:function(){this._selectionStart=-1},_isItemVisible:function(a){return a>=this._topIndex&&a<this._topIndex+this._rows.length},_isItemFullyVisible:function(a){return a>=this._topIndex&&a<this._topIndex+this._getFullyVisibleRowCount()},_makeItemFullyVisible:function(a){var c=this._getRowIndexFromItemIndex(a);var b=c===-1?null:this._rows[c];if(b!==null&&b.getTop()+b.getHeight()>this._clientArea.getHeight()){this._internalSetTopIndex(this._topIndex+1,true)}},updateItem:function(b,a){var c=this._getRowIndexFromItemIndex(b);if(c!==-1){if(a){this._updateRow(c,b)}else{this._updateRowState(c,b)}}},_getRowIndexFromItemIndex:function(b){var a=-1;if(b>=this._topIndex&&b<this._topIndex+this._rows.length){a=b-this._topIndex}return a},_getItemIndexFromRowIndex:function(b){var a=this._topIndex+b;if(a<0||a>this._itemCount-1){a=-1}return a},_isItemHovered:function(b){var a=false;var d=this._getRowIndexFromItemIndex(b);if(d>=0){var c=this._rows[d];a=c.hasState("over")&&c.hasHoverColorsDefined()}return a},_addColumn:function(a){a.setHeight(this._columnArea.getHeight());this._hookColumnMove(a);a.addEventListener($[56],this._onColumnChangeSize,this);this._columnArea.add(a);this._updateScrollWidth()},_hookColumnMove:function(a){a.addEventListener($[149],this._onColumnChangeSize,this)},_unhookColumnMove:function(a){a.removeEventListener($[149],this._onColumnChangeSize,this)},_removeColumn:function(a){this._unhookColumnMove(a);a.removeEventListener($[56],this._onColumnChangeSize,this);this._columnArea.remove(a);this._updateScrollWidth();this._updateRows()},_onColumnChangeSize:function(a){this._updateScrollWidth()},_updateScrollHeight:function(){var a=this._itemHeight+this._itemCount*this._itemHeight;if(!this._vertScrollBar.getDisposed()){this._vertScrollBar.setMaximum(a)}},_updateScrollWidth:function(){var a;if(this.getColumnCount()===0){a=this.getDefaultColumnWidth();if(this._checkBoxes!==null){a+=this.getCheckWidth()}}else{a=this.getColumnsWidth()}this._horzScrollBar.setMaximum(a);this._updateColumnHeader();this._updateGridLines()},_updateColumnHeader:function(){var e=this.getWidth()-2*this._borderWidth;var d=this._columnArea.getChildren()[0];var b=this._vertScrollBar.getVisibility()?this._vertScrollBar.getWidth():0;var a;if(this.getColumnCount()===0){var c=this.getDefaultColumnWidth();if(this._checkBoxes!==null){c+=this.getCheckWidth()}a=Math.max(c+b,e);d.setLeft(0);d.setWidth(a)}else{var c=this.getColumnsWidth();a=Math.max(c+b,e);d.setLeft(c);d.setWidth(Math.max(a-c,0))}this._columnArea.setWidth(a)},_updateClientAreaSize:function(){var d=0;if(this._columnArea.getVisibility()){d=this._columnArea.getHeight()}var c=this._horzScrollBar.getVisibility()?this._horzScrollBar.getHeight():0;var b=this._vertScrollBar.getVisibility()?this._vertScrollBar.getWidth():0;var a=this.getHeight()-d-c-(2*this._borderWidth);var e=this.getWidth()-b-(2*this._borderWidth);this._vertScrollBar.setLeft(this.getWidth()-b-(2*this._borderWidth));this._vertScrollBar.setTop(d);this._vertScrollBar.setHeight(a);this._horzScrollBar.setLeft(0);this._horzScrollBar.setTop(this.getHeight()-c-(2*this._borderWidth));this._horzScrollBar.setWidth(e);this._clientArea.setTop(d);this._clientArea.setHeight(a);this._clientArea.setWidth(e);this._updateColumnHeader();if(this._updateRowCount()){this._updateRows()}else{this._updateRowBounds();this._updateRowTop()}this._updateGridLines()},_updateRowCount:function(){var b=false;if(this._clientArea.isCreated()){var e=0;var a=this._clientArea.getHeight();if(this._itemHeight!==0&&a>0){e=Math.ceil(a/this._itemHeight)}if(e!=this._rows.length){while(this._rows.length>e){if(this._checkBoxes!=null){var d=this._checkBoxes.shift();d.removeEventListener($[532],this._onCheckBoxClick,this);d.removeEventListener($[9],this._onCheckBoxOver,this);d.removeEventListener($[14],this._onCheckBoxOut,this);d.setParent(null);d.dispose()}var f=this._rows.shift();this._unhookRowEventListener(f);f.setParent(null);f.dispose()}if(this._rows.length<e){while(this._rows.length<e){var c=new org.eclipse.swt.widgets.TableRow();this._hookRowEventListener(c);c.setLinesVisible(this._linesVisible);this._clientArea.add(c);this._rows.push(c);if(this._checkBoxes!=null){var d=new qx.ui.basic.Image();d.addEventListener($[29],this._onCheckBoxClick,this);d.addEventListener($[9],this._onCheckBoxOver,this);d.addEventListener($[14],this._onCheckBoxOut,this);d.setAppearance("table-check-box");this._clientArea.add(d);this._checkBoxes.push(d)}}}this._updateRowBounds();this._updateRowTop();this._updateRowsState();b=true}}return b},_hookRowEventListener:function(a){a.addEventListener($[2],this._onRowMouseDown,this);a.addEventListener($[15],this._onRowMouseUp,this);a.addEventListener($[62],this._onRowDblClick,this);a.addEventListener($[41],this._onRowContextMenu,this);a.addEventListener($[303],this._onRowChangeOverState,this)},_unhookRowEventListener:function(a){a.removeEventListener($[2],this._onRowMouseDown,this);a.removeEventListener($[15],this._onRowMouseUp,this);a.removeEventListener($[62],this._onRowDblClick,this);a.removeEventListener($[41],this._onRowContextMenu,this);a.removeEventListener($[303],this._onRowChangeOverState,this)},_updateRowTop:function(){var c=this._itemHeight/2-this.getCheckHeight()/2;var b=0;for(var a=0;a<this._rows.length;a++){if(this._checkBoxes!==null){this._checkBoxes[a].setTop(b+c)}this._rows[a].setTop(b);b+=this._itemHeight}},_updateRowBounds:function(){var f=0-this._horzScrollBar.getValue();var d=0;var b=0;if(this._checkBoxes!==null){b=this.getCheckWidth();d=this.getCheckHeight()}var e;if(this.getColumnCount()===0){e=this.getDefaultColumnWidth()+b}else{e=this.getColumnsWidth()}if(this._clientArea.getWidth()>e){e=this._clientArea.getWidth()}for(var c=0;c<this._rows.length;c++){if(this._checkBoxes!==null){var a=this._checkBoxes[c];a.setLeft(f);a.setWidth(b);a.setHeight(d)}var g=this._rows[c];g.setLeft(f);g.setWidth(e);g.setHeight(this._itemHeight)}},_scrollRowsVertical:function(h){if(Math.abs(h)>this._rows.length){this._updateRows()}else{var e=new Array();var b=this._checkBoxes!==null?new Array():null;var g=this._rows.length;for(var d=0;d<g;d++){var a=(g+d+h)%g;e.push(this._rows[a]);if(this._checkBoxes!==null){b.push(this._checkBoxes[a])}}this._rows=e;this._checkBoxes=b;this._updateRowTop();for(var d=0;d<g;d++){var c=this._getItemIndexFromRowIndex(d);var f=this._rows[d].getItemIndex();if(f!==c){this._updateRow(d,c)}}}},_updateRows:function(){var b=(new Date()).getTime();for(var a=0;a<this._rows.length;a++){this._updateRow(a,this._getItemIndexFromRowIndex(a))}this._vertScrollBar.autoEnableMerge((new Date()).getTime()-b)},_updateRow:function(d,a){var c=this._rows[d];if(a>=0&&a<this._itemCount){var b=this._items[a];if(b===undefined||(b!==null&&!b.getCached())){this._scheduleResolveItems();this._renderItem(c,this._virtualItem);c.setItemIndex(-1)}else{this._renderItem(c,b);c.setItemIndex(a)}}else{this._renderItem(c,this._emptyItem);c.setItemIndex(-1)}this._updateRowState(d,a)},_renderItem:function(c,a){if(c.isCreated()){a._render(c)}else{var b=function(){a._render(c);c.removeEventListener($[107],b)};c.addEventListener($[107],b)}},_updateRowsState:function(){for(var a=0;a<this._rows.length;a++){this._updateRowState(a,this._getItemIndexFromRowIndex(a))}},_updateRowState:function(e,b){var d=this._rows[e];if(b===-1){d.removeState($[30]);d.removeState($[384]);if(this._checkBoxes!==null){this._checkBoxes[e].setVisibility(false)}}else{if(this._isItemSelected(b)&&!this.shouldHideSelection()){d.addState($[30])}else{d.removeState($[30])}if(this._focusIndex===b){d.addState($[384])}else{d.removeState($[384])}if(this._checkBoxes!==null){var c=this._items[b];var a=this._checkBoxes[e];if(c!==null&&c!==undefined){if(c.getChecked()){a.addState($[203])}else{a.removeState($[203])}if(c.getGrayed()){a.addState($[235])}else{a.removeState($[235])}a.setVisibility(true)}else{a.setVisibility(false)}}}if(this.getFocused()){d.removeState($[87])}else{d.addState($[87])}},_scheduleResolveItems:function(){if(this._resolveItemsFor===null){qx.client.Timer.once(this._sendResolveItemsRequest,this,500)}this._resolveItemsFor=this._topIndex},_sendResolveItemsRequest:function(h){if(!this.isDisposed()){var g=Math.abs(this._topIndex-this._resolveItemsFor);this._resolveItemsFor=null;if(g>this._rows.length-2){this._scheduleResolveItems()}else{var d=[];for(var b=0;b<this._rows.length;b++){var c=this._getItemIndexFromRowIndex(b);if(c>=0&&c<this._itemCount){var k=this._items[c];if(k===undefined||(k!==null&&!k.getCached())){d.push(c)}}}if(d.length>0){var j=d.join(",");var e=org.eclipse.swt.WidgetManager.getInstance();var a=e.findIdByWidget(this);var f=org.eclipse.swt.Request.getInstance();f.addParameter("org.eclipse.swt.events.setData.index",j);f.addEvent("org.eclipse.swt.events.setData",a);f.send()}}}},_showResizeLine:function(b){if(this._resizeLine===null){this._resizeLine=new qx.ui.basic.Terminator();this._resizeLine.setAppearance($[432]);this.add(this._resizeLine);qx.ui.core.Widget.flushGlobalQueues()}var d=this._clientArea.getTop();this._resizeLine._renderRuntimeTop(d);var c=b-2-this._horzScrollBar.getValue();this._resizeLine._renderRuntimeLeft(c);var a=this._clientArea.getHeight();this._resizeLine._renderRuntimeHeight(a);this._resizeLine.removeStyleProperty($[113])},_hideResizeLine:function(){this._resizeLine.setStyleProperty($[113],$[17])},_updateGridLines:function(){if(this.getLinesVisible()){var d=this.getColumns();this._showGridLines(d.length);var a=this._clientArea.getHeight();var f=this._columnArea.getLeft();for(var c=0;c<d.length;c++){var b=this._gridLines[c];var e=f+d[c].getLeft()+d[c].getWidth();b.setSpace(e-1,2,0,a);b.removeStyleProperty($[113])}}else{this._showGridLines(0)}},_showGridLines:function(c){for(var b=this._gridLines.length;b<c;b++){var a=new qx.ui.basic.Terminator();a.setAppearance("table-gridline-vertical");a.addState($[47]);a.setZIndex(100000);a.addEventListener($[2],this._onRowMouseDown,this);a.addEventListener($[15],this._onRowMouseUp,this);this._gridLines.push(a);this._clientArea.add(a)}for(var b=c;b<this._gridLines.length;b++){var a=this._gridLines[b];a.setStyleProperty($[113],$[17])}},_getRowAtPoint:function(g,e){var a=null;for(var d=0;a===null&&d<this._rows.length;d++){var h=this._rows[d];var c=h.getElement();var f=qx.bom.element.Location.getLeft(c);var b=qx.bom.element.Location.getTop(c);if(g>=f&&g<f+h.getWidth()&&e>=b&&e<b+h.getHeight()){a=h}}return a},_onFocusIn:function(a){this._updateRowsState()},_onFocusOut:function(a){this._updateRowsState()},onItemSelected:function(a){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(a.getTarget());var b=org.eclipse.swt.Request.getInstance();b.addEvent($[61],c);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.addParameter($[270],a.getData());b.send()},onItemDefaultSelected:function(a){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(a.getTarget());var b=org.eclipse.swt.Request.getInstance();b.addEvent($[169],c);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.addParameter($[270],a.getData());b.send()},onItemChecked:function(a){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(a.getTarget());var b=org.eclipse.swt.Request.getInstance();b.addEvent($[61],c);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.addParameter($[270],a.getData());b.addParameter($[349],"check");b.send()},_onSendRequest:function(a){if(this._topIndexChanged||this._leftOffsetChanged){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();if(this._topIndexChanged){b.addParameter(c+".topIndex",this._topIndex);this._topIndexChanged=false}if(this._leftOffsetChanged){b.addParameter(c+".leftOffset",this._horzScrollBar.getValue());this._leftOffsetChanged=false}}},_sendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var a=org.eclipse.swt.Request.getInstance();a.send()}this._readyToSendChanges=true},setEnableCellToolTip:function(a){if(a){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);this._cellToolTip=new org.eclipse.swt.widgets.TableCellToolTip(b);this._clientArea.addEventListener($[45],this._onClientAreaMouseMove,this);this._clientArea.setToolTip(this._cellToolTip)}else{this._clientArea.removeEventListener($[45],this._onClientAreaMouseMove,this);this._clientArea.setToolTip(null);this._cellToolTip.destroy();this._cellToolTip=null}},_onClientAreaMouseMove:function(l){if(this._cellToolTip!=null){var e=l.getPageX();var d=l.getPageY();var n=this._getRowAtPoint(e,d);if(n!=null){var a=n.getItemIndex();if(a!=-1){var j=org.eclipse.swt.WidgetManager.getInstance();var k=j.findIdByWidget(this._items[a]);var c=this.getColumns();var h=c.length==0?0:-1;var g=this._clientArea.getElement();var b=qx.bom.element.Location.getLeft(g);for(var f=0;h==-1&&f<c.length;f++){var m=b+this._itemLeft[f];if(e>=m&&e<m+this._itemWidth[f]){h=f}}this._cellToolTip.setCell(k,h)}}}},setCellToolTipText:function(a){if(this._cellToolTip!=null){this._cellToolTip.setText(a)}}}});
+qx.Class.define("org.eclipse.swt.widgets.TableItem",{extend:qx.core.Object,construct:function(b,a){arguments.callee.base.call(this);this._parent=b;this._cached=true;this._checked=false;this._grayed=false;this._texts=new Array();this._images=new Array();this._background=null;this._foreground=null;this._font=null;this._cellBackgrounds=null;this._cellForegrounds=null;this._cellFonts=null;if(a>=0){b._addItem(this,a)}},statics:{PX:"px"},members:{dispose:function(){arguments.callee.base.call(this);if(!this._parent.getDisposed()&&!qx.core.Object.inGlobalDispose()){this._parent._removeItem(this)}org.eclipse.swt.WidgetManager.getInstance().remove(this)},getCached:function(){return this._cached},setChecked:function(a){if(this._checked!=a){this._checked=a}},getChecked:function(){return this._checked},setGrayed:function(a){if(this._grayed!=a){this._grayed=a}},getGrayed:function(){return this._grayed},setSelection:function(b){var a=this._getIndex();if(b){this._parent._selectItem(a,false);this._parent._resetSelectionStart()}else{this._parent._deselectItem(a,false)}},setTexts:function(a){this._texts=a},setImages:function(a){this._images=a},setBackground:function(a){this._background=a},setForeground:function(a){this._foreground=a},setFont:function(a){this._font=a},setCellBackgrounds:function(a){this._cellBackgrounds=a},setCellForegrounds:function(a){this._cellForegrounds=a},setCellFonts:function(a){this._cellFonts=a},setVariant:function(a){this._variant=a},update:function(){this._cached=true;this._parent.updateItem(this._getIndex(),true)},clear:function(){this._cached=false;this._checked=false;this._grayed=false;this._texts=new Array();this._images=new Array();this._background=null;this._foreground=null;this._font=null;this._cellBackgrounds=null;this._cellForegrounds=null;this._cellFonts=null;this._variant=null},_render:function(f){var b=f.getElement();var h=this._parent;var e=0;var d=0;var n=0;var m=this._parent.getItemHeight()-1;if(m<0){m=0}var s=h.getColumnCount();var g=this._drawColors();if(s==0){s=1}var j=0;if(h.hasCheckBoxes()){j=h.getCheckWidth()}f.setVariant(this._variant);if(g&&this._background!=null){f.setBackgroundColor(this._background)}else{f.resetBackgroundColor()}for(var q=0;q<s;q++){var k="";var l="";var a="";var r=null;if(this._cellFonts&&this._cellFonts[q]){l=this._cellFonts[q]}else{if(this._font!=null){l=this._font}}if(g){if(this._cellForegrounds&&this._cellForegrounds[q]){a=this._cellForegrounds[q]}else{if(this._foreground!=null){a=this._foreground}}if(this._cellBackgrounds&&this._cellBackgrounds[q]){r=this._cellBackgrounds[q]}}if(r!=null){var o=this._getChildNode(b,e);e++;d=h.getItemLeft(q);n=h.getItemWidth(q)-1;if(n<0){n=0}this._renderBackground(o,d,n,m,r)}if(this._images&&this._images[q]){var o=this._getChildNode(b,e);e++;d=h.getItemImageLeft(q);n=h.getItemImageWidth(q);this._renderImage(o,d,n,m,this._images[q])}var o=this._getChildNode(b,e);e++;d=h.getItemTextLeft(q);n=h.getItemTextWidth(q);if(this._texts[q]!==undefined){k=this._texts[q]}var p=qx.constant.Layout.ALIGN_LEFT;var c=h.getColumn(q);if(c){p=c.getHorizontalChildrenAlign()}this._renderText(o,d,n,m,k,p,l,a)}this._deleteRemainingChildNodes(b,e)},_getChildNode:function(b,c){var a;if(b.childNodes.length>c){a=b.childNodes[c]}else{a=document.createElement("div");b.appendChild(a)}return a},_deleteRemainingChildNodes:function(b,c){for(var a=b.childNodes.length-1;a>=c;a--){b.removeChild(b.childNodes[a])}},_drawColors:function(){var a=this._parent.getEnabled();var c=this._parent._isItemSelected(this._getIndex());var b=this._parent._isItemHovered(this._getIndex());return a&&(this._parent.shouldHideSelection()||!c)&&!b},_renderBackground:function(d,e,c,a,b){d.innerHTML="&nbsp;";d.style.position=$[28];d.style.top="0px";d.style.left=e+org.eclipse.swt.widgets.TableItem.PX;d.style.width=c+org.eclipse.swt.widgets.TableItem.PX;d.style.height=a+org.eclipse.swt.widgets.TableItem.PX;d.style.backgroundImage="none";d.style.backgroundColor=b;d.style.fontSize="0";d.style.lineHeight="0";if(qx.core.Variant.isSet($[0],$[18])){d.style.filter=""}else{d.style.opacity="";d.style.KhtmlOpacity="";d.style.MozOpacity=""}},_renderImage:function(e,g,d,a,f){e.innerHTML="";e.style.position=$[28];e.style.overflow=$[17];e.style.top="0px";e.style.left=g+org.eclipse.swt.widgets.TableItem.PX;e.style.width=d+org.eclipse.swt.widgets.TableItem.PX;e.style.height=a+org.eclipse.swt.widgets.TableItem.PX;e.style.lineHeight=a+org.eclipse.swt.widgets.TableItem.PX;e.style.backgroundColor="";var c=qx.io.Alias.getInstance().resolve(f);e.style.backgroundImage="url("+c+")";e.style.backgroundRepeat=$[378];e.style.backgroundPosition=$[37];if(qx.core.Variant.isSet($[0],$[18])){e.style.filter=this._parent.getEnabled()?"":"Alpha(Opacity=30)"}else{var b=this._parent.getEnabled()?"":0.3;e.style.opacity=b;e.style.KhtmlOpacity=b;e.style.MozOpacity=b}},_renderText:function(d,f,c,a,g,h,b,e){if(d.innerHTML!=g){d.innerHTML=g}d.style.position=$[28];d.style.overflow=$[17];d.style.top="0px";d.style.textAlign=h;d.style.verticalAlign=$[32];d.style.whiteSpace="nowrap";if(qx.core.Variant.isSet($[0],$[122])){d.style.textDecoration=$[125]}d.style.left=f+org.eclipse.swt.widgets.TableItem.PX;d.style.width=c+org.eclipse.swt.widgets.TableItem.PX;d.style.height=a+org.eclipse.swt.widgets.TableItem.PX;if(b==""||b==null){if(!qx.core.Variant.isSet($[0],$[18])){d.style.font=b}d.style.fontFamily="";d.style.fontSize="";d.style.fontVariant="";d.style.fontStyle="";d.style.fontWeight=""}else{d.style.font=b}d.style.lineHeight=a+org.eclipse.swt.widgets.TableItem.PX;d.style.color=e;d.style.backgroundColor="";d.style.backgroundImage="none";if(qx.core.Variant.isSet($[0],$[18])){d.style.filter=""}else{d.style.opacity="";d.style.KhtmlOpacity="";d.style.MozOpacity=""}},_getIndex:function(){return this._parent._items.indexOf(this)}}});
 qx.Class.define("org.eclipse.swt.widgets.TableCellToolTip",{extend:qx.ui.popup.ToolTip,include:org.eclipse.rwt.FadeAnimationMixin,construct:function(a){arguments.callee.base.call(this);this._controlId=a;this._itemId=null;this._columnIndex=-1},members:{_onshowtimer:function(a){this._stopShowTimer();this._requestCellToolTipText()},setText:function(a){if(a&&a!=""){this.getAtom().setLabel(a);this.setLeft(qx.event.type.MouseEvent.getPageX()+this.getMousePointerOffsetX());this.setTop(qx.event.type.MouseEvent.getPageY()+this.getMousePointerOffsetY());this.show()}},setCell:function(b,a){if(this._itemId!=b||this._columnIndex!=a){this._itemId=b;this._columnIndex=a;this.hide();if(!this._showTimer.getEnabled()&&b!=null&&a!=-1){this._showTimer.start()}}},_requestCellToolTipText:function(){if(this._itemId!=null&&this._columnIndex!=-1){var b=org.eclipse.swt.Request.getInstance();b.addEvent("org.eclipse.swt.events.cellToolTipTextRequested",this._controlId);var a=this._itemId+","+this._columnIndex;b.addParameter("org.eclipse.swt.events.cellToolTipTextRequested.cell",a);b.send()}}}});
-qx.Class.define("org.eclipse.swt.widgets.TableColumn",{extend:qx.ui.basic.Atom,construct:function(a){arguments.callee.base.call(this);this._parentIsTree=a instanceof org.eclipse.rwt.widgets.Tree;this.setAppearance(this._parentIsTree?$[393]:$[336]);this.setHorizontalChildrenAlign(qx.constant.Layout.ALIGN_LEFT);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this._resizable=true;this._moveable=false;this._resizeStartX=0;this._inResize=false;this._wasResizeOrMoveEvent=false;this._inMove=false;this._offsetX=0;this._initialLeft=0;this._bufferedZIndex=0;this.setWidth(0);this.setLeft(0);this.setLabel($[139]);this.getLabelObject().setMode(qx.constant.Style.LABEL_MODE_HTML);this.setLabel("");this._table=a;this._table._addColumn(this);this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[45],this._onMouseMove,this);this.addEventListener($[14],this._onMouseOut,this);this.addEventListener($[2],this._onMouseDown,this);this.addEventListener($[15],this._onMouseUp,this);this._sortImage=new qx.ui.basic.Image();this._sortImage.setAnonymous(true);if(this._parentIsTree){this._sortImage.setAppearance("tree-column-sort-indicator")}else{this._sortImage.setAppearance("table-column-sort-indicator")}this.add(this._sortImage)},destruct:function(){this.removeEventListener($[9],this._onMouseOver,this);this.removeEventListener($[45],this._onMouseMove,this);this.removeEventListener($[14],this._onMouseOut,this);this.removeEventListener($[2],this._onMouseDown,this);this.removeEventListener($[15],this._onMouseUp,this);this._disposeFields("_sortImage");if(!this._table.getDisposed()&&!qx.core.Object.inGlobalDispose()){this._table._removeColumn(this)}},statics:{RESIZE_CURSOR:(org.eclipse.rwt.Client.isGecko()&&(org.eclipse.rwt.Client.getMajor()>1||org.eclipse.rwt.Client.getMinor()>=8))?"ew-resize":$[160],STATE_MOVING:"moving",STATE_MOUSE_OVER:$[9]},members:{setSortDirection:function(a){if(a=="up"){this._sortImage.addState("up")}else{this._sortImage.removeState("up")}if(a=="down"){this._sortImage.addState("down")}else{this._sortImage.removeState("down")}},setResizable:function(a){this._resizable=a},setMoveable:function(a){this._moveable=a},onClick:function(a){if(!this._wasResizeOrMoveEvent){org.eclipse.swt.EventUtil.widgetSelected(a)}this._wasResizeOrMoveEvent=false},_onMouseOver:function(a){if(!this._inMove&&!this._inResize){this.addState(org.eclipse.swt.widgets.TableColumn.STATE_MOUSE_OVER)}},setAlignment:function(a,b){this._table.setAlignment(a,b);this.setHorizontalChildrenAlign(b)},_onMouseDown:function(b){if(!this._inMove&&!this._inResize&&b.getButton()==="left"){var c=org.eclipse.swt.WidgetUtil;if(this._isResizeLocation(b.getPageX())){this._inResize=true;var a=this.getLeft()+this.getWidth();this._table._showResizeLine(a);this._resizeStartX=b.getPageX();this.setCapture(true);b.stopPropagation();b.preventDefault();c._fakeMouseEvent(this,$[14])}else{if(this._moveable){this._inMove=true;this.setCapture(true);this._bufferedZIndex=this.getZIndex();this.setZIndex(100000000);this._table._unhookColumnMove(this);this._offsetX=b.getPageX()-this.getLeft();this._initialLeft=this.getLeft();b.stopPropagation();b.preventDefault();c._fakeMouseEvent(this,$[14])}}}},_onMouseUp:function(a){var b=org.eclipse.swt.WidgetUtil;if(this._inResize){this._table._hideResizeLine();this.getTopLevelWidget().setGlobalCursor(null);this.setCapture(false);var d=this._getResizeWidth(a.getPageX());this._sendResized(d);this._inResize=false;this._wasResizeOrMoveEvent=true;a.stopPropagation();a.preventDefault();b._fakeMouseEvent(a.getTarget(),$[9])}else{if(this._inMove){this._inMove=false;this.setCapture(false);this.setZIndex(this._bufferedZIndex);this._table._hookColumnMove(this);this.removeState(org.eclipse.swt.widgets.TableColumn.STATE_MOVING);if(this.getLeft()<this._initialLeft-1||this.getLeft()>this._initialLeft+1){this._wasResizeOrMoveEvent=true;var c=Math.round(this.getElement().getBoundingClientRect().left);this._sendMoved(this.getLeft()+a.getPageX()-c)}else{this.setLeft(this._initialLeft)}a.stopPropagation();a.preventDefault();b._fakeMouseEvent(a.getTarget(),$[9])}}},_onMouseMove:function(b){if(this._inResize){var a=this.getLeft()+this._getResizeWidth(b.getPageX());if(a<this.getLeft()+5){a=this.getLeft()+5}this._table._showResizeLine(a)}else{if(this._inMove){this.setLeft(b.getPageX()-this._offsetX);this.addState(org.eclipse.swt.widgets.TableColumn.STATE_MOVING)}else{if(this._isResizeLocation(b.getPageX())){this.getTopLevelWidget().setGlobalCursor(org.eclipse.swt.widgets.TableColumn.RESIZE_CURSOR)}else{this.getTopLevelWidget().setGlobalCursor(null)}}}b.stopPropagation();b.preventDefault()},_onMouseOut:function(a){this.removeState(org.eclipse.swt.widgets.TableColumn.STATE_MOUSE_OVER);if(!this._inResize){this.getTopLevelWidget().setGlobalCursor(null);a.stopPropagation();a.preventDefault()}},_isResizeLocation:function(b){var a=false;if(this._resizable){var c=qx.bom.element.Location.getLeft(this.getElement())+this.getWidth();if(b>=c-5&&b<=c){a=true}}return a},_getResizeWidth:function(a){var b=this._resizeStartX-a;return this.getWidth()-b},_sendResized:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addEvent("org.eclipse.swt.events.controlResized",c);b.addParameter(c+".width",a);b.send()}},_sendMoved:function(b){if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addEvent("org.eclipse.swt.events.controlMoved",c);a.addParameter(c+".left",b);a.send()}}}});
-qx.Class.define("org.eclipse.swt.browser.Browser",{extend:qx.ui.embed.Iframe,construct:function(){arguments.callee.base.call(this);this._hasProgressListener=false;this._browserFunctions={};this.setTabIndex(1);this.setAppearance("browser");this.addEventListener($[105],this._onCreate,this)},properties:{asynchronousResult:{check:$[3],init:false},executedFunctionPending:{check:$[3],init:false},executedFunctionResult:{nullable:true,init:null},executedFunctionError:{check:$[25],nullable:true,init:null}},statics:{getDomain:function(a){var d=null;if(a!==null){var b=a.toLowerCase();if(b.indexOf("http://")===0||b.indexOf("https://")===0||b.indexOf("ftp://")===0||b.indexOf("ftps://")===0){var d=b.slice(b.indexOf("://")+3);var c=d.indexOf("/");if(c!==-1){d=d.slice(0,c)}}}return d}},members:{syncSource:function(){if(this.isCreated()){this._syncSource()}},_applySource:function(b,a){},_applyEnabled:function(b,a){arguments.callee.base.call(this,b,a);if(b){this.release()}else{this.block()}},release:function(){if(this.getEnabled()){arguments.callee.base.call(this)}},_onload:function(a){if(!this._isInGlobalDisposeQueue){arguments.callee.base.call(this,a);if(this._isContentAccessible()){this._attachBrowserFunctions()}this._sendProgressEvent()}},_onCreate:function(a){if(!this.getEnabled()){this.block()}},_sendProgressEvent:function(){if(this._hasProgressListener){var c=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var b=c.findIdByWidget(this);a.addParameter(b+".org.eclipse.swt.events.progressCompleted","true");a.send()}},setHasProgressListener:function(a){this._hasProgressListener=a},execute:function(b){this._checkIframeAccess();var f=true;var a=null;try{a=this._parseEvalResult(this._eval(b))}catch(c){f=false}var d=org.eclipse.swt.Request.getInstance();var e=org.eclipse.swt.WidgetManager.getInstance();var g=e.findIdByWidget(this);d.addParameter(g+".executeResult",f);d.addParameter(g+".evaluateResult",a);if(this.getExecutedFunctionPending()){d.sendSyncronous()}else{d.send()}},_srcInLocalDomain:function(){var f=this.getSource();var e=org.eclipse.swt.browser.Browser;var c=e.getDomain(document.URL);var d=e.getDomain(f);var a=c===d;var b=d===null;return b||a},_isContentAccessible:function(){var a;try{this.getContentDocument().body.URL;a=true}catch(b){a=false}return a&&this._isLoaded},_checkIframeAccess:function(b){if(!this._isContentAccessible()){var a=this._srcInLocalDomain();if(!a){this._throwSecurityException(false)}if(this._isLoaded&&a){this._throwSecurityException(true)}}},_throwSecurityException:function(a){var e=org.eclipse.swt.browser.Browser;var b=e.getDomain(document.URL);var d=a?null:e.getDomain(this.getSource());var c="SecurityRestriction:\nBrowser-Widget can not access ";c+=d!==null?'"'+d+'"':"unkown domain";c+=' from "'+b+'".';throw new Error(c)},_eval:function(script){var win=this.getContentWindow();if(!win.eval&&win.execScript){win.execScript("null;","JScript")}return win.eval(script)},_parseEvalResult:function(b){var a=null;var c;if(qx.core.Variant.isSet($[0],$[40])&&org.eclipse.rwt.Client.getVersion()<2){c=window}else{c=this.getContentWindow()}if(b instanceof c.Function){a=this.objectToString([[]])}else{if(b instanceof c.Array){a=this.objectToString([b])}else{if(typeof b!==$[10]&&typeof b!==$[44]){a=this.objectToString([b])}}}return a},createFunction:function(a){this._browserFunctions[a]=true;this._checkIframeAccess();if(this.isLoaded()){try{this._createFunctionImpl(a);this._createFunctionWrapper(a)}catch(b){var c='Unable to create function: "'+a+'".\n'+b;if(org.eclipse.swt.EventUtil.getSuspended()){throw c}else{org.eclipse.rwt.ErrorHandler.processJavaScriptError(c)}}}},_attachBrowserFunctions:function(){for(var a in this._browserFunctions){this.createFunction(a)}},_createFunctionImpl:function(a){var d=this.getContentWindow();var c=org.eclipse.swt.Request.getInstance();var f=org.eclipse.swt.WidgetManager.getInstance();var e=f.findIdByWidget(this);var b=this;d[a+"_impl"]=function(){var g={};if(b.getExecutedFunctionPending()){g.error='Unable to execute browser function "'+a+'". Another browser function is still pending.'}else{var i=b.objectToString(arguments);c.addParameter(e+".executeFunction",a);c.addParameter(e+".executeArguments",i);b.setExecutedFunctionResult(null);b.setExecutedFunctionError(null);b.setExecutedFunctionPending(true);b.setAsynchronousResult(false);c.sendSyncronous();if(b.getExecutedFunctionPending()){b.setAsynchronousResult(true)}else{var h=b.getExecutedFunctionError();if(h!=null){g.error=h}else{g.result=b.getExecutedFunctionResult()}}}return g}},_createFunctionWrapper:function(b){var a=[];a.push("function "+b+"(){");a.push("  var result = "+b+"_impl.apply( window, arguments );");a.push("  if( result.error ) {");a.push("    throw new Error( result.error );");a.push("  }");a.push("  return result.result;");a.push("}");this._eval(a.join(""))},destroyFunction:function(b){delete this._browserFunctions[b];var d=this.getContentWindow();if(d!=null){try{var a=[];if(qx.core.Variant.isSet($[0],$[18])){a.push("window."+b+" = undefined;");a.push("window."+b+"_impl = undefined;")}else{a.push($[427]+b+";");a.push($[427]+b+"_impl;")}this._eval(a.join(""))}catch(c){throw new Error("Unable to destroy function: "+b+" error: "+c)}}},setFunctionResult:function(c,a,b){this.setExecutedFunctionResult(a);this.setExecutedFunctionError(b);this.setExecutedFunctionPending(false)},objectToString:function(b){var a;var d=typeof(b);if(b===null){a=String(b)}else{if(d==$[10]){a=[];for(var c=0;c<b.length;c++){var e=b[c];d=typeof(e);if(d==$[13]){e='"'+e.replace(/"/g,'\\"')+'"'}else{if(d==$[10]&&e!==null){e=this.objectToString(e)}}a.push(String(e))}a="["+String(a)+"]"}else{if(d==$[13]){a='"'+b.replace(/"/g,'\\"')+'"'}else{a=String(b)}}}return a},destroy:function(){arguments.callee.base.call(this);this.syncSource()}}});
+qx.Class.define("org.eclipse.swt.widgets.TableColumn",{extend:qx.ui.basic.Atom,construct:function(a){arguments.callee.base.call(this);this._parentIsTree=a instanceof org.eclipse.rwt.widgets.Tree;this.setAppearance(this._parentIsTree?$[329]:$[332]);this.setHorizontalChildrenAlign(qx.constant.Layout.ALIGN_LEFT);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this._resizable=true;this._moveable=false;this._resizeStartX=0;this._inResize=false;this._wasResizeOrMoveEvent=false;this._inMove=false;this._offsetX=0;this._initialLeft=0;this._bufferedZIndex=0;this.setWidth(0);this.setLeft(0);this.setLabel($[150]);this.getLabelObject().setMode(qx.constant.Style.LABEL_MODE_HTML);this.setLabel("");this._table=a;this._table._addColumn(this);this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[45],this._onMouseMove,this);this.addEventListener($[14],this._onMouseOut,this);this.addEventListener($[2],this._onMouseDown,this);this.addEventListener($[15],this._onMouseUp,this);this._sortImage=new qx.ui.basic.Image();this._sortImage.setAnonymous(true);if(this._parentIsTree){this._sortImage.setAppearance("tree-column-sort-indicator")}else{this._sortImage.setAppearance("table-column-sort-indicator")}this.add(this._sortImage)},destruct:function(){this.removeEventListener($[9],this._onMouseOver,this);this.removeEventListener($[45],this._onMouseMove,this);this.removeEventListener($[14],this._onMouseOut,this);this.removeEventListener($[2],this._onMouseDown,this);this.removeEventListener($[15],this._onMouseUp,this);this._disposeFields("_sortImage");if(!this._table.getDisposed()&&!qx.core.Object.inGlobalDispose()){this._table._removeColumn(this)}},statics:{RESIZE_CURSOR:(org.eclipse.rwt.Client.isGecko()&&(org.eclipse.rwt.Client.getMajor()>1||org.eclipse.rwt.Client.getMinor()>=8))?"ew-resize":$[167],STATE_MOVING:"moving",STATE_MOUSE_OVER:$[9]},members:{setSortDirection:function(a){if(a=="up"){this._sortImage.addState("up")}else{this._sortImage.removeState("up")}if(a=="down"){this._sortImage.addState("down")}else{this._sortImage.removeState("down")}},setResizable:function(a){this._resizable=a},setMoveable:function(a){this._moveable=a},onClick:function(a){if(!this._wasResizeOrMoveEvent){org.eclipse.swt.EventUtil.widgetSelected(a)}this._wasResizeOrMoveEvent=false},_onMouseOver:function(a){if(!this._inMove&&!this._inResize){this.addState(org.eclipse.swt.widgets.TableColumn.STATE_MOUSE_OVER)}},setAlignment:function(a,b){this._table.setAlignment(a,b);this.setHorizontalChildrenAlign(b)},_onMouseDown:function(b){if(!this._inMove&&!this._inResize&&b.getButton()==="left"){var c=org.eclipse.swt.WidgetUtil;if(this._isResizeLocation(b.getPageX())){this._inResize=true;var a=this.getLeft()+this.getWidth();this._table._showResizeLine(a);this._resizeStartX=b.getPageX();this.setCapture(true);b.stopPropagation();b.preventDefault();c._fakeMouseEvent(this,$[14])}else{if(this._moveable){this._inMove=true;this.setCapture(true);this._bufferedZIndex=this.getZIndex();this.setZIndex(100000000);this._table._unhookColumnMove(this);this._offsetX=b.getPageX()-this.getLeft();this._initialLeft=this.getLeft();b.stopPropagation();b.preventDefault();c._fakeMouseEvent(this,$[14])}}}},_onMouseUp:function(a){var b=org.eclipse.swt.WidgetUtil;if(this._inResize){this._table._hideResizeLine();this.getTopLevelWidget().setGlobalCursor(null);this.setCapture(false);var d=this._getResizeWidth(a.getPageX());this._sendResized(d);this._inResize=false;this._wasResizeOrMoveEvent=true;a.stopPropagation();a.preventDefault();b._fakeMouseEvent(a.getTarget(),$[9])}else{if(this._inMove){this._inMove=false;this.setCapture(false);this.setZIndex(this._bufferedZIndex);this._table._hookColumnMove(this);this.removeState(org.eclipse.swt.widgets.TableColumn.STATE_MOVING);if(this.getLeft()<this._initialLeft-1||this.getLeft()>this._initialLeft+1){this._wasResizeOrMoveEvent=true;var c=Math.round(this.getElement().getBoundingClientRect().left);this._sendMoved(this.getLeft()+a.getPageX()-c)}else{this.setLeft(this._initialLeft)}a.stopPropagation();a.preventDefault();b._fakeMouseEvent(a.getTarget(),$[9])}}},_onMouseMove:function(b){if(this._inResize){var a=this.getLeft()+this._getResizeWidth(b.getPageX());if(a<this.getLeft()+5){a=this.getLeft()+5}this._table._showResizeLine(a)}else{if(this._inMove){this.setLeft(b.getPageX()-this._offsetX);this.addState(org.eclipse.swt.widgets.TableColumn.STATE_MOVING)}else{if(this._isResizeLocation(b.getPageX())){this.getTopLevelWidget().setGlobalCursor(org.eclipse.swt.widgets.TableColumn.RESIZE_CURSOR)}else{this.getTopLevelWidget().setGlobalCursor(null)}}}b.stopPropagation();b.preventDefault()},_onMouseOut:function(a){this.removeState(org.eclipse.swt.widgets.TableColumn.STATE_MOUSE_OVER);if(!this._inResize){this.getTopLevelWidget().setGlobalCursor(null);a.stopPropagation();a.preventDefault()}},_isResizeLocation:function(b){var a=false;if(this._resizable){var c=qx.bom.element.Location.getLeft(this.getElement())+this.getWidth();if(b>=c-5&&b<=c){a=true}}return a},_getResizeWidth:function(a){var b=this._resizeStartX-a;return this.getWidth()-b},_sendResized:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addEvent("org.eclipse.swt.events.controlResized",c);b.addParameter(c+".width",a);b.send()}},_sendMoved:function(b){if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addEvent("org.eclipse.swt.events.controlMoved",c);a.addParameter(c+".left",b);a.send()}}}});
+qx.Class.define("org.eclipse.swt.browser.Browser",{extend:qx.ui.embed.Iframe,construct:function(){arguments.callee.base.call(this);this._hasProgressListener=false;this._browserFunctions={};this.setTabIndex(1);this.setAppearance("browser");this.addEventListener($[107],this._onCreate,this)},properties:{asynchronousResult:{check:$[3],init:false},executedFunctionPending:{check:$[3],init:false},executedFunctionResult:{nullable:true,init:null},executedFunctionError:{check:$[25],nullable:true,init:null}},statics:{getDomain:function(a){var d=null;if(a!==null){var b=a.toLowerCase();if(b.indexOf("http://")===0||b.indexOf("https://")===0||b.indexOf("ftp://")===0||b.indexOf("ftps://")===0){var d=b.slice(b.indexOf("://")+3);var c=d.indexOf("/");if(c!==-1){d=d.slice(0,c)}}}return d}},members:{syncSource:function(){if(this.isCreated()){this._syncSource()}},_applySource:function(b,a){},_applyEnabled:function(b,a){arguments.callee.base.call(this,b,a);if(b){this.release()}else{this.block()}},release:function(){if(this.getEnabled()){arguments.callee.base.call(this)}},_onload:function(a){if(!this._isInGlobalDisposeQueue){arguments.callee.base.call(this,a);if(this._isContentAccessible()){this._attachBrowserFunctions()}this._sendProgressEvent()}},_onCreate:function(a){if(!this.getEnabled()){this.block()}},_sendProgressEvent:function(){if(this._hasProgressListener){var c=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var b=c.findIdByWidget(this);a.addParameter(b+".org.eclipse.swt.events.progressCompleted","true");a.send()}},setHasProgressListener:function(a){this._hasProgressListener=a},execute:function(b){this._checkIframeAccess();var f=true;var a=null;try{a=this._parseEvalResult(this._eval(b))}catch(c){f=false}var d=org.eclipse.swt.Request.getInstance();var e=org.eclipse.swt.WidgetManager.getInstance();var g=e.findIdByWidget(this);d.addParameter(g+".executeResult",f);d.addParameter(g+".evaluateResult",a);if(this.getExecutedFunctionPending()){d.sendSyncronous()}else{d.send()}},_srcInLocalDomain:function(){var f=this.getSource();var e=org.eclipse.swt.browser.Browser;var c=e.getDomain(document.URL);var d=e.getDomain(f);var a=c===d;var b=d===null;return b||a},_isContentAccessible:function(){var a;try{this.getContentDocument().body.URL;a=true}catch(b){a=false}return a&&this._isLoaded},_checkIframeAccess:function(b){if(!this._isContentAccessible()){var a=this._srcInLocalDomain();if(!a){this._throwSecurityException(false)}if(this._isLoaded&&a){this._throwSecurityException(true)}}},_throwSecurityException:function(a){var e=org.eclipse.swt.browser.Browser;var b=e.getDomain(document.URL);var d=a?null:e.getDomain(this.getSource());var c="SecurityRestriction:\nBrowser-Widget can not access ";c+=d!==null?'"'+d+'"':"unkown domain";c+=' from "'+b+'".';throw new Error(c)},_eval:function(script){var win=this.getContentWindow();if(!win.eval&&win.execScript){win.execScript("null;","JScript")}return win.eval(script)},_parseEvalResult:function(b){var a=null;var c;if(qx.core.Variant.isSet($[0],$[40])&&org.eclipse.rwt.Client.getVersion()<2){c=window}else{c=this.getContentWindow()}if(b instanceof c.Function){a=this.objectToString([[]])}else{if(b instanceof c.Array){a=this.objectToString([b])}else{if(typeof b!==$[10]&&typeof b!==$[44]){a=this.objectToString([b])}}}return a},createFunction:function(a){this._browserFunctions[a]=true;this._checkIframeAccess();if(this.isLoaded()){try{this._createFunctionImpl(a);this._createFunctionWrapper(a)}catch(b){var c='Unable to create function: "'+a+'".\n'+b;if(org.eclipse.swt.EventUtil.getSuspended()){throw c}else{org.eclipse.rwt.ErrorHandler.processJavaScriptError(c)}}}},_attachBrowserFunctions:function(){for(var a in this._browserFunctions){this.createFunction(a)}},_createFunctionImpl:function(a){var d=this.getContentWindow();var c=org.eclipse.swt.Request.getInstance();var f=org.eclipse.swt.WidgetManager.getInstance();var e=f.findIdByWidget(this);var b=this;d[a+"_impl"]=function(){var g={};if(b.getExecutedFunctionPending()){g.error='Unable to execute browser function "'+a+'". Another browser function is still pending.'}else{var i=b.objectToString(arguments);c.addParameter(e+".executeFunction",a);c.addParameter(e+".executeArguments",i);b.setExecutedFunctionResult(null);b.setExecutedFunctionError(null);b.setExecutedFunctionPending(true);b.setAsynchronousResult(false);c.sendSyncronous();if(b.getExecutedFunctionPending()){b.setAsynchronousResult(true)}else{var h=b.getExecutedFunctionError();if(h!=null){g.error=h}else{g.result=b.getExecutedFunctionResult()}}}return g}},_createFunctionWrapper:function(b){var a=[];a.push("function "+b+"(){");a.push("  var result = "+b+"_impl.apply( window, arguments );");a.push("  if( result.error ) {");a.push("    throw new Error( result.error );");a.push("  }");a.push("  return result.result;");a.push("}");this._eval(a.join(""))},destroyFunction:function(b){delete this._browserFunctions[b];var d=this.getContentWindow();if(d!=null){try{var a=[];if(qx.core.Variant.isSet($[0],$[18])){a.push("window."+b+" = undefined;");a.push("window."+b+"_impl = undefined;")}else{a.push($[420]+b+";");a.push($[420]+b+"_impl;")}this._eval(a.join(""))}catch(c){throw new Error("Unable to destroy function: "+b+" error: "+c)}}},setFunctionResult:function(c,a,b){this.setExecutedFunctionResult(a);this.setExecutedFunctionError(b);this.setExecutedFunctionPending(false)},objectToString:function(b){var a;var d=typeof(b);if(b===null){a=String(b)}else{if(d==$[10]){a=[];for(var c=0;c<b.length;c++){var e=b[c];d=typeof(e);if(d==$[13]){e='"'+e.replace(/"/g,'\\"')+'"'}else{if(d==$[10]&&e!==null){e=this.objectToString(e)}}a.push(String(e))}a="["+String(a)+"]"}else{if(d==$[13]){a='"'+b.replace(/"/g,'\\"')+'"'}else{a=String(b)}}}return a},destroy:function(){arguments.callee.base.call(this);this.syncSource()}}});
 qx.Class.define("org.eclipse.rwt.widgets.ExternalBrowser",{extend:qx.core.Object,statics:{_map:{},open:function(d,a,b){var c=window.open(a,d,b,true);if(c!=null){c.focus();org.eclipse.rwt.widgets.ExternalBrowser._map[d]=c}},close:function(b){var a=org.eclipse.rwt.widgets.ExternalBrowser._map[b];if(a!=null){a.close()}delete org.eclipse.rwt.widgets.ExternalBrowser._map[b]}}});
 qx.Class.define("org.eclipse.swt.FontSizeCalculation",{statics:{MEASUREMENT_LABEL:new qx.ui.basic.Label(),probe:function(c){for(var b=0;b<c.length;b++){var d=c[b];var a=org.eclipse.swt.FontSizeCalculation._doMeasurement(d);var e=a[0]+","+a[1];var f=d[0];org.eclipse.swt.FontSizeCalculation._addRequestParam(f,e)}},measureStrings:function(a){for(var c=0;c<a.length;c++){var d=a[c];var b=org.eclipse.swt.FontSizeCalculation._doMeasurement(d);var e=b[0]+","+b[1];var f=d[0];org.eclipse.swt.FontSizeCalculation._addRequestParam(f,e);org.eclipse.swt.Request.getInstance().send()}},_doMeasurement:function(b){var d=org.eclipse.swt.FontSizeCalculation.MEASUREMENT_LABEL;var e=qx.ui.basic.Label._getMeasureNode();e.style.left=-1000;if(b[6]>0){e.style.width=b[6]}else{e.style.width="auto"}d.setText(b[1]);var c=org.eclipse.swt.WidgetManager.getInstance();c.setFont(d,b[2],b[3],b[4],b[5]);var a=[d._computePreferredInnerWidth(),d._computePreferredInnerHeight()];e.style.width="auto";return a},_addRequestParam:function(a,c){var b=org.eclipse.swt.Request.getInstance();b.addParameter(a,c)}}});
-qx.Class.define("org.eclipse.rwt.widgets.BasicButton",{extend:org.eclipse.rwt.widgets.MultiCellWidget,construct:function(a){arguments.callee.base.call(this,this._CELLORDER);this._hasSelectionListener=false;this._selected=false;this._image=[null,null,null];this._hotImage=[null,null,null];this.addEventListener($[9],this._onMouseOver);this.addEventListener($[14],this._onMouseOut);this.addEventListener($[2],this._onMouseDown);this.addEventListener($[15],this._onMouseUp);this.addEventListener($[24],this._onKeyDown);this.addEventListener($[60],this._onKeyUp);this.addEventListener($[12],this._onKeyPress);this.addState(a);switch(a){case"push":this._isSelectable=false;this._isDeselectable=false;this._sendEvent=true;break;case"toggle":case"check":this._isSelectable=true;this._isDeselectable=true;this._sendEvent=true;break;case"radio":this._isSelectable=true;this._sendEvent=false;this.setNoRadioGroup(false);org.eclipse.rwt.RadioButtonUtil.registerExecute(this);org.eclipse.rwt.RadioButtonUtil.registerKeypress(this);break}},destruct:function(){if(this._animation!=null){this._animation.dispose()}this._animation=null},events:{stateOverChanged:$[11]},properties:{selectionIndicator:{apply:$[519],nullable:true,themeable:true},icon:{apply:$[360],nullable:true,themeable:true},animation:{check:$[110],nullable:false,init:null,apply:$[345],themeable:true}},members:{_CELLORDER:[$[35],$[35],$[82]],_applyIcon:function(b,a){this.setImage.apply(this,b)},setImage:function(c,b,a){this._image=[c,b,a];this._updateButtonImage()},setHotImage:function(c,b,a){this._hotImage=[c,b,a];this._updateButtonImage()},_updateButtonImage:function(){var b=(this._hotImage[0]!=null&&this.hasState("over"))?this._hotImage:this._image;var a=this.getCellContent(1);if(a!=b[0]){this.setCellContent(1,b[0]);this.setCellDimension(1,b[1],b[2])}},setText:function(a){this.setCellContent(2,a)},_applySelectionIndicator:function(e,b){var c=e?e[0]:null;var d=e?e[1]:0;var a=e?e[2]:0;this.setCellContent(0,c);this.setCellDimension(0,d,a)},setHasSelectionListener:function(a){this._hasSelectionListener=a},setGrayed:function(a){if(a){this.addState($[227])}else{this.removeState($[227])}},setNoRadioGroup:function(a){if(this.hasState("radio")){this._noRadioGroup=a;this._isDeselectable=a}},getNoRadioGroup:function(){return this._noRadioGroup},execute:function(){arguments.callee.base.call(this);if(this._isSelectable){this.setSelection(!(this._selected&&this._isDeselectable))}this._sendChanges()},setSelection:function(b){if(this._selected!=b||this._selected){this._selected=b;if(this._selected){this.addState($[30])}else{this.removeState($[30])}if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addParameter(c+$[144],this._selected);org.eclipse.swt.EventUtil.addWidgetSelectedModifier()}}},_sendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()&&this._hasSelectionListener){var a=org.eclipse.swt.Request.getInstance();if(this._sendEvent){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);a.addEvent($[64],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier()}a.send()}},_onMouseOver:function(a){if(a.getTarget()==this&&!this.hasState("over")){if(this.hasState($[47])){this.removeState($[47]);this.addState($[21])}this.addState("over");this._updateButtonImage();this.createDispatchEvent($[192])}},_onMouseOut:function(a){if(a.getTarget()==this){this.removeState("over");this._updateButtonImage();if(this.hasState($[21])){this.setCapture(true);this.removeState($[21]);this.addState($[47])}this.createDispatchEvent($[192])}},_onMouseDown:function(a){if(a.getTarget()==this&&a.isLeftButtonPressed()){this.removeState($[47]);this.addState($[21])}},_onMouseUp:function(b){this.setCapture(false);var a=this.hasState($[21]);var c=this.hasState($[47]);if(a){this.removeState($[21])}if(c){this.removeState($[47])}if(!c){this.addState("over");this._updateButtonImage();if(a){this.execute()}}},_onKeyDown:function(a){switch(a.getKeyIdentifier()){case $[68]:case $[92]:this.removeState($[47]);this.addState($[21]);a.preventDefault();a.stopPropagation()}},_onKeyUp:function(a){switch(a.getKeyIdentifier()){case $[68]:case $[92]:if(this.hasState($[21])){this.removeState($[47]);this.removeState($[21]);this.execute();a.preventDefault();a.stopPropagation()}}},_onKeyPress:function(a){switch(a.getKeyIdentifier()){case"Left":case"Up":case $[53]:case"Down":case $[58]:case $[55]:case"End":case"Home":a.preventDefault();a.stopPropagation()}},_applyAnimation:function(b,a){if(b.hoverIn||b[$[380]]){if(this._animation==null){this._animation=new org.eclipse.rwt.Animation();this._animation.addEventListener("init",this._initAnimation,this)}this.addEventListener($[192],this._animation.activateRendererOnce,this._animation);this.addEventListener($[364],this._configureRenderer,this);this._configureRenderer()}else{if(this._animation!=null){this.removeEventListener($[192],this._animation.activateRendererOnce,this._animation);this.removeEventListener($[364],this._configureRenderer,this)}}},_configureRenderer:function(c){if(!c||c.getValue()==null||c.getOldValue()==null){this._animation.skip();var d=this._animation.getDefaultRenderer(false);var a=this.getBackgroundGradient()!=null?$[298]:$[78];var b=org.eclipse.rwt.AnimationRenderer.ANIMATION_CHANGE;d.animate(this,a,b)}},_initAnimation:function(a){if(this.hasState($[21])){this._animation.cancel()}else{var b=this.getAnimation();if(this.hasState("over")&&b.hoverIn){this._animation.setProperties(b.hoverIn)}else{if(!this.hasState("over")&&b[$[380]]){this._animation.setProperties(b[$[380]])}else{this._animation.cancel()}}}},_renderAppearance:function(){arguments.callee.base.call(this);if(this._animation!=null&&!this._animation.isStarted()){this._animation.getDefaultRenderer().cancelActivateOnce()}}}});
-qx.Class.define("org.eclipse.rwt.widgets.ToolItem",{extend:org.eclipse.rwt.widgets.BasicButton,construct:function(a,b){arguments.callee.base.call(this,a);this._isDropDown=false;if(a=="dropDown"){this._isDropDown=true;this._isSelectable=false;this._isDeselectable=false;this._sendEvent=true;this.setCellDimension(3,1,0);this.setCellContent(3,"")}this._separatorBorder=null;this.setAppearance("toolbar-button");this.removeEventListener($[24],this._onKeyDown);this.removeEventListener($[60],this._onKeyUp);if(b){this.addState($[171])}},properties:{dropDownArrow:{apply:"_applyDropDownArrow",nullable:true,themeable:true},separatorBorder:{nullable:true,init:null,apply:$[574],themeable:true}},members:{_CELLORDER:[$[35],$[35],$[82],$[82],$[35]],_onKeyPress:function(a){this.getParent().dispatchEvent(a);arguments.callee.base.call(this,a)},_onMouseDown:function(a){if(a.getTarget()==this&&a.isLeftButtonPressed()){this.removeState($[47]);if(this._isDropdownClick(a)){this._onDropDownClick();this._sendChanges()}else{this.addState($[21])}}},_isDropdownClick:function(e){var a=false;var d=this.getCellNode(3);if(d!=null){var c=qx.bom.element.Location.getLeft(d);var b=e.getClientX();a=b>c}return a},_onDropDownClick:function(){if(!org.eclipse.swt.EventUtil.getSuspended()&&this._hasSelectionListener){var a=org.eclipse.swt.Request.getInstance();if(this._sendEvent){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);a.addEvent($[346],"arrow")}}},_applyDropDownArrow:function(e,c){var b=e?e[0]:null;var d=e?e[1]:0;var a=e?e[2]:0;this.setCellContent(4,b);this.setCellDimension(4,d,a)},_applySeparatorBorder:function(b,a){this._queueSeparatorBorder(b)},_queueSeparatorBorder:function(a){this._separatorBorder=a;this.addToQueue($[441])},_beforeRenderLayout:function(h){if(this._isDropDown){if(h.layoutY){var g=this.getPaddingTop()+this.getPaddingBottom();this._setCellHeight(3,this.getInnerHeight()+g)}if(h.layoutX){var l=this.getInnerWidth();this.setCellWidth(0,0);this.setCellWidth(2,null);var j=this.getPreferredInnerWidth();var i=l-j;if(i>0){var b=this.getSpacing();if((i>(b*2))&&this.getHorizontalChildrenAlign()!="left"){var e=Math.round(i*0.5)-b;var f=Math.round(i*0.5);this.setCellWidth(0,e);this.setCellWidth(2,this.getCellWidth(2)+f)}else{this.setCellWidth(2,this.getCellWidth(2)+i)}}}if(h.separatorBorder){var c=this.getCellNode(3).style;var a=this._separatorBorder.getWidthLeft();var k=this._separatorBorder.getStyleLeft();var d=this._separatorBorder.getColorLeft();c.borderLeftWidth=(a||0)+"px";c.borderLeftStyle=k||"none";c.borderLeftColor=d||""}}},_renderCellLayoutY:function(a){arguments.callee.base.call(this,a);if(this._isDropDown&&a==3){this.getCellNode(a).style.top=0}}}});
-qx.Class.define("org.eclipse.swt.widgets.Group",{extend:qx.ui.groupbox.GroupBox,construct:function(){arguments.callee.base.call(this);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);var b=new org.eclipse.swt.theme.ThemeValues({});this._themeBackgroundColor=b.getCssColor($[212],$[5]);b.dispose();var a=this.getLegendObject().getLabelObject();if(a==null){this.setLegend($[139]);this.setLegend("")}a=this.getLegendObject().getLabelObject();a.setMode(qx.constant.Style.LABEL_MODE_HTML);this.addEventListener($[203],this._onChangeBackgroundColor,this);this.addEventListener($[84],this._onChangeFont,this);this.getLegendObject().addEventListener($[9],this._onMouseOver,this);this.getLegendObject().addEventListener($[14],this._onMouseOut,this);qx.ui.core.Widget.disableScrolling(this)},destruct:function(){this.removeEventListener($[203],this._onChangeBackgroundColor,this);this.removeEventListener($[84],this._onChangeFont,this);this.getLegendObject().removeEventListener($[9],this._onMouseOver,this);this.getLegendObject().removeEventListener($[14],this._onMouseOut,this)},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]){this._legendObject.addState(a);this._frameObject.addState(a)}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]){this._legendObject.removeState(a);this._frameObject.removeState(a)}},_onChangeBackgroundColor:function(a){var b=a.getValue();if(this._themeBackgroundColor===$[8]){this.getLegendObject().setBackgroundColor(b)}},_onChangeFont:function(b){var a=b.getValue();this.getLegendObject().setFont(a)},_onMouseOver:function(a){this.getLegendObject().addState("over");this.getFrameObject().addState("over")},_onMouseOut:function(a){this.getLegendObject().removeState("over");this.getFrameObject().removeState("over")},_layoutPost:function(a){arguments.callee.base.call(this,a);this._frameObject._layoutPost(a)}}});
-qx.Class.define("org.eclipse.swt.widgets.Shell",{extend:qx.ui.window.Window,construct:function(){arguments.callee.base.call(this);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this.setRestrictToPageOnOpen(false);this._captionTitle.setMode("html");this._activeControl=null;this._focusControl=null;this._activateListenerWidgets=new Array();this._parentShell=null;this._renderZIndex=true;this.addEventListener($[398],this._onChangeActiveChild);this.addEventListener($[222],this._onChangeFocusedChild);this.addEventListener($[359],this._onChangeActive);this.addEventListener($[391],this._onChangeMode);this.addEventListener($[145],this._onChangeLocation);this.addEventListener($[302],this._onChangeLocation);this.addEventListener($[57],this._onChangeSize);this.addEventListener($[66],this._onChangeSize);this.addEventListener($[24],this._onKeydown);var a=org.eclipse.swt.Request.getInstance();a.addEventListener("send",this._onSend,this);this.getCaptionBar().setWidth("100%");this.removeEventListener($[2],this._onwindowmousedown);this.addEventListener($[105],this._onCreate,this);this.__onwindowmousedown=qx.lang.Function.bind(this._onwindowmousedown,this)},statics:{TOP_LEFT:"topLeft",TOP_RIGHT:"topRight",BOTTOM_LEFT:"bottomLeft",BOTTOM_RIGHT:$[525],CORNER_NAMES:["topLeft","topRight","bottomLeft",$[525]],_onParentClose:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){this.doClose()}},_appendCloseRequestParam:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(a);var b=org.eclipse.swt.Request.getInstance();b.addEvent("org.eclipse.swt.widgets.Shell_close",c)}},reorderShells:function(c){var g=qx.lang.Object.getValues(c.getAll());g=g.sort(org.eclipse.swt.widgets.Shell._compareShells);var f=g.length;var e=null;if(f>0){var b=g[0].getTopLevelWidget();var a=org.eclipse.swt.widgets.Shell.MIN_ZINDEX;for(var d=0;d<f;d++){a+=10;g[d].setZIndex(a);if(g[d]._appModal){e=g[d]}}if(e!=null){this._copyStates(e,b._getBlocker());b._getBlocker().show();b._getBlocker().setZIndex(e.getZIndex()-1)}else{b._getBlocker().hide()}}org.eclipse.swt.widgets.Shell._upperModalShell=e},_copyStates:function(b,c){c.__states={};for(var a in b.__states){if(b._isRelevantState(a)){c.addState(a)}}c._renderAppearance();qx.ui.core.Widget.removeFromGlobalLayoutQueue(c)},_compareShells:function(c,b){var a=0;if(c.isDialogOf(b)){a=1}else{if(b.isDialogOf(c)){a=-1}}if(a==0){a=(c._onTop?1:0)-(b._onTop?1:0)}if(a==0){a=(c._appModal?1:0)-(b._appModal?1:0)}if(a==0){var e=c.getTopLevelShell();var d=b.getTopLevelShell();a=e.getZIndex()-d.getZIndex()}if(a==0){a=c.getZIndex()-b.getZIndex()}return a},MIN_ZINDEX:100000,MAX_ZINDEX:10000000},destruct:function(){this.setParentShell(null);this.removeEventListener($[398],this._onChangeActiveChild);this.removeEventListener($[222],this._onChangeFocusedChild);this.removeEventListener($[359],this._onChangeActive);this.removeEventListener($[391],this._onChangeMode);this.removeEventListener($[145],this._onChangeLocation);this.removeEventListener($[302],this._onChangeLocation);this.removeEventListener($[57],this._onChangeSize);this.removeEventListener($[66],this._onChangeSize);this.removeEventListener($[24],this._onKeydown);var a=org.eclipse.swt.Request.getInstance();a.removeEventListener("send",this._onSend,this);if(this.isCreated()){qx.html.EventRegistration.removeEventListener(this.getElement(),$[2],this.__onwindowmousedown)}this._activateListenerWidgets=null},events:{close:$[70]},members:{_onCreate:function(a){qx.html.EventRegistration.addEventListener(this.getElement(),$[2],this.__onwindowmousedown);this.removeEventListener($[105],this._onCreate,this)},_beforeAppear:function(){qx.ui.layout.CanvasLayout.prototype._beforeAppear.call(this);qx.ui.popup.PopupManager.getInstance().update();var a=this.getWindowManager().getActiveWindow();this.getWindowManager().add(this);this.getWindowManager().setActiveWindow(a)},setDefaultButton:function(a){this._defaultButton=a},getDefaultButton:function(){return this._defaultButton},setParentShell:function(a){var b=this._parentShell;this._parentShell=a;var c=org.eclipse.swt.widgets.Shell._onParentClose;if(b!=null){b.removeEventListener("close",c,this)}if(a!=null){a.addEventListener("close",c,this)}},setSpace:function(d,b,c,a){if(!this._disableResize){this.setLeft(d);this.setWidth(b);this.setTop(c);this.setHeight(a)}},setHasShellListener:function(a){this._hasShellListener=a},setActiveControl:function(a){this._activeControl=a},initialize:function(){this.setShowCaption(this.hasState("rwt_TITLE"));this._onTop=(this._parentShell!=null&&this._parentShell._onTop)||this.hasState("rwt_ON_TOP");this._appModal=this.hasState("rwt_APPLICATION_MODAL")},addState:function(b){arguments.callee.base.call(this,b);if(this._isRelevantState(b)){this._captionBar.addState(b);this._captionTitle.addState(b);this._minimizeButton.addState(b);this._maximizeButton.addState(b);this._restoreButton.addState(b);this._closeButton.addState(b);var a=this._getClientDocumentBlocker();if(a!=null){a.addState(b)}}},removeState:function(b){arguments.callee.base.call(this,b);if(this._isRelevantState(b)){this._captionBar.removeState(b);this._captionTitle.removeState(b);this._minimizeButton.removeState(b);this._maximizeButton.removeState(b);this._restoreButton.removeState(b);this._closeButton.removeState(b);var a=this._getClientDocumentBlocker();if(a!=null){a.removeState(b)}}},_getClientDocumentBlocker:function(){var a=null;if(this._appModal&&org.eclipse.swt.widgets.Shell._upperModalShell==this){a=this.getTopLevelWidget()._getBlocker()}return a},_isRelevantState:function(b){var a=b==$[88]||b==$[95]||b==$[236]||b.substr(0,8)==$[54]||b.substr(0,4)=="rwt_";return a},close:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){org.eclipse.swt.widgets.Shell._appendCloseRequestParam(this);if(this._hasShellListener){org.eclipse.swt.Request.getInstance().send()}else{this.doClose()}}},doClose:function(){if(!this.isDisposed()){this.hide();if(this.hasEventListeners("close")){var a=new qx.event.type.DataEvent("close",this);this.dispatchEvent(a,true)}var b=this.getWindowManager();org.eclipse.swt.widgets.Shell.reorderShells(b)}},addActivateListenerWidget:function(a){this._activateListenerWidgets.push(a)},removeActivateListenerWidget:function(a){qx.lang.Array.remove(this._activateListenerWidgets,a)},_isRelevantActivateEvent:function(d){var a=false;for(var c=0;!a&&c<this._activateListenerWidgets.length;c++){var b=this._activateListenerWidgets[c];if(!b.contains(this._activeControl)&&b.contains(d)){a=true}}return a},_onChangeActiveChild:function(a){var e=this._getParentControl(a.getValue());if(!org.eclipse.swt.EventUtil.getSuspended()&&e!=null){var b=org.eclipse.swt.WidgetManager.getInstance();var f=b.findIdByWidget(e);var d=b.findIdByWidget(this);var c=org.eclipse.swt.Request.getInstance();if(this._isRelevantActivateEvent(e)){this._activeControl=e;c.removeParameter(d+$[463]);c.addEvent("org.eclipse.swt.events.controlActivated",f);c.send()}else{c.addParameter(d+$[463],f)}}},_onChangeFocusedChild:function(a){if(org.eclipse.swt.EventUtil.getSuspended()){this._focusControl=this.getFocusedChild()}},_onChangeActive:function(b){if(!this.getActive()&&!isFinite(this.getZIndex())){this.setZIndex(100000000)}if(!org.eclipse.swt.EventUtil.getSuspended()&&this.getActive()){var c=org.eclipse.swt.WidgetManager.getInstance();var f=c.findIdByWidget(this);var d=org.eclipse.swt.Request.getInstance();d.addEvent("org.eclipse.swt.events.shellActivated",f);d.send()}var e=b.getValue();if(e){var a=org.eclipse.swt.widgets.Shell._upperModalShell;if(a!=null&&a.getZIndex()>this.getZIndex()){this.setActive(false);a.setActive(true)}}},_onChangeMode:function(a){var c=a.getValue();var e=org.eclipse.swt.WidgetManager.getInstance();var d=e.findIdByWidget(a.getTarget());var b=org.eclipse.swt.Request.getInstance();b.addParameter(d+".mode",c)},_onChangeSize:function(b){if(!org.eclipse.swt.EventUtil.getSuspended()){var f=org.eclipse.swt.WidgetManager.getInstance();var d=org.eclipse.swt.Request.getInstance();var e=f.findIdByWidget(b.getTarget());var a=b.getTarget().getHeightValue();var c=b.getTarget().getWidthValue();d.addParameter(e+$[317],a);d.addParameter(e+$[303],c);d.send()}},_onChangeLocation:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var f=org.eclipse.swt.WidgetManager.getInstance();var b=org.eclipse.swt.Request.getInstance();var e=f.findIdByWidget(a.getTarget());var d=a.getTarget().getLeft();var c=a.getTarget().getTop();if(!isNaN(d)&&!isNaN(c)){b.addParameter(e+$[294],d);b.addParameter(e+$[295],c)}b.send()}},_onKeydown:function(a){var c=a.getKeyIdentifier();if(c==$[68]&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isCtrlPressed()&&!a.isMetaPressed()){var b=this.getDefaultButton();if(b!=null&&b.isSeeable()){b.execute()}}else{if(c==$[116]&&this._parentShell!=null){this.close()}}},_onSend:function(a){if(this.getActive()){var c=this.getFocusedChild();if(c!=null&&c!=this._focusControl){this._focusControl=c;var e=org.eclipse.swt.WidgetManager.getInstance();var b=e.findIdByWidget(c);var d=org.eclipse.swt.Request.getInstance();d.addParameter(d.getUIRootId()+".focusControl",b)}}},_getParentControl:function(c){var b=org.eclipse.swt.WidgetManager.getInstance();var a=c;while(a!=null&&!b.isControl(a)){if(a.getParent){a=a.getParent()}else{a=null}}return a},isDialogOf:function(c){var a=false;var b=this._parentShell;while(!a&&b!=null){a=c===b;b=b._parentShell}return a},getTopLevelShell:function(){var a=this;while(a._parentShell!=null){a=a._parentShell}return a},_sendTo:function(){org.eclipse.swt.widgets.Shell.reorderShells(this.getWindowManager())},bringToFront:function(){var a=this;while(a._parentShell!=null){a=a._parentShell}this._setRenderZIndex(false);this.setZIndex(org.eclipse.swt.widgets.Shell.MAX_ZINDEX+1);a.setZIndex(org.eclipse.swt.widgets.Shell.MAX_ZINDEX+1);org.eclipse.swt.widgets.Shell.reorderShells(this.getWindowManager());this._setRenderZIndex(true)},_applyZIndex:function(b,a){if(this._renderZIndex){arguments.callee.base.call(this,b,a)}},_setRenderZIndex:function(a){this._renderZIndex=a;if(a){this._applyZIndex(this.getZIndex())}},sendToBack:function(){var a=this;while(a._parentShell!=null){a=a._parentShell}this._setRenderZIndex(false);this.setZIndex(org.eclipse.swt.widgets.Shell.MIN_ZINDEX-1);a.setZIndex(org.eclipse.swt.widgets.Shell.MIN_ZINDEX-1);org.eclipse.swt.widgets.Shell.reorderShells(this.getWindowManager());this._setRenderZIndex(true)},setBlocked:function(a){if(a){if(!this._blocker){this._blocker=new qx.ui.layout.CanvasLayout();this._blocker.setAppearance($[516]);this.add(this._blocker)}this._blocker.setSpace(0,0,10000,10000);this._blocker.setZIndex(1000)}else{if(this._blocker){this.remove(this._blocker);this._blocker.destroy();this._blocker=null}}},setFullScreen:function(a){if(a){this._captionBar.setDisplay(false)}else{this._captionBar.setDisplay(this.hasState("rwt_TITLE"))}}}});
-qx.Class.define("org.eclipse.swt.widgets.ProgressBar",{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this.setOverflow($[17]);this.setAppearance("progressbar");this._timer=null;this._gfxCanvasAppended=false;this._canvas=null;this._backgroundShape=null;this._indicatorShape=null;this._borderShape=null;this._useBorderShape=false;this._gfxBorderWidth=0;this._indicatorVirtualPosition=0;this._separatorStartShape=null;this._separatorEndShape=null;this._useSeparator=false;this._separatorWidth=0;this._minimum=0;this._maximum=100;this._selection=0;this._flag=0},destruct:function(){if(this._timer!=null){this._timer.stop();this._timer.dispose()}this._timer=null;this._canvas=null;this._backgroundShape=null;this._indicatorShape=null;this._borderShape=null;this._separatorStartShape=null;this._separatorEndShape=null},statics:{UNDETERMINED_SIZE:40,FLAG_UNDETERMINED:2,FLAG_HORIZONTAL:256,FLAG_VERTICAL:512},properties:{indicatorColor:{nullable:true,init:null,apply:$[314],themeable:true},indicatorImage:{nullable:true,init:null,apply:$[314],themeable:true},indicatorGradient:{nullable:true,init:null,apply:$[314],themeable:true},indicatorOpacity:{nullable:true,init:1,apply:$[314],themeable:true},backgroundImageSized:{nullable:true,init:null,apply:"_applyBackgroundImageSized",themeable:true},separatorBorder:{nullable:true,init:null,apply:$[574],themeable:true}},members:{setMinimum:function(a){this._minimum=a},setMaximum:function(a){this._maximum=a},setSelection:function(a){this._selection=a;this.addToQueue("indicatorSelection")},setFlag:function(a){this._flag=a;if(this._isUndetermined()){this._timer=new qx.client.Timer(120);this._timer.addEventListener($[50],this._onInterval,this);this._timer.start();this.addState("rwt_UNDETERMINED")}if(this._isVertical()){this.addState($[304])}},setState:function(a){if(a=="error"){this.removeState("paused");this.addState("error")}else{if(a=="paused"){this.removeState("error");this.addState("paused")}else{this.removeState("error");this.removeState("paused")}}},_isUndetermined:function(){var a=this._flag&org.eclipse.swt.widgets.ProgressBar.FLAG_UNDETERMINED;return a!=0},_isHorizontal:function(){var a=this._flag&org.eclipse.swt.widgets.ProgressBar.FLAG_HORIZONTAL;return a!=0},_isVertical:function(){var a=this._flag&org.eclipse.swt.widgets.ProgressBar.FLAG_VERTICAL;return a!=0},_queueBorder:function(a){this.addToQueue("indicatorBorder");if(a&&a.getStyle()===$[114]){this._cachedBorderTop=0;this._cachedBorderRight=0;this._cachedBorderBottom=0;this._cachedBorderLeft=0;this._invalidateFrameDimensions()}else{arguments.callee.base.call(this,a)}},_applyBackgroundColor:function(a){if(this._gfxCanvasAppended){this._styleBackgroundFill()}},_applyBackgroundGradient:function(a){if(this._gfxCanvasAppended){this._styleBackgroundFill()}},_applyBackgroundImage:function(a){},_applyBackgroundImageSized:function(a){if(this._gfxCanvasAppended){this._styleBackgroundFill()}},_applyIndicatorFill:function(a){if(this._gfxCanvasAppended){this._styleIndicatorFill()}},_applySeparatorBorder:function(a){this.addToQueue($[441])},_onCanvasAppear:function(){org.eclipse.rwt.GraphicsUtil.handleAppear(this._canvas)},_onInterval:function(){if(this.isSeeable()){this._renderIndicatorSelection()}},_layoutPost:function(b){if(!this._gfxCanvasAppended){this._createCanvas()}var a=b.width||b.height||b.frameWidth||b.frameHeight||b.initial;if(b.separatorBorder){this._styleSeparatorBorder()}if(b.indicatorBorder){this._styleIndicatorBorder()}if(b.indicatorBorder||a){this._renderDimension();this._renderIndicatorSelection()}else{if(b.indicatorSelection||b.separatorBorder){this._renderIndicatorSelection()}}},_createCanvas:function(){var a=org.eclipse.rwt.GraphicsUtil;this._canvas=a.createCanvas();this._getTargetNode().appendChild(a.getCanvasNode(this._canvas));this._gfxCanvasAppended=true;this.addEventListener($[216],this._onCanvasAppear);this._backgroundShape=a.createShape($[178]);this._indicatorShape=a.createShape($[178]);a.addToCanvas(this._canvas,this._backgroundShape);a.addToCanvas(this._canvas,this._indicatorShape);this._styleBackgroundFill();this._styleIndicatorFill();if(this.isSeeable()){this._onCanvasAppear()}},_styleIndicatorBorder:function(){var b=org.eclipse.rwt.GraphicsUtil;if(this.getBorder()&&this.getBorder().getStyle()===$[114]){if(!this._useBorderShape){this._style.border="";if(this._borderShape==null){this._borderShape=b.createShape($[178])}b.addToCanvas(this._canvas,this._borderShape);this._useBorderShape=true}this._gfxBorderWidth=this._getMaxBorderWidth(this.getBorder());var a=this.getBorder().getColor();b.setStroke(this._borderShape,a,this._gfxBorderWidth)}else{if(this._useBorderShape){b.removeFromCanvas(this._canvas,this._borderShape);this._useBorderShape=true;this._gfxBorderWidth=0}}},_styleSeparatorBorder:function(){var c=org.eclipse.rwt.GraphicsUtil;var b=this.getSeparatorBorder();if(b!=null){if(!this._useSeparator){if(this._isUndetermined()){if(this._separatorStartShape==null){this._separatorStartShape=c.createShape("rect")}c.addToCanvas(this._canvas,this._separatorStartShape)}if(this._separatorEndShape==null){this._separatorEndShape=c.createShape("rect")}c.addToCanvas(this._canvas,this._separatorEndShape);this._useSeparator=true}this._separatorWidth=this._getMaxBorderWidth(b);var a=b.getColorTop();c.setFillColor(this._separatorEndShape,a);if(this._isUndetermined()){c.setFillColor(this._separatorStartShape,a)}}else{if(this._useSeparator){c.removeFromCanvas(this._canvs,this._separatorEndShape);this._useSeparator=false;if(this._isUndetermined()){c.removeFromCanvas(canvas,this._separatorStartShape)}this._separatorWidth=0}}},_getMaxBorderWidth:function(a){var b=0;b=Math.max(b,a.getWidthTop());b=Math.max(b,a.getWidthLeft());b=Math.max(b,a.getWidthRight());b=Math.max(b,a.getWidthBottom());return b},_styleIndicatorFill:function(){var a=org.eclipse.rwt.GraphicsUtil;if(this.getIndicatorImage()!=null&&this.getIndicatorImage()[0]!=null){var b=this.getIndicatorImage();a.setFillPattern(this._indicatorShape,b[0],b[1],b[2])}else{if(this.getIndicatorGradient()!=null){a.setFillGradient(this._indicatorShape,this.getIndicatorGradient())}else{a.setFillColor(this._indicatorShape,this.getIndicatorColor())}}a.setOpacity(this._indicatorShape,this.getIndicatorOpacity())},_styleBackgroundFill:function(){var a=org.eclipse.rwt.GraphicsUtil;if(this.getBackgroundImageSized()!=null&&this.getBackgroundImageSized()[0]!=null){var b=this.getBackgroundImageSized();a.setFillPattern(this._backgroundShape,b[0],b[1],b[2])}else{if(this.getBackgroundGradient()!=null){a.setFillGradient(this._backgroundShape,this.getBackgroundGradient())}else{a.setFillColor(this._backgroundShape,this.getBackgroundColor())}}},_renderDimension:function(){var c=org.eclipse.rwt.GraphicsUtil;var d=[0,0,0,0];var b=this.getInnerWidth();var a=this.getInnerHeight();if(this._useBorderShape){d=this.getBorder().getRadii();c.setRoundRectLayout(this._borderShape,this._gfxBorderWidth/2,this._gfxBorderWidth/2,b-this._gfxBorderWidth,a-this._gfxBorderWidth,d)}c.setRoundRectLayout(this._backgroundShape,this._gfxBorderWidth/2,this._gfxBorderWidth/2,b-this._gfxBorderWidth,a-this._gfxBorderWidth,d)},_renderIndicatorSelection:function(){var g=org.eclipse.rwt.GraphicsUtil;var c=this._getIndicatorVirtualPosition();var h=Math.max(c,0);var b=this._getIndicatorLength(c);if(b>0){var f=this._getIndicatorRadii(h,b);var i=h;var j=b;if(h+b==this._getIndicatorFullLength()){j+=this._gfxBorderWidth/2}else{j+=this._separatorWidth}if(i==0){i+=this._gfxBorderWidth/2;j+=this._gfxBorderWidth/2}else{i+=this._gfxBorderWidth}var e=this._isVertical();var a=e?this.getInnerWidth()-this._gfxBorderWidth:j;var m=e?j:this.getInnerHeight()-this._gfxBorderWidth;var l=e?this.getInnerHeight()-(i+j):this._gfxBorderWidth/2;var d=e?this._gfxBorderWidth/2:i;var k=this._indicatorShape;g.setDisplay(this._indicatorShape,true);g.setRoundRectLayout(k,d,l,a,m,f)}else{g.setDisplay(this._indicatorShape,false)}if(this._useSeparator){this._renderSeparator(h,b)}},_renderSeparator:function(e,b){var d=org.eclipse.rwt.GraphicsUtil;var h=b+e==this._getIndicatorFullLength();if(b==0){d.setDisplay(this._separatorEndShape,false);if(this._isUndetermined()){d.setDisplay(this._separatorStartShape,false)}}else{d.setDisplay(this._separatorEndShape,!h);if(this._isUndetermined()){d.setDisplay(this._separatorStartShape,e!=0)}var f=e+this._gfxBorderWidth-this._separatorWidth;var g=b+2*this._separatorWidth;if(this._isVertical()){var c=this._gfxBorderWidth;var j=this.getInnerHeight()-(g+f);var a=this.getInnerWidth()-2*this._gfxBorderWidth;var k=this._separatorWidth;var i=this._separatorEndShape;if(!h){d.setRectBounds(i,c,j,a,k)}if(e!=0){j=this.getInnerHeight()-f-this._separatorWidth;i=this._separatorStartShape;d.setRectBounds(i,c,j,a,k)}}else{var c=f+g-this._separatorWidth;var j=this._gfxBorderWidth;var a=this._separatorWidth;var k=this.getInnerHeight()-2*this._gfxBorderWidth;var i=this._separatorEndShape;if(!h){d.setRectBounds(i,c,j,a,k)}if(e!=0){c=f;i=this._separatorStartShape;d.setRectBounds(i,c,j,a,k)}}}},_getIndicatorLength:function(c){var a=this._getIndicatorVirtualLength();var e=this._getIndicatorFullLength();if(this._isUndetermined()){if(c<0){a+=c}if((c+a)>e){a=e-c}}else{if(this._useBorderShape){var d=this._getIndicatorMinSafeLength();var b=this._getIndicatorMaxSafeLength();if(a<d){if(a>0){a=d}else{a=0}}if(a>b&&a<e){a=b}}}return Math.round(a)},_getIndicatorVirtualLength:function(){var b;if(this._isUndetermined()){b=org.eclipse.swt.widgets.ProgressBar.UNDETERMINED_SIZE}else{var d=this._getIndicatorFullLength();var c=this._selection-this._minimum;var a=this._maximum-this._minimum;b=(c/a)*d}return b},_getIndicatorVirtualPosition:function(){var a=0;if(this._isUndetermined()){a=this._computeNextSaveIndicatorPosition()}return a},_computeNextSaveIndicatorPosition:function(){var e=org.eclipse.swt.widgets.ProgressBar.UNDETERMINED_SIZE;var f=this._getIndicatorFullLength();var a=this._indicatorVirtualPosition+2;if(this._useBorderShape){var b=this._getIndicatorMinSafeLength();var d=this._getIndicatorMaxSafeLength();var c=a+e;if(c>0&&c<b){a=b-e}if(a>0&&a<b){a=b}c=a+e;if(c>d&&c<f){a=f-e}if(a>d){a=-e}}else{if(a>=f){a=-e}}this._indicatorVirtualPosition=a;return a},_getIndicatorRadii:function(b,d){var a=[0,0,0,0];if(this._useBorderShape&&d>0){var f=this.getBorder().getRadii();var c=b+d;var e=this._getIndicatorFullLength();if(this._isVertical()){if(b==0){a[2]=f[2];a[3]=f[3]}if(c==e){a[0]=f[0];a[1]=f[1]}}else{if(b==0){a[0]=f[0];a[3]=f[3]}if(c==e){a[1]=f[1];a[2]=f[2]}}}return a},_getIndicatorFullLength:function(){return this._isVertical()?this.getInnerHeight()-2*this._gfxBorderWidth:this.getInnerWidth()-2*this._gfxBorderWidth},_getIndicatorMinSafeLength:function(){var b=this.getBorder().getRadii();var a=this._isVertical()?Math.max(b[2],b[3]):Math.max(b[0],b[3]);a+=this._separatorWidth;a-=Math.floor(this._gfxBorderWidth/2);return a},_getIndicatorMaxSafeLength:function(){var c=this.getBorder().getRadii();var b=this._getIndicatorFullLength();var a=this._isVertical()?b-Math.max(c[0],c[1]):b-Math.max(c[1],c[2]);a-=this._separatorWidth;a+=Math.floor(this._gfxBorderWidth/2);return a}}});
-qx.Class.define("org.eclipse.swt.widgets.Link",{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this.setAppearance("link");this._text="";this._hasSelectionListener=false;this._hyperlinksHaveListeners=false;this._linkColor;this._readyToSendChanges=true;this._currentFocusedLink=-1;this._linksCount=0;this._link=new qx.ui.embed.HtmlEmbed();this._link.setAppearance("link-text");this.add(this._link);this.setSelectable(false);this.setHideFocus(true);this.__onMouseDown=qx.lang.Function.bindEvent(this._onMouseDown,this);this.__onKeyDown=qx.lang.Function.bindEvent(this._onKeyDown,this);this.addEventListener($[31],this._onAppear,this);this.addEventListener($[132],this._onChangeEnabled,this);this.addEventListener($[41],this._onContextMenu,this);this.addEventListener($[12],this._onKeyPress);this.addEventListener($[176],this._onFocusOut);this._link.addEventListener($[330],this._onChangeHtml,this)},destruct:function(){this._removeEventListeners();delete this.__onMouseDown;delete this.__onKeyDown;this.removeEventListener($[31],this._onAppear,this);this.removeEventListener($[41],this._onContextMenu,this);this.removeEventListener($[132],this._onChangeEnabled,this);this.removeEventListener($[12],this._onKeyPress);this.removeEventListener($[176],this._onFocusOut);this._link.removeEventListener($[330],this._onChangeHtml,this);this._link.dispose()},members:{_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_onAppear:function(a){this._link.setTabIndex(null);this._link.setHideFocus(true);this._applyHyperlinksStyleProperties();this._addEventListeners()},_onChangeHtml:function(a){this._applyHyperlinksStyleProperties();this._addEventListeners()},_applyTextColor:function(b,a){arguments.callee.base.call(this,b,a);var c=new org.eclipse.swt.theme.ThemeValues(this._getStates());this._linkColor=c.getCssColor("Link-Hyperlink",$[6]);c.dispose();this._applyHyperlinksStyleProperties()},_onChangeEnabled:function(a){this._applyHyperlinksStyleProperties();this._changeHyperlinksTabIndexProperty()},_getStates:function(){if(!this.__states){this.__states={}}return this.__states},addState:function(a){arguments.callee.base.call(this,a);this._link.addState(a)},removeState:function(a){arguments.callee.base.call(this,a);this._link.removeState(a)},setHasSelectionListener:function(a){this._hasSelectionListener=a},addText:function(a){this._text+=a},addLink:function(b,a){this._text+='<span tabIndex="1" ';this._text+='style="';this._text+="text-decoration:underline; ";this._text+='" ';this._text+='id="'+a+'"';this._text+=">";this._text+=b;this._text+="</span>";this._linksCount++},applyText:function(){this._link.setHtml(this._text);if(this._linksCount===0){this.setTabIndex(null)}else{this.setTabIndex(1)}},clear:function(){this._removeEventListeners();this._text="";this._linksCount=0;this._currentFocusedLink=-1},_applyHyperlinksStyleProperties:function(){var a=this._getHyperlinkElements();for(i=0;i<a.length;i++){if(this._linkColor){if(this.isEnabled()){a[i].style.color=this._linkColor}else{a[i].style.color=""}}if(this.isEnabled()){a[i].style.cursor=$[149]}else{a[i].style.cursor=$[39]}}},_changeHyperlinksTabIndexProperty:function(){var a=this._getHyperlinkElements();for(i=0;i<a.length;i++){if(this.isEnabled()){a[i].tabIndex="1"}else{a[i].tabIndex="-1"}}},_addEventListeners:function(){var a=this._getHyperlinkElements();if(a.length>0&&!this._hyperlinksHaveListeners){for(i=0;i<a.length;i++){qx.html.EventRegistration.addEventListener(a[i],$[2],this.__onMouseDown);qx.html.EventRegistration.addEventListener(a[i],$[24],this.__onKeyDown)}this._hyperlinksHaveListeners=true}},_removeEventListeners:function(){var a=this._getHyperlinkElements();if(a.length>0&&this._hyperlinksHaveListeners){for(i=0;i<a.length;i++){qx.html.EventRegistration.removeEventListener(a[i],$[2],this.__onMouseDown);qx.html.EventRegistration.removeEventListener(a[i],$[24],this.__onKeyDown)}this._hyperlinksHaveListeners=false}},_onMouseDown:function(c){var b=this._getEventTarget(c);var a=parseInt(b.id);this._setFocusedLink(a);var d=this._isLeftMouseButtonPressed(c);if(this.isEnabled()&&d&&this._readyToSendChanges){this._readyToSendChanges=false;qx.client.Timer.once(function(){this._sendChanges(a)},this,org.eclipse.swt.EventUtil.DOUBLE_CLICK_TIME)}},_isLeftMouseButtonPressed:function(a){var b;if(a.which){b=(a.which===1)}else{if(a.button){if(qx.core.Variant.isSet($[0],$[18])){b=(a.button===1)}else{b=(a.button===0)}}}return b},_onKeyDown:function(c){if(this.isEnabled()&&c.keyCode===13){var b=this._getEventTarget(c);var a=b.id;this._sendChanges(a)}},_getEventTarget:function(b){var a;if(qx.core.Variant.isSet($[0],$[18])){a=window.event.srcElement}else{a=b.target}return a},_ontabfocus:function(){if(this._currentFocusedLink===-1&&this._linksCount>0){this._setFocusedLink(0)}},_onKeyPress:function(a){if(this.isFocused()&&a.getKeyIdentifier()==="Tab"&&this._linksCount>0){if(!a.isShiftPressed()&&this._currentFocusedLink>=0&&this._currentFocusedLink<this._linksCount-1){a.stopPropagation();a.preventDefault();this._setFocusedLink(this._currentFocusedLink+1)}else{if(!a.isShiftPressed()&&this._currentFocusedLink===-1){a.stopPropagation();a.preventDefault();this._setFocusedLink(0)}else{if(a.isShiftPressed()&&this._currentFocusedLink>0&&this._currentFocusedLink<=this._linksCount-1){a.stopPropagation();a.preventDefault();this._setFocusedLink(this._currentFocusedLink-1)}}}}},_onFocusOut:function(a){this._setFocusedLink(-1)},_setFocusedLink:function(b){var a=this._getFocusedHyperlinkElement();if(a!==null){a.blur();if(qx.core.Variant.isSet($[0],$[71])){a.style.outline="none"}}this._currentFocusedLink=b;a=this._getFocusedHyperlinkElement();if(a!==null){a.focus();if(qx.core.Variant.isSet($[0],$[71])){a.style.outline=$[369]}}},_getFocusedHyperlinkElement:function(){var a=null;var b=this._getHyperlinkElements();var c=this._currentFocusedLink;if(c>=0&&c<b.length){a=b[c]}return a},_getHyperlinkElements:function(){var a;var b=this.getElement();if(b){a=b.getElementsByTagName("span")}else{a=[]}return a},_sendChanges:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();if(this._hasSelectionListener){b.addEvent($[64],c);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.addEvent($[276],a);b.send()}}this._readyToSendChanges=true}}});
-qx.Class.define("org.eclipse.swt.widgets.Scrollable",{extend:qx.ui.layout.CanvasLayout,construct:function(a){arguments.callee.base.call(this);this._clientArea=a;this._horzScrollBar=new org.eclipse.rwt.widgets.ScrollBar(true);this._vertScrollBar=new org.eclipse.rwt.widgets.ScrollBar(false);this._blockScrolling=false;this._internalChangeFlag=false;this.add(this._clientArea);this.add(this._horzScrollBar);this.add(this._vertScrollBar);this._configureScrollBars();this._configureClientArea();this.__onscroll=qx.lang.Function.bindEvent(this._onscroll,this)},destruct:function(){var b=this._clientArea._getTargetNode();if(b){var a=qx.html.EventRegistration;a.removeEventListener(b,$[26],this.__onscroll);delete this.__onscroll}this._clientArea=null;this._horzScrollBar=null;this._vertScrollBar=null},events:{userScroll:$[11]},statics:{_nativeWidth:null,getNativeScrollBarWidth:function(){if(this._nativeWidth===null){var a=document.createElement("div");a.style.width="100px";a.style.height="100px";a.style.overflow=$[26];a.style.visibility=$[17];document.body.appendChild(a);this._nativeWidth=a.offsetWidth-a.clientWidth;document.body.removeChild(a)}return this._nativeWidth}},members:{setScrollBarsVisible:function(a,b){this._horzScrollBar.setDisplay(a);this._vertScrollBar.setDisplay(b);var c=$[17];if(a&&b){c=$[26]}else{if(a){c=$[94]}else{if(b){c=$[93]}}}this._clientArea.setOverflow(c);this._layoutX();this._layoutY()},setHBarSelection:function(a){this._internalChangeFlag=true;this._horzScrollBar.setValue(a);this._internalChangeFlag=false},setVBarSelection:function(a){this._internalChangeFlag=true;this._vertScrollBar.setValue(a);this._internalChangeFlag=false},setBlockScrolling:function(a){this._blockScrolling=a},_configureClientArea:function(){this._clientArea.setOverflow($[26]);this._clientArea.setLeft(0);this._clientArea.setTop(0);this._clientArea.addEventListener($[105],this._onClientCreate,this);this._clientArea.addEventListener($[31],this._onClientAppear,this);this._clientArea._layoutPost=qx.lang.Function.bindEvent(this._onClientLayout,this)},_configureScrollBars:function(){var a=function(b){b.stopPropagation()};this._horzScrollBar.setLeft(0);this._horzScrollBar.addEventListener($[75],a);this._vertScrollBar.setTop(0);this._vertScrollBar.addEventListener($[75],a);this._horzScrollBar.addEventListener($[80],this._onHorzScrollBarChangeValue,this);this._vertScrollBar.addEventListener($[80],this._onVertScrollBarChangeValue,this)},_applyWidth:function(b,a){arguments.callee.base.call(this,b,a);this._layoutX()},_applyHeight:function(b,a){arguments.callee.base.call(this,b,a);this._layoutY()},_applyBorder:function(b,a){arguments.callee.base.call(this,b,a);this._layoutX();this._layoutY()},_layoutX:function(){var a=this.getWidth()-this.getFrameWidth();if(this._vertScrollBar.getDisplay()){a-=this._vertScrollBar.getWidth()}this._clientArea.setWidth(a);this._vertScrollBar.setLeft(a);this._horzScrollBar.setWidth(a)},_layoutY:function(){var a=this.getHeight()-this.getFrameHeight();if(this._horzScrollBar.getDisplay()){a-=this._horzScrollBar.getHeight()}this._clientArea.setHeight(a);this._vertScrollBar.setHeight(a);this._horzScrollBar.setTop(a)},_onClientCreate:function(b){this._clientArea.prepareEnhancedBorder();this._clientArea.setContainerOverflow(false);var c=this._clientArea._getTargetNode();var a=qx.html.EventRegistration;a.addEventListener(c,$[26],this.__onscroll)},_onClientLayout:function(){var d=org.eclipse.swt.widgets.Scrollable.getNativeScrollBarWidth();var e=this._clientArea._getTargetNode();var c=this._clientArea.getElement();var f=this._clientArea.getOverflow();var b=parseInt(c.style.width);var a=parseInt(c.style.height);if(f===$[26]||f===$[93]){b+=d}if(f===$[26]||f===$[94]){a+=d}e.style.width=b;e.style.height=a},_onHorzScrollBarChangeValue:function(){if(this._isCreated){this._syncClientArea(true,false)}if(!this._internalChangeFlag){this.createDispatchEvent($[388])}},_onVertScrollBarChangeValue:function(){if(this._isCreated){this._syncClientArea(false,true)}if(!this._internalChangeFlag){this.createDispatchEvent($[388])}},_onClientAppear:function(){this._internalChangeFlag=true;this._syncClientArea(true,true);this._internalChangeFlag=false},_onscroll:function(a){if(!this._internalChangeFlag){org.eclipse.rwt.EventHandlerUtil.stopDomEvent(a);var c=this._blockScrolling||!this._horzScrollBar.getDisplay();var b=this._blockScrolling||!this._vertScrollBar.getDisplay();this._internalChangeFlag=true;this._syncClientArea(c,b);this._internalChangeFlag=false;this._syncScrollBars()}},_syncClientArea:function(d,a){if(d){var c=this._horzScrollBar.getValue();this._clientArea.setScrollLeft(c)}if(a){var b=this._vertScrollBar.getValue();this._clientArea.setScrollTop(b)}},_syncScrollBars:function(){var b=this._clientArea.getScrollLeft();this._horzScrollBar.setValue(b);var a=this._clientArea.getScrollTop();this._vertScrollBar.setValue(a)}}});
-qx.Class.define("org.eclipse.swt.custom.ScrolledComposite",{extend:org.eclipse.swt.widgets.Scrollable,construct:function(){arguments.callee.base.call(this,new qx.ui.layout.CanvasLayout());this._clientArea.addEventListener($[56],this._onMouseWheel,this);this._clientArea.addEventListener($[12],this._onKeyPress,this);this.addEventListener($[388],this._onUserScroll);this._content=null;this._hasSelectionListener=false;this._requestTimerRunning=false;this._showFocusedControl=false;this._focusRoot=null;this.addEventListener($[289],this._onChangeParent,this);this.setAppearance("scrolledcomposite")},members:{setShowFocusedControl:function(a){this._showFocusedControl=a},setHasSelectionListener:function(a){this._hasSelectionListener=a},setContent:function(a){if(this._content!=null){this._content.removeEventListener($[289],this._onContentRemove,this);this._content.removeEventListener($[57],this._onContentResize,this);this._content.removeEventListener($[66],this._onContentResize,this)}this._content=a;this._onContentResize();if(this._content!=null){this._clientArea.add(this._content);this._content.addEventListener($[289],this._onContentRemove,this);this._content.addEventListener($[57],this._onContentResize,this);this._content.addEventListener($[66],this._onContentResize,this)}},_onContentRemove:function(){this.setContent(null)},_onContentResize:function(){if(this._content!==null&&typeof this._content.getWidth()===$[77]&&typeof this._content.getHeight()===$[77]){var b=this._content.getWidth();var a=this._content.getHeight();this._horzScrollBar.setMaximum(b);this._vertScrollBar.setMaximum(a)}},_onChangeParent:function(a){if(this._focusRoot!=null){this._focusRoot.removeEventListener($[222],this._onChangeFocusedChild,this)}this._focusRoot=this.getFocusRoot();if(this._focusRoot!=null){this._focusRoot.addEventListener($[222],this._onChangeFocusedChild,this)}},_onMouseWheel:function(a){this.setBlockScrolling(false)},_onKeyPress:function(a){switch(a.getKeyIdentifier()){case"Left":case"Up":case $[53]:case"Down":case $[58]:case $[55]:case"End":case"Home":this.setBlockScrolling(false);a.stopPropagation();break}},_onUserScroll:function(){if(!this._requestTimerRunning){this._requestTimerRunning=true;qx.client.Timer.once(this._sendChanges,this,500)}},_onChangeFocusedChild:function(a){var b=this.getFocusRoot().getFocusedChild();this.setBlockScrolling(!this._showFocusedControl&&b!==this)},_sendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()&&this.isCreated()){var b=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var e=b.findIdByWidget(this);var d=this._clientArea.getScrollLeft();a.addParameter(e+".horizontalBar.selection",d);var c=this._clientArea.getScrollTop();a.addParameter(e+".verticalBar.selection",c);if(this._hasSelectionListener){a.send()}this._requestTimerRunning=false}}}});
-qx.Class.define("org.eclipse.rwt.widgets.ToolBar",{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this._hoverItem=null;this.setAppearance("toolbar");this.setOverflow($[17]);this.initTabIndex();this.addEventListener($[74],this._onFocus);this.addEventListener("blur",this._onBlur);this.addEventListener($[9],this._onMouseOver);this.addEventListener($[12],this._onKeyPress);this.addEventListener($[24],this._onKeyDown);this.addEventListener($[60],this._onKeyUp)},properties:{tabIndex:{refine:true,init:1}},members:{_isRelevantEvent:function(a){var b=a.getTarget();return this._isToolItem(b)||b===this},_isToolItem:function(a){return a instanceof org.eclipse.rwt.widgets.ToolItem&&a.getParent()===this},_onMouseOver:function(a){var b=a.getTarget();if(this._hoverItem!=null&&this._hoverItem!=b){this._hoverItem.removeState("over");this._hoverItem=null}if(this._isToolItem(b)){this._hoverItem=b;this._hoverItem.addState("over")}},_onFocus:function(a){if(this._hoverItem==null){this._hoverItem=this.getFirstChild()}if(this._hoverItem!=null){this._hoverItem.addState("over")}},_onBlur:function(a){if(this._hoverItem!=null){this._hoverItem.removeState("over")}},_onKeyPress:function(a){if(this._isRelevantEvent(a)){switch(a.getKeyIdentifier()){case"Left":this._hoverNext(true);break;case $[53]:this._hoverNext(false);break}}},_onKeyDown:function(a){if(this._hoverItem!=null&&this._isRelevantEvent(a)){this._hoverItem._onKeyDown(a)}},_onKeyUp:function(a){if(this._hoverItem!=null&&this._isRelevantEvent(a)){this._hoverItem._onKeyUp(a)}},_hoverNext:function(a){if(this._hoverItem!=null){this._hoverItem.removeState("over");do{if(a){this._hoverItem=this._hoverItem.getPreviousSibling();if(this._hoverItem==null){this._hoverItem=this.getLastChild()}}else{this._hoverItem=this._hoverItem.getNextSibling();if(this._hoverItem==null){this._hoverItem=this.getFirstChild()}}}while(!(this._isToolItem(this._hoverItem)&&this._hoverItem.isEnabled()));this._hoverItem.addState("over")}}}});
-qx.Class.define("org.eclipse.swt.TextUtil",{statics:{LINE_HEIGT_FACTOR:1.2,initialize:function(a){if(a.isCreated()){org.eclipse.swt.TextUtil._doInitialize(a)}else{a.addEventListener($[31],org.eclipse.swt.TextUtil._onAppearInitialize)}a.setLiveUpdate(true);a._ontabfocus=function(){a.setSelectionLength(0)};a.setUserData($[189],0);a.setUserData($[193],0)},setHasSelectionListener:function(c,b){var a=c.getUserData($[382]);if(b!=a){c.setUserData($[382],b);org.eclipse.swt.TextUtil._updateSelectionListener(c,b)}},hasSelectionListener:function(a){return a.getUserData($[382])==true},setHasVerifyOrModifyListener:function(c,b){var a=c.getUserData($[390]);if(b!=a){c.setUserData($[390],b);org.eclipse.swt.TextUtil._updateVerifyOrModifyListener(c,b)}},hasVerifyOrModifyListener:function(a){return a.getUserData($[390])==true},setSelection:function(b,c,a){b.setUserData($[189],c);b.setUserData($[193],a);if(b.getFocused()){org.eclipse.swt.TextUtil._doSetSelection(b)}},_doSetSelection:function(b){var c=b.getUserData($[189]);var a=b.getUserData($[193]);if(c!=null&&a!=null){qx.client.Timer.once(function(){b.setSelectionStart(c);b.setSelectionLength(a)},b,50)}},_onAppearInitialize:function(a){var b=a.getTarget();b.removeEventListener($[31],org.eclipse.swt.TextUtil._onAppearInitialize);org.eclipse.swt.TextUtil._doInitialize(b)},_doInitialize:function(a){a.addEventListener($[15],org.eclipse.swt.TextUtil._onMouseUp);a.addEventListener($[60],org.eclipse.swt.TextUtil._onKeyUp);a.addEventListener($[24],org.eclipse.swt.TextUtil._onKeyDown);a.addEventListener($[12],org.eclipse.swt.TextUtil._onKeyPress);a.addEventListener($[80],org.eclipse.swt.TextUtil._onTextChange);a.addEventListener($[84],org.eclipse.swt.TextUtil._onFontChange,a);a.addEventListener($[74],org.eclipse.swt.TextUtil._onFocus,a);a.addEventListener("blur",org.eclipse.swt.TextUtil._onBlur,a);org.eclipse.swt.TextUtil._updateLineHeight(a)},_onMouseUp:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var b=a.getTarget();org.eclipse.swt.TextUtil._handleSelectionChange(b)}},_onKeyDown:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var b=a.getTarget();org.eclipse.swt.TextUtil._handleSelectionChange(b);if(a.getKeyIdentifier()==$[68]&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isCtrlPressed()&&!a.isMetaPressed()){if(b.hasState("rwt_MULTI")){a.stopPropagation()}if(org.eclipse.swt.TextUtil.hasSelectionListener(b)){org.eclipse.swt.TextUtil._sendWidgetDefaultSelected(b)}}}},_onKeyPress:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var b=a.getTarget();org.eclipse.swt.TextUtil._handleSelectionChange(b)}},_onKeyUp:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var b=a.getTarget();org.eclipse.swt.TextUtil._handleSelectionChange(b)}},_onTextChange:function(a){var b=a.getTarget();org.eclipse.swt.TextUtil._updateMessageLabel(b);if(!org.eclipse.swt.EventUtil.getSuspended()){org.eclipse.swt.TextUtil._handleModification(b);org.eclipse.swt.TextUtil._handleSelectionChange(b)}},_onFontChange:function(a){var b=a.getTarget();org.eclipse.swt.TextUtil._updateLineHeight(b)},_onFocus:function(a){var b=a.getTarget();org.eclipse.swt.TextUtil._updateMessageLabel(b);if(!qx.event.handler.FocusHandler.mouseFocus){org.eclipse.swt.TextUtil._doSetSelection(b)}},_onBlur:function(a){var b=a.getTarget();org.eclipse.swt.TextUtil._updateMessageLabel(b)},_updateLineHeight:function(c){if(c._inputElement!==undefined){var b=c.getFont();var a=Math.floor(b.getSize()*org.eclipse.swt.TextUtil.LINE_HEIGT_FACTOR);c._inputElement.style.lineHeight=a+"px"}},_handleModification:function(b){if(!org.eclipse.swt.TextUtil._isModified(b)){org.eclipse.swt.TextUtil._setModified(b,true);var a=org.eclipse.swt.Request.getInstance();a.addEventListener("send",org.eclipse.swt.TextUtil._onSend,b);if(org.eclipse.swt.TextUtil.hasVerifyOrModifyListener(b)){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(b);var a=org.eclipse.swt.Request.getInstance();a.addEvent($[405],c);qx.client.Timer.once(org.eclipse.swt.TextUtil._delayedSend,b,500)}}},_updateSelectionListener:function(b,a){},_updateVerifyOrModifyListener:function(b,a){},_onSend:function(b){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addParameter(c+".text",this.getComputedValue());a.removeEventListener("send",org.eclipse.swt.TextUtil._onSend,this);org.eclipse.swt.TextUtil._setModified(this,false);if(this.getFocused()){this.setValue(this.getComputedValue())}},_delayedSend:function(b){if(org.eclipse.swt.TextUtil._isModified(this)){var a=org.eclipse.swt.Request.getInstance();a.send()}},_sendWidgetDefaultSelected:function(b){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(b);var a=org.eclipse.swt.Request.getInstance();a.addEvent($[165],c);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()},_isModified:function(a){return a.getUserData("modified")==true},_setModified:function(b,a){b.setUserData("modified",a)},_handleSelectionChange:function(d,a){if(d instanceof qx.ui.form.TextField){var c=a!=null?a:d;var e=d.getSelectionStart();if(e===undefined){e=0}var b=d.getSelectionLength();if(typeof b==$[8]){b=0}if(d.getUserData($[189])!=e||d.getUserData($[193])!=b){d.setUserData($[189],e);org.eclipse.swt.WidgetUtil.setPropertyParam(c,$[189],e);d.setUserData($[193],b);org.eclipse.swt.WidgetUtil.setPropertyParam(c,$[193],b)}}},_createMessageLabel:function(c,b){var a=new qx.ui.basic.Atom(b);a.setAppearance("text-field-message");a.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);a.addEventListener($[2],org.eclipse.swt.TextUtil._onMessageLabelMouseDown,c);a.setParent(c.getParent());c.addEventListener($[509],org.eclipse.swt.TextUtil._onTextPropertyChange,c);c.addEventListener($[205],org.eclipse.swt.TextUtil._onTextPropertyChange,c);c.addEventListener($[145],org.eclipse.swt.TextUtil._onTextPropertyChange,c);c.addEventListener($[302],org.eclipse.swt.TextUtil._onTextPropertyChange,c);c.addEventListener($[57],org.eclipse.swt.TextUtil._onTextPropertyChange,c);c.addEventListener($[66],org.eclipse.swt.TextUtil._onTextPropertyChange,c);c.setUserData($[262],a)},_updateMessageLabel:function(c){var a=c.getUserData($[262]);if(a!=null){a.setLeft(c.getLeft());a.setTop(c.getTop());a.setWidth(c.getWidth());a.setHeight(c.getHeight());a.setZIndex(c.getZIndex()+1);var b=c.getVisibility()&&c.getValue()===""&&!c.getFocused();a.setVisibility(b)}},disposeMessageLabel:function(b){var a=b.getUserData($[262]);if(a!=null){a.setParent(null);a.destroy()}},setMessage:function(c,b){var a=c.getUserData($[262]);if(a==null){org.eclipse.swt.TextUtil._createMessageLabel(c,b);org.eclipse.swt.TextUtil._updateMessageLabel(c)}else{a.setLabel(b)}},_onMessageLabelMouseDown:function(a){this.focus()},_onTextPropertyChange:function(a){var b=a.getTarget();org.eclipse.swt.TextUtil._updateMessageLabel(b)}}});
-qx.Class.define("org.eclipse.swt.widgets.Scale",{extend:qx.ui.layout.CanvasLayout,construct:function(a){arguments.callee.base.call(this);this.setAppearance("scale");this._horizontal=qx.lang.String.contains(a,$[52]);this._hasSelectionListener=false;this._readyToSendChanges=true;this._selection=0;this._minimum=0;this._maximum=100;this._increment=1;this._pageIncrement=10;this._pxStep=1.34;this._line=new qx.ui.basic.Image();if(this._horizontal){this._line.addState(org.eclipse.swt.widgets.Scale.STATE_HORIZONTAL)}this._line.setAppearance("scale-line");this._line.setResizeToInner(true);this._line.addEventListener($[2],this._onLineMouseDown,this);this.add(this._line);this._thumb=new qx.ui.basic.Image();if(this._horizontal){this._thumb.addState(org.eclipse.swt.widgets.Scale.STATE_HORIZONTAL)}this._thumb.setAppearance($[505]);this._thumb.addEventListener($[2],this._onThumbMouseDown,this);this._thumb.addEventListener($[45],this._onThumbMouseMove,this);this._thumb.addEventListener($[15],this._onThumbMouseUp,this);org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._thumb);this.add(this._thumb);this._thumbOffset=0;this._minMarker=new qx.ui.basic.Image();if(this._horizontal){this._minMarker.addState(org.eclipse.swt.widgets.Scale.STATE_HORIZONTAL)}this._minMarker.setAppearance("scale-min-marker");this.add(this._minMarker);this._maxMarker=new qx.ui.basic.Image();if(this._horizontal){this._maxMarker.addState(org.eclipse.swt.widgets.Scale.STATE_HORIZONTAL)}this._maxMarker.setAppearance("scale-max-marker");this.add(this._maxMarker);if(this._horizontal){this.addEventListener($[57],this._onChangeWidth,this)}else{this.addEventListener($[66],this._onChangeHeight,this)}this.addEventListener($[41],this._onContextMenu,this);this.addEventListener($[12],this._onKeyPress,this);this.addEventListener($[56],this._onMouseWheel,this);this._middleMarkers=new Array();this._updateMiddleMarkers()},destruct:function(){this._line.removeEventListener($[2],this._onLineMouseDown,this);this._thumb.removeEventListener($[2],this._onThumbMouseDown,this);this._thumb.removeEventListener($[45],this._onThumbMouseMove,this);this._thumb.removeEventListener($[15],this._onThumbMouseUp,this);if(this._horizontal){this.removeEventListener($[57],this._onChangeWidth,this)}else{this.removeEventListener($[66],this._onChangeHeight,this)}this.removeEventListener($[41],this._onContextMenu,this);this.removeEventListener($[12],this._onKeyPress,this);this.removeEventListener($[56],this._onMouseWheel,this);this._disposeObjects("_line","_thumb","_minMarker","_maxMarker");for(var b=0;b<this._middleMarkers.length;b++){var a=this._middleMarkers[b];a.dispose()}},statics:{STATE_HORIZONTAL:$[52],PADDING:8,MAX_MARKER_OFFSET:12,SCALE_LINE_OFFSET:9,THUMB_OFFSET:10,HALF_THUMB:5,_isNoModifierPressed:function(a){return !a.isCtrlPressed()&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isMetaPressed()}},members:{_onChangeWidth:function(a){this._line.setWidth(this.getWidth()-2*org.eclipse.swt.widgets.Scale.PADDING);this._maxMarker.setLeft(this.getWidth()-org.eclipse.swt.widgets.Scale.MAX_MARKER_OFFSET);this._updateStep();this._updateThumbPosition();this._updateMiddleMarkers()},_onChangeHeight:function(a){this._line.setHeight(this.getHeight()-2*org.eclipse.swt.widgets.Scale.PADDING);this._maxMarker.setTop(this.getHeight()-org.eclipse.swt.widgets.Scale.MAX_MARKER_OFFSET);this._updateStep();this._updateThumbPosition();this._updateMiddleMarkers()},_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_onKeyPress:function(a){var c=a.getKeyIdentifier();var b;if(org.eclipse.swt.widgets.Scale._isNoModifierPressed(a)){switch(c){case"Left":b=this._selection-this._increment;a.preventDefault();a.stopPropagation();break;case"Down":if(this._horizontal){b=this._selection-this._increment}else{b=this._selection+this._increment}a.preventDefault();a.stopPropagation();break;case $[53]:b=this._selection+this._increment;a.preventDefault();a.stopPropagation();break;case"Up":if(this._horizontal){b=this._selection+this._increment}else{b=this._selection-this._increment}a.preventDefault();a.stopPropagation();break;case"Home":b=this._minimum;a.preventDefault();a.stopPropagation();break;case"End":b=this._maximum;a.preventDefault();a.stopPropagation();break;case $[55]:if(this._horizontal){b=this._selection-this._pageIncrement}else{b=this._selection+this._pageIncrement}a.preventDefault();a.stopPropagation();break;case $[58]:if(this._horizontal){b=this._selection+this._pageIncrement}else{b=this._selection-this._pageIncrement}a.preventDefault();a.stopPropagation();break}if(b!=undefined){if(b<this._minimum){b=this._minimum}if(b>this._maximum){b=this._maximum}this.setSelection(b);if(this._readyToSendChanges){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,500)}}}},_onMouseWheel:function(a){if(this.getFocused()){a.preventDefault();a.stopPropagation();var c=Math.round(a.getWheelDelta());var b=this._selection-c;if(b<this._minimum){b=this._minimum}if(b>this._maximum){b=this._maximum}this.setSelection(b);if(this._readyToSendChanges){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,500)}}},_onLineMouseDown:function(b){var d;var a;var c;if(b.isLeftButtonPressed()){if(this._horizontal){d=this._thumb.getLeft()+org.eclipse.swt.widgets.Scale.HALF_THUMB;a=b.getPageX()-qx.bom.element.Location.getLeft(this.getElement())}else{d=this._thumb.getTop()+org.eclipse.swt.widgets.Scale.HALF_THUMB;a=b.getPageY()-qx.bom.element.Location.getTop(this.getElement())}if(a>d){c=this._selection+this._pageIncrement}else{c=this._selection-this._pageIncrement}if(c<this._minimum){c=this._minimum}if(c>this._maximum){c=this._maximum}this.setSelection(c);if(this._readyToSendChanges){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,500)}}},_onThumbMouseDown:function(b){var a;if(b.isLeftButtonPressed()){if(this._horizontal){a=b.getPageX()-qx.bom.element.Location.getLeft(this.getElement());this._thumbOffset=a-this._thumb.getLeft()}else{a=b.getPageY()-qx.bom.element.Location.getTop(this.getElement());this._thumbOffset=a-this._thumb.getTop()}this._thumb.setCapture(true)}},_onThumbMouseMove:function(b){var a;if(this._thumb.getCapture()){if(this._horizontal){a=b.getPageX()-qx.bom.element.Location.getLeft(this.getElement())}else{a=b.getPageY()-qx.bom.element.Location.getTop(this.getElement())}var c=this._getSelectionFromThumbPosition(a-this._thumbOffset);if(this._selection!=c){this.setSelection(c);if(this._readyToSendChanges){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,500)}}}},_onThumbMouseUp:function(a){this._thumb.setCapture(false)},_updateMiddleMarkers:function(){for(var c=0;c<this._middleMarkers.length;c++){var a=this._middleMarkers[c];this.remove(a);a.dispose()}this._middleMarkers=new Array();var b=Math.round((this._maximum-this._minimum)/this._pageIncrement)-1;for(var c=0;c<b;c++){var a=new qx.ui.basic.Image();var d=org.eclipse.swt.widgets.Scale.PADDING+org.eclipse.swt.widgets.Scale.HALF_THUMB+(c+1)*this._pageIncrement*this._pxStep;if(this._horizontal){a.addState(org.eclipse.swt.widgets.Scale.STATE_HORIZONTAL);a.setLeft(d)}else{a.setTop(d)}a.setAppearance("scale-middle-marker");this.add(a);this._middleMarkers[c]=a}},_updateStep:function(){var a=org.eclipse.swt.widgets.Scale.PADDING+org.eclipse.swt.widgets.Scale.HALF_THUMB;if(this._horizontal){this._pxStep=(this.getWidth()-2*a)/(this._maximum-this._minimum)}else{this._pxStep=(this.getHeight()-2*a)/(this._maximum-this._minimum)}},_updateThumbPosition:function(){var a=org.eclipse.swt.widgets.Scale.PADDING+this._pxStep*(this._selection-this._minimum);if(this._horizontal){this._thumb.setLeft(a)}else{this._thumb.setTop(a)}},_getSelectionFromThumbPosition:function(a){var b=(a-org.eclipse.swt.widgets.Scale.PADDING)/this._pxStep+this._minimum;b=Math.round(b);if(b<this._minimum){b=this._minimum}if(b>this._maximum){b=this._maximum}return b},_sendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var b=c.findIdByWidget(this);a.addParameter(b+$[144],this._selection);if(this._hasSelectionListener){a.addEvent($[64],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()}this._readyToSendChanges=true}},setHasSelectionListener:function(a){this._hasSelectionListener=a},setSelection:function(a){this._selection=a;this._updateThumbPosition()},setMinimum:function(a){this._minimum=a;this._updateStep();this._updateThumbPosition();this._updateMiddleMarkers()},setMaximum:function(a){this._maximum=a;this._updateStep();this._updateThumbPosition();this._updateMiddleMarkers()},setIncrement:function(a){this._increment=a},setPageIncrement:function(a){this._pageIncrement=a;this._updateMiddleMarkers()},_visualizeFocus:function(){arguments.callee.base.call(this);this._thumb.addState($[123])},_visualizeBlur:function(){arguments.callee.base.call(this);this._thumb.removeState($[123])}}});
-qx.Class.define("org.eclipse.rwt.widgets.ToolSeparator",{extend:qx.ui.layout.CanvasLayout,construct:function(b,a){arguments.callee.base.call(this);this._line=null;this._control=null;this._vertical=a;if(b){this._line=new qx.ui.basic.Terminator();if(a){this._line.addState($[46])}this._line.setAppearance("toolbar-separator-line");this.add(this._line)}this.setStyleProperty($[194],"0px");this.setStyleProperty($[343],"0px")},properties:{appearance:{refine:true,init:"toolbar-separator"}},members:{_applyWidth:function(e,d){arguments.callee.base.call(this,e,d);if(this._line&&!this._vertical){var c=this._line.getWidth();var b=e*0.5;var a=Math.floor(b-(c*0.5));this._line.setLeft(a)}},_applyHeight:function(e,c){arguments.callee.base.call(this,e,c);if(this._line&&this._vertical){var d=this._line.getHeight();var a=e*0.5;var b=Math.floor(a-(d*0.5));this._line.setTop(b)}},setLineVisible:function(a){if(this._line){this._line.setVisibility(a)}}}});
-qx.Class.define("org.eclipse.swt.theme.BorderDefinitions",{type:$[118],statics:{getDefinition:function(a){return this._definitions[a]},_definitions:{inset:{color:[$[28],$[49],$[49],$[28]],innerColor:[$[243],$[153],$[153],$[243]],width:2},thinInset:{color:[$[28],$[49],$[49],$[28]],width:1},outset:{color:[$[153],$[243],$[243],$[153]],innerColor:[$[49],$[28],$[28],$[49]],width:2},thinOutset:{color:[$[49],$[28],$[28],$[49]],width:1},groove:{color:[$[28],$[49],$[49],$[28]],innerColor:[$[49],$[28],$[28],$[49]],width:2},ridge:{color:[$[49],$[28],$[28],$[49]],innerColor:[$[28],$[49],$[49],$[28]],width:2},shadow:{width:1,color:[$[28],$[28],$[28],$[28]]},verticalDivider:{width:[1,0,1,0],color:[$[28],null,$[49],null]},horizontalDivider:{width:[0,1,0,1],color:[null,$[28],null,$[49]]},"separator.shadowin.horizontal.border":{width:[1,0,1,0],color:[$[153],null,$[49]]},"separator.shadowin.vertical.border":{width:[0,1,0,1],color:[null,$[49],null,$[153]]},"separator.shadowout.horizontal.border":{width:[1,0,1,0],color:[$[49],null,$[28],null]},"separator.shadowout.vertical.border":{width:[0,1,0,1],color:[null,$[28],null,$[49]]}}}});
-qx.Class.define("org.eclipse.rwt.widgets.BasicList",{extend:org.eclipse.swt.widgets.Scrollable,construct:function(b){arguments.callee.base.call(this,new qx.ui.layout.VerticalBoxLayout());this.setAppearance("list");this.setTabIndex(1);this._manager=new qx.ui.selection.SelectionManager(this._clientArea);this.addEventListener($[9],this._onmouseover);this.addEventListener($[2],this._onmousedown);this.addEventListener($[15],this._onmouseup);this.addEventListener($[24],this._onkeydown);this.addEventListener($[12],this._onkeypress);this.addEventListener($[12],this._onkeyinput);this.initOverflow();this.initTabIndex();this._pressedString="";this._lastKeyPress=0;this._itemWidth=0;this._itemHeight=0;var a=this.getManager();a.setMultiSelection(b);a.setDragSelection(false);this.addEventListener($[61],this._ondblclick,this)},destruct:function(){this.removeEventListener($[61],this._ondblclick,this);this._disposeObjects($[375])},members:{getManager:function(){return this._manager},getPreferredWidth:function(){var b=0;var c=this.getItems();for(var d=0;d<c.length;d++){var a=c[d].getPaddingLeft()+c[d].getPaddingRight();var e=c[d].getLabelObject().getPreferredBoxWidth()+a;b=Math.max(b,e)}b+=this._vertScrollBar.getWidth();return b},isRelevantEvent:function(a){var b=a.getTarget();while(b!=null&&b!==this){b=b.getParent()}return b===this},getListItemTarget:function(a){while(a!=null&&a.getParent()!=this._clientArea){a=a.getParent()}return a},getSelectedItem:function(){return this._manager.getSelectedItems()[0]||null},getSelectedItems:function(){return this._manager.getSelectedItems()},_onmouseover:function(a){var b=this.getListItemTarget(a.getTarget());if(b){this._manager.handleMouseOver(b,a)}},_onmousedown:function(a){var b=this.getListItemTarget(a.getTarget());if(b){this._manager.handleMouseDown(b,a)}},_onmouseup:function(a){var b=this.getListItemTarget(a.getTarget());if(b){this._manager.handleMouseUp(b,a)}},_onclick:function(a){var b=this.getListItemTarget(a.getTarget());if(b){this._manager.handleClick(b,a)}},_ondblclick:function(a){var b=this.getListItemTarget(a.getTarget());if(b){this._manager.handleDblClick(b,a)}},_onkeydown:function(c){if(c.getKeyIdentifier()==$[68]&&!c.isAltPressed()){var a=this.getSelectedItems();for(var b=0;b<a.length;b++){a[b].createDispatchEvent("action")}}},_onkeypress:function(a){this._manager.handleKeyPress(a)},_onkeyinput:function(d){if(!d.isAltPressed()&&!d.isCtrlPressed()){if(d.getCharCode()!==0){if(((new Date()).valueOf()-this._lastKeyPress)>1000){this._pressedString=""}this._pressedString+=String.fromCharCode(d.getCharCode());var a=this.findString(this._pressedString,null);if(a){var c=this._manager._getChangeValue();var b=this._manager.getFireChange();this._manager.setFireChange(false);this._manager._deselectAll();this._manager.setItemSelected(a,true);this._manager.setAnchorItem(a);this._manager.setLeadItem(a);a.scrollIntoView();this._manager.setFireChange(b);if(b&&this._manager._hasChanged(c)){this._manager._dispatchChange()}}this._lastKeyPress=(new Date()).valueOf();d.preventDefault()}}},findString:function(b,a){return this._findItem(b,a||0,$[25])},_findItem:function(f,a,e){var c=this.getItems();if(a==null){a=c.indexOf(this.getSelectedItem());if(a==-1){a=0}}var b="matches"+e;for(var d=a;d<c.length;d++){if(c[d][b](f)){return c[d]}}for(var d=0;d<a;d++){if(c[d][b](f)){return c[d]}}return null},setItems:function(e){var c=this.getManager();var j=c.getLeadItem();var f=c.getAnchorItem();var a=c.getSelectedItems();var g=this.getItems();for(var d=0;d<e.length;d++){if(d<g.length){g[d].setLabel(e[d])}else{var h=new qx.ui.form.ListItem();h.addEventListener($[9],this._onListItemMouseOver,this);h.addEventListener($[14],this._onListItemMouseOut,this);h.setStyleProperty($[120],"0px none");h.handleStateChange=function(){};h.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);h.setWidth(this._itemWidth);h.setHeight(this._itemHeight);h.setContextMenu(this.getContextMenu());h.setTabIndex(null);h.setLabel($[139]);h.getLabelObject().setMode(qx.constant.Style.LABEL_MODE_HTML);h.setLabel(e[d]);if(d%2==0){h.addState("even")}this._clientArea.add(h)}}var b=null;while(this._clientArea.getChildrenLength()>e.length){b=this._clientArea.getLastChild();b.removeEventListener($[9],this._onListItemMouseOver,this);b.removeEventListener($[14],this._onListItemMouseOut,this);b._isDisplayable=true;b.destroy()}c.setSelectedItems(a);c.setLeadItem(j);if(c.getMultiSelection()){c.setAnchorItem(f)}this._updateScrollDimension()},getItems:function(){return this.getManager().getItems()},getItemsCount:function(){return this.getItems().length},getItemIndex:function(a){return this._clientArea.indexOf(a)},selectItem:function(a){if(a==-1){this.getManager().deselectAll()}else{var b=this.getItems()[a];this.getManager().setSelectedItem(b);if(this._clientArea.isCreated()&&this._clientArea.isDisplayable()){this.getManager().scrollItemIntoView(b,true)}}},selectItems:function(a){var c=this.getManager();c.deselectAll();for(var b=0;b<a.length;b++){var d=this.getItems()[a[b]];c.setItemSelected(d,true)}},focusItem:function(b){if(b==-1){this.getManager().setLeadItem(null)}else{var a=this.getItems();this.getManager().setLeadItem(a[b])}},selectAll:function(){if(this.getManager().getMultiSelection()==true){this.getManager().selectAll()}},setItemDimensions:function(d,a){this._itemWidth=d;this._itemHeight=a;var b=this.getItems();for(var c=0;c<b.length;c++){b[c].setWidth(this._itemWidth);b[c].setHeight(this._itemHeight)}this._vertScrollBar.setIncrement(a);this._updateScrollDimension()},_updateScrollDimension:function(){var a=this.getItems().length;this._horzScrollBar.setMaximum(this._itemWidth);this._vertScrollBar.setMaximum(this._itemHeight*a)},addState:function(c){arguments.callee.base.call(this,c);if(c.substr(0,8)==$[54]){var a=this.getItems();for(var b=0;b<a.length;b++){a[b].addState(c)}}},removeState:function(c){arguments.callee.base.call(this,c);if(c.substr(0,8)==$[54]){var a=this.getItems();for(var b=0;b<a.length;b++){a[b].removeState(c)}}},_getSelectionIndices:function(){var c=org.eclipse.swt.WidgetManager.getInstance();var f=c.findIdByWidget(this);var d="";var e=this.getManager().getSelectedItems();for(var b=0;b<e.length;b++){var a=this._clientArea.indexOf(e[b]);if(a>=0){if(d!=""){d+=","}d+=String(a)}}return d},_onListItemMouseOver:function(a){a.getTarget().addState("over")},_onListItemMouseOut:function(a){a.getTarget().removeState("over")}}});
-qx.Class.define("org.eclipse.swt.widgets.Combo",{extend:qx.ui.layout.CanvasLayout,construct:function(b){arguments.callee.base.call(this);this._ccombo=false;if(b){this._ccombo=qx.lang.String.contains(b,"ccombo")}this._hasSelectionListener=false;this._hasVerifyModifyListener=false;this._isModified=false;this._selected=null;this._editable=true;this._dropped=false;this._borderWidth=0;this._selectionStart=0;this._selectionLength=0;this._listItemHeight="auto";this._listMaxHeight=0;this._field=new qx.ui.form.TextField();this._field.setTabIndex(null);this._field.setAllowStretchY(true);this.add(this._field);this._button=new qx.ui.form.Button();this._button.setTabIndex(null);this._button.setHeight("100%");this.add(this._button);this._list=new org.eclipse.rwt.widgets.BasicList(false);this._list.setTabIndex(null);this._list.setDisplay(false);this._manager=this._list.getManager();this._manager.setMultiSelection(false);this._manager.setDragSelection(false);this._manager.scrollItemIntoView=this._scrollItemIntoView;this.setHideFocus(true);var a=qx.ui.core.ClientDocument.getInstance();a.addEventListener($[249],this._onBlur,this);if(this._ccombo){this.setAppearance("ccombo");this._field.setAppearance("ccombo-field");this._button.setAppearance("ccombo-button");this._list.setAppearance("ccombo-list")}else{this.setAppearance("combo");this._field.setAppearance("combo-field");this._button.setAppearance("combo-button");this._list.setAppearance("combo-list")}this.addEventListener($[31],this._onAppear,this);this.addEventListener($[217],this._onFocusIn,this);this.addEventListener("blur",this._onBlur,this);this.addEventListener($[57],this._onChangeSize,this);this.addEventListener($[66],this._onChangeSize,this);this.addEventListener($[41],this._onContextMenu,this);this.addEventListener($[84],this._onChangeFont,this);this.addEventListener($[282],this._onChangeTextColor,this);this.addEventListener($[203],this._onChangeBackgroundColor,this);this.addEventListener($[205],this._onChangeVisibility,this);this.addEventListener($[2],this._onMouseDown,this);this.addEventListener($[15],this._onMouseUp,this);this.addEventListener($[29],this._onMouseClick,this);this.addEventListener($[56],this._onMouseWheel,this);this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[14],this._onMouseOut,this);this.addEventListener($[24],this._onKeyDown);this.addEventListener($[12],this._onKeyPress);this._field.addEventListener("blur",this._onTextBlur,this);this._field.addEventListener($[85],this._onTextInput,this);this._list.addEventListener($[31],this._onListAppear,this);this._setupCaptureRestore()},destruct:function(){var a=qx.ui.core.ClientDocument.getInstance();a.removeEventListener($[249],this._onBlur,this);this.removeEventListener($[31],this._onAppear,this);this.removeEventListener($[217],this._onFocusIn,this);this.removeEventListener($[57],this._onChangeSize,this);this.removeEventListener($[66],this._onChangeSize,this);this.removeEventListener($[41],this._onContextMenu,this);this.removeEventListener($[84],this._onChangeFont,this);this.removeEventListener($[282],this._onChangeTextColor,this);this.removeEventListener($[203],this._onChangeBackgroundColor,this);this.removeEventListener($[205],this._onChangeVisibility,this);this.removeEventListener($[2],this._onMouseDown,this);this.removeEventListener($[15],this._onMouseUp,this);this.removeEventListener($[29],this._onMouseClick,this);this.removeEventListener($[56],this._onMouseWheel,this);this.removeEventListener($[9],this._onMouseOver,this);this.removeEventListener($[14],this._onMouseOut,this);this.removeEventListener($[24],this._onKeyDown);this.removeEventListener($[12],this._onKeyPress);this._field.removeEventListener("blur",this._onTextBlur,this);this._field.removeEventListener($[85],this._onTextInput,this);this._list.removeEventListener($[31],this._onListAppear,this);if(this._list&&!qx.core.Object.inGlobalDispose()){this._list.setParent(null)}this._disposeObjects("_field","_button","_list",$[375],"_selected")},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]){this._field.addState(a);this._list.addState(a)}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]){this._field.removeState(a);this._list.removeState(a)}},_onChangeSize:function(a){this._setListBounds()},_onAppear:function(a){if(this._ccombo&&this.hasState($[171])){this._field.addState($[171]);this._button.addState($[171]);this._list.addState($[171])}this.getTopLevelWidget().add(this._list);org.eclipse.swt.TextUtil._updateLineHeight(this._field)},_onFocusIn:function(a){if(this._field.isCreated()&&!org.eclipse.swt.EventUtil.getSuspended()){this._handleSelectionChange()}},_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null&&!this._dropped){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_onChangeFont:function(a){var d=a.getValue();this._field.setFont(d);var b=this._list.getItems();for(var c=0;c<b.length;c++){b[c].setFont(d)}org.eclipse.swt.TextUtil._updateLineHeight(this._field)},_onChangeTextColor:function(a){var b=a.getValue();this._field.setTextColor(b);this._list.setTextColor(b)},_onChangeBackgroundColor:function(a){var b=a.getValue();if(b!=null){this._list.setBackgroundColor(b)}else{this._list.resetBackgroundColor()}},_onChangeVisibility:function(a){var b=a.getValue();if(!b&&this._dropped){this._toggleListVisibility()}},_applyCursor:function(b,a){arguments.callee.base.call(this,b,a);if(b){this._field.setCursor(b);this._button.setCursor(b);this._list.setCursor(b)}else{this._field.resetCursor();this._button.resetCursor();this._list.resetCursor()}},_visualizeFocus:function(){if(this._field.isCreated()){this._field._visualizeFocus()}if(!this._editable){var b=org.eclipse.rwt.FocusIndicator.getInstance();var a=this._ccombo?"CCombo-FocusIndicator":"Combo-FocusIndicator";b.show(this,a,null)}},_ontabfocus:function(){if(this._field.isCreated()){this._field.selectAll()}},_visualizeBlur:function(){if(this._field.isCreated()){this._field.setSelectionLength(0);this._field._visualizeBlur()}if(!this._editable){var a=org.eclipse.rwt.FocusIndicator.getInstance();a.hide(this)}},_onBlur:function(a){if(this._dropped){this._toggleListVisibility()}},_setListBounds:function(){if(this.getElement()){var b=qx.bom.element.Location.get(this.getElement());var d=b.left;var a=b.top;var e=a+this.getHeight();var f=qx.html.Window.getInnerHeight(window);var j=qx.html.Window.getInnerWidth(window);var g=this._list.getPreferredWidth();var i=Math.min(j-d,g);i=Math.max(this.getWidth(),i);var h=this._list.getItemsCount()*this._listItemHeight;var c=Math.min(this._listMaxHeight,h);c+=this._list.getFrameHeight();if(f<e+c&&a>f-e){e=b.top-c}this._list.setLocation(d,e);this._list.setWidth(i);this._list.setHeight(c);this._list.setItemDimensions(i,this._listItemHeight)}},_toggleListVisibility:function(){if(this._list.getItemsCount()){if(this._editable){this._field.setReadOnly(!this._dropped)}if(!this._dropped){this._bringToFront()}this.setCapture(!this._dropped);this._list.setDisplay(!this._dropped);if(this._list.getDisplay()){this._setListBounds()}this._dropped=!this._dropped;if(this._dropped){this._setListSelection(this._selected)}this._updateListScrollBar();if(this.hasState("rwt_CCOMBO")){this._updateListVisibleRequestParam()}}},_updateListScrollBar:function(){if(this._dropped){var a=this._list.getItemsCount()*this._listItemHeight;var b=this._listMaxHeight<a;this._list.setScrollBarsVisible(false,b)}},_resetListSelection:function(){this._manager.deselectAll();this._manager.setLeadItem(null);this._manager.setAnchorItem(null)},_setListSelection:function(a){this._manager.deselectAll();this._manager.setLeadItem(a);this._manager.setAnchorItem(a);this._manager.setSelectedItem(a)},_onListAppear:function(a){if(this._selected){this._selected.scrollIntoView();this._list._syncScrollBars()}},_bringToFront:function(){var a=this.getTopLevelWidget().getChildren();var b=this._list.getZIndex();for(var d in a){var c=a[d];if(c.getZIndex){if(b<c.getZIndex()){b=c.getZIndex()}}}if(b>this._list.getZIndex()){this._list.setZIndex(b+1)}},_setSelected:function(b){this._selected=b;if(b){var a=b.getLabel().toString();this._field.setValue(this._formatText(a));if(this._field.isCreated()){if(!org.eclipse.swt.EventUtil.getSuspended()){this._field.selectAll();this._handleSelectionChange()}}this._setListSelection(b);this._manager.scrollItemIntoView(b)}else{if(!this._editable){this._field.setValue("")}this._resetListSelection()}this._sendWidgetSelected()},_scrollItemIntoView:function(b,a){if(b.isCreated()&&b.isDisplayable()){b.scrollIntoView(a)}},_formatText:function(b){var a=b;a=a.replace(/<[^>]+?>/g,"");a=qx.html.String.unescape(a);return a},_reDispatch:function(c){var b=c.getTarget();var a=b.getParent();if(a===this._list||a===this._list._vertScrollBar){b.dispatchEvent(c,false);c.stopPropagation()}},_onMouseDown:function(a){if(a.isLeftButtonPressed()){if(a.getTarget()==this._field){if(!this._editable||this._dropped){this._toggleListVisibility()}}else{if(this._dropped){this._reDispatch(a)}}}},_onMouseClick:function(a){if(a.isLeftButtonPressed()){if(this._button.hasState("over")){this._button.removeState("over")}var b=a.getTarget();if(b instanceof qx.ui.form.ListItem&&b===this._list.getListItemTarget(b)){this._reDispatch(a);this._toggleListVisibility();this._setSelected(this._manager.getSelectedItem());this.setFocused(true)}else{if(b==this._button||(this._dropped&&b!=this&&b!=this._field&&!this._list.contains(b))){this._toggleListVisibility()}}}},_onMouseUp:function(a){if(!this._dropped){this.setCapture(false)}if(a.getTarget()==this._field&&!org.eclipse.swt.EventUtil.getSuspended()){this._handleSelectionChange()}else{if(this._dropped){this._reDispatch(a)}}},_onMouseWheel:function(a){if(this._dropped){if(!this._list.isRelevantEvent(a)){a.preventDefault();a.stopPropagation()}}else{if(this.getFocused()){a.preventDefault();a.stopPropagation();var c;var b=this._selected;if(b){if(a.getWheelDelta()<0){c=this._manager.getNext(b)}else{c=this._manager.getPrevious(b)}if(c){this._setSelected(c)}}else{if(this._list.getItemsCount()){this._setSelected(this._list.getItems()[0])}}}}},_onMouseOver:function(a){var b=a.getTarget();if(b instanceof qx.ui.form.ListItem){this._setListSelection(b)}else{if(b==this._button){this._button.addState("over")}}},_onMouseOut:function(a){if(a.getTarget()==this._button){this._button.removeState("over")}},_setupCaptureRestore:function(){var a=this._list._vertScrollBar._thumb;a.addEventListener($[15],this._captureRestore,this)},_captureRestore:function(a){this.setCapture(true)},_onKeyDown:function(a){switch(a.getKeyIdentifier()){case $[68]:if(this._dropped){this._toggleListVisibility();this._setSelected(this._manager.getSelectedItem())}else{if(!a.isShiftPressed()&&!a.isAltPressed()&&!a.isCtrlPressed()&&!a.isMetaPressed()){this._sendWidgetDefaultSelected()}}this.setFocused(true);a.stopPropagation();break;case $[116]:if(this._dropped){this._toggleListVisibility()}this.setFocused(true);a.stopPropagation();break;case"Down":case"Up":if(a.isAltPressed()){this._toggleListVisibility()}break}if(this._field.isCreated()&&!org.eclipse.swt.EventUtil.getSuspended()){this._handleSelectionChange()}},_onKeyPress:function(a){switch(a.getKeyIdentifier()){case $[116]:a.stopPropagation();break;case"Tab":if(this._dropped){this._toggleListVisibility()}break;case $[53]:if(this._dropped){var c=this._selected?this._manager.getNext(this._selected):this._manager.getFirst();if(c){this._setSelected(c)}}break;case"Left":if(this._dropped){var c=this._selected?this._manager.getPrevious(this._selected):this._manager.getLast();if(c){this._setSelected(c)}}break;case"Up":case"Down":case $[58]:case $[55]:if(this._selected){this._list._onkeypress(a);var b=this._manager.getSelectedItem();this._setSelected(b)}else{if(this._list.getItemsCount()){this._setSelected(this._list.getItems()[0])}}a.stopPropagation();break}if(this._field.isCreated()&&!org.eclipse.swt.EventUtil.getSuspended()){this._handleSelectionChange()}if(a.getCharCode()!==0){this._onKeyInput(a)}},_onKeyInput:function(a){if(this._dropped&&!a.isAltPressed()&&!a.isCtrlPressed()){this._list._onkeyinput(a);var b=this._manager.getSelectedItem();this._setSelected(b)}},_onTextInput:function(a){if(this._editable){this._isModified=true;this._selected=null;this._resetListSelection();if(!org.eclipse.swt.EventUtil.getSuspended()){var b=org.eclipse.swt.Request.getInstance();b.addEventListener("send",this._onSend,this);if(this._hasVerifyModifyListener){qx.client.Timer.once(this._sendModifyText,this,500)}}}},_onTextBlur:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()&&this._isModified){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.send()}},_onSend:function(a){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addParameter(c+".text",this._field.getComputedValue());b.removeEventListener("send",this._onSend,this);this._isModified=false;this.setValue(this._field.getComputedValue())},_sendModifyText:function(){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.send();this._isModified=false},_sendWidgetSelected:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var e=org.eclipse.swt.WidgetManager.getInstance();var b=org.eclipse.swt.Request.getInstance();var d=e.findIdByWidget(this);var c=this._list;var a=this._list.getSelectedItem();b.addParameter(d+".selectedItem",c.getItemIndex(a));if(this._hasSelectionListener||this._hasVerifyModifyListener){b.addEvent($[64],d);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.send()}}},_sendWidgetDefaultSelected:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var b=c.findIdByWidget(this);if(this._hasSelectionListener){a.addEvent($[165],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()}}},_updateListVisibleRequestParam:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var b=c.findIdByWidget(this);a.addParameter(b+".listVisible",this._list.getDisplay())}},_handleSelectionChange:function(){var e=this._field.getSelectionStart();if(e===undefined){e=0}var b=this._field.getSelectionLength();if(typeof b==$[8]){b=0}if(this._selectionStart!=e||this._selectionLength!=b){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();this._selectionStart=e;a.addParameter(c+".selectionStart",e);this._selectionLength=b;a.addParameter(c+".selectionLength",b)}},setItems:function(a){this._list.setItems(a)},setMaxListHeight:function(a){this._listMaxHeight=a},setListItemHeight:function(a){this._listItemHeight=a},select:function(b){var a=this._list.getItems();var c=null;if(b>=0&&b<=a.length-1){c=a[b]}this._setSelected(c)},setEditable:function(a){this._editable=a;this._field.setReadOnly(!a);this._field.setCursor(a?null:$[39])},setListVisible:function(a){if(this._list.getDisplay()!=a){this._dropped=!a;this._toggleListVisibility()}},setValue:function(a){this._field.setValue(a)},setTextSelection:function(b,a){if(this._field.isCreated()){this._selectionStart=b;this._field.setSelectionStart(b);this._selectionLength=a;this._field.setSelectionLength(a)}},setTextLimit:function(a){this._field.setMaxLength(a)},setHasSelectionListener:function(a){this._hasSelectionListener=a},setHasVerifyModifyListener:function(a){this._hasVerifyModifyListener=a}}});
-qx.Class.define("org.eclipse.rwt.FocusIndicator",{type:$[33],extend:qx.core.Object,construct:function(){arguments.callee.base.call(this);this._frame=null},members:{_createFrame:function(){this._frame=document.createElement("div");this._frame.setAttribute("id","focusIndicator");this._frame.style.position=$[27];this._frame.style.fontSize=0;this._frame.style.lineHeight=0;this._frame.style.zIndex=0},_createTheme:function(h,b,n){var g=null;var m=typeof h.__states!=$[8]?h.__states:{};var i=new org.eclipse.swt.theme.ThemeValues(m);var f=i.getCssBorder(b,$[4]);var k=i.getCssFloat(b,$[42]);var j=f instanceof org.eclipse.rwt.Border;var e=i.getCssBoxDimensions(b,$[96]);var l=i.getCssBoxDimensions(b,$[37]);if(!l){l=[0,0,0,0]}var d=l[0]==0&&l[1]==0&&l[2]==0&&l[3]==0;var a=!d&&n!=null;if(j&&(e!=null||a)){var c=i.getCssColor(b,$[5]);g={backgroundColor:c!=$[8]?c:"",opacity:k,border:f,margin:e,padding:a?l:null}}return g},show:function(d,c,b){this.hide();if(d.isCreated()){var f=this._createTheme(d,c,b);if(f!=null){var a=d._getTargetNode();if(this._frame==null){this._createFrame()}if(this._frame.parentNode!=a){if(a.hasChildNodes()){var e=a.firstChild;a.insertBefore(this._frame,e)}else{a.appendChild(this._frame)}}this._styleFocusIndicator(f);this._layoutFocusIndicator(d,f,b)}}},hide:function(){if(this._frame!=null&&this._frame.parentNode!=null){this._frame.parentNode.removeChild(this._frame)}},_styleFocusIndicator:function(g){var e=g[$[4]];var b=this._frame.style;var f=["Left","Top","Bottom",$[53]];for(var h=0;h<4;h++){var c=f[h];var d=e["getColor"+c]();var j=e["getStyle"+c]();var a=e["getWidth"+c]();b[$[4]+c+"Width"]=a==null?"0px":a+"px";b[$[4]+c+"Style"]=j==null?"none":j;b[$[4]+c+"Color"]=d==null?"":d}b.backgroundColor=g[$[78]];this._styleFocusIndiactorOpacity(g[$[42]])},_styleFocusIndiactorOpacity:qx.core.Variant.select($[0],{"default":function(c){var b=this._frame.style;var a=c==1?"":c;b.opacity=a;b.KhtmlOpacity=a;b.MozOpacity=a},mshtml:function(c){var b=this._frame.style;var a=c==1?"":"Alpha(Opacity="+(c*100)+")";b.filter=a}}),_layoutFocusIndicator:function(e,d,i){var c=d[$[4]];var a=[];if(d[$[37]]!=null){var g=d[$[37]];a[0]=parseInt(i.style.left)-g[3];a[1]=parseInt(i.style.top)-g[0];a[2]=parseInt(i.style.width)+g[1]+g[3];a[3]=parseInt(i.style.height)+g[2]+g[0]}else{var b=d[$[96]];e._invalidateBoxWidth();e._invalidateBoxHeight();var h=e.getBoxWidth()-e._cachedBorderLeft-e._cachedBorderRight;var f=e.getBoxHeight()-e._cachedBorderTop-e._cachedBorderBottom;e._invalidateBoxWidth();e._invalidateBoxHeight();a[0]=b[3];a[1]=b[0];a[2]=h-(b[3]+b[1]);a[3]=f-(b[0]+b[2]);a[2]=Math.max(0,a[2]);a[3]=Math.max(0,a[3])}this._frame.style.left=a[0]+"px";this._frame.style.top=a[1]+"px";this._frame.style.width=a[2]+"px";this._frame.style.height=a[3]+"px"}}});
-qx.Class.define("org.eclipse.swt.CLabelUtil",{statics:{SHOW_BOTH:"both",APPEARANCE:"clabel",initialize:function(b){b.setVerticalChildrenAlign(qx.constant.Layout.ALIGN_MIDDLE);b.setHorizontalChildrenAlign(qx.constant.Layout.ALIGN_LEFT);b.setAppearance(org.eclipse.swt.CLabelUtil.APPEARANCE);b.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);b.setLabel($[139]);var a=b.getLabelObject();a.setMode(qx.constant.Style.LABEL_MODE_HTML);a.setTextOverflow(false);a.setAppearance($[483]);b.getLabelObject().setWrap(false);b.setLabel("");b.setHideFocus(true);b.setShow(org.eclipse.swt.CLabelUtil.SHOW_BOTH);b.addEventListener($[9],org.eclipse.swt.CLabelUtil._onMouseOver);b.addEventListener($[14],org.eclipse.swt.CLabelUtil._onMouseOut)},_onMouseOver:function(b){var a=b.getTarget();a.addState("over")},_onMouseOut:function(b){var a=b.getTarget();a.removeState("over")}}});
-qx.Class.define("org.eclipse.swt.graphics.GC",{extend:qx.core.Object,construct:function(a){arguments.callee.base.call(this);this._control=a;this._control.addEventListener($[105],this._onControlCreate,this);this._vmlCanvas=null;if(qx.core.Variant.isSet($[0],$[18])){this._vmlCanvas=org.eclipse.rwt.VML.createCanvas();this._canvas=org.eclipse.rwt.VML.getCanvasNode(this._vmlCanvas);this._context=new org.eclipse.rwt.VMLCanvas(this._vmlCanvas)}else{this._canvas=document.createElement("canvas");this._context=this._canvas.getContext("2d")}this._textCanvas=document.createElement("div");this._textCanvas.style.position=$[27];this._textCanvas.style.overflow=$[17];this._textCanvas.style.left="0px";this._textCanvas.style.top="0px";if(this._control.isCreated()){this._addCanvasToDOM()}},destruct:function(){this._control.removeEventListener($[105],this._onControlCreate,this);this._control=null;this._canvas=null;if(this._context.dispose){this._context.dispose()}this._context=null;this._textCanvas=null},members:{_onControlCreate:function(){this._addCanvasToDOM()},_addCanvasToDOM:function(){var b=this._control._getTargetNode();var a=b.firstChild;if(a){b.insertBefore(this._canvas,a);b.insertBefore(this._textCanvas,a)}else{b.appendChild(this._canvas);b.appendChild(this._textCanvas)}},init:qx.core.Variant.select($[0],{mshtml:function(d,a,b,c,e){qx.ui.core.Widget.flushGlobalQueues();this._initTextCanvas(d,a);this._context.clearRect(0,0,d,a);this._initFields(b,c,e)},"default":function(d,a,b,c,e){this._initTextCanvas(d,a);this._canvas.width=d;this._canvas.style.width=d+"px";this._canvas.height=a;this._canvas.style.height=a+"px";this._context.clearRect(0,0,d,a);this._initFields(b,c,e)}}),_initTextCanvas:function(b,a){this._textCanvas.width=b;this._textCanvas.style.width=b+"px";this._textCanvas.height=a;this._textCanvas.style.height=a+"px";this._textCanvas.innerHTML=""},_initFields:function(a,b,c){this._context.strokeStyle=c;this._context.fillStyle=b;this._context.globalAlpha=1;this._context.lineWidth=1;this._context.lineCap="butt";this._context.lineJoin="miter";this._context.font=a},setProperty:function(a,b){switch(a){case"foreground":this._context.strokeStyle=b;break;case $[190]:this._context.fillStyle=b;break;case"alpha":this._context.globalAlpha=b/255;break;case"lineWidth":this._context.lineWidth=b>1?b:1;break;case"lineCap":switch(b){case 1:this._context.lineCap="butt";break;case 2:this._context.lineCap="round";break;case 3:this._context.lineCap="square";break}break;case"lineJoin":switch(b){case 1:this._context.lineJoin="miter";break;case 2:this._context.lineJoin="round";break;case 3:this._context.lineJoin="bevel";break}break;case"font":this._context.font=b;break}},drawLine:function(b,d,a,c){var e=this._getOffset(false);this._context.beginPath();this._context.moveTo(b+e,d+e);this._context.lineTo(a+e,c+e);this._stroke(false)},drawPoint:function(a,b){this._context.save();this._context.fillStyle=this._context.strokeStyle;this._context.beginPath();this._context.lineWidth=1;this._context.rect(a,b,1,1);this._stroke(true);this._context.restore()},drawRectangle:function(b,f,c,a,d){var e=this._getOffset(d);this._context.beginPath();this._context.rect(b+e,f+e,c,a);this._stroke(d)},drawRoundRectangle:function(h,f,a,k,j,b,l){var d=this._getOffset(l);var i=h+d;var g=f+d;var e=j/2+1;var c=b/2+1;this._context.beginPath();this._context.moveTo(i,g+c);this._context.lineTo(i,g+k-c);this._context.quadraticCurveTo(i,g+k,i+e,g+k);this._context.lineTo(i+a-e,g+k);this._context.quadraticCurveTo(i+a,g+k,i+a,g+k-c);this._context.lineTo(i+a,g+c);this._context.quadraticCurveTo(i+a,g,i+a-e,g);this._context.lineTo(i+e,g);this._context.quadraticCurveTo(i,g,i,g+c);this._stroke(l)},fillGradientRectangle:function(l,i,b,m,f){var c=l;var k=i;var e=false;if(b<0){c+=b;if(!f){e=true}}if(m<0){k+=m;if(f){e=true}}var a=f?c:c+Math.abs(b);var h=f?k+Math.abs(m):k;var g=e?this._context.fillStyle:this._context.strokeStyle;var d=e?this._context.strokeStyle:this._context.fillStyle;var j=this._context.createLinearGradient(c,k,a,h);j.addColorStop(0,g);j.addColorStop(1,d);this._context.save();this._context.fillStyle=j;this.drawRectangle(l,i,b,m,true);this._context.restore()},drawArc:qx.core.Variant.select($[0],{mshtml:function(g,f,c,h,e,j,i){var b=c/2;var a=h/2;var d=this._getOffset(i);this._context.save();this._context.beginPath();this._context.arc(g+b+d,f+a+d,b,a,-e*Math.PI/180,-(e+j)*Math.PI/180,true);this._stroke(i);this._context.restore()},"default":function(g,f,a,h,d,j,i){if(a>0&&h>0){var c=a/2;var e=h/2;var b=this._getOffset(i);this._context.save();this._context.beginPath();this._context.translate(g+c+b,f+e+b);this._context.scale(1,h/a);this._context.arc(0,0,c,-d*Math.PI/180,-(d+j)*Math.PI/180,true);this._stroke(i);this._context.restore()}}}),drawPolyline:function(b,e,c){var d=this._getOffset(c);this._context.beginPath();for(var a=1;a<b.length;a+=2){if(a==1){this._context.moveTo(b[a-1]+d,b[a]+d)}else{this._context.lineTo(b[a-1]+d,b[a]+d)}}if(b.length>1&&e){this._context.lineTo(b[0]+d,b[1]+d)}this._stroke(c&&e)},drawText:function(e,a,f,d){var b=document.createElement("div");var c=b.style;c.position=$[27];c.left=a+"px";c.top=f+"px";c.color=this._context.strokeStyle;if(d){c.backgroundColor=this._context.fillStyle}if(this._context.font!=""){c.font=this._context.font}b.innerHTML=e;this._textCanvas.appendChild(b)},drawImage:function(j,h,g,f,m,k,i,l,c,a){var b=this._context;var d=new Image();d.src=j;if(d.complete||qx.core.Variant.isSet($[0],$[18])){if(a){b.drawImage(d,k,i)}else{b.drawImage(d,h,g,f,m,k,i,l,c)}}else{var e=b.globalAlpha;d.onload=function(){b.save();b.globalAlpha=e;if(a){b.drawImage(d,k,i)}else{b.drawImage(d,h,g,f,m,k,i,l,c)}b.restore()}}},_stroke:function(a){if(a){this._context.fill()}else{this._context.stroke()}},_getOffset:function(b){var a=0;if(!b&&this._context.lineWidth%2!==0){a=0.5}return a}}});
-qx.Class.define("org.eclipse.rwt.VMLCanvas",{extend:qx.core.Object,construct:function(a){this._autoDispose=false;arguments.callee.base.call(this);this._canvas=a;this._stateStack=[];this._currentPath=[];this.strokeStyle=$[258];this.fillStyle=$[258];this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=10;this.globalAlpha=1},destruct:function(){this._canvas=null},members:{save:function(){var a={};this._copyState(this,a);this._stateStack.push(a)},restore:function(){var a=this._stateStack.pop();this._copyState(a,this)},beginPath:function(){this._currentPath=[]},closePath:function(){this._currentPath.push({type:"close"})},clearRect:function(b,d,c,a){org.eclipse.rwt.VML.clearCanvas(this._canvas)},stroke:function(b){var a=org.eclipse.rwt.VML.createShapeFromContext(this,b);org.eclipse.rwt.VML.addToCanvas(this._canvas,a)},fill:function(){this.stroke(true)},moveTo:function(a,b){this._currentPath.push({type:"moveTo",x:a,y:b})},lineTo:function(a,b){this._currentPath.push({type:"lineTo",x:a,y:b})},quadraticCurveTo:function(c,b,a,d){this._currentPath.push({type:$[482],cp1x:c,cp1y:b,x:a,y:d})},bezierCurveTo:function(c,b,e,d,a,f){this._currentPath.push({type:$[428],cp1x:c,cp1y:b,cp2x:e,cp2y:d,x:a,y:f})},rect:function(b,d,c,a){this.moveTo(b,d);this.lineTo(b+c,d);this.lineTo(b+c,d+a);this.lineTo(b,d+a);this.closePath()},arc:function(i,h,b,a,f,c,g){if(this._currentPath.length==0){var e=i+Math.cos(f)*b;var d=h+Math.sin(f)*a;this.moveTo(e,d)}this._currentPath.push({type:"arc",anticlockwise:g,centerX:i,centerY:h,radiusX:b,radiusY:a,startAngle:f,endAngle:c})},drawImage:function(){var g=org.eclipse.rwt.VML.createShape($[35]);org.eclipse.rwt.VML.setOpacity(g,this.globalAlpha);var b=arguments[0];if(arguments.length==3){var i=arguments[1];var h=arguments[2];org.eclipse.rwt.VML.setImageData(g,b.src,i,h,b.width,b.height)}else{var f=arguments[1];var e=arguments[2];var c=arguments[3];var k=arguments[4];var i=arguments[5];var h=arguments[6];var j=arguments[7];var a=arguments[8];var d=[e/b.height,(b.width-f-c)/b.width,(b.height-e-k)/b.height,f/b.width];org.eclipse.rwt.VML.setImageData(g,b.src,i,h,j,a,d)}org.eclipse.rwt.VML.addToCanvas(this._canvas,g)},createLinearGradient:function(b,d,a,c){var e=new Array();e.addColorStop=this._addColorStopFunction;e.horizontal=b!=a;return e},_copyState:function(a,b){b.font=a.font;b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX=a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.globalAlpha=a.globalAlpha},_addColorStopFunction:function(b,a){this.push([b,a])}}});
-qx.Class.define("org.eclipse.swt.widgets.Composite",{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this.setAppearance("composite");this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this.setHideFocus(true);this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[14],this._onMouseOut,this);if(qx.core.Variant.isSet($[0],$[18])){this._fixBackgroundTransparency();this.addEventListener($[203],this._fixBackgroundTransparency,this)}qx.ui.core.Widget.disableScrolling(this)},destruct:function(){this.removeEventListener($[9],this._onMouseOver,this);this.removeEventListener($[14],this._onMouseOut,this)},members:{_onMouseOver:function(a){this.addState("over")},_onMouseOut:function(a){this.removeState("over")},_applyBackgroundImage:qx.core.Variant.select($[0],{mshtml:function(b,a){arguments.callee.base.call(this,b,a);if(b==null){this._fixBackgroundTransparency()}},"default":function(b,a){arguments.callee.base.call(this,b,a)}}),_fixBackgroundTransparency:function(){if(this.getBackgroundColor()==null&&this.getBackgroundImage()==null){this._applyBackgroundImage($[344],null)}}}});
-qx.Class.define("org.eclipse.swt.widgets.Sash",{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this.setOverflow(null);this.setHtmlProperty($[408],"on");this.addEventListener($[57],this._onChangeSize,this);this.addEventListener($[66],this._onChangeSize,this);this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[14],this._onMouseOut,this);this._slider=new qx.ui.layout.CanvasLayout();this._slider.setAppearance("sash-slider");this._slider.setVisibility(false);org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._slider);this.add(this._slider);this._sliderHandle=new qx.ui.layout.CanvasLayout();this._sliderHandle.setStyleProperty($[374],$[493]);this._sliderHandle.setAppearance($[418]);this._sliderHandle.setVisibility(false);org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._sliderHandle);this.add(this._sliderHandle);this._handle=new qx.ui.layout.CanvasLayout();this._handle.setStyleProperty($[374],$[493]);this._handle.setAppearance($[418]);org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._handle);this.add(this._handle);this.initOrientation();this._bufferZIndex=null},destruct:function(){this.removeEventListener($[57],this._onChangeSize,this);this.removeEventListener($[66],this._onChangeSize,this);this.removeEventListener($[9],this._onMouseOver,this);this.removeEventListener($[14],this._onMouseOut,this);this._removeStyle(this.getOrientation());this._disposeObjects("_slider","_handle","_sliderHandle")},properties:{appearance:{refine:true,init:"sash"},orientation:{check:[$[52],$[46]],apply:$[435],init:$[52],nullable:true}},members:{_onChangeSize:function(a){this._handle.setWidth(this.getWidth());this._handle.setHeight(this.getHeight())},_onMouseDownX:function(a){if(a.isLeftButtonPressed()){if(this.getEnabled()){this._commonMouseDown();this._dragOffset=a.getPageX();this._minMove=-this.getLeft()-this._frameOffset;this._maxMove=this.getParent().getWidth()-this.getLeft()-this.getWidth()-this._frameOffset}}},_onMouseDownY:function(a){if(a.isLeftButtonPressed()){if(this.getEnabled()){this._commonMouseDown();this._dragOffset=a.getPageY();this._minMove=-this.getTop()-this._frameOffset;this._maxMove=this.getParent().getHeight()-this.getTop()-this.getHeight()-this._frameOffset}}},_commonMouseDown:function(){this.setCapture(true);this.getTopLevelWidget().setGlobalCursor(this.getCursor());this._frameOffset=this.getFrameWidth()/2;this._slider.setLeft(0-this._frameOffset);this._slider.setTop(0-this._frameOffset);this._slider.setWidth(this.getWidth());this._slider.setHeight(this.getHeight());this._sliderHandle.setLeft(0);this._sliderHandle.setTop(0);this._sliderHandle.setWidth(this.getWidth());this._sliderHandle.setHeight(this.getHeight());this._bufferZIndex=this.getZIndex();this.setZIndex(10000000);this._slider.show();this._sliderHandle.show();this._sendWidgetSelected()},_onMouseUpX:function(a){if(this.getCapture()){this._commonMouseUp()}},_onMouseUpY:function(a){if(this.getCapture()){this._commonMouseUp()}},_commonMouseUp:function(){this._slider.hide();this._sliderHandle.hide();this.setCapture(false);this.getTopLevelWidget().setGlobalCursor(null);if(this._bufferZIndex!=null){this.setZIndex(this._bufferZIndex)}var a=org.eclipse.swt.WidgetUtil;a._fakeMouseEvent(this,$[14]);this._sendWidgetSelected()},_onMouseMoveX:function(b){if(this.getCapture()){if(this.getTopLevelWidget().getGlobalCursor()!=this.getCursor()){this.getTopLevelWidget().setGlobalCursor(this.getCursor())}var a=b.getPageX()-this._dragOffset;this._slider.setLeft(this._normalizeMove(a));this._sliderHandle.setLeft(this._normalizeMove(a))}},_onMouseMoveY:function(b){if(this.getCapture()){if(this.getTopLevelWidget().getGlobalCursor()!=this.getCursor()){this.getTopLevelWidget().setGlobalCursor(this.getCursor())}var a=b.getPageY()-this._dragOffset;this._slider.setTop(this._normalizeMove(a));this._sliderHandle.setTop(this._normalizeMove(a))}},_normalizeMove:function(b){var a=b;if(a<this._minMove){a=this._minMove}if(a>this._maxMove){a=this._maxMove}return a},_applyOrientation:function(b,a){this._removeStyle(a);this._setStyle(b)},_setStyle:function(a){if(a==$[52]){this.addEventListener($[2],this._onMouseDownY,this);this.addEventListener($[45],this._onMouseMoveY,this);this.addEventListener($[15],this._onMouseUpY,this);this.addState($[52]);this._handle.addState($[52]);this._sliderHandle.addState($[52])}else{if(a==$[46]){this.addEventListener($[45],this._onMouseMoveX,this);this.addEventListener($[2],this._onMouseDownX,this);this.addEventListener($[15],this._onMouseUpX,this);this.addState($[46]);this._handle.addState($[46]);this._sliderHandle.addState($[46])}}},_removeStyle:function(a){if(a==$[52]){this.removeEventListener($[2],this._onMouseDownY,this);this.removeEventListener($[45],this._onMouseMoveY,this);this.removeEventListener($[15],this._onMouseUpY,this);this.removeState($[52]);this._handle.removeState($[52]);this._sliderHandle.removeState($[52])}else{if(a==$[46]){this.removeEventListener($[2],this._onMouseDownX,this);this.removeEventListener($[45],this._onMouseMoveX,this);this.removeEventListener($[15],this._onMouseUpX,this);this.removeState($[46]);this._handle.removeState($[46]);this._sliderHandle.removeState($[46])}}},_sendWidgetSelected:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=this._slider.getLeft()+this._frameOffset;var a=this._slider.getTop()+this._frameOffset;var e=org.eclipse.swt.WidgetManager.getInstance();var d=e.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addEvent($[64],d);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.addParameter(d+$[294],this.getLeft()+c);b.addParameter(d+$[295],this.getTop()+a);b.addParameter(d+$[303],this.getWidth());b.addParameter(d+$[317],this.getHeight());if(this.getCapture()){b.addParameter($[346],"drag")}b.send()}},_onMouseOver:function(a){this.addState("over")},_onMouseOut:function(a){this.removeState("over")}}});
+qx.Class.define("org.eclipse.rwt.widgets.BasicButton",{extend:org.eclipse.rwt.widgets.MultiCellWidget,construct:function(a){arguments.callee.base.call(this,this._CELLORDER);this._hasSelectionListener=false;this._selected=false;this._image=[null,null,null];this._hotImage=[null,null,null];this.addEventListener($[9],this._onMouseOver);this.addEventListener($[14],this._onMouseOut);this.addEventListener($[2],this._onMouseDown);this.addEventListener($[15],this._onMouseUp);this.addEventListener($[23],this._onKeyDown);this.addEventListener($[60],this._onKeyUp);this.addEventListener($[12],this._onKeyPress);this.addState(a);switch(a){case"push":this._isSelectable=false;this._isDeselectable=false;this._sendEvent=true;break;case"toggle":case"check":this._isSelectable=true;this._isDeselectable=true;this._sendEvent=true;break;case"radio":this._isSelectable=true;this._sendEvent=false;this.setNoRadioGroup(false);org.eclipse.rwt.RadioButtonUtil.registerExecute(this);org.eclipse.rwt.RadioButtonUtil.registerKeypress(this);break}},destruct:function(){if(this._animation!=null){this._animation.dispose()}this._animation=null},events:{stateOverChanged:$[11]},properties:{selectionIndicator:{apply:$[445],nullable:true,themeable:true},icon:{apply:$[400],nullable:true,themeable:true},animation:{check:$[111],nullable:false,init:null,apply:$[375],themeable:true}},members:{_CELLORDER:[$[35],$[35],$[85]],_applyIcon:function(b,a){this.setImage.apply(this,b)},setImage:function(c,b,a){this._image=[c,b,a];this._updateButtonImage()},setHotImage:function(c,b,a){this._hotImage=[c,b,a];this._updateButtonImage()},_updateButtonImage:function(){var b=(this._hotImage[0]!=null&&this.hasState("over"))?this._hotImage:this._image;var a=this.getCellContent(1);if(a!=b[0]){this.setCellContent(1,b[0]);this.setCellDimension(1,b[1],b[2])}},setText:function(a){this.setCellContent(2,a)},_applySelectionIndicator:function(e,b){var c=e?e[0]:null;var d=e?e[1]:0;var a=e?e[2]:0;this.setCellContent(0,c);this.setCellDimension(0,d,a)},setHasSelectionListener:function(a){this._hasSelectionListener=a},setGrayed:function(a){if(a){this.addState($[235])}else{this.removeState($[235])}},setNoRadioGroup:function(a){if(this.hasState("radio")){this._noRadioGroup=a;this._isDeselectable=a}},getNoRadioGroup:function(){return this._noRadioGroup},execute:function(){arguments.callee.base.call(this);if(this._isSelectable){this.setSelection(!(this._selected&&this._isDeselectable))}this._sendChanges()},setSelection:function(b){if(this._selected!=b||this._selected){this._selected=b;if(this._selected){this.addState($[30])}else{this.removeState($[30])}if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addParameter(c+$[143],this._selected);org.eclipse.swt.EventUtil.addWidgetSelectedModifier()}}},_sendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()&&this._hasSelectionListener){var a=org.eclipse.swt.Request.getInstance();if(this._sendEvent){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);a.addEvent($[61],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier()}a.send()}},_onMouseOver:function(a){if(a.getTarget()==this&&!this.hasState("over")){if(this.hasState($[46])){this.removeState($[46]);this.addState($[21])}this.addState("over");this._updateButtonImage();this.createDispatchEvent($[182])}},_onMouseOut:function(a){if(a.getTarget()==this){this.removeState("over");this._updateButtonImage();if(this.hasState($[21])){this.setCapture(true);this.removeState($[21]);this.addState($[46])}this.createDispatchEvent($[182])}},_onMouseDown:function(a){if(a.getTarget()==this&&a.isLeftButtonPressed()){this.removeState($[46]);this.addState($[21])}},_onMouseUp:function(b){this.setCapture(false);var a=this.hasState($[21]);var c=this.hasState($[46]);if(a){this.removeState($[21])}if(c){this.removeState($[46])}if(!c){this.addState("over");this._updateButtonImage();if(a){this.execute()}}},_onKeyDown:function(a){switch(a.getKeyIdentifier()){case $[71]:case $[91]:this.removeState($[46]);this.addState($[21]);a.preventDefault();a.stopPropagation()}},_onKeyUp:function(a){switch(a.getKeyIdentifier()){case $[71]:case $[91]:if(this.hasState($[21])){this.removeState($[46]);this.removeState($[21]);this.execute();a.preventDefault();a.stopPropagation()}}},_onKeyPress:function(a){switch(a.getKeyIdentifier()){case"Left":case"Up":case $[51]:case"Down":case $[57]:case $[58]:case"End":case"Home":a.preventDefault();a.stopPropagation()}},_applyAnimation:function(b,a){if(b.hoverIn||b[$[348]]){if(this._animation==null){this._animation=new org.eclipse.rwt.Animation();this._animation.addEventListener("init",this._initAnimation,this)}this.addEventListener($[182],this._animation.activateRendererOnce,this._animation);this.addEventListener($[360],this._configureRenderer,this);this._configureRenderer()}else{if(this._animation!=null){this.removeEventListener($[182],this._animation.activateRendererOnce,this._animation);this.removeEventListener($[360],this._configureRenderer,this)}}},_configureRenderer:function(c){if(!c||c.getValue()==null||c.getOldValue()==null){this._animation.skip();var d=this._animation.getDefaultRenderer(false);var a=this.getBackgroundGradient()!=null?$[272]:$[77];var b=org.eclipse.rwt.AnimationRenderer.ANIMATION_CHANGE;d.animate(this,a,b)}},_initAnimation:function(a){if(this.hasState($[21])){this._animation.cancel()}else{var b=this.getAnimation();if(this.hasState("over")&&b.hoverIn){this._animation.setProperties(b.hoverIn)}else{if(!this.hasState("over")&&b[$[348]]){this._animation.setProperties(b[$[348]])}else{this._animation.cancel()}}}},_renderAppearance:function(){arguments.callee.base.call(this);if(this._animation!=null&&!this._animation.isStarted()){this._animation.getDefaultRenderer().cancelActivateOnce()}}}});
+qx.Class.define("org.eclipse.rwt.widgets.ToolItem",{extend:org.eclipse.rwt.widgets.BasicButton,construct:function(a,b){arguments.callee.base.call(this,a);this._isDropDown=false;if(a=="dropDown"){this._isDropDown=true;this._isSelectable=false;this._isDeselectable=false;this._sendEvent=true;this.setCellDimension(3,1,0);this.setCellContent(3,"")}this._separatorBorder=null;this.setAppearance("toolbar-button");this.removeEventListener($[23],this._onKeyDown);this.removeEventListener($[60],this._onKeyUp);if(b){this.addState($[159])}},properties:{dropDownArrow:{apply:"_applyDropDownArrow",nullable:true,themeable:true},separatorBorder:{nullable:true,init:null,apply:$[550],themeable:true}},members:{_CELLORDER:[$[35],$[35],$[85],$[85],$[35]],_onKeyPress:function(a){this.getParent().dispatchEvent(a);arguments.callee.base.call(this,a)},_onMouseDown:function(a){if(a.getTarget()==this&&a.isLeftButtonPressed()){this.removeState($[46]);if(this._isDropdownClick(a)){this._onDropDownClick();this._sendChanges()}else{this.addState($[21])}}},_isDropdownClick:function(e){var a=false;var d=this.getCellNode(3);if(d!=null){var c=qx.bom.element.Location.getLeft(d);var b=e.getClientX();a=b>c}return a},_onDropDownClick:function(){if(!org.eclipse.swt.EventUtil.getSuspended()&&this._hasSelectionListener){var a=org.eclipse.swt.Request.getInstance();if(this._sendEvent){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);a.addEvent($[349],"arrow")}}},_applyDropDownArrow:function(e,c){var b=e?e[0]:null;var d=e?e[1]:0;var a=e?e[2]:0;this.setCellContent(4,b);this.setCellDimension(4,d,a)},_applySeparatorBorder:function(b,a){this._queueSeparatorBorder(b)},_queueSeparatorBorder:function(a){this._separatorBorder=a;this.addToQueue($[409])},_beforeRenderLayout:function(h){if(this._isDropDown){if(h.layoutY){var g=this.getPaddingTop()+this.getPaddingBottom();this._setCellHeight(3,this.getInnerHeight()+g)}if(h.layoutX){var l=this.getInnerWidth();this.setCellWidth(0,0);this.setCellWidth(2,null);var j=this.getPreferredInnerWidth();var i=l-j;if(i>0){var b=this.getSpacing();if((i>(b*2))&&this.getHorizontalChildrenAlign()!="left"){var e=Math.round(i*0.5)-b;var f=Math.round(i*0.5);this.setCellWidth(0,e);this.setCellWidth(2,this.getCellWidth(2)+f)}else{this.setCellWidth(2,this.getCellWidth(2)+i)}}}if(h.separatorBorder){var c=this.getCellNode(3).style;var a=this._separatorBorder.getWidthLeft();var k=this._separatorBorder.getStyleLeft();var d=this._separatorBorder.getColorLeft();c.borderLeftWidth=(a||0)+"px";c.borderLeftStyle=k||"none";c.borderLeftColor=d||""}}},_renderCellLayoutY:function(a){arguments.callee.base.call(this,a);if(this._isDropDown&&a==3){this.getCellNode(a).style.top=0}}}});
+qx.Class.define("org.eclipse.swt.widgets.Group",{extend:qx.ui.groupbox.GroupBox,construct:function(){arguments.callee.base.call(this);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);var b=new org.eclipse.swt.theme.ThemeValues({});this._themeBackgroundColor=b.getCssColor($[193],$[5]);b.dispose();var a=this.getLegendObject().getLabelObject();if(a==null){this.setLegend($[150]);this.setLegend("")}a=this.getLegendObject().getLabelObject();a.setMode(qx.constant.Style.LABEL_MODE_HTML);this.addEventListener($[194],this._onChangeBackgroundColor,this);this.addEventListener($[83],this._onChangeFont,this);this.getLegendObject().addEventListener($[9],this._onMouseOver,this);this.getLegendObject().addEventListener($[14],this._onMouseOut,this);qx.ui.core.Widget.disableScrolling(this)},destruct:function(){this.removeEventListener($[194],this._onChangeBackgroundColor,this);this.removeEventListener($[83],this._onChangeFont,this);this.getLegendObject().removeEventListener($[9],this._onMouseOver,this);this.getLegendObject().removeEventListener($[14],this._onMouseOut,this)},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]){this._legendObject.addState(a);this._frameObject.addState(a)}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]){this._legendObject.removeState(a);this._frameObject.removeState(a)}},_onChangeBackgroundColor:function(a){var b=a.getValue();if(this._themeBackgroundColor===$[8]){this.getLegendObject().setBackgroundColor(b)}},_onChangeFont:function(b){var a=b.getValue();this.getLegendObject().setFont(a)},_onMouseOver:function(a){this.getLegendObject().addState("over");this.getFrameObject().addState("over")},_onMouseOut:function(a){this.getLegendObject().removeState("over");this.getFrameObject().removeState("over")},_layoutPost:function(a){arguments.callee.base.call(this,a);this._frameObject._layoutPost(a)}}});
+qx.Class.define("org.eclipse.swt.widgets.Shell",{extend:qx.ui.window.Window,construct:function(){arguments.callee.base.call(this);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this.setRestrictToPageOnOpen(false);this._captionTitle.setMode("html");this._activeControl=null;this._focusControl=null;this._activateListenerWidgets=new Array();this._parentShell=null;this._renderZIndex=true;this.addEventListener($[355],this._onChangeActiveChild);this.addEventListener($[220],this._onChangeFocusedChild);this.addEventListener($[371],this._onChangeActive);this.addEventListener($[319],this._onChangeMode);this.addEventListener($[149],this._onChangeLocation);this.addEventListener($[309],this._onChangeLocation);this.addEventListener($[56],this._onChangeSize);this.addEventListener($[76],this._onChangeSize);this.addEventListener($[23],this._onKeydown);var a=org.eclipse.swt.Request.getInstance();a.addEventListener("send",this._onSend,this);this.getCaptionBar().setWidth("100%");this.removeEventListener($[2],this._onwindowmousedown);this.addEventListener($[107],this._onCreate,this);this.__onwindowmousedown=qx.lang.Function.bind(this._onwindowmousedown,this)},statics:{TOP_LEFT:"topLeft",TOP_RIGHT:"topRight",BOTTOM_LEFT:"bottomLeft",BOTTOM_RIGHT:$[500],CORNER_NAMES:["topLeft","topRight","bottomLeft",$[500]],_onParentClose:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){this.doClose()}},_appendCloseRequestParam:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(a);var b=org.eclipse.swt.Request.getInstance();b.addEvent("org.eclipse.swt.widgets.Shell_close",c)}},reorderShells:function(c){var g=qx.lang.Object.getValues(c.getAll());g=g.sort(org.eclipse.swt.widgets.Shell._compareShells);var f=g.length;var e=null;if(f>0){var b=g[0].getTopLevelWidget();var a=org.eclipse.swt.widgets.Shell.MIN_ZINDEX;for(var d=0;d<f;d++){a+=10;g[d].setZIndex(a);if(g[d]._appModal){e=g[d]}}if(e!=null){this._copyStates(e,b._getBlocker());b._getBlocker().show();b._getBlocker().setZIndex(e.getZIndex()-1)}else{b._getBlocker().hide()}}org.eclipse.swt.widgets.Shell._upperModalShell=e},_copyStates:function(b,c){c.__states={};for(var a in b.__states){if(b._isRelevantState(a)){c.addState(a)}}c._renderAppearance();qx.ui.core.Widget.removeFromGlobalLayoutQueue(c)},_compareShells:function(c,b){var a=0;if(c.isDialogOf(b)){a=1}else{if(b.isDialogOf(c)){a=-1}}if(a==0){a=(c._onTop?1:0)-(b._onTop?1:0)}if(a==0){a=(c._appModal?1:0)-(b._appModal?1:0)}if(a==0){var e=c.getTopLevelShell();var d=b.getTopLevelShell();a=e.getZIndex()-d.getZIndex()}if(a==0){a=c.getZIndex()-b.getZIndex()}return a},MIN_ZINDEX:100000,MAX_ZINDEX:10000000},destruct:function(){this.setParentShell(null);this.removeEventListener($[355],this._onChangeActiveChild);this.removeEventListener($[220],this._onChangeFocusedChild);this.removeEventListener($[371],this._onChangeActive);this.removeEventListener($[319],this._onChangeMode);this.removeEventListener($[149],this._onChangeLocation);this.removeEventListener($[309],this._onChangeLocation);this.removeEventListener($[56],this._onChangeSize);this.removeEventListener($[76],this._onChangeSize);this.removeEventListener($[23],this._onKeydown);var a=org.eclipse.swt.Request.getInstance();a.removeEventListener("send",this._onSend,this);if(this.isCreated()){qx.html.EventRegistration.removeEventListener(this.getElement(),$[2],this.__onwindowmousedown)}this._activateListenerWidgets=null},events:{close:$[68]},members:{_onCreate:function(a){qx.html.EventRegistration.addEventListener(this.getElement(),$[2],this.__onwindowmousedown);this.removeEventListener($[107],this._onCreate,this)},_beforeAppear:function(){qx.ui.layout.CanvasLayout.prototype._beforeAppear.call(this);qx.ui.popup.PopupManager.getInstance().update();var a=this.getWindowManager().getActiveWindow();this.getWindowManager().add(this);this.getWindowManager().setActiveWindow(a)},setDefaultButton:function(a){this._defaultButton=a},getDefaultButton:function(){return this._defaultButton},setParentShell:function(a){var b=this._parentShell;this._parentShell=a;var c=org.eclipse.swt.widgets.Shell._onParentClose;if(b!=null){b.removeEventListener("close",c,this)}if(a!=null){a.addEventListener("close",c,this)}},setSpace:function(d,b,c,a){if(!this._disableResize){this.setLeft(d);this.setWidth(b);this.setTop(c);this.setHeight(a)}},setHasShellListener:function(a){this._hasShellListener=a},setActiveControl:function(a){this._activeControl=a},initialize:function(){this.setShowCaption(this.hasState("rwt_TITLE"));this._onTop=(this._parentShell!=null&&this._parentShell._onTop)||this.hasState("rwt_ON_TOP");this._appModal=this.hasState("rwt_APPLICATION_MODAL")},addState:function(b){arguments.callee.base.call(this,b);if(this._isRelevantState(b)){this._captionBar.addState(b);this._captionTitle.addState(b);this._minimizeButton.addState(b);this._maximizeButton.addState(b);this._restoreButton.addState(b);this._closeButton.addState(b);var a=this._getClientDocumentBlocker();if(a!=null){a.addState(b)}}},removeState:function(b){arguments.callee.base.call(this,b);if(this._isRelevantState(b)){this._captionBar.removeState(b);this._captionTitle.removeState(b);this._minimizeButton.removeState(b);this._maximizeButton.removeState(b);this._restoreButton.removeState(b);this._closeButton.removeState(b);var a=this._getClientDocumentBlocker();if(a!=null){a.removeState(b)}}},_getClientDocumentBlocker:function(){var a=null;if(this._appModal&&org.eclipse.swt.widgets.Shell._upperModalShell==this){a=this.getTopLevelWidget()._getBlocker()}return a},_isRelevantState:function(b){var a=b==$[90]||b==$[92]||b==$[252]||b.substr(0,8)==$[53]||b.substr(0,4)=="rwt_";return a},close:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){org.eclipse.swt.widgets.Shell._appendCloseRequestParam(this);if(this._hasShellListener){org.eclipse.swt.Request.getInstance().send()}else{this.doClose()}}},doClose:function(){if(!this.isDisposed()){this.hide();if(this.hasEventListeners("close")){var a=new qx.event.type.DataEvent("close",this);this.dispatchEvent(a,true)}var b=this.getWindowManager();org.eclipse.swt.widgets.Shell.reorderShells(b)}},addActivateListenerWidget:function(a){this._activateListenerWidgets.push(a)},removeActivateListenerWidget:function(a){qx.lang.Array.remove(this._activateListenerWidgets,a)},_isRelevantActivateEvent:function(d){var a=false;for(var c=0;!a&&c<this._activateListenerWidgets.length;c++){var b=this._activateListenerWidgets[c];if(!b.contains(this._activeControl)&&b.contains(d)){a=true}}return a},_onChangeActiveChild:function(a){var e=this._getParentControl(a.getValue());if(!org.eclipse.swt.EventUtil.getSuspended()&&e!=null){var b=org.eclipse.swt.WidgetManager.getInstance();var f=b.findIdByWidget(e);var d=b.findIdByWidget(this);var c=org.eclipse.swt.Request.getInstance();if(this._isRelevantActivateEvent(e)){this._activeControl=e;c.removeParameter(d+$[492]);c.addEvent("org.eclipse.swt.events.controlActivated",f);c.send()}else{c.addParameter(d+$[492],f)}}},_onChangeFocusedChild:function(a){if(org.eclipse.swt.EventUtil.getSuspended()){this._focusControl=this.getFocusedChild()}},_onChangeActive:function(b){if(!this.getActive()&&!isFinite(this.getZIndex())){this.setZIndex(100000000)}if(!org.eclipse.swt.EventUtil.getSuspended()&&this.getActive()){var c=org.eclipse.swt.WidgetManager.getInstance();var f=c.findIdByWidget(this);var d=org.eclipse.swt.Request.getInstance();d.addEvent("org.eclipse.swt.events.shellActivated",f);d.send()}var e=b.getValue();if(e){var a=org.eclipse.swt.widgets.Shell._upperModalShell;if(a!=null&&a.getZIndex()>this.getZIndex()){this.setActive(false);a.setActive(true)}}},_onChangeMode:function(a){var c=a.getValue();var e=org.eclipse.swt.WidgetManager.getInstance();var d=e.findIdByWidget(a.getTarget());var b=org.eclipse.swt.Request.getInstance();b.addParameter(d+".mode",c)},_onChangeSize:function(b){if(!org.eclipse.swt.EventUtil.getSuspended()){var f=org.eclipse.swt.WidgetManager.getInstance();var d=org.eclipse.swt.Request.getInstance();var e=f.findIdByWidget(b.getTarget());var a=b.getTarget().getHeightValue();var c=b.getTarget().getWidthValue();d.addParameter(e+$[280],a);d.addParameter(e+$[315],c);d.send()}},_onChangeLocation:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var f=org.eclipse.swt.WidgetManager.getInstance();var b=org.eclipse.swt.Request.getInstance();var e=f.findIdByWidget(a.getTarget());var d=a.getTarget().getLeft();var c=a.getTarget().getTop();if(!isNaN(d)&&!isNaN(c)){b.addParameter(e+$[295],d);b.addParameter(e+$[294],c)}b.send()}},_onKeydown:function(a){var c=a.getKeyIdentifier();if(c==$[71]&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isCtrlPressed()&&!a.isMetaPressed()){var b=this.getDefaultButton();if(b!=null&&b.isSeeable()){b.execute()}}else{if(c==$[118]&&this._parentShell!=null){this.close()}}},_onSend:function(a){if(this.getActive()){var c=this.getFocusedChild();if(c!=null&&c!=this._focusControl){this._focusControl=c;var e=org.eclipse.swt.WidgetManager.getInstance();var b=e.findIdByWidget(c);var d=org.eclipse.swt.Request.getInstance();d.addParameter(d.getUIRootId()+".focusControl",b)}}},_getParentControl:function(c){var b=org.eclipse.swt.WidgetManager.getInstance();var a=c;while(a!=null&&!b.isControl(a)){if(a.getParent){a=a.getParent()}else{a=null}}return a},isDialogOf:function(c){var a=false;var b=this._parentShell;while(!a&&b!=null){a=c===b;b=b._parentShell}return a},getTopLevelShell:function(){var a=this;while(a._parentShell!=null){a=a._parentShell}return a},_sendTo:function(){org.eclipse.swt.widgets.Shell.reorderShells(this.getWindowManager())},bringToFront:function(){var a=this;while(a._parentShell!=null){a=a._parentShell}this._setRenderZIndex(false);this.setZIndex(org.eclipse.swt.widgets.Shell.MAX_ZINDEX+1);a.setZIndex(org.eclipse.swt.widgets.Shell.MAX_ZINDEX+1);org.eclipse.swt.widgets.Shell.reorderShells(this.getWindowManager());this._setRenderZIndex(true)},_applyZIndex:function(b,a){if(this._renderZIndex){arguments.callee.base.call(this,b,a)}},_setRenderZIndex:function(a){this._renderZIndex=a;if(a){this._applyZIndex(this.getZIndex())}},sendToBack:function(){var a=this;while(a._parentShell!=null){a=a._parentShell}this._setRenderZIndex(false);this.setZIndex(org.eclipse.swt.widgets.Shell.MIN_ZINDEX-1);a.setZIndex(org.eclipse.swt.widgets.Shell.MIN_ZINDEX-1);org.eclipse.swt.widgets.Shell.reorderShells(this.getWindowManager());this._setRenderZIndex(true)},setBlocked:function(a){if(a){if(!this._blocker){this._blocker=new qx.ui.layout.CanvasLayout();this._blocker.setAppearance($[546]);this.add(this._blocker)}this._blocker.setSpace(0,0,10000,10000);this._blocker.setZIndex(1000)}else{if(this._blocker){this.remove(this._blocker);this._blocker.destroy();this._blocker=null}}},setFullScreen:function(a){if(a){this._captionBar.setDisplay(false)}else{this._captionBar.setDisplay(this.hasState("rwt_TITLE"))}}}});
+qx.Class.define("org.eclipse.swt.widgets.ProgressBar",{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this.setOverflow($[17]);this.setAppearance("progressbar");this._timer=null;this._gfxCanvasAppended=false;this._canvas=null;this._backgroundShape=null;this._indicatorShape=null;this._borderShape=null;this._useBorderShape=false;this._gfxBorderWidth=0;this._indicatorVirtualPosition=0;this._separatorStartShape=null;this._separatorEndShape=null;this._useSeparator=false;this._separatorWidth=0;this._minimum=0;this._maximum=100;this._selection=0;this._flag=0},destruct:function(){if(this._timer!=null){this._timer.stop();this._timer.dispose()}this._timer=null;this._canvas=null;this._backgroundShape=null;this._indicatorShape=null;this._borderShape=null;this._separatorStartShape=null;this._separatorEndShape=null},statics:{UNDETERMINED_SIZE:40,FLAG_UNDETERMINED:2,FLAG_HORIZONTAL:256,FLAG_VERTICAL:512},properties:{indicatorColor:{nullable:true,init:null,apply:$[258],themeable:true},indicatorImage:{nullable:true,init:null,apply:$[258],themeable:true},indicatorGradient:{nullable:true,init:null,apply:$[258],themeable:true},indicatorOpacity:{nullable:true,init:1,apply:$[258],themeable:true},backgroundImageSized:{nullable:true,init:null,apply:"_applyBackgroundImageSized",themeable:true},separatorBorder:{nullable:true,init:null,apply:$[550],themeable:true}},members:{setMinimum:function(a){this._minimum=a},setMaximum:function(a){this._maximum=a},setSelection:function(a){this._selection=a;this.addToQueue("indicatorSelection")},setFlag:function(a){this._flag=a;if(this._isUndetermined()){this._timer=new qx.client.Timer(120);this._timer.addEventListener($[49],this._onInterval,this);this._timer.start();this.addState("rwt_UNDETERMINED")}if(this._isVertical()){this.addState($[308])}},setState:function(a){if(a=="error"){this.removeState("paused");this.addState("error")}else{if(a=="paused"){this.removeState("error");this.addState("paused")}else{this.removeState("error");this.removeState("paused")}}},_isUndetermined:function(){var a=this._flag&org.eclipse.swt.widgets.ProgressBar.FLAG_UNDETERMINED;return a!=0},_isHorizontal:function(){var a=this._flag&org.eclipse.swt.widgets.ProgressBar.FLAG_HORIZONTAL;return a!=0},_isVertical:function(){var a=this._flag&org.eclipse.swt.widgets.ProgressBar.FLAG_VERTICAL;return a!=0},_queueBorder:function(a){this.addToQueue("indicatorBorder");if(a&&a.getStyle()===$[120]){this._cachedBorderTop=0;this._cachedBorderRight=0;this._cachedBorderBottom=0;this._cachedBorderLeft=0;this._invalidateFrameDimensions()}else{arguments.callee.base.call(this,a)}},_applyBackgroundColor:function(a){if(this._gfxCanvasAppended){this._styleBackgroundFill()}},_applyBackgroundGradient:function(a){if(this._gfxCanvasAppended){this._styleBackgroundFill()}},_applyBackgroundImage:function(a){},_applyBackgroundImageSized:function(a){if(this._gfxCanvasAppended){this._styleBackgroundFill()}},_applyIndicatorFill:function(a){if(this._gfxCanvasAppended){this._styleIndicatorFill()}},_applySeparatorBorder:function(a){this.addToQueue($[409])},_onCanvasAppear:function(){org.eclipse.rwt.GraphicsUtil.handleAppear(this._canvas)},_onInterval:function(){if(this.isSeeable()){this._renderIndicatorSelection()}},_layoutPost:function(b){if(!this._gfxCanvasAppended){this._createCanvas()}var a=b.width||b.height||b.frameWidth||b.frameHeight||b.initial;if(b.separatorBorder){this._styleSeparatorBorder()}if(b.indicatorBorder){this._styleIndicatorBorder()}if(b.indicatorBorder||a){this._renderDimension();this._renderIndicatorSelection()}else{if(b.indicatorSelection||b.separatorBorder){this._renderIndicatorSelection()}}},_createCanvas:function(){var a=org.eclipse.rwt.GraphicsUtil;this._canvas=a.createCanvas();this._getTargetNode().appendChild(a.getCanvasNode(this._canvas));this._gfxCanvasAppended=true;this.addEventListener($[228],this._onCanvasAppear);this._backgroundShape=a.createShape($[173]);this._indicatorShape=a.createShape($[173]);a.addToCanvas(this._canvas,this._backgroundShape);a.addToCanvas(this._canvas,this._indicatorShape);this._styleBackgroundFill();this._styleIndicatorFill();if(this.isSeeable()){this._onCanvasAppear()}},_styleIndicatorBorder:function(){var b=org.eclipse.rwt.GraphicsUtil;if(this.getBorder()&&this.getBorder().getStyle()===$[120]){if(!this._useBorderShape){this._style.border="";if(this._borderShape==null){this._borderShape=b.createShape($[173])}b.addToCanvas(this._canvas,this._borderShape);this._useBorderShape=true}this._gfxBorderWidth=this._getMaxBorderWidth(this.getBorder());var a=this.getBorder().getColor();b.setStroke(this._borderShape,a,this._gfxBorderWidth)}else{if(this._useBorderShape){b.removeFromCanvas(this._canvas,this._borderShape);this._useBorderShape=true;this._gfxBorderWidth=0}}},_styleSeparatorBorder:function(){var c=org.eclipse.rwt.GraphicsUtil;var b=this.getSeparatorBorder();if(b!=null){if(!this._useSeparator){if(this._isUndetermined()){if(this._separatorStartShape==null){this._separatorStartShape=c.createShape("rect")}c.addToCanvas(this._canvas,this._separatorStartShape)}if(this._separatorEndShape==null){this._separatorEndShape=c.createShape("rect")}c.addToCanvas(this._canvas,this._separatorEndShape);this._useSeparator=true}this._separatorWidth=this._getMaxBorderWidth(b);var a=b.getColorTop();c.setFillColor(this._separatorEndShape,a);if(this._isUndetermined()){c.setFillColor(this._separatorStartShape,a)}}else{if(this._useSeparator){c.removeFromCanvas(this._canvs,this._separatorEndShape);this._useSeparator=false;if(this._isUndetermined()){c.removeFromCanvas(canvas,this._separatorStartShape)}this._separatorWidth=0}}},_getMaxBorderWidth:function(a){var b=0;b=Math.max(b,a.getWidthTop());b=Math.max(b,a.getWidthLeft());b=Math.max(b,a.getWidthRight());b=Math.max(b,a.getWidthBottom());return b},_styleIndicatorFill:function(){var a=org.eclipse.rwt.GraphicsUtil;if(this.getIndicatorImage()!=null&&this.getIndicatorImage()[0]!=null){var b=this.getIndicatorImage();a.setFillPattern(this._indicatorShape,b[0],b[1],b[2])}else{if(this.getIndicatorGradient()!=null){a.setFillGradient(this._indicatorShape,this.getIndicatorGradient())}else{a.setFillColor(this._indicatorShape,this.getIndicatorColor())}}a.setOpacity(this._indicatorShape,this.getIndicatorOpacity())},_styleBackgroundFill:function(){var a=org.eclipse.rwt.GraphicsUtil;if(this.getBackgroundImageSized()!=null&&this.getBackgroundImageSized()[0]!=null){var b=this.getBackgroundImageSized();a.setFillPattern(this._backgroundShape,b[0],b[1],b[2])}else{if(this.getBackgroundGradient()!=null){a.setFillGradient(this._backgroundShape,this.getBackgroundGradient())}else{a.setFillColor(this._backgroundShape,this.getBackgroundColor())}}},_renderDimension:function(){var c=org.eclipse.rwt.GraphicsUtil;var d=[0,0,0,0];var b=this.getInnerWidth();var a=this.getInnerHeight();if(this._useBorderShape){d=this.getBorder().getRadii();c.setRoundRectLayout(this._borderShape,this._gfxBorderWidth/2,this._gfxBorderWidth/2,b-this._gfxBorderWidth,a-this._gfxBorderWidth,d)}c.setRoundRectLayout(this._backgroundShape,this._gfxBorderWidth/2,this._gfxBorderWidth/2,b-this._gfxBorderWidth,a-this._gfxBorderWidth,d)},_renderIndicatorSelection:function(){var g=org.eclipse.rwt.GraphicsUtil;var c=this._getIndicatorVirtualPosition();var h=Math.max(c,0);var b=this._getIndicatorLength(c);if(b>0){var f=this._getIndicatorRadii(h,b);var i=h;var j=b;if(h+b==this._getIndicatorFullLength()){j+=this._gfxBorderWidth/2}else{j+=this._separatorWidth}if(i==0){i+=this._gfxBorderWidth/2;j+=this._gfxBorderWidth/2}else{i+=this._gfxBorderWidth}var e=this._isVertical();var a=e?this.getInnerWidth()-this._gfxBorderWidth:j;var m=e?j:this.getInnerHeight()-this._gfxBorderWidth;var l=e?this.getInnerHeight()-(i+j):this._gfxBorderWidth/2;var d=e?this._gfxBorderWidth/2:i;var k=this._indicatorShape;g.setDisplay(this._indicatorShape,true);g.setRoundRectLayout(k,d,l,a,m,f)}else{g.setDisplay(this._indicatorShape,false)}if(this._useSeparator){this._renderSeparator(h,b)}},_renderSeparator:function(e,b){var d=org.eclipse.rwt.GraphicsUtil;var h=b+e==this._getIndicatorFullLength();if(b==0){d.setDisplay(this._separatorEndShape,false);if(this._isUndetermined()){d.setDisplay(this._separatorStartShape,false)}}else{d.setDisplay(this._separatorEndShape,!h);if(this._isUndetermined()){d.setDisplay(this._separatorStartShape,e!=0)}var f=e+this._gfxBorderWidth-this._separatorWidth;var g=b+2*this._separatorWidth;if(this._isVertical()){var c=this._gfxBorderWidth;var j=this.getInnerHeight()-(g+f);var a=this.getInnerWidth()-2*this._gfxBorderWidth;var k=this._separatorWidth;var i=this._separatorEndShape;if(!h){d.setRectBounds(i,c,j,a,k)}if(e!=0){j=this.getInnerHeight()-f-this._separatorWidth;i=this._separatorStartShape;d.setRectBounds(i,c,j,a,k)}}else{var c=f+g-this._separatorWidth;var j=this._gfxBorderWidth;var a=this._separatorWidth;var k=this.getInnerHeight()-2*this._gfxBorderWidth;var i=this._separatorEndShape;if(!h){d.setRectBounds(i,c,j,a,k)}if(e!=0){c=f;i=this._separatorStartShape;d.setRectBounds(i,c,j,a,k)}}}},_getIndicatorLength:function(c){var a=this._getIndicatorVirtualLength();var e=this._getIndicatorFullLength();if(this._isUndetermined()){if(c<0){a+=c}if((c+a)>e){a=e-c}}else{if(this._useBorderShape){var d=this._getIndicatorMinSafeLength();var b=this._getIndicatorMaxSafeLength();if(a<d){if(a>0){a=d}else{a=0}}if(a>b&&a<e){a=b}}}return Math.round(a)},_getIndicatorVirtualLength:function(){var b;if(this._isUndetermined()){b=org.eclipse.swt.widgets.ProgressBar.UNDETERMINED_SIZE}else{var d=this._getIndicatorFullLength();var c=this._selection-this._minimum;var a=this._maximum-this._minimum;b=(c/a)*d}return b},_getIndicatorVirtualPosition:function(){var a=0;if(this._isUndetermined()){a=this._computeNextSaveIndicatorPosition()}return a},_computeNextSaveIndicatorPosition:function(){var e=org.eclipse.swt.widgets.ProgressBar.UNDETERMINED_SIZE;var f=this._getIndicatorFullLength();var a=this._indicatorVirtualPosition+2;if(this._useBorderShape){var b=this._getIndicatorMinSafeLength();var d=this._getIndicatorMaxSafeLength();var c=a+e;if(c>0&&c<b){a=b-e}if(a>0&&a<b){a=b}c=a+e;if(c>d&&c<f){a=f-e}if(a>d){a=-e}}else{if(a>=f){a=-e}}this._indicatorVirtualPosition=a;return a},_getIndicatorRadii:function(b,d){var a=[0,0,0,0];if(this._useBorderShape&&d>0){var f=this.getBorder().getRadii();var c=b+d;var e=this._getIndicatorFullLength();if(this._isVertical()){if(b==0){a[2]=f[2];a[3]=f[3]}if(c==e){a[0]=f[0];a[1]=f[1]}}else{if(b==0){a[0]=f[0];a[3]=f[3]}if(c==e){a[1]=f[1];a[2]=f[2]}}}return a},_getIndicatorFullLength:function(){return this._isVertical()?this.getInnerHeight()-2*this._gfxBorderWidth:this.getInnerWidth()-2*this._gfxBorderWidth},_getIndicatorMinSafeLength:function(){var b=this.getBorder().getRadii();var a=this._isVertical()?Math.max(b[2],b[3]):Math.max(b[0],b[3]);a+=this._separatorWidth;a-=Math.floor(this._gfxBorderWidth/2);return a},_getIndicatorMaxSafeLength:function(){var c=this.getBorder().getRadii();var b=this._getIndicatorFullLength();var a=this._isVertical()?b-Math.max(c[0],c[1]):b-Math.max(c[1],c[2]);a-=this._separatorWidth;a+=Math.floor(this._gfxBorderWidth/2);return a}}});
+qx.Class.define("org.eclipse.swt.widgets.Link",{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this.setAppearance("link");this._text="";this._hasSelectionListener=false;this._hyperlinksHaveListeners=false;this._linkColor;this._readyToSendChanges=true;this._currentFocusedLink=-1;this._linksCount=0;this._link=new qx.ui.embed.HtmlEmbed();this._link.setAppearance("link-text");this.add(this._link);this.setSelectable(false);this.setHideFocus(true);this.__onMouseDown=qx.lang.Function.bindEvent(this._onMouseDown,this);this.__onKeyDown=qx.lang.Function.bindEvent(this._onKeyDown,this);this.addEventListener($[31],this._onAppear,this);this.addEventListener($[131],this._onChangeEnabled,this);this.addEventListener($[41],this._onContextMenu,this);this.addEventListener($[12],this._onKeyPress);this.addEventListener($[177],this._onFocusOut);this._link.addEventListener($[367],this._onChangeHtml,this)},destruct:function(){this._removeEventListeners();delete this.__onMouseDown;delete this.__onKeyDown;this.removeEventListener($[31],this._onAppear,this);this.removeEventListener($[41],this._onContextMenu,this);this.removeEventListener($[131],this._onChangeEnabled,this);this.removeEventListener($[12],this._onKeyPress);this.removeEventListener($[177],this._onFocusOut);this._link.removeEventListener($[367],this._onChangeHtml,this);this._link.dispose()},members:{_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_onAppear:function(a){this._link.setTabIndex(null);this._link.setHideFocus(true);this._applyHyperlinksStyleProperties();this._addEventListeners()},_onChangeHtml:function(a){this._applyHyperlinksStyleProperties();this._addEventListeners()},_applyTextColor:function(b,a){arguments.callee.base.call(this,b,a);var c=new org.eclipse.swt.theme.ThemeValues(this._getStates());this._linkColor=c.getCssColor("Link-Hyperlink",$[6]);c.dispose();this._applyHyperlinksStyleProperties()},_onChangeEnabled:function(a){this._applyHyperlinksStyleProperties();this._changeHyperlinksTabIndexProperty()},_getStates:function(){if(!this.__states){this.__states={}}return this.__states},addState:function(a){arguments.callee.base.call(this,a);this._link.addState(a)},removeState:function(a){arguments.callee.base.call(this,a);this._link.removeState(a)},setHasSelectionListener:function(a){this._hasSelectionListener=a},addText:function(a){this._text+=a},addLink:function(b,a){this._text+='<span tabIndex="1" ';this._text+='style="';this._text+="text-decoration:underline; ";this._text+='" ';this._text+='id="'+a+'"';this._text+=">";this._text+=b;this._text+="</span>";this._linksCount++},applyText:function(){this._link.setHtml(this._text);if(this._linksCount===0){this.setTabIndex(null)}else{this.setTabIndex(1)}},clear:function(){this._removeEventListeners();this._text="";this._linksCount=0;this._currentFocusedLink=-1},_applyHyperlinksStyleProperties:function(){var a=this._getHyperlinkElements();for(i=0;i<a.length;i++){if(this._linkColor){if(this.isEnabled()){a[i].style.color=this._linkColor}else{a[i].style.color=""}}if(this.isEnabled()){a[i].style.cursor=$[144]}else{a[i].style.cursor=$[38]}}},_changeHyperlinksTabIndexProperty:function(){var a=this._getHyperlinkElements();for(i=0;i<a.length;i++){if(this.isEnabled()){a[i].tabIndex="1"}else{a[i].tabIndex="-1"}}},_addEventListeners:function(){var a=this._getHyperlinkElements();if(a.length>0&&!this._hyperlinksHaveListeners){for(i=0;i<a.length;i++){qx.html.EventRegistration.addEventListener(a[i],$[2],this.__onMouseDown);qx.html.EventRegistration.addEventListener(a[i],$[23],this.__onKeyDown)}this._hyperlinksHaveListeners=true}},_removeEventListeners:function(){var a=this._getHyperlinkElements();if(a.length>0&&this._hyperlinksHaveListeners){for(i=0;i<a.length;i++){qx.html.EventRegistration.removeEventListener(a[i],$[2],this.__onMouseDown);qx.html.EventRegistration.removeEventListener(a[i],$[23],this.__onKeyDown)}this._hyperlinksHaveListeners=false}},_onMouseDown:function(c){var b=this._getEventTarget(c);var a=parseInt(b.id);this._setFocusedLink(a);var d=this._isLeftMouseButtonPressed(c);if(this.isEnabled()&&d&&this._readyToSendChanges){this._readyToSendChanges=false;qx.client.Timer.once(function(){this._sendChanges(a)},this,org.eclipse.swt.EventUtil.DOUBLE_CLICK_TIME)}},_isLeftMouseButtonPressed:function(a){var b;if(a.which){b=(a.which===1)}else{if(a.button){if(qx.core.Variant.isSet($[0],$[18])){b=(a.button===1)}else{b=(a.button===0)}}}return b},_onKeyDown:function(c){if(this.isEnabled()&&c.keyCode===13){var b=this._getEventTarget(c);var a=b.id;this._sendChanges(a)}},_getEventTarget:function(b){var a;if(qx.core.Variant.isSet($[0],$[18])){a=window.event.srcElement}else{a=b.target}return a},_ontabfocus:function(){if(this._currentFocusedLink===-1&&this._linksCount>0){this._setFocusedLink(0)}},_onKeyPress:function(a){if(this.isFocused()&&a.getKeyIdentifier()==="Tab"&&this._linksCount>0){if(!a.isShiftPressed()&&this._currentFocusedLink>=0&&this._currentFocusedLink<this._linksCount-1){a.stopPropagation();a.preventDefault();this._setFocusedLink(this._currentFocusedLink+1)}else{if(!a.isShiftPressed()&&this._currentFocusedLink===-1){a.stopPropagation();a.preventDefault();this._setFocusedLink(0)}else{if(a.isShiftPressed()&&this._currentFocusedLink>0&&this._currentFocusedLink<=this._linksCount-1){a.stopPropagation();a.preventDefault();this._setFocusedLink(this._currentFocusedLink-1)}}}}},_onFocusOut:function(a){this._setFocusedLink(-1)},_setFocusedLink:function(b){var a=this._getFocusedHyperlinkElement();if(a!==null){a.blur();if(qx.core.Variant.isSet($[0],$[69])){a.style.outline="none"}}this._currentFocusedLink=b;a=this._getFocusedHyperlinkElement();if(a!==null){a.focus();if(qx.core.Variant.isSet($[0],$[69])){a.style.outline=$[372]}}},_getFocusedHyperlinkElement:function(){var a=null;var b=this._getHyperlinkElements();var c=this._currentFocusedLink;if(c>=0&&c<b.length){a=b[c]}return a},_getHyperlinkElements:function(){var a;var b=this.getElement();if(b){a=b.getElementsByTagName("span")}else{a=[]}return a},_sendChanges:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();if(this._hasSelectionListener){b.addEvent($[61],c);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.addEvent($[270],a);b.send()}}this._readyToSendChanges=true}}});
+qx.Class.define("org.eclipse.swt.widgets.Scrollable",{extend:qx.ui.layout.CanvasLayout,construct:function(a){arguments.callee.base.call(this);this._clientArea=a;this._horzScrollBar=new org.eclipse.rwt.widgets.ScrollBar(true);this._vertScrollBar=new org.eclipse.rwt.widgets.ScrollBar(false);this._blockScrolling=false;this._internalChangeFlag=false;this.add(this._clientArea);this.add(this._horzScrollBar);this.add(this._vertScrollBar);this._configureScrollBars();this._configureClientArea();this.__onscroll=qx.lang.Function.bindEvent(this._onscroll,this)},destruct:function(){var b=this._clientArea._getTargetNode();if(b){var a=qx.html.EventRegistration;a.removeEventListener(b,$[26],this.__onscroll);delete this.__onscroll}this._clientArea=null;this._horzScrollBar=null;this._vertScrollBar=null},events:{userScroll:$[11]},statics:{_nativeWidth:null,getNativeScrollBarWidth:function(){if(this._nativeWidth===null){var a=document.createElement("div");a.style.width="100px";a.style.height="100px";a.style.overflow=$[26];a.style.visibility=$[17];document.body.appendChild(a);this._nativeWidth=a.offsetWidth-a.clientWidth;document.body.removeChild(a)}return this._nativeWidth}},members:{setScrollBarsVisible:function(a,b){this._horzScrollBar.setDisplay(a);this._vertScrollBar.setDisplay(b);var c=$[17];if(a&&b){c=$[26]}else{if(a){c=$[94]}else{if(b){c=$[93]}}}this._clientArea.setOverflow(c);this._layoutX();this._layoutY()},setHBarSelection:function(a){this._internalChangeFlag=true;this._horzScrollBar.setValue(a);this._internalChangeFlag=false},setVBarSelection:function(a){this._internalChangeFlag=true;this._vertScrollBar.setValue(a);this._internalChangeFlag=false},setBlockScrolling:function(a){this._blockScrolling=a},_configureClientArea:function(){this._clientArea.setOverflow($[26]);this._clientArea.setLeft(0);this._clientArea.setTop(0);this._clientArea.addEventListener($[107],this._onClientCreate,this);this._clientArea.addEventListener($[31],this._onClientAppear,this);this._clientArea._layoutPost=qx.lang.Function.bindEvent(this._onClientLayout,this)},_configureScrollBars:function(){var a=function(b){b.stopPropagation()};this._horzScrollBar.setLeft(0);this._horzScrollBar.addEventListener($[72],a);this._vertScrollBar.setTop(0);this._vertScrollBar.addEventListener($[72],a);this._horzScrollBar.addEventListener($[80],this._onHorzScrollBarChangeValue,this);this._vertScrollBar.addEventListener($[80],this._onVertScrollBarChangeValue,this)},_applyWidth:function(b,a){arguments.callee.base.call(this,b,a);this._layoutX()},_applyHeight:function(b,a){arguments.callee.base.call(this,b,a);this._layoutY()},_applyBorder:function(b,a){arguments.callee.base.call(this,b,a);this._layoutX();this._layoutY()},_layoutX:function(){var a=this.getWidth()-this.getFrameWidth();if(this._vertScrollBar.getDisplay()){a-=this._vertScrollBar.getWidth()}this._clientArea.setWidth(a);this._vertScrollBar.setLeft(a);this._horzScrollBar.setWidth(a)},_layoutY:function(){var a=this.getHeight()-this.getFrameHeight();if(this._horzScrollBar.getDisplay()){a-=this._horzScrollBar.getHeight()}this._clientArea.setHeight(a);this._vertScrollBar.setHeight(a);this._horzScrollBar.setTop(a)},_onClientCreate:function(b){this._clientArea.prepareEnhancedBorder();this._clientArea.setContainerOverflow(false);var c=this._clientArea._getTargetNode();var a=qx.html.EventRegistration;a.addEventListener(c,$[26],this.__onscroll)},_onClientLayout:function(){var d=org.eclipse.swt.widgets.Scrollable.getNativeScrollBarWidth();var e=this._clientArea._getTargetNode();var c=this._clientArea.getElement();var f=this._clientArea.getOverflow();var b=parseInt(c.style.width);var a=parseInt(c.style.height);if(f===$[26]||f===$[93]){b+=d}if(f===$[26]||f===$[94]){a+=d}e.style.width=b;e.style.height=a},_onHorzScrollBarChangeValue:function(){if(this._isCreated){this._syncClientArea(true,false)}if(!this._internalChangeFlag){this.createDispatchEvent($[373])}},_onVertScrollBarChangeValue:function(){if(this._isCreated){this._syncClientArea(false,true)}if(!this._internalChangeFlag){this.createDispatchEvent($[373])}},_onClientAppear:function(){this._internalChangeFlag=true;this._syncClientArea(true,true);this._internalChangeFlag=false},_onscroll:function(a){if(!this._internalChangeFlag){org.eclipse.rwt.EventHandlerUtil.stopDomEvent(a);var c=this._blockScrolling||!this._horzScrollBar.getDisplay();var b=this._blockScrolling||!this._vertScrollBar.getDisplay();this._internalChangeFlag=true;this._syncClientArea(c,b);this._internalChangeFlag=false;this._syncScrollBars()}},_syncClientArea:function(d,a){if(d){var c=this._horzScrollBar.getValue();this._clientArea.setScrollLeft(c)}if(a){var b=this._vertScrollBar.getValue();this._clientArea.setScrollTop(b)}},_syncScrollBars:function(){var b=this._clientArea.getScrollLeft();this._horzScrollBar.setValue(b);var a=this._clientArea.getScrollTop();this._vertScrollBar.setValue(a)}}});
+qx.Class.define("org.eclipse.swt.custom.ScrolledComposite",{extend:org.eclipse.swt.widgets.Scrollable,construct:function(){arguments.callee.base.call(this,new qx.ui.layout.CanvasLayout());this._clientArea.addEventListener($[55],this._onMouseWheel,this);this._clientArea.addEventListener($[12],this._onKeyPress,this);this.addEventListener($[373],this._onUserScroll);this._content=null;this._hasSelectionListener=false;this._requestTimerRunning=false;this._showFocusedControl=false;this._focusRoot=null;this.addEventListener($[299],this._onChangeParent,this);this.setAppearance("scrolledcomposite")},members:{setShowFocusedControl:function(a){this._showFocusedControl=a},setHasSelectionListener:function(a){this._hasSelectionListener=a},setContent:function(a){if(this._content!=null){this._content.removeEventListener($[299],this._onContentRemove,this);this._content.removeEventListener($[56],this._onContentResize,this);this._content.removeEventListener($[76],this._onContentResize,this)}this._content=a;this._onContentResize();if(this._content!=null){this._clientArea.add(this._content);this._content.addEventListener($[299],this._onContentRemove,this);this._content.addEventListener($[56],this._onContentResize,this);this._content.addEventListener($[76],this._onContentResize,this)}},_onContentRemove:function(){this.setContent(null)},_onContentResize:function(){if(this._content!==null&&typeof this._content.getWidth()===$[78]&&typeof this._content.getHeight()===$[78]){var b=this._content.getWidth();var a=this._content.getHeight();this._horzScrollBar.setMaximum(b);this._vertScrollBar.setMaximum(a)}},_onChangeParent:function(a){if(this._focusRoot!=null){this._focusRoot.removeEventListener($[220],this._onChangeFocusedChild,this)}this._focusRoot=this.getFocusRoot();if(this._focusRoot!=null){this._focusRoot.addEventListener($[220],this._onChangeFocusedChild,this)}},_onMouseWheel:function(a){this.setBlockScrolling(false)},_onKeyPress:function(a){switch(a.getKeyIdentifier()){case"Left":case"Up":case $[51]:case"Down":case $[57]:case $[58]:case"End":case"Home":this.setBlockScrolling(false);a.stopPropagation();break}},_onUserScroll:function(){if(!this._requestTimerRunning){this._requestTimerRunning=true;qx.client.Timer.once(this._sendChanges,this,500)}},_onChangeFocusedChild:function(a){var b=this.getFocusRoot().getFocusedChild();this.setBlockScrolling(!this._showFocusedControl&&b!==this)},_sendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()&&this.isCreated()){var b=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var e=b.findIdByWidget(this);var d=this._clientArea.getScrollLeft();a.addParameter(e+".horizontalBar.selection",d);var c=this._clientArea.getScrollTop();a.addParameter(e+".verticalBar.selection",c);if(this._hasSelectionListener){a.send()}this._requestTimerRunning=false}}}});
+qx.Class.define("org.eclipse.rwt.widgets.ToolBar",{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this._hoverItem=null;this.setAppearance("toolbar");this.setOverflow($[17]);this.initTabIndex();this.addEventListener($[66],this._onFocus);this.addEventListener("blur",this._onBlur);this.addEventListener($[9],this._onMouseOver);this.addEventListener($[12],this._onKeyPress);this.addEventListener($[23],this._onKeyDown);this.addEventListener($[60],this._onKeyUp)},properties:{tabIndex:{refine:true,init:1}},members:{_isRelevantEvent:function(a){var b=a.getTarget();return this._isToolItem(b)||b===this},_isToolItem:function(a){return a instanceof org.eclipse.rwt.widgets.ToolItem&&a.getParent()===this},_onMouseOver:function(a){var b=a.getTarget();if(this._hoverItem!=null&&this._hoverItem!=b){this._hoverItem.removeState("over");this._hoverItem=null}if(this._isToolItem(b)){this._hoverItem=b;this._hoverItem.addState("over")}},_onFocus:function(a){if(this._hoverItem==null){this._hoverItem=this.getFirstChild()}if(this._hoverItem!=null){this._hoverItem.addState("over")}},_onBlur:function(a){if(this._hoverItem!=null){this._hoverItem.removeState("over")}},_onKeyPress:function(a){if(this._isRelevantEvent(a)){switch(a.getKeyIdentifier()){case"Left":this._hoverNext(true);break;case $[51]:this._hoverNext(false);break}}},_onKeyDown:function(a){if(this._hoverItem!=null&&this._isRelevantEvent(a)){this._hoverItem._onKeyDown(a)}},_onKeyUp:function(a){if(this._hoverItem!=null&&this._isRelevantEvent(a)){this._hoverItem._onKeyUp(a)}},_hoverNext:function(a){if(this._hoverItem!=null){this._hoverItem.removeState("over");do{if(a){this._hoverItem=this._hoverItem.getPreviousSibling();if(this._hoverItem==null){this._hoverItem=this.getLastChild()}}else{this._hoverItem=this._hoverItem.getNextSibling();if(this._hoverItem==null){this._hoverItem=this.getFirstChild()}}}while(!(this._isToolItem(this._hoverItem)&&this._hoverItem.isEnabled()));this._hoverItem.addState("over")}}}});
+qx.Class.define("org.eclipse.swt.TextUtil",{statics:{LINE_HEIGT_FACTOR:1.2,initialize:function(a){if(a.isCreated()){org.eclipse.swt.TextUtil._doInitialize(a)}else{a.addEventListener($[31],org.eclipse.swt.TextUtil._onAppearInitialize)}a.setLiveUpdate(true);a._ontabfocus=function(){a.setSelectionLength(0)};a.setUserData($[212],0);a.setUserData($[195],0)},setHasSelectionListener:function(c,b){var a=c.getUserData($[353]);if(b!=a){c.setUserData($[353],b);org.eclipse.swt.TextUtil._updateSelectionListener(c,b)}},hasSelectionListener:function(a){return a.getUserData($[353])==true},setHasVerifyOrModifyListener:function(c,b){var a=c.getUserData($[388]);if(b!=a){c.setUserData($[388],b);org.eclipse.swt.TextUtil._updateVerifyOrModifyListener(c,b)}},hasVerifyOrModifyListener:function(a){return a.getUserData($[388])==true},setSelection:function(b,c,a){b.setUserData($[212],c);b.setUserData($[195],a);if(b.getFocused()){org.eclipse.swt.TextUtil._doSetSelection(b)}},_doSetSelection:function(b){var c=b.getUserData($[212]);var a=b.getUserData($[195]);if(c!=null&&a!=null){qx.client.Timer.once(function(){b.setSelectionStart(c);b.setSelectionLength(a)},b,50)}},_onAppearInitialize:function(a){var b=a.getTarget();b.removeEventListener($[31],org.eclipse.swt.TextUtil._onAppearInitialize);org.eclipse.swt.TextUtil._doInitialize(b)},_doInitialize:function(a){a.addEventListener($[15],org.eclipse.swt.TextUtil._onMouseUp);a.addEventListener($[60],org.eclipse.swt.TextUtil._onKeyUp);a.addEventListener($[23],org.eclipse.swt.TextUtil._onKeyDown);a.addEventListener($[12],org.eclipse.swt.TextUtil._onKeyPress);a.addEventListener($[80],org.eclipse.swt.TextUtil._onTextChange);a.addEventListener($[83],org.eclipse.swt.TextUtil._onFontChange,a);a.addEventListener($[66],org.eclipse.swt.TextUtil._onFocus,a);a.addEventListener("blur",org.eclipse.swt.TextUtil._onBlur,a);org.eclipse.swt.TextUtil._updateLineHeight(a)},_onMouseUp:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var b=a.getTarget();org.eclipse.swt.TextUtil._handleSelectionChange(b)}},_onKeyDown:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var b=a.getTarget();org.eclipse.swt.TextUtil._handleSelectionChange(b);if(a.getKeyIdentifier()==$[71]&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isCtrlPressed()&&!a.isMetaPressed()){if(b.hasState("rwt_MULTI")){a.stopPropagation()}if(org.eclipse.swt.TextUtil.hasSelectionListener(b)){org.eclipse.swt.TextUtil._sendWidgetDefaultSelected(b)}}}},_onKeyPress:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var b=a.getTarget();org.eclipse.swt.TextUtil._handleSelectionChange(b)}},_onKeyUp:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var b=a.getTarget();org.eclipse.swt.TextUtil._handleSelectionChange(b)}},_onTextChange:function(a){var b=a.getTarget();org.eclipse.swt.TextUtil._updateMessageLabel(b);if(!org.eclipse.swt.EventUtil.getSuspended()){org.eclipse.swt.TextUtil._handleModification(b);org.eclipse.swt.TextUtil._handleSelectionChange(b)}},_onFontChange:function(a){var b=a.getTarget();org.eclipse.swt.TextUtil._updateLineHeight(b)},_onFocus:function(a){var b=a.getTarget();org.eclipse.swt.TextUtil._updateMessageLabel(b);if(!qx.event.handler.FocusHandler.mouseFocus){org.eclipse.swt.TextUtil._doSetSelection(b)}},_onBlur:function(a){var b=a.getTarget();org.eclipse.swt.TextUtil._updateMessageLabel(b)},_updateLineHeight:function(c){if(c._inputElement!==undefined){var b=c.getFont();var a=Math.floor(b.getSize()*org.eclipse.swt.TextUtil.LINE_HEIGT_FACTOR);c._inputElement.style.lineHeight=a+"px"}},_handleModification:function(b){if(!org.eclipse.swt.TextUtil._isModified(b)){org.eclipse.swt.TextUtil._setModified(b,true);var a=org.eclipse.swt.Request.getInstance();a.addEventListener("send",org.eclipse.swt.TextUtil._onSend,b);if(org.eclipse.swt.TextUtil.hasVerifyOrModifyListener(b)){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(b);var a=org.eclipse.swt.Request.getInstance();a.addEvent($[568],c);qx.client.Timer.once(org.eclipse.swt.TextUtil._delayedSend,b,500)}}},_updateSelectionListener:function(b,a){},_updateVerifyOrModifyListener:function(b,a){},_onSend:function(b){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addParameter(c+".text",this.getComputedValue());a.removeEventListener("send",org.eclipse.swt.TextUtil._onSend,this);org.eclipse.swt.TextUtil._setModified(this,false);if(this.getFocused()){this.setValue(this.getComputedValue())}},_delayedSend:function(b){if(org.eclipse.swt.TextUtil._isModified(this)){var a=org.eclipse.swt.Request.getInstance();a.send()}},_sendWidgetDefaultSelected:function(b){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(b);var a=org.eclipse.swt.Request.getInstance();a.addEvent($[169],c);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()},_isModified:function(a){return a.getUserData("modified")==true},_setModified:function(b,a){b.setUserData("modified",a)},_handleSelectionChange:function(d,a){if(d instanceof qx.ui.form.TextField){var c=a!=null?a:d;var e=d.getSelectionStart();if(e===undefined){e=0}var b=d.getSelectionLength();if(typeof b==$[8]){b=0}if(d.getUserData($[212])!=e||d.getUserData($[195])!=b){d.setUserData($[212],e);org.eclipse.swt.WidgetUtil.setPropertyParam(c,$[212],e);d.setUserData($[195],b);org.eclipse.swt.WidgetUtil.setPropertyParam(c,$[195],b)}}},_createMessageLabel:function(c,b){var a=new qx.ui.basic.Atom(b);a.setAppearance("text-field-message");a.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);a.addEventListener($[2],org.eclipse.swt.TextUtil._onMessageLabelMouseDown,c);a.setParent(c.getParent());c.addEventListener($[565],org.eclipse.swt.TextUtil._onTextPropertyChange,c);c.addEventListener($[198],org.eclipse.swt.TextUtil._onTextPropertyChange,c);c.addEventListener($[149],org.eclipse.swt.TextUtil._onTextPropertyChange,c);c.addEventListener($[309],org.eclipse.swt.TextUtil._onTextPropertyChange,c);c.addEventListener($[56],org.eclipse.swt.TextUtil._onTextPropertyChange,c);c.addEventListener($[76],org.eclipse.swt.TextUtil._onTextPropertyChange,c);c.setUserData($[297],a)},_updateMessageLabel:function(c){var a=c.getUserData($[297]);if(a!=null){a.setLeft(c.getLeft());a.setTop(c.getTop());a.setWidth(c.getWidth());a.setHeight(c.getHeight());a.setZIndex(c.getZIndex()+1);var b=c.getVisibility()&&c.getValue()===""&&!c.getFocused();a.setVisibility(b)}},disposeMessageLabel:function(b){var a=b.getUserData($[297]);if(a!=null){a.setParent(null);a.destroy()}},setMessage:function(c,b){var a=c.getUserData($[297]);if(a==null){org.eclipse.swt.TextUtil._createMessageLabel(c,b);org.eclipse.swt.TextUtil._updateMessageLabel(c)}else{a.setLabel(b)}},_onMessageLabelMouseDown:function(a){this.focus()},_onTextPropertyChange:function(a){var b=a.getTarget();org.eclipse.swt.TextUtil._updateMessageLabel(b)}}});
+qx.Class.define("org.eclipse.swt.widgets.Scale",{extend:qx.ui.layout.CanvasLayout,construct:function(a){arguments.callee.base.call(this);this.setAppearance("scale");this._horizontal=qx.lang.String.contains(a,$[52]);this._hasSelectionListener=false;this._readyToSendChanges=true;this._selection=0;this._minimum=0;this._maximum=100;this._increment=1;this._pageIncrement=10;this._pxStep=1.34;this._line=new qx.ui.basic.Image();if(this._horizontal){this._line.addState(org.eclipse.swt.widgets.Scale.STATE_HORIZONTAL)}this._line.setAppearance("scale-line");this._line.setResizeToInner(true);this._line.addEventListener($[2],this._onLineMouseDown,this);this.add(this._line);this._thumb=new qx.ui.basic.Image();if(this._horizontal){this._thumb.addState(org.eclipse.swt.widgets.Scale.STATE_HORIZONTAL)}this._thumb.setAppearance($[408]);this._thumb.addEventListener($[2],this._onThumbMouseDown,this);this._thumb.addEventListener($[45],this._onThumbMouseMove,this);this._thumb.addEventListener($[15],this._onThumbMouseUp,this);org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._thumb);this.add(this._thumb);this._thumbOffset=0;this._minMarker=new qx.ui.basic.Image();if(this._horizontal){this._minMarker.addState(org.eclipse.swt.widgets.Scale.STATE_HORIZONTAL)}this._minMarker.setAppearance("scale-min-marker");this.add(this._minMarker);this._maxMarker=new qx.ui.basic.Image();if(this._horizontal){this._maxMarker.addState(org.eclipse.swt.widgets.Scale.STATE_HORIZONTAL)}this._maxMarker.setAppearance("scale-max-marker");this.add(this._maxMarker);if(this._horizontal){this.addEventListener($[56],this._onChangeWidth,this)}else{this.addEventListener($[76],this._onChangeHeight,this)}this.addEventListener($[41],this._onContextMenu,this);this.addEventListener($[12],this._onKeyPress,this);this.addEventListener($[55],this._onMouseWheel,this);this._middleMarkers=new Array();this._updateMiddleMarkers()},destruct:function(){this._line.removeEventListener($[2],this._onLineMouseDown,this);this._thumb.removeEventListener($[2],this._onThumbMouseDown,this);this._thumb.removeEventListener($[45],this._onThumbMouseMove,this);this._thumb.removeEventListener($[15],this._onThumbMouseUp,this);if(this._horizontal){this.removeEventListener($[56],this._onChangeWidth,this)}else{this.removeEventListener($[76],this._onChangeHeight,this)}this.removeEventListener($[41],this._onContextMenu,this);this.removeEventListener($[12],this._onKeyPress,this);this.removeEventListener($[55],this._onMouseWheel,this);this._disposeObjects("_line","_thumb","_minMarker","_maxMarker");for(var b=0;b<this._middleMarkers.length;b++){var a=this._middleMarkers[b];a.dispose()}},statics:{STATE_HORIZONTAL:$[52],PADDING:8,MAX_MARKER_OFFSET:12,SCALE_LINE_OFFSET:9,THUMB_OFFSET:10,HALF_THUMB:5,_isNoModifierPressed:function(a){return !a.isCtrlPressed()&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isMetaPressed()}},members:{_onChangeWidth:function(a){this._line.setWidth(this.getWidth()-2*org.eclipse.swt.widgets.Scale.PADDING);this._maxMarker.setLeft(this.getWidth()-org.eclipse.swt.widgets.Scale.MAX_MARKER_OFFSET);this._updateStep();this._updateThumbPosition();this._updateMiddleMarkers()},_onChangeHeight:function(a){this._line.setHeight(this.getHeight()-2*org.eclipse.swt.widgets.Scale.PADDING);this._maxMarker.setTop(this.getHeight()-org.eclipse.swt.widgets.Scale.MAX_MARKER_OFFSET);this._updateStep();this._updateThumbPosition();this._updateMiddleMarkers()},_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_onKeyPress:function(a){var c=a.getKeyIdentifier();var b;if(org.eclipse.swt.widgets.Scale._isNoModifierPressed(a)){switch(c){case"Left":b=this._selection-this._increment;a.preventDefault();a.stopPropagation();break;case"Down":if(this._horizontal){b=this._selection-this._increment}else{b=this._selection+this._increment}a.preventDefault();a.stopPropagation();break;case $[51]:b=this._selection+this._increment;a.preventDefault();a.stopPropagation();break;case"Up":if(this._horizontal){b=this._selection+this._increment}else{b=this._selection-this._increment}a.preventDefault();a.stopPropagation();break;case"Home":b=this._minimum;a.preventDefault();a.stopPropagation();break;case"End":b=this._maximum;a.preventDefault();a.stopPropagation();break;case $[58]:if(this._horizontal){b=this._selection-this._pageIncrement}else{b=this._selection+this._pageIncrement}a.preventDefault();a.stopPropagation();break;case $[57]:if(this._horizontal){b=this._selection+this._pageIncrement}else{b=this._selection-this._pageIncrement}a.preventDefault();a.stopPropagation();break}if(b!=undefined){if(b<this._minimum){b=this._minimum}if(b>this._maximum){b=this._maximum}this.setSelection(b);if(this._readyToSendChanges){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,500)}}}},_onMouseWheel:function(a){if(this.getFocused()){a.preventDefault();a.stopPropagation();var c=Math.round(a.getWheelDelta());var b=this._selection-c;if(b<this._minimum){b=this._minimum}if(b>this._maximum){b=this._maximum}this.setSelection(b);if(this._readyToSendChanges){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,500)}}},_onLineMouseDown:function(b){var d;var a;var c;if(b.isLeftButtonPressed()){if(this._horizontal){d=this._thumb.getLeft()+org.eclipse.swt.widgets.Scale.HALF_THUMB;a=b.getPageX()-qx.bom.element.Location.getLeft(this.getElement())}else{d=this._thumb.getTop()+org.eclipse.swt.widgets.Scale.HALF_THUMB;a=b.getPageY()-qx.bom.element.Location.getTop(this.getElement())}if(a>d){c=this._selection+this._pageIncrement}else{c=this._selection-this._pageIncrement}if(c<this._minimum){c=this._minimum}if(c>this._maximum){c=this._maximum}this.setSelection(c);if(this._readyToSendChanges){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,500)}}},_onThumbMouseDown:function(b){var a;if(b.isLeftButtonPressed()){if(this._horizontal){a=b.getPageX()-qx.bom.element.Location.getLeft(this.getElement());this._thumbOffset=a-this._thumb.getLeft()}else{a=b.getPageY()-qx.bom.element.Location.getTop(this.getElement());this._thumbOffset=a-this._thumb.getTop()}this._thumb.setCapture(true)}},_onThumbMouseMove:function(b){var a;if(this._thumb.getCapture()){if(this._horizontal){a=b.getPageX()-qx.bom.element.Location.getLeft(this.getElement())}else{a=b.getPageY()-qx.bom.element.Location.getTop(this.getElement())}var c=this._getSelectionFromThumbPosition(a-this._thumbOffset);if(this._selection!=c){this.setSelection(c);if(this._readyToSendChanges){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,500)}}}},_onThumbMouseUp:function(a){this._thumb.setCapture(false)},_updateMiddleMarkers:function(){for(var c=0;c<this._middleMarkers.length;c++){var a=this._middleMarkers[c];this.remove(a);a.dispose()}this._middleMarkers=new Array();var b=Math.round((this._maximum-this._minimum)/this._pageIncrement)-1;for(var c=0;c<b;c++){var a=new qx.ui.basic.Image();var d=org.eclipse.swt.widgets.Scale.PADDING+org.eclipse.swt.widgets.Scale.HALF_THUMB+(c+1)*this._pageIncrement*this._pxStep;if(this._horizontal){a.addState(org.eclipse.swt.widgets.Scale.STATE_HORIZONTAL);a.setLeft(d)}else{a.setTop(d)}a.setAppearance("scale-middle-marker");this.add(a);this._middleMarkers[c]=a}},_updateStep:function(){var a=org.eclipse.swt.widgets.Scale.PADDING+org.eclipse.swt.widgets.Scale.HALF_THUMB;if(this._horizontal){this._pxStep=(this.getWidth()-2*a)/(this._maximum-this._minimum)}else{this._pxStep=(this.getHeight()-2*a)/(this._maximum-this._minimum)}},_updateThumbPosition:function(){var a=org.eclipse.swt.widgets.Scale.PADDING+this._pxStep*(this._selection-this._minimum);if(this._horizontal){this._thumb.setLeft(a)}else{this._thumb.setTop(a)}},_getSelectionFromThumbPosition:function(a){var b=(a-org.eclipse.swt.widgets.Scale.PADDING)/this._pxStep+this._minimum;b=Math.round(b);if(b<this._minimum){b=this._minimum}if(b>this._maximum){b=this._maximum}return b},_sendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var b=c.findIdByWidget(this);a.addParameter(b+$[143],this._selection);if(this._hasSelectionListener){a.addEvent($[61],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()}this._readyToSendChanges=true}},setHasSelectionListener:function(a){this._hasSelectionListener=a},setSelection:function(a){this._selection=a;this._updateThumbPosition()},setMinimum:function(a){this._minimum=a;this._updateStep();this._updateThumbPosition();this._updateMiddleMarkers()},setMaximum:function(a){this._maximum=a;this._updateStep();this._updateThumbPosition();this._updateMiddleMarkers()},setIncrement:function(a){this._increment=a},setPageIncrement:function(a){this._pageIncrement=a;this._updateMiddleMarkers()},_visualizeFocus:function(){arguments.callee.base.call(this);this._thumb.addState($[133])},_visualizeBlur:function(){arguments.callee.base.call(this);this._thumb.removeState($[133])}}});
+qx.Class.define("org.eclipse.rwt.widgets.ToolSeparator",{extend:qx.ui.layout.CanvasLayout,construct:function(b,a){arguments.callee.base.call(this);this._line=null;this._control=null;this._vertical=a;if(b){this._line=new qx.ui.basic.Terminator();if(a){this._line.addState($[47])}this._line.setAppearance("toolbar-separator-line");this.add(this._line)}this.setStyleProperty($[211],"0px");this.setStyleProperty($[337],"0px")},properties:{appearance:{refine:true,init:"toolbar-separator"}},members:{_applyWidth:function(e,d){arguments.callee.base.call(this,e,d);if(this._line&&!this._vertical){var c=this._line.getWidth();var b=e*0.5;var a=Math.floor(b-(c*0.5));this._line.setLeft(a)}},_applyHeight:function(e,c){arguments.callee.base.call(this,e,c);if(this._line&&this._vertical){var d=this._line.getHeight();var a=e*0.5;var b=Math.floor(a-(d*0.5));this._line.setTop(b)}},setLineVisible:function(a){if(this._line){this._line.setVisibility(a)}}}});
+qx.Class.define("org.eclipse.swt.theme.BorderDefinitions",{type:$[119],statics:{getDefinition:function(a){return this._definitions[a]},_definitions:{inset:{color:[$[27],$[48],$[48],$[27]],innerColor:[$[255],$[163],$[163],$[255]],width:2},thinInset:{color:[$[27],$[48],$[48],$[27]],width:1},outset:{color:[$[163],$[255],$[255],$[163]],innerColor:[$[48],$[27],$[27],$[48]],width:2},thinOutset:{color:[$[48],$[27],$[27],$[48]],width:1},groove:{color:[$[27],$[48],$[48],$[27]],innerColor:[$[48],$[27],$[27],$[48]],width:2},ridge:{color:[$[48],$[27],$[27],$[48]],innerColor:[$[27],$[48],$[48],$[27]],width:2},shadow:{width:1,color:[$[27],$[27],$[27],$[27]]},verticalDivider:{width:[1,0,1,0],color:[$[27],null,$[48],null]},horizontalDivider:{width:[0,1,0,1],color:[null,$[27],null,$[48]]},"separator.shadowin.horizontal.border":{width:[1,0,1,0],color:[$[163],null,$[48]]},"separator.shadowin.vertical.border":{width:[0,1,0,1],color:[null,$[48],null,$[163]]},"separator.shadowout.horizontal.border":{width:[1,0,1,0],color:[$[48],null,$[27],null]},"separator.shadowout.vertical.border":{width:[0,1,0,1],color:[null,$[27],null,$[48]]}}}});
+qx.Class.define("org.eclipse.rwt.widgets.BasicList",{extend:org.eclipse.swt.widgets.Scrollable,construct:function(b){arguments.callee.base.call(this,new qx.ui.layout.VerticalBoxLayout());this.setAppearance("list");this.setTabIndex(1);this._manager=new qx.ui.selection.SelectionManager(this._clientArea);this.addEventListener($[9],this._onmouseover);this.addEventListener($[2],this._onmousedown);this.addEventListener($[15],this._onmouseup);this.addEventListener($[23],this._onkeydown);this.addEventListener($[12],this._onkeypress);this.addEventListener($[12],this._onkeyinput);this.initOverflow();this.initTabIndex();this._pressedString="";this._lastKeyPress=0;this._itemWidth=0;this._itemHeight=0;var a=this.getManager();a.setMultiSelection(b);a.setDragSelection(false);this.addEventListener($[62],this._ondblclick,this)},destruct:function(){this.removeEventListener($[62],this._ondblclick,this);this._disposeObjects($[321])},members:{getManager:function(){return this._manager},getPreferredWidth:function(){var b=0;var c=this.getItems();for(var d=0;d<c.length;d++){var a=c[d].getPaddingLeft()+c[d].getPaddingRight();var e=c[d].getLabelObject().getPreferredBoxWidth()+a;b=Math.max(b,e)}b+=this._vertScrollBar.getWidth();return b},isRelevantEvent:function(a){var b=a.getTarget();while(b!=null&&b!==this){b=b.getParent()}return b===this},getListItemTarget:function(a){while(a!=null&&a.getParent()!=this._clientArea){a=a.getParent()}return a},getSelectedItem:function(){return this._manager.getSelectedItems()[0]||null},getSelectedItems:function(){return this._manager.getSelectedItems()},_onmouseover:function(a){var b=this.getListItemTarget(a.getTarget());if(b){this._manager.handleMouseOver(b,a)}},_onmousedown:function(a){var b=this.getListItemTarget(a.getTarget());if(b){this._manager.handleMouseDown(b,a)}},_onmouseup:function(a){var b=this.getListItemTarget(a.getTarget());if(b){this._manager.handleMouseUp(b,a)}},_onclick:function(a){var b=this.getListItemTarget(a.getTarget());if(b){this._manager.handleClick(b,a)}},_ondblclick:function(a){var b=this.getListItemTarget(a.getTarget());if(b){this._manager.handleDblClick(b,a)}},_onkeydown:function(c){if(c.getKeyIdentifier()==$[71]&&!c.isAltPressed()){var a=this.getSelectedItems();for(var b=0;b<a.length;b++){a[b].createDispatchEvent("action")}}},_onkeypress:function(a){this._manager.handleKeyPress(a)},_onkeyinput:function(d){if(!d.isAltPressed()&&!d.isCtrlPressed()){if(d.getCharCode()!==0){if(((new Date()).valueOf()-this._lastKeyPress)>1000){this._pressedString=""}this._pressedString+=String.fromCharCode(d.getCharCode());var a=this.findString(this._pressedString,null);if(a){var c=this._manager._getChangeValue();var b=this._manager.getFireChange();this._manager.setFireChange(false);this._manager._deselectAll();this._manager.setItemSelected(a,true);this._manager.setAnchorItem(a);this._manager.setLeadItem(a);a.scrollIntoView();this._manager.setFireChange(b);if(b&&this._manager._hasChanged(c)){this._manager._dispatchChange()}}this._lastKeyPress=(new Date()).valueOf();d.preventDefault()}}},findString:function(b,a){return this._findItem(b,a||0,$[25])},_findItem:function(f,a,e){var c=this.getItems();if(a==null){a=c.indexOf(this.getSelectedItem());if(a==-1){a=0}}var b="matches"+e;for(var d=a;d<c.length;d++){if(c[d][b](f)){return c[d]}}for(var d=0;d<a;d++){if(c[d][b](f)){return c[d]}}return null},setItems:function(e){var c=this.getManager();var j=c.getLeadItem();var f=c.getAnchorItem();var a=c.getSelectedItems();var g=this.getItems();for(var d=0;d<e.length;d++){if(d<g.length){g[d].setLabel(e[d])}else{var h=new qx.ui.form.ListItem();h.addEventListener($[9],this._onListItemMouseOver,this);h.addEventListener($[14],this._onListItemMouseOut,this);h.setStyleProperty($[115],"0px none");h.handleStateChange=function(){};h.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);h.setWidth(this._itemWidth);h.setHeight(this._itemHeight);h.setContextMenu(this.getContextMenu());h.setTabIndex(null);h.setLabel($[150]);h.getLabelObject().setMode(qx.constant.Style.LABEL_MODE_HTML);h.setLabel(e[d]);if(d%2==0){h.addState("even")}this._clientArea.add(h)}}var b=null;while(this._clientArea.getChildrenLength()>e.length){b=this._clientArea.getLastChild();b.removeEventListener($[9],this._onListItemMouseOver,this);b.removeEventListener($[14],this._onListItemMouseOut,this);b._isDisplayable=true;b.destroy()}c.setSelectedItems(a);c.setLeadItem(j);if(c.getMultiSelection()){c.setAnchorItem(f)}this._updateScrollDimension()},getItems:function(){return this.getManager().getItems()},getItemsCount:function(){return this.getItems().length},getItemIndex:function(a){return this._clientArea.indexOf(a)},selectItem:function(a){if(a==-1){this.getManager().deselectAll()}else{var b=this.getItems()[a];this.getManager().setSelectedItem(b);if(this._clientArea.isCreated()&&this._clientArea.isDisplayable()){this.getManager().scrollItemIntoView(b,true)}}},selectItems:function(a){var c=this.getManager();c.deselectAll();for(var b=0;b<a.length;b++){var d=this.getItems()[a[b]];c.setItemSelected(d,true)}},focusItem:function(b){if(b==-1){this.getManager().setLeadItem(null)}else{var a=this.getItems();this.getManager().setLeadItem(a[b])}},selectAll:function(){if(this.getManager().getMultiSelection()==true){this.getManager().selectAll()}},setItemDimensions:function(d,a){this._itemWidth=d;this._itemHeight=a;var b=this.getItems();for(var c=0;c<b.length;c++){b[c].setWidth(this._itemWidth);b[c].setHeight(this._itemHeight)}this._vertScrollBar.setIncrement(a);this._updateScrollDimension()},_updateScrollDimension:function(){var a=this.getItems().length;this._horzScrollBar.setMaximum(this._itemWidth);this._vertScrollBar.setMaximum(this._itemHeight*a)},addState:function(c){arguments.callee.base.call(this,c);if(c.substr(0,8)==$[53]){var a=this.getItems();for(var b=0;b<a.length;b++){a[b].addState(c)}}},removeState:function(c){arguments.callee.base.call(this,c);if(c.substr(0,8)==$[53]){var a=this.getItems();for(var b=0;b<a.length;b++){a[b].removeState(c)}}},_getSelectionIndices:function(){var c=org.eclipse.swt.WidgetManager.getInstance();var f=c.findIdByWidget(this);var d="";var e=this.getManager().getSelectedItems();for(var b=0;b<e.length;b++){var a=this._clientArea.indexOf(e[b]);if(a>=0){if(d!=""){d+=","}d+=String(a)}}return d},_onListItemMouseOver:function(a){a.getTarget().addState("over")},_onListItemMouseOut:function(a){a.getTarget().removeState("over")}}});
+qx.Class.define("org.eclipse.swt.widgets.Combo",{extend:qx.ui.layout.CanvasLayout,construct:function(b){arguments.callee.base.call(this);this._ccombo=false;if(b){this._ccombo=qx.lang.String.contains(b,"ccombo")}this._hasSelectionListener=false;this._hasVerifyModifyListener=false;this._isModified=false;this._selected=null;this._editable=true;this._dropped=false;this._borderWidth=0;this._selectionStart=0;this._selectionLength=0;this._listItemHeight="auto";this._listMaxHeight=0;this._field=new qx.ui.form.TextField();this._field.setTabIndex(null);this._field.setAllowStretchY(true);this.add(this._field);this._button=new qx.ui.form.Button();this._button.setTabIndex(null);this._button.setHeight("100%");this.add(this._button);this._list=new org.eclipse.rwt.widgets.BasicList(false);this._list.setTabIndex(null);this._list.setDisplay(false);this._manager=this._list.getManager();this._manager.setMultiSelection(false);this._manager.setDragSelection(false);this._manager.scrollItemIntoView=this._scrollItemIntoView;this.setHideFocus(true);var a=qx.ui.core.ClientDocument.getInstance();a.addEventListener($[243],this._onBlur,this);if(this._ccombo){this.setAppearance("ccombo");this._field.setAppearance("ccombo-field");this._button.setAppearance("ccombo-button");this._list.setAppearance("ccombo-list")}else{this.setAppearance("combo");this._field.setAppearance("combo-field");this._button.setAppearance("combo-button");this._list.setAppearance("combo-list")}this.addEventListener($[31],this._onAppear,this);this.addEventListener($[230],this._onFocusIn,this);this.addEventListener("blur",this._onBlur,this);this.addEventListener($[56],this._onChangeSize,this);this.addEventListener($[76],this._onChangeSize,this);this.addEventListener($[41],this._onContextMenu,this);this.addEventListener($[83],this._onChangeFont,this);this.addEventListener($[268],this._onChangeTextColor,this);this.addEventListener($[194],this._onChangeBackgroundColor,this);this.addEventListener($[198],this._onChangeVisibility,this);this.addEventListener($[2],this._onMouseDown,this);this.addEventListener($[15],this._onMouseUp,this);this.addEventListener($[29],this._onMouseClick,this);this.addEventListener($[55],this._onMouseWheel,this);this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[14],this._onMouseOut,this);this.addEventListener($[23],this._onKeyDown);this.addEventListener($[12],this._onKeyPress);this._field.addEventListener("blur",this._onTextBlur,this);this._field.addEventListener($[82],this._onTextInput,this);this._list.addEventListener($[31],this._onListAppear,this);this._setupCaptureRestore()},destruct:function(){var a=qx.ui.core.ClientDocument.getInstance();a.removeEventListener($[243],this._onBlur,this);this.removeEventListener($[31],this._onAppear,this);this.removeEventListener($[230],this._onFocusIn,this);this.removeEventListener($[56],this._onChangeSize,this);this.removeEventListener($[76],this._onChangeSize,this);this.removeEventListener($[41],this._onContextMenu,this);this.removeEventListener($[83],this._onChangeFont,this);this.removeEventListener($[268],this._onChangeTextColor,this);this.removeEventListener($[194],this._onChangeBackgroundColor,this);this.removeEventListener($[198],this._onChangeVisibility,this);this.removeEventListener($[2],this._onMouseDown,this);this.removeEventListener($[15],this._onMouseUp,this);this.removeEventListener($[29],this._onMouseClick,this);this.removeEventListener($[55],this._onMouseWheel,this);this.removeEventListener($[9],this._onMouseOver,this);this.removeEventListener($[14],this._onMouseOut,this);this.removeEventListener($[23],this._onKeyDown);this.removeEventListener($[12],this._onKeyPress);this._field.removeEventListener("blur",this._onTextBlur,this);this._field.removeEventListener($[82],this._onTextInput,this);this._list.removeEventListener($[31],this._onListAppear,this);if(this._list&&!qx.core.Object.inGlobalDispose()){this._list.setParent(null)}this._disposeObjects("_field","_button","_list",$[321],"_selected")},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]){this._field.addState(a);this._list.addState(a)}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]){this._field.removeState(a);this._list.removeState(a)}},_onChangeSize:function(a){this._setListBounds()},_onAppear:function(a){if(this._ccombo&&this.hasState($[159])){this._field.addState($[159]);this._button.addState($[159]);this._list.addState($[159])}this.getTopLevelWidget().add(this._list);org.eclipse.swt.TextUtil._updateLineHeight(this._field)},_onFocusIn:function(a){if(this._field.isCreated()&&!org.eclipse.swt.EventUtil.getSuspended()){this._handleSelectionChange()}},_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null&&!this._dropped){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_onChangeFont:function(a){var d=a.getValue();this._field.setFont(d);var b=this._list.getItems();for(var c=0;c<b.length;c++){b[c].setFont(d)}org.eclipse.swt.TextUtil._updateLineHeight(this._field)},_onChangeTextColor:function(a){var b=a.getValue();this._field.setTextColor(b);this._list.setTextColor(b)},_onChangeBackgroundColor:function(a){var b=a.getValue();if(b!=null){this._list.setBackgroundColor(b)}else{this._list.resetBackgroundColor()}},_onChangeVisibility:function(a){var b=a.getValue();if(!b&&this._dropped){this._toggleListVisibility()}},_applyCursor:function(b,a){arguments.callee.base.call(this,b,a);if(b){this._field.setCursor(b);this._button.setCursor(b);this._list.setCursor(b)}else{this._field.resetCursor();this._button.resetCursor();this._list.resetCursor()}},_visualizeFocus:function(){if(this._field.isCreated()){this._field._visualizeFocus()}if(!this._editable){var b=org.eclipse.rwt.FocusIndicator.getInstance();var a=this._ccombo?"CCombo-FocusIndicator":"Combo-FocusIndicator";b.show(this,a,null)}},_ontabfocus:function(){if(this._field.isCreated()){this._field.selectAll()}},_visualizeBlur:function(){if(this._field.isCreated()){this._field.setSelectionLength(0);this._field._visualizeBlur()}if(!this._editable){var a=org.eclipse.rwt.FocusIndicator.getInstance();a.hide(this)}},_onBlur:function(a){if(this._dropped){this._toggleListVisibility()}},_setListBounds:function(){if(this.getElement()){var b=qx.bom.element.Location.get(this.getElement());var d=b.left;var a=b.top;var e=a+this.getHeight();var f=qx.html.Window.getInnerHeight(window);var j=qx.html.Window.getInnerWidth(window);var g=this._list.getPreferredWidth();var i=Math.min(j-d,g);i=Math.max(this.getWidth(),i);var h=this._list.getItemsCount()*this._listItemHeight;var c=Math.min(this._listMaxHeight,h);c+=this._list.getFrameHeight();if(f<e+c&&a>f-e){e=b.top-c}this._list.setLocation(d,e);this._list.setWidth(i);this._list.setHeight(c);this._list.setItemDimensions(i,this._listItemHeight)}},_toggleListVisibility:function(){if(this._list.getItemsCount()){if(this._editable){this._field.setReadOnly(!this._dropped)}if(!this._dropped){this._bringToFront()}this.setCapture(!this._dropped);this._list.setDisplay(!this._dropped);if(this._list.getDisplay()){this._setListBounds()}this._dropped=!this._dropped;if(this._dropped){this._setListSelection(this._selected)}this._updateListScrollBar();if(this.hasState("rwt_CCOMBO")){this._updateListVisibleRequestParam()}}},_updateListScrollBar:function(){if(this._dropped){var a=this._list.getItemsCount()*this._listItemHeight;var b=this._listMaxHeight<a;this._list.setScrollBarsVisible(false,b)}},_resetListSelection:function(){this._manager.deselectAll();this._manager.setLeadItem(null);this._manager.setAnchorItem(null)},_setListSelection:function(a){this._manager.deselectAll();this._manager.setLeadItem(a);this._manager.setAnchorItem(a);this._manager.setSelectedItem(a)},_onListAppear:function(a){if(this._selected){this._selected.scrollIntoView();this._list._syncScrollBars()}},_bringToFront:function(){var a=this.getTopLevelWidget().getChildren();var b=this._list.getZIndex();for(var d in a){var c=a[d];if(c.getZIndex){if(b<c.getZIndex()){b=c.getZIndex()}}}if(b>this._list.getZIndex()){this._list.setZIndex(b+1)}},_setSelected:function(b){this._selected=b;if(b){var a=b.getLabel().toString();this._field.setValue(this._formatText(a));if(this._field.isCreated()){if(!org.eclipse.swt.EventUtil.getSuspended()){this._field.selectAll();this._handleSelectionChange()}}this._setListSelection(b);this._manager.scrollItemIntoView(b)}else{if(!this._editable){this._field.setValue("")}this._resetListSelection()}this._sendWidgetSelected()},_scrollItemIntoView:function(b,a){if(b.isCreated()&&b.isDisplayable()){b.scrollIntoView(a)}},_formatText:function(b){var a=b;a=a.replace(/<[^>]+?>/g,"");a=qx.html.String.unescape(a);return a},_reDispatch:function(c){var b=c.getTarget();var a=b.getParent();if(a===this._list||a===this._list._vertScrollBar){b.dispatchEvent(c,false);c.stopPropagation()}},_onMouseDown:function(a){if(a.isLeftButtonPressed()){if(a.getTarget()==this._field){if(!this._editable||this._dropped){this._toggleListVisibility()}}else{if(this._dropped){this._reDispatch(a)}}}},_onMouseClick:function(a){if(a.isLeftButtonPressed()){if(this._button.hasState("over")){this._button.removeState("over")}var b=a.getTarget();if(b instanceof qx.ui.form.ListItem&&b===this._list.getListItemTarget(b)){this._reDispatch(a);this._toggleListVisibility();this._setSelected(this._manager.getSelectedItem());this.setFocused(true)}else{if(b==this._button||(this._dropped&&b!=this&&b!=this._field&&!this._list.contains(b))){this._toggleListVisibility()}}}},_onMouseUp:function(a){if(!this._dropped){this.setCapture(false)}if(a.getTarget()==this._field&&!org.eclipse.swt.EventUtil.getSuspended()){this._handleSelectionChange()}else{if(this._dropped){this._reDispatch(a)}}},_onMouseWheel:function(a){if(this._dropped){if(!this._list.isRelevantEvent(a)){a.preventDefault();a.stopPropagation()}}else{if(this.getFocused()){a.preventDefault();a.stopPropagation();var c;var b=this._selected;if(b){if(a.getWheelDelta()<0){c=this._manager.getNext(b)}else{c=this._manager.getPrevious(b)}if(c){this._setSelected(c)}}else{if(this._list.getItemsCount()){this._setSelected(this._list.getItems()[0])}}}}},_onMouseOver:function(a){var b=a.getTarget();if(b instanceof qx.ui.form.ListItem){this._setListSelection(b)}else{if(b==this._button){this._button.addState("over")}}},_onMouseOut:function(a){if(a.getTarget()==this._button){this._button.removeState("over")}},_setupCaptureRestore:function(){var a=this._list._vertScrollBar._thumb;a.addEventListener($[15],this._captureRestore,this)},_captureRestore:function(a){this.setCapture(true)},_onKeyDown:function(a){switch(a.getKeyIdentifier()){case $[71]:if(this._dropped){this._toggleListVisibility();this._setSelected(this._manager.getSelectedItem())}else{if(!a.isShiftPressed()&&!a.isAltPressed()&&!a.isCtrlPressed()&&!a.isMetaPressed()){this._sendWidgetDefaultSelected()}}this.setFocused(true);a.stopPropagation();break;case $[118]:if(this._dropped){this._toggleListVisibility()}this.setFocused(true);a.stopPropagation();break;case"Down":case"Up":if(a.isAltPressed()){this._toggleListVisibility()}break}if(this._field.isCreated()&&!org.eclipse.swt.EventUtil.getSuspended()){this._handleSelectionChange()}},_onKeyPress:function(a){switch(a.getKeyIdentifier()){case $[118]:a.stopPropagation();break;case"Tab":if(this._dropped){this._toggleListVisibility()}break;case $[51]:if(this._dropped){var c=this._selected?this._manager.getNext(this._selected):this._manager.getFirst();if(c){this._setSelected(c)}}break;case"Left":if(this._dropped){var c=this._selected?this._manager.getPrevious(this._selected):this._manager.getLast();if(c){this._setSelected(c)}}break;case"Up":case"Down":case $[57]:case $[58]:if(this._selected){this._list._onkeypress(a);var b=this._manager.getSelectedItem();this._setSelected(b)}else{if(this._list.getItemsCount()){this._setSelected(this._list.getItems()[0])}}a.stopPropagation();break}if(this._field.isCreated()&&!org.eclipse.swt.EventUtil.getSuspended()){this._handleSelectionChange()}if(a.getCharCode()!==0){this._onKeyInput(a)}},_onKeyInput:function(a){if(this._dropped&&!a.isAltPressed()&&!a.isCtrlPressed()){this._list._onkeyinput(a);var b=this._manager.getSelectedItem();this._setSelected(b)}},_onTextInput:function(a){if(this._editable){this._isModified=true;this._selected=null;this._resetListSelection();if(!org.eclipse.swt.EventUtil.getSuspended()){var b=org.eclipse.swt.Request.getInstance();b.addEventListener("send",this._onSend,this);if(this._hasVerifyModifyListener){qx.client.Timer.once(this._sendModifyText,this,500)}}}},_onTextBlur:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()&&this._isModified){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.send()}},_onSend:function(a){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addParameter(c+".text",this._field.getComputedValue());b.removeEventListener("send",this._onSend,this);this._isModified=false;this.setValue(this._field.getComputedValue())},_sendModifyText:function(){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.send();this._isModified=false},_sendWidgetSelected:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var e=org.eclipse.swt.WidgetManager.getInstance();var b=org.eclipse.swt.Request.getInstance();var d=e.findIdByWidget(this);var c=this._list;var a=this._list.getSelectedItem();b.addParameter(d+".selectedItem",c.getItemIndex(a));if(this._hasSelectionListener||this._hasVerifyModifyListener){b.addEvent($[61],d);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.send()}}},_sendWidgetDefaultSelected:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var b=c.findIdByWidget(this);if(this._hasSelectionListener){a.addEvent($[169],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()}}},_updateListVisibleRequestParam:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var b=c.findIdByWidget(this);a.addParameter(b+".listVisible",this._list.getDisplay())}},_handleSelectionChange:function(){var e=this._field.getSelectionStart();if(e===undefined){e=0}var b=this._field.getSelectionLength();if(typeof b==$[8]){b=0}if(this._selectionStart!=e||this._selectionLength!=b){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();this._selectionStart=e;a.addParameter(c+".selectionStart",e);this._selectionLength=b;a.addParameter(c+".selectionLength",b)}},setItems:function(a){this._list.setItems(a)},setMaxListHeight:function(a){this._listMaxHeight=a},setListItemHeight:function(a){this._listItemHeight=a},select:function(b){var a=this._list.getItems();var c=null;if(b>=0&&b<=a.length-1){c=a[b]}this._setSelected(c)},setEditable:function(a){this._editable=a;this._field.setReadOnly(!a);this._field.setCursor(a?null:$[38])},setListVisible:function(a){if(this._list.getDisplay()!=a){this._dropped=!a;this._toggleListVisibility()}},setValue:function(a){this._field.setValue(a)},setTextSelection:function(b,a){if(this._field.isCreated()){this._selectionStart=b;this._field.setSelectionStart(b);this._selectionLength=a;this._field.setSelectionLength(a)}},setTextLimit:function(a){this._field.setMaxLength(a)},setHasSelectionListener:function(a){this._hasSelectionListener=a},setHasVerifyModifyListener:function(a){this._hasVerifyModifyListener=a}}});
+qx.Class.define("org.eclipse.rwt.FocusIndicator",{type:$[33],extend:qx.core.Object,construct:function(){arguments.callee.base.call(this);this._frame=null},members:{_createFrame:function(){this._frame=document.createElement("div");this._frame.setAttribute("id","focusIndicator");this._frame.style.position=$[28];this._frame.style.fontSize=0;this._frame.style.lineHeight=0;this._frame.style.zIndex=0},_createTheme:function(h,b,n){var g=null;var m=typeof h.__states!=$[8]?h.__states:{};var i=new org.eclipse.swt.theme.ThemeValues(m);var f=i.getCssBorder(b,$[4]);var k=i.getCssFloat(b,$[43]);var j=f instanceof org.eclipse.rwt.Border;var e=i.getCssBoxDimensions(b,$[96]);var l=i.getCssBoxDimensions(b,$[36]);if(!l){l=[0,0,0,0]}var d=l[0]==0&&l[1]==0&&l[2]==0&&l[3]==0;var a=!d&&n!=null;if(j&&(e!=null||a)){var c=i.getCssColor(b,$[5]);g={backgroundColor:c!=$[8]?c:"",opacity:k,border:f,margin:e,padding:a?l:null}}return g},show:function(d,c,b){this.hide();if(d.isCreated()){var f=this._createTheme(d,c,b);if(f!=null){var a=d._getTargetNode();if(this._frame==null){this._createFrame()}if(this._frame.parentNode!=a){if(a.hasChildNodes()){var e=a.firstChild;a.insertBefore(this._frame,e)}else{a.appendChild(this._frame)}}this._styleFocusIndicator(f);this._layoutFocusIndicator(d,f,b)}}},hide:function(){if(this._frame!=null&&this._frame.parentNode!=null){this._frame.parentNode.removeChild(this._frame)}},_styleFocusIndicator:function(g){var e=g[$[4]];var b=this._frame.style;var f=["Left","Top","Bottom",$[51]];for(var h=0;h<4;h++){var c=f[h];var d=e["getColor"+c]();var j=e["getStyle"+c]();var a=e["getWidth"+c]();b[$[4]+c+"Width"]=a==null?"0px":a+"px";b[$[4]+c+"Style"]=j==null?"none":j;b[$[4]+c+"Color"]=d==null?"":d}b.backgroundColor=g[$[77]];this._styleFocusIndiactorOpacity(g[$[43]])},_styleFocusIndiactorOpacity:qx.core.Variant.select($[0],{"default":function(c){var b=this._frame.style;var a=c==1?"":c;b.opacity=a;b.KhtmlOpacity=a;b.MozOpacity=a},mshtml:function(c){var b=this._frame.style;var a=c==1?"":"Alpha(Opacity="+(c*100)+")";b.filter=a}}),_layoutFocusIndicator:function(e,d,i){var c=d[$[4]];var a=[];if(d[$[36]]!=null){var g=d[$[36]];a[0]=parseInt(i.style.left)-g[3];a[1]=parseInt(i.style.top)-g[0];a[2]=parseInt(i.style.width)+g[1]+g[3];a[3]=parseInt(i.style.height)+g[2]+g[0]}else{var b=d[$[96]];e._invalidateBoxWidth();e._invalidateBoxHeight();var h=e.getBoxWidth()-e._cachedBorderLeft-e._cachedBorderRight;var f=e.getBoxHeight()-e._cachedBorderTop-e._cachedBorderBottom;e._invalidateBoxWidth();e._invalidateBoxHeight();a[0]=b[3];a[1]=b[0];a[2]=h-(b[3]+b[1]);a[3]=f-(b[0]+b[2]);a[2]=Math.max(0,a[2]);a[3]=Math.max(0,a[3])}this._frame.style.left=a[0]+"px";this._frame.style.top=a[1]+"px";this._frame.style.width=a[2]+"px";this._frame.style.height=a[3]+"px"}}});
+qx.Class.define("org.eclipse.swt.CLabelUtil",{statics:{SHOW_BOTH:"both",APPEARANCE:"clabel",initialize:function(b){b.setVerticalChildrenAlign(qx.constant.Layout.ALIGN_MIDDLE);b.setHorizontalChildrenAlign(qx.constant.Layout.ALIGN_LEFT);b.setAppearance(org.eclipse.swt.CLabelUtil.APPEARANCE);b.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);b.setLabel($[150]);var a=b.getLabelObject();a.setMode(qx.constant.Style.LABEL_MODE_HTML);a.setTextOverflow(false);a.setAppearance($[518]);b.getLabelObject().setWrap(false);b.setLabel("");b.setHideFocus(true);b.setShow(org.eclipse.swt.CLabelUtil.SHOW_BOTH);b.addEventListener($[9],org.eclipse.swt.CLabelUtil._onMouseOver);b.addEventListener($[14],org.eclipse.swt.CLabelUtil._onMouseOut)},_onMouseOver:function(b){var a=b.getTarget();a.addState("over")},_onMouseOut:function(b){var a=b.getTarget();a.removeState("over")}}});
+qx.Class.define("org.eclipse.swt.graphics.GC",{extend:qx.core.Object,construct:function(a){arguments.callee.base.call(this);this._control=a;this._control.addEventListener($[107],this._onControlCreate,this);this._vmlCanvas=null;if(qx.core.Variant.isSet($[0],$[18])){this._vmlCanvas=org.eclipse.rwt.VML.createCanvas();this._canvas=org.eclipse.rwt.VML.getCanvasNode(this._vmlCanvas);this._context=new org.eclipse.rwt.VMLCanvas(this._vmlCanvas)}else{this._canvas=document.createElement("canvas");this._context=this._canvas.getContext("2d")}this._textCanvas=document.createElement("div");this._textCanvas.style.position=$[28];this._textCanvas.style.overflow=$[17];this._textCanvas.style.left="0px";this._textCanvas.style.top="0px";if(this._control.isCreated()){this._addCanvasToDOM()}},destruct:function(){this._control.removeEventListener($[107],this._onControlCreate,this);this._control=null;this._canvas=null;if(this._context.dispose){this._context.dispose()}this._context=null;this._textCanvas=null},members:{_onControlCreate:function(){this._addCanvasToDOM()},_addCanvasToDOM:function(){var b=this._control._getTargetNode();var a=b.firstChild;if(a){b.insertBefore(this._canvas,a);b.insertBefore(this._textCanvas,a)}else{b.appendChild(this._canvas);b.appendChild(this._textCanvas)}},init:qx.core.Variant.select($[0],{mshtml:function(d,a,b,c,e){qx.ui.core.Widget.flushGlobalQueues();this._initTextCanvas(d,a);this._context.clearRect(0,0,d,a);this._initFields(b,c,e)},"default":function(d,a,b,c,e){this._initTextCanvas(d,a);this._canvas.width=d;this._canvas.style.width=d+"px";this._canvas.height=a;this._canvas.style.height=a+"px";this._context.clearRect(0,0,d,a);this._initFields(b,c,e)}}),_initTextCanvas:function(b,a){this._textCanvas.width=b;this._textCanvas.style.width=b+"px";this._textCanvas.height=a;this._textCanvas.style.height=a+"px";this._textCanvas.innerHTML=""},_initFields:function(a,b,c){this._context.strokeStyle=c;this._context.fillStyle=b;this._context.globalAlpha=1;this._context.lineWidth=1;this._context.lineCap="butt";this._context.lineJoin="miter";this._context.font=a},setProperty:function(a,b){switch(a){case"foreground":this._context.strokeStyle=b;break;case $[189]:this._context.fillStyle=b;break;case"alpha":this._context.globalAlpha=b/255;break;case"lineWidth":this._context.lineWidth=b>1?b:1;break;case"lineCap":switch(b){case 1:this._context.lineCap="butt";break;case 2:this._context.lineCap="round";break;case 3:this._context.lineCap="square";break}break;case"lineJoin":switch(b){case 1:this._context.lineJoin="miter";break;case 2:this._context.lineJoin="round";break;case 3:this._context.lineJoin="bevel";break}break;case"font":this._context.font=b;break}},drawLine:function(b,d,a,c){var e=this._getOffset(false);this._context.beginPath();this._context.moveTo(b+e,d+e);this._context.lineTo(a+e,c+e);this._stroke(false)},drawPoint:function(a,b){this._context.save();this._context.fillStyle=this._context.strokeStyle;this._context.beginPath();this._context.lineWidth=1;this._context.rect(a,b,1,1);this._stroke(true);this._context.restore()},drawRectangle:function(b,f,c,a,d){var e=this._getOffset(d);this._context.beginPath();this._context.rect(b+e,f+e,c,a);this._stroke(d)},drawRoundRectangle:function(h,f,a,k,j,b,l){var d=this._getOffset(l);var i=h+d;var g=f+d;var e=j/2+1;var c=b/2+1;this._context.beginPath();this._context.moveTo(i,g+c);this._context.lineTo(i,g+k-c);this._context.quadraticCurveTo(i,g+k,i+e,g+k);this._context.lineTo(i+a-e,g+k);this._context.quadraticCurveTo(i+a,g+k,i+a,g+k-c);this._context.lineTo(i+a,g+c);this._context.quadraticCurveTo(i+a,g,i+a-e,g);this._context.lineTo(i+e,g);this._context.quadraticCurveTo(i,g,i,g+c);this._stroke(l)},fillGradientRectangle:function(l,i,b,m,f){var c=l;var k=i;var e=false;if(b<0){c+=b;if(!f){e=true}}if(m<0){k+=m;if(f){e=true}}var a=f?c:c+Math.abs(b);var h=f?k+Math.abs(m):k;var g=e?this._context.fillStyle:this._context.strokeStyle;var d=e?this._context.strokeStyle:this._context.fillStyle;var j=this._context.createLinearGradient(c,k,a,h);j.addColorStop(0,g);j.addColorStop(1,d);this._context.save();this._context.fillStyle=j;this.drawRectangle(l,i,b,m,true);this._context.restore()},drawArc:qx.core.Variant.select($[0],{mshtml:function(g,f,c,h,e,j,i){var b=c/2;var a=h/2;var d=this._getOffset(i);this._context.save();this._context.beginPath();this._context.arc(g+b+d,f+a+d,b,a,-e*Math.PI/180,-(e+j)*Math.PI/180,true);this._stroke(i);this._context.restore()},"default":function(g,f,a,h,d,j,i){if(a>0&&h>0){var c=a/2;var e=h/2;var b=this._getOffset(i);this._context.save();this._context.beginPath();this._context.translate(g+c+b,f+e+b);this._context.scale(1,h/a);this._context.arc(0,0,c,-d*Math.PI/180,-(d+j)*Math.PI/180,true);this._stroke(i);this._context.restore()}}}),drawPolyline:function(b,e,c){var d=this._getOffset(c);this._context.beginPath();for(var a=1;a<b.length;a+=2){if(a==1){this._context.moveTo(b[a-1]+d,b[a]+d)}else{this._context.lineTo(b[a-1]+d,b[a]+d)}}if(b.length>1&&e){this._context.lineTo(b[0]+d,b[1]+d)}this._stroke(c&&e)},drawText:function(e,a,f,d){var b=document.createElement("div");var c=b.style;c.position=$[28];c.left=a+"px";c.top=f+"px";c.color=this._context.strokeStyle;if(d){c.backgroundColor=this._context.fillStyle}if(this._context.font!=""){c.font=this._context.font}b.innerHTML=e;this._textCanvas.appendChild(b)},drawImage:function(j,h,g,f,m,k,i,l,c,a){var b=this._context;var d=new Image();d.src=j;if(d.complete||qx.core.Variant.isSet($[0],$[18])){if(a){b.drawImage(d,k,i)}else{b.drawImage(d,h,g,f,m,k,i,l,c)}}else{var e=b.globalAlpha;d.onload=function(){b.save();b.globalAlpha=e;if(a){b.drawImage(d,k,i)}else{b.drawImage(d,h,g,f,m,k,i,l,c)}b.restore()}}},_stroke:function(a){if(a){this._context.fill()}else{this._context.stroke()}},_getOffset:function(b){var a=0;if(!b&&this._context.lineWidth%2!==0){a=0.5}return a}}});
+qx.Class.define("org.eclipse.rwt.VMLCanvas",{extend:qx.core.Object,construct:function(a){this._autoDispose=false;arguments.callee.base.call(this);this._canvas=a;this._stateStack=[];this._currentPath=[];this.strokeStyle=$[305];this.fillStyle=$[305];this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=10;this.globalAlpha=1},destruct:function(){this._canvas=null},members:{save:function(){var a={};this._copyState(this,a);this._stateStack.push(a)},restore:function(){var a=this._stateStack.pop();this._copyState(a,this)},beginPath:function(){this._currentPath=[]},closePath:function(){this._currentPath.push({type:"close"})},clearRect:function(b,d,c,a){org.eclipse.rwt.VML.clearCanvas(this._canvas)},stroke:function(b){var a=org.eclipse.rwt.VML.createShapeFromContext(this,b);org.eclipse.rwt.VML.addToCanvas(this._canvas,a)},fill:function(){this.stroke(true)},moveTo:function(a,b){this._currentPath.push({type:"moveTo",x:a,y:b})},lineTo:function(a,b){this._currentPath.push({type:"lineTo",x:a,y:b})},quadraticCurveTo:function(c,b,a,d){this._currentPath.push({type:$[450],cp1x:c,cp1y:b,x:a,y:d})},bezierCurveTo:function(c,b,e,d,a,f){this._currentPath.push({type:$[455],cp1x:c,cp1y:b,cp2x:e,cp2y:d,x:a,y:f})},rect:function(b,d,c,a){this.moveTo(b,d);this.lineTo(b+c,d);this.lineTo(b+c,d+a);this.lineTo(b,d+a);this.closePath()},arc:function(i,h,b,a,f,c,g){if(this._currentPath.length==0){var e=i+Math.cos(f)*b;var d=h+Math.sin(f)*a;this.moveTo(e,d)}this._currentPath.push({type:"arc",anticlockwise:g,centerX:i,centerY:h,radiusX:b,radiusY:a,startAngle:f,endAngle:c})},drawImage:function(){var g=org.eclipse.rwt.VML.createShape($[35]);org.eclipse.rwt.VML.setOpacity(g,this.globalAlpha);var b=arguments[0];if(arguments.length==3){var i=arguments[1];var h=arguments[2];org.eclipse.rwt.VML.setImageData(g,b.src,i,h,b.width,b.height)}else{var f=arguments[1];var e=arguments[2];var c=arguments[3];var k=arguments[4];var i=arguments[5];var h=arguments[6];var j=arguments[7];var a=arguments[8];var d=[e/b.height,(b.width-f-c)/b.width,(b.height-e-k)/b.height,f/b.width];org.eclipse.rwt.VML.setImageData(g,b.src,i,h,j,a,d)}org.eclipse.rwt.VML.addToCanvas(this._canvas,g)},createLinearGradient:function(b,d,a,c){var e=new Array();e.addColorStop=this._addColorStopFunction;e.horizontal=b!=a;return e},_copyState:function(a,b){b.font=a.font;b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX=a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.globalAlpha=a.globalAlpha},_addColorStopFunction:function(b,a){this.push([b,a])}}});
+qx.Class.define("org.eclipse.swt.widgets.Composite",{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this.setAppearance("composite");this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this.setHideFocus(true);this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[14],this._onMouseOut,this);if(qx.core.Variant.isSet($[0],$[18])){this._fixBackgroundTransparency();this.addEventListener($[194],this._fixBackgroundTransparency,this)}qx.ui.core.Widget.disableScrolling(this)},destruct:function(){this.removeEventListener($[9],this._onMouseOver,this);this.removeEventListener($[14],this._onMouseOut,this)},members:{_onMouseOver:function(a){this.addState("over")},_onMouseOut:function(a){this.removeState("over")},_applyBackgroundImage:qx.core.Variant.select($[0],{mshtml:function(b,a){arguments.callee.base.call(this,b,a);if(b==null){this._fixBackgroundTransparency()}},"default":function(b,a){arguments.callee.base.call(this,b,a)}}),_fixBackgroundTransparency:function(){if(this.getBackgroundColor()==null&&this.getBackgroundImage()==null){this._applyBackgroundImage($[351],null)}}}});
+qx.Class.define("org.eclipse.swt.widgets.Sash",{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this.setOverflow(null);this.setHtmlProperty($[479],"on");this.addEventListener($[56],this._onChangeSize,this);this.addEventListener($[76],this._onChangeSize,this);this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[14],this._onMouseOut,this);this._slider=new qx.ui.layout.CanvasLayout();this._slider.setAppearance("sash-slider");this._slider.setVisibility(false);org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._slider);this.add(this._slider);this._sliderHandle=new qx.ui.layout.CanvasLayout();this._sliderHandle.setStyleProperty($[350],$[457]);this._sliderHandle.setAppearance($[528]);this._sliderHandle.setVisibility(false);org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._sliderHandle);this.add(this._sliderHandle);this._handle=new qx.ui.layout.CanvasLayout();this._handle.setStyleProperty($[350],$[457]);this._handle.setAppearance($[528]);org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._handle);this.add(this._handle);this.initOrientation();this._bufferZIndex=null},destruct:function(){this.removeEventListener($[56],this._onChangeSize,this);this.removeEventListener($[76],this._onChangeSize,this);this.removeEventListener($[9],this._onMouseOver,this);this.removeEventListener($[14],this._onMouseOut,this);this._removeStyle(this.getOrientation());this._disposeObjects("_slider","_handle","_sliderHandle")},properties:{appearance:{refine:true,init:"sash"},orientation:{check:[$[52],$[47]],apply:$[449],init:$[52],nullable:true}},members:{_onChangeSize:function(a){this._handle.setWidth(this.getWidth());this._handle.setHeight(this.getHeight())},_onMouseDownX:function(a){if(a.isLeftButtonPressed()){if(this.getEnabled()){this._commonMouseDown();this._dragOffset=a.getPageX();this._minMove=-this.getLeft()-this._frameOffset;this._maxMove=this.getParent().getWidth()-this.getLeft()-this.getWidth()-this._frameOffset}}},_onMouseDownY:function(a){if(a.isLeftButtonPressed()){if(this.getEnabled()){this._commonMouseDown();this._dragOffset=a.getPageY();this._minMove=-this.getTop()-this._frameOffset;this._maxMove=this.getParent().getHeight()-this.getTop()-this.getHeight()-this._frameOffset}}},_commonMouseDown:function(){this.setCapture(true);this.getTopLevelWidget().setGlobalCursor(this.getCursor());this._frameOffset=this.getFrameWidth()/2;this._slider.setLeft(0-this._frameOffset);this._slider.setTop(0-this._frameOffset);this._slider.setWidth(this.getWidth());this._slider.setHeight(this.getHeight());this._sliderHandle.setLeft(0);this._sliderHandle.setTop(0);this._sliderHandle.setWidth(this.getWidth());this._sliderHandle.setHeight(this.getHeight());this._bufferZIndex=this.getZIndex();this.setZIndex(10000000);this._slider.show();this._sliderHandle.show();this._sendWidgetSelected()},_onMouseUpX:function(a){if(this.getCapture()){this._commonMouseUp()}},_onMouseUpY:function(a){if(this.getCapture()){this._commonMouseUp()}},_commonMouseUp:function(){this._slider.hide();this._sliderHandle.hide();this.setCapture(false);this.getTopLevelWidget().setGlobalCursor(null);if(this._bufferZIndex!=null){this.setZIndex(this._bufferZIndex)}var a=org.eclipse.swt.WidgetUtil;a._fakeMouseEvent(this,$[14]);this._sendWidgetSelected()},_onMouseMoveX:function(b){if(this.getCapture()){if(this.getTopLevelWidget().getGlobalCursor()!=this.getCursor()){this.getTopLevelWidget().setGlobalCursor(this.getCursor())}var a=b.getPageX()-this._dragOffset;this._slider.setLeft(this._normalizeMove(a));this._sliderHandle.setLeft(this._normalizeMove(a))}},_onMouseMoveY:function(b){if(this.getCapture()){if(this.getTopLevelWidget().getGlobalCursor()!=this.getCursor()){this.getTopLevelWidget().setGlobalCursor(this.getCursor())}var a=b.getPageY()-this._dragOffset;this._slider.setTop(this._normalizeMove(a));this._sliderHandle.setTop(this._normalizeMove(a))}},_normalizeMove:function(b){var a=b;if(a<this._minMove){a=this._minMove}if(a>this._maxMove){a=this._maxMove}return a},_applyOrientation:function(b,a){this._removeStyle(a);this._setStyle(b)},_setStyle:function(a){if(a==$[52]){this.addEventListener($[2],this._onMouseDownY,this);this.addEventListener($[45],this._onMouseMoveY,this);this.addEventListener($[15],this._onMouseUpY,this);this.addState($[52]);this._handle.addState($[52]);this._sliderHandle.addState($[52])}else{if(a==$[47]){this.addEventListener($[45],this._onMouseMoveX,this);this.addEventListener($[2],this._onMouseDownX,this);this.addEventListener($[15],this._onMouseUpX,this);this.addState($[47]);this._handle.addState($[47]);this._sliderHandle.addState($[47])}}},_removeStyle:function(a){if(a==$[52]){this.removeEventListener($[2],this._onMouseDownY,this);this.removeEventListener($[45],this._onMouseMoveY,this);this.removeEventListener($[15],this._onMouseUpY,this);this.removeState($[52]);this._handle.removeState($[52]);this._sliderHandle.removeState($[52])}else{if(a==$[47]){this.removeEventListener($[2],this._onMouseDownX,this);this.removeEventListener($[45],this._onMouseMoveX,this);this.removeEventListener($[15],this._onMouseUpX,this);this.removeState($[47]);this._handle.removeState($[47]);this._sliderHandle.removeState($[47])}}},_sendWidgetSelected:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=this._slider.getLeft()+this._frameOffset;var a=this._slider.getTop()+this._frameOffset;var e=org.eclipse.swt.WidgetManager.getInstance();var d=e.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addEvent($[61],d);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.addParameter(d+$[295],this.getLeft()+c);b.addParameter(d+$[294],this.getTop()+a);b.addParameter(d+$[315],this.getWidth());b.addParameter(d+$[280],this.getHeight());if(this.getCapture()){b.addParameter($[349],"drag")}b.send()}},_onMouseOver:function(a){this.addState("over")},_onMouseOut:function(a){this.removeState("over")}}});
 qx.Class.define("org.eclipse.swt.widgets.Canvas",{extend:org.eclipse.swt.widgets.Composite,construct:function(){arguments.callee.base.call(this);this._gc=null},destruct:function(){if(this._gc!=null){this._gc.dispose();this._gc=null}},members:{getGC:function(){if(this._gc==null){this._gc=new org.eclipse.swt.graphics.GC(this)}return this._gc},_onCanvasAppear:function(){var a=org.eclipse.rwt.GraphicsUtil;if(this._gfxCanvasAppended){a.handleAppear(this._gfxCanvas)}if(this._gc!=null&&this._gc._vmlCanvas){a.handleAppear(this._gc._vmlCanvas)}}}});
-qx.Class.define("org.eclipse.swt.widgets.List",{extend:org.eclipse.rwt.widgets.BasicList,construct:function(c){arguments.callee.base.call(this,c);this._topIndex=0;this._changeSelectionNotification="state";var a=org.eclipse.swt.Request.getInstance();a.addEventListener("send",this._onSendRequest,this);var b=this.getManager();b.addEventListener($[354],this._onChangeLeadItem,this);b.addEventListener($[284],this._onSelectionChange,this);this.addEventListener($[74],this._onFocusIn,this);this.addEventListener("blur",this._onFocusOut,this);this.addEventListener($[61],this._onDblClick,this);this.addEventListener($[31],this._onAppear,this)},destruct:function(){var a=org.eclipse.swt.Request.getInstance();a.removeEventListener("send",this._onSendRequest,this);var b=this.getManager();b.removeEventListener($[354],this._onChangeLeadItem,this);b.removeEventListener($[284],this._onSelectionChange,this);this.removeEventListener($[74],this._onFocusIn,this);this.removeEventListener("blur",this._onFocusOut,this);this.removeEventListener($[61],this._onDblClick,this);this.removeEventListener($[31],this._onAppear,this)},members:{setTopIndex:function(a){this._topIndex=a;this._applyTopIndex(a)},_applyTopIndex:function(b){var a=this.getManager().getItems();if(a.length>0&&a[0].isCreated()){var c=this.getManager().getItemHeight(a[0]);if(c>0){this._clientArea.setScrollTop(b*c)}}},_getTopIndex:function(){var b=0;var c=this._clientArea.getScrollTop();var a=this.getManager().getItems();if(a.length>0){var d=this.getManager().getItemHeight(a[0]);if(d>0){b=Math.round(c/d)}}return b},_onAppear:function(a){this._applyTopIndex(this._topIndex)},setChangeSelectionNotification:function(a){this._changeSelectionNotification=a},_onChangeLeadItem:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var e=c.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();var d=this._clientArea.indexOf(this.getManager().getLeadItem());b.addParameter(e+$[539],d)}},_onSelectionChange:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var d=c.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addParameter(d+$[144],this._getSelectionIndices());if(this._changeSelectionNotification=="action"){b.addEvent($[64],d);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.send()}}this._updateSelectedItemState()},_onSendRequest:function(a){var b=this._isCreated?this._getTopIndex():0;if(this._topIndex!=b){var e=org.eclipse.swt.WidgetManager.getInstance();var d=e.findIdByWidget(this);var c=org.eclipse.swt.Request.getInstance();c.addParameter(d+".topIndex",b);this._topIndex=b}},_onDblClick:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){if(this._changeSelectionNotification=="action"){var c=org.eclipse.swt.WidgetManager.getInstance();var d=c.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addEvent($[165],d);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.send()}}},_onFocusIn:function(a){this._updateSelectedItemState()},_onFocusOut:function(a){this._updateSelectedItemState()},_updateSelectedItemState:function(){var b=this.getManager().getSelectedItems();for(var a=0;a<b.length;a++){if(this.getFocused()){b[a].removeState($[89])}else{b[a].addState($[89])}}}}});
-qx.Class.define("org.eclipse.swt.TabUtil",{statics:{createTabItem:function(g,f,a){var d=new qx.ui.pageview.tabview.Button();d.setTabIndex(null);d.setLabel($[139]);d.getLabelObject().setMode("html");d.setLabel("");d.setEnableElementFocus(false);d.addEventListener($[370],org.eclipse.swt.TabUtil._onTabItemChangeFocus);d.addEventListener($[29],org.eclipse.swt.TabUtil._onTabItemClick);var e=org.eclipse.swt.WidgetManager.getInstance();var b=e.findWidgetById(f);b.getBar().addAt(d,a);var c=new qx.ui.pageview.tabview.Page(d);b.getPane().add(c);e.add(d,g);e.add(c,g+"pg")},releaseTabItem:function(b){var c=org.eclipse.swt.WidgetManager.getInstance();var a=c.findWidgetById(b);a.removeEventListener($[370],org.eclipse.swt.TabUtil._onTabItemChangeFocus);a.removeEventListener($[29],org.eclipse.swt.TabUtil._onTabItemClick);c.dispose(b+"pg")},_onTabItemChangeFocus:function(a){if(a.getTarget().getFocused()){a.getTarget().getParent().getParent().focus()}},_onTabItemClick:function(a){var b=a.getTarget().getParent().getParent();if(!b.getFocused()){b.focus()}},onTabFolderKeyPress:function(a){var d=a.getTarget();if(d.classname==$[433]){var b=d.getBar().getManager();var c=b.getSelected();if(c!=null){switch(a.getKeyIdentifier()){case"Left":b.selectPrevious(c);org.eclipse.swt.TabUtil.markTabItemFocused(d,a.getTarget());a.stopPropagation();break;case $[53]:b.selectNext(c);org.eclipse.swt.TabUtil.markTabItemFocused(d,a.getTarget());a.stopPropagation();break}}}},onTabFolderChangeFocused:function(a){var c=a.getTarget();var b=c.getBar().getManager().getSelected();org.eclipse.swt.TabUtil.markTabItemFocused(c,b)},markTabItemFocused:function(d,c){var a=d.getBar().getManager().getItems();for(var b=0;b<a.length;b++){a[b].removeState($[123])}if(c!=null&&d.getFocused()){c.addState($[123])}},tabSelected:function(a){var b=a.getTarget();if(!org.eclipse.swt.EventUtil.getSuspended()&&b.getChecked()){var f=org.eclipse.swt.WidgetManager.getInstance();var d=f.findIdByWidget(b);var c=org.eclipse.swt.Request.getInstance();c.addParameter("org.eclipse.swt.events.widgetSelected.item",d);var e=f.findIdByWidget(b.getParent().getParent());org.eclipse.swt.EventUtil.doWidgetSelected(e,0,0,0,0)}}}});
-qx.Class.define("org.eclipse.swt.widgets.DateTimeCalendar",{extend:qx.ui.layout.CanvasLayout,construct:function(c,b,a){arguments.callee.base.call(this);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this.setAppearance("datetime-calendar");this._hasSelectionListener=false;org.eclipse.swt.widgets.Calendar.MONTH_NAMES=b;org.eclipse.swt.widgets.Calendar.WEEKDAY_NAMES=a;this._calendar=new org.eclipse.swt.widgets.Calendar();this._calendar.addEventListener($[340],this._onChangeDate,this);this._calendar.setDate(new Date(74,5,6));this._calendar.setTabIndex(null);this.add(this._calendar);this.addEventListener($[41],this._onContextMenu,this);this.addEventListener($[12],this._onKeyPress,this);this.addEventListener($[56],this._onmousewheel,this);this.addEventListener($[74],this._onFocusIn,this);this.addEventListener("blur",this._onFocusOut,this);this._updateSelectedDayState()},destruct:function(){this._calendar.removeEventListener($[340],this._onChangeDate,this);this.removeEventListener($[41],this._onContextMenu,this);this.removeEventListener($[12],this._onKeyPress,this);this.removeEventListener($[56],this._onmousewheel,this);this.removeEventListener($[74],this._onFocusIn,this);this.removeEventListener("blur",this._onFocusOut,this);this._disposeObjects("_calendar")},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]){this._calendar.addState(a)}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]){this._calendar.removeState(a)}},_onChangeDate:function(){var a=this._calendar.getDate();this._sendChanges(a.getDate(),a.getMonth(),a.getFullYear())},_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_onKeyPress:function(a){this._calendar._onkeypress(a)},_onmousewheel:function(a){a.preventDefault();a.stopPropagation()},_onFocusIn:function(a){this._updateSelectedDayState()},_onFocusOut:function(a){this._updateSelectedDayState()},_updateSelectedDayState:function(){for(var a=0;a<6*7;a++){if(this.getFocused()){this._calendar._dayLabelArr[a].removeState($[89])}else{this._calendar._dayLabelArr[a].addState($[89])}}},_sendChanges:function(a,d,b){if(!org.eclipse.swt.EventUtil.getSuspended()){var f=org.eclipse.swt.WidgetManager.getInstance();var c=org.eclipse.swt.Request.getInstance();var e=f.findIdByWidget(this);c.addParameter(e+".day",a);c.addParameter(e+".month",d);c.addParameter(e+".year",b);if(this._hasSelectionListener){c.addEvent($[64],e);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();c.send()}}},setMonth:function(b){var a=this._calendar.getDate();a.setMonth(b);this._calendar.setDate(a)},setDay:function(b){var a=this._calendar.getDate();a.setDate(b);this._calendar.setDate(a)},setYear:function(b){var a=this._calendar.getDate();a.setYear(b);this._calendar.setDate(a)},setHasSelectionListener:function(a){this._hasSelectionListener=a},setFont:function(){}}});
-qx.Class.define("org.eclipse.swt.widgets.Calendar",{extend:qx.ui.layout.BoxLayout,construct:function(c){arguments.callee.base.call(this);this.setOrientation($[46]);var b=new qx.ui.layout.BoxLayout;b.setAppearance("calendar-navBar");b.set({height:"auto",spacing:1});var f=new qx.ui.form.Button;var a=new qx.ui.form.Button;var m=new qx.ui.basic.Label;var g=new qx.ui.form.Button;var d=new qx.ui.form.Button;var l=org.eclipse.swt.WidgetManager.getInstance();l.setToolTip(f,"Previous year");l.setToolTip(a,"Previous month");l.setToolTip(g,"Next month");l.setToolTip(d,"Next year");f.set({show:"icon",spacing:0,tabIndex:null});f.setUserData($[206],true);a.set({show:"icon",tabIndex:null});a.setUserData($[206],true);g.set({show:"icon",tabIndex:null});g.setUserData($[206],true);d.set({show:"icon",tabIndex:null});d.setUserData($[206],true);f.setAppearance("calendar-toolbar-previous-year-button");a.setAppearance("calendar-toolbar-previous-month-button");g.setAppearance("calendar-toolbar-next-month-button");d.setAppearance("calendar-toolbar-next-year-button");f.addEventListener($[29],this._onNavButtonClicked,this);a.addEventListener($[29],this._onNavButtonClicked,this);g.addEventListener($[29],this._onNavButtonClicked,this);d.addEventListener($[29],this._onNavButtonClicked,this);this._lastYearBt=f;this._lastMonthBt=a;this._nextMonthBt=g;this._nextYearBt=d;m.setAppearance("calendar-monthyear");m.set({width:"1*"});b.add(f,a,m,g,d);this._monthYearLabel=m;b.setHtmlProperty("id","navBar");var o=new qx.ui.layout.CanvasLayout;o.setAppearance("calendar-datepane");o.set({width:org.eclipse.swt.widgets.Calendar.CELL_WIDTH*8,height:org.eclipse.swt.widgets.Calendar.CELL_HEIGHT*7});var k=new qx.ui.basic.Label;k.setAppearance($[532]);k.set({width:org.eclipse.swt.widgets.Calendar.CELL_WIDTH,height:org.eclipse.swt.widgets.Calendar.CELL_HEIGHT,left:0});k.addState("header");o.add(k);this._weekdayLabelArr=[];for(var e=1;e<8;e++){var k=new qx.ui.basic.Label;k.setAppearance("calendar-weekday");k.setSelectable(false);k.setCursor($[39]);k.set({width:org.eclipse.swt.widgets.Calendar.CELL_WIDTH,height:org.eclipse.swt.widgets.Calendar.CELL_HEIGHT,left:e*org.eclipse.swt.widgets.Calendar.CELL_WIDTH});o.add(k);this._weekdayLabelArr.push(k)}this._dayLabelArr=[];this._weekLabelArr=[];for(var h=0;h<6;h++){var k=new qx.ui.basic.Label;k.setAppearance($[532]);k.setSelectable(false);k.setCursor($[39]);k.set({width:org.eclipse.swt.widgets.Calendar.CELL_WIDTH,height:org.eclipse.swt.widgets.Calendar.CELL_HEIGHT,left:0,top:(h+1)*org.eclipse.swt.widgets.Calendar.CELL_HEIGHT});o.add(k);this._weekLabelArr.push(k);for(var j=1;j<8;j++){var k=new qx.ui.basic.Label;k.setAppearance($[188]);k.setSelectable(false);k.setCursor($[39]);k.set({width:org.eclipse.swt.widgets.Calendar.CELL_WIDTH,height:org.eclipse.swt.widgets.Calendar.CELL_HEIGHT,left:j*org.eclipse.swt.widgets.Calendar.CELL_WIDTH,top:(h+1)*org.eclipse.swt.widgets.Calendar.CELL_HEIGHT});k.addEventListener($[2],this._onDayClicked,this);k.addEventListener($[61],this._onDayDblClicked,this);k.addEventListener($[9],this._onDayMouseOver,this);k.addEventListener($[14],this._onDayMouseOut,this);k.setUserData($[188],true);o.add(k);this._dayLabelArr.push(k)}}var n=(c!=null)?c:new Date();this.showMonth(n.getMonth(),n.getFullYear());this.add(b);this.add(o);this.initWidth();this.initHeight()},events:{select:$[70]},statics:{CELL_WIDTH:24,CELL_HEIGHT:16,MONTH_NAMES:[],WEEKDAY_NAMES:[]},properties:{width:{refine:true,init:"auto"},height:{refine:true,init:"auto"},shownMonth:{check:$[22],init:null,nullable:true,event:"changeShownMonth"},shownYear:{check:$[22],init:null,nullable:true,event:"changeShownYear"},date:{check:"Date",init:null,nullable:true,apply:"_applyDate",event:$[340],transform:"_checkDate"}},members:{addState:function(b){arguments.callee.base.call(this,b);if(b.substr(0,8)==$[54]){this._monthYearLabel.addState(b);for(var a=0;a<7;a++){this._weekdayLabelArr[a].addState(b)}for(var a=0;a<6*7;a++){this._dayLabelArr[a].addState(b)}for(var a=0;a<6;a++){this._weekLabelArr[a].addState(b)}}},removeState:function(b){arguments.callee.base.call(this,b);if(b.substr(0,8)==$[54]){this._monthYearLabel.removeState(b);for(var a=0;a<7;a++){this._weekdayLabelArr[a].removeState(b)}for(var a=0;a<6*7;a++){this._dayLabelArr[a].removeState(b)}for(var a=0;a<6;a++){this._weekLabelArr[a].removeState(b)}}},_checkDate:function(a){return(a==null)?null:new Date(a.getTime())},_applyDate:function(f,a){if((f!=null)&&(this.getShownMonth()!=f.getMonth()||this.getShownYear()!=f.getFullYear())){this.showMonth(f.getMonth(),f.getFullYear())}else{var e=(f==null)?-1:f.getDate();for(var c=0;c<6*7;c++){var d=this._dayLabelArr[c];if(d.hasState($[339])){if(d.hasState($[30])){d.removeState($[30])}}else{var b=parseInt(d.getText());if(b==e){d.addState($[30])}else{if(d.hasState($[30])){d.removeState($[30])}}}}}},_onNavButtonClicked:function(a){var b=this.getShownYear();var c=this.getShownMonth();switch(a.getTarget()){case this._lastYearBt:b--;break;case this._lastMonthBt:c--;if(c<0){c=11;b--}break;case this._nextMonthBt:c++;if(c>=12){c=0;b++}break;case this._nextYearBt:b++;break}this.showMonth(c,b)},_onDayClicked:function(a){if(a.isLeftButtonPressed()){var b=a.getTarget().dateTime;this.setDate(new Date(b))}},_onDayDblClicked:function(){this.createDispatchDataEvent("select",this.getDate())},_onDayMouseOver:function(a){a.getTarget().addState("over")},_onDayMouseOut:function(a){a.getTarget().removeState("over")},_onkeypress:function(a){var e=null;var b=null;var d=null;if(a.getModifiers()==0){switch(a.getKeyIdentifier()){case"Left":e=-1;a.preventDefault();a.stopPropagation();break;case $[53]:e=1;a.preventDefault();a.stopPropagation();break;case"Up":e=-7;a.preventDefault();a.stopPropagation();break;case"Down":e=7;a.preventDefault();a.stopPropagation();break;case $[58]:b=-1;a.preventDefault();a.stopPropagation();break;case $[55]:b=1;a.preventDefault();a.stopPropagation();break;case $[116]:if(this.getDate()!=null){this.setDate(null);a.preventDefault();a.stopPropagation();return true}a.preventDefault();a.stopPropagation();break;case"Home":case"End":a.preventDefault();a.stopPropagation();break;case $[68]:case $[92]:if(this.getDate()!=null){this.createDispatchDataEvent("select",this.getDate())}a.preventDefault();a.stopPropagation();return}}else{if(a.isShiftPressed()){switch(a.getKeyIdentifier()){case $[58]:d=-1;a.preventDefault();a.stopPropagation();break;case $[55]:d=1;a.preventDefault();a.stopPropagation();break}}}if(e!=null||b!=null||d!=null){var c=this.getDate();if(c!=null){c=new Date(c.getTime())}if(c==null){c=new Date()}else{if(e!=null){c.setDate(c.getDate()+e)}if(b!=null){c.setMonth(c.getMonth()+b)}if(d!=null){c.setFullYear(c.getFullYear()+d)}}this.setDate(c)}},showMonth:function(b,a){if((b!=null&&b!=this.getShownMonth())||(a!=null&&a!=this.getShownYear())){if(b!=null){this.setShownMonth(b)}if(a!=null){this.setShownYear(a)}this._updateDatePane()}},_updateDatePane:function(){var t=new Date();var d=t.getFullYear();var j=t.getMonth();var z=t.getDate();var a=this.getDate();var r=(a==null)?-1:a.getFullYear();var b=(a==null)?-1:a.getMonth();var w=(a==null)?-1:a.getDate();var e=this.getShownMonth();var q=this.getShownYear();var x=this.__getWeekStart();var u=new Date(this.getShownYear(),this.getShownMonth(),1);var f=this.getShownYear();var v=org.eclipse.swt.widgets.Calendar.MONTH_NAMES[this.getShownMonth()];this._monthYearLabel.setText(v+" "+f);var k=u.getDay();var g=(1+7-k)%7;for(var o=0;o<7;o++){var n=(o+x)%7;var m=this._weekdayLabelArr[o];u.setDate(g+n);var s=org.eclipse.swt.widgets.Calendar.WEEKDAY_NAMES[u.getDay()+1];m.setText(s);if(this.__isWeekend(n)){m.addState("weekend")}else{m.removeState("weekend")}}u=new Date(q,e,1);var p=(7+k-x)%7;u.setDate(u.getDate()-p);for(var l=0;l<6;l++){this._weekLabelArr[l].setText(""+this.__getWeekInYear(u));for(var o=0;o<7;o++){var m=this._dayLabelArr[l*7+o];var f=u.getFullYear();var v=u.getMonth();var h=u.getDate();var c=(r==f&&b==v&&w==h);if(c){m.addState($[30])}else{m.removeState($[30])}if(v!=e){m.addState($[339])}else{m.removeState($[339])}var y=(f==d&&v==j&&h==z);if(y){m.addState("today")}else{m.removeState("today")}m.setText(""+h);m.dateTime=u.getTime();u.setDate(u.getDate()+1)}}},__thursdayOfSameWeek:function(a){return new Date(a.getTime()+(3-((a.getDay()+6)%7))*86400000)},__getWeekInYear:function(a){var d=this.__thursdayOfSameWeek(a);var b=d.getFullYear();var c=this.__thursdayOfSameWeek(new Date(b,0,4));return Math.floor(1.5+(d.getTime()-c.getTime())/86400000/7)},__getWeekStart:function(){var a={MV:5,AE:6,AF:6,BH:6,DJ:6,DZ:6,EG:6,ER:6,ET:6,IQ:6,IR:6,JO:6,KE:6,KW:6,LB:6,LY:6,MA:6,OM:6,QA:6,SA:6,SD:6,SO:6,TN:6,YE:6,AS:0,AU:0,AZ:0,BW:0,CA:0,CN:0,FO:0,GE:0,GL:0,GU:0,HK:0,IE:0,IL:0,IS:0,JM:0,JP:0,KG:0,KR:0,LA:0,MH:0,MN:0,MO:0,MP:0,MT:0,NZ:0,PH:0,PK:0,SG:0,TH:0,TT:0,TW:0,UM:0,US:0,UZ:0,VI:0,ZA:0,ZW:0,MW:0,NG:0,TJ:0};var b=this.__getTerritory();return a[b]!=null?a[b]:1},__getWeekendStart:function(){var a={EG:5,IL:5,SY:5,IN:0,AE:4,BH:4,DZ:4,IQ:4,JO:4,KW:4,LB:4,LY:4,MA:4,OM:4,QA:4,SA:4,SD:4,TN:4,YE:4};var b=this.__getTerritory();return a[b]!=null?a[b]:6},__getWeekendEnd:function(){var a={AE:5,BH:5,DZ:5,IQ:5,JO:5,KW:5,LB:5,LY:5,MA:5,OM:5,QA:5,SA:5,SD:5,TN:5,YE:5,AF:5,IR:5,EG:6,IL:6,SY:6};var b=this.__getTerritory();return a[b]!=null?a[b]:0},__isWeekend:function(b){var c=this.__getWeekendStart();var a=this.__getWeekendEnd();if(a>c){return((b>=c)&&(b<=a))}else{return((b>=c)||(b<=a))}},__getTerritory:function(){var a=org.eclipse.rwt.Client.getTerritory()||org.eclipse.rwt.Client.getLanguage();return a.toUpperCase()}},destruct:function(){this._disposeObjects("_lastYearBt","_lastMonthBt","_nextMonthBt","_nextYearBt","_monthYearLabel");this._disposeObjectDeep("_weekdayLabelArr",1);this._disposeObjectDeep("_dayLabelArr",1);this._disposeObjectDeep("_weekLabelArr",1)}});
-qx.Class.define("org.eclipse.swt.widgets.CoolItem",{extend:qx.ui.layout.CanvasLayout,construct:function(a){arguments.callee.base.call(this);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this.setAppearance("coolitem");this._orientation=a;this._handle=new qx.ui.basic.Terminator();this._handle.addState(a);this._handle.setAppearance($[526]);this._handle.addEventListener($[2],this._onHandleMouseDown,this);this._handle.addEventListener($[45],this._onHandleMouseMove,this);this._handle.addEventListener($[15],this._onHandleMouseUp,this);this.add(this._handle);this._bufferedZIndex=null;this._bufferedControlZIndex=null;this._control=null},destruct:function(){if(this._handle!=null){this._handle.removeEventListener($[2],this._onHandleMouseDown,this);this._handle.removeEventListener($[45],this._onHandleMouseMove,this);this._handle.removeEventListener($[15],this._onHandleMouseUp,this);this._handle.dispose()}},statics:{DRAG_CURSOR:$[231],CONTROL_OFFSET:6},members:{setLocked:function(a){this._handle.setDisplay(!a)},setControl:function(a){if(a!=null){a.setLeft(this.getLeft()+org.eclipse.swt.widgets.CoolItem.CONTROL_OFFSET);a.setDisplay(true)}if(this._control!=null){this._control.setDisplay(false)}this._control=a},updateHandleBounds:function(){if(this._orientation==$[46]){this._handle.setWidth(this.getWidth())}else{this._handle.setHeight(this.getHeight())}},_onHandleMouseDown:function(a){this._handle.setCapture(true);this.getTopLevelWidget().setGlobalCursor(org.eclipse.swt.widgets.CoolItem.DRAG_CURSOR);this._offsetX=a.getPageX()-this.getLeft();this._offsetY=a.getPageY()-this.getTop();this._bufferedZIndex=this.getZIndex();this.setZIndex(10000000-1);if(this._control!=null){this._bufferedControlZIndex=this._control.getZIndex();this._control.setZIndex(10000000)}this.setBackgroundColor(this._findBackground())},_applyLeft:function(c,a){arguments.callee.base.call(this,c,a);if(this._control!=null){var b=c+org.eclipse.swt.widgets.CoolItem.CONTROL_OFFSET;this._control.setLeft(b)}},_applyWidth:function(c,a){arguments.callee.base.call(this,c,a);if(this._control!=null){var b=c-org.eclipse.swt.widgets.CoolItem.CONTROL_OFFSET;this._control.setWidth(b)}},_onHandleMouseMove:function(a){if(this._handle.getCapture()){this.setLeft(a.getPageX()-this._offsetX)}},_onHandleMouseUp:function(a){this._handle.setCapture(false);this.setZIndex(this._bufferedZIndex);if(this._control!=null){this._control.setZIndex(this._bufferedControlZIndex)}this.resetBackgroundColor();this.getTopLevelWidget().setGlobalCursor(null);if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addEvent("org.eclipse.swt.events.widgetMoved",c);b.addParameter(c+$[294],this.getLeft());b.addParameter(c+$[295],this.getTop());b.send()}},_findBackground:function(){var b=true;var a=null;var c=this.getParent();while(b&&c!=null&&a==null){if(c.getBackgroundColor){a=c.getBackgroundColor()}if(c.getParent){c=c.getParent()}else{b=false}}return a}}});
-qx.Class.define($[563],{extend:org.eclipse.rwt.widgets.BasicButton,construct:function(a){arguments.callee.base.call(this,a);switch(a){case"push":case"toggle":this.setAppearance("push-button");break;case"check":this.setAppearance("check-box");break;case"radio":this.setAppearance("radio-button")}this.initTabIndex();this.addEventListener($[74],this._onFocus);this.addEventListener("blur",this._onBlur)},properties:{tabIndex:{refine:true,init:1}},members:{setWrap:function(a){if(a){this.setFlexibleCell(2)}},_afterRenderLayout:function(a){if(this.hasState($[123])){this._showFocusIndicator()}},_showFocusIndicator:function(){var b=org.eclipse.rwt.FocusIndicator.getInstance();var a=this.getCellNode(2)!=null?this.getCellNode(2):this.getCellNode(1);b.show(this,"Button-FocusIndicator",a)},_onFocus:function(a){this._showFocusIndicator()},_onBlur:function(b){var a=org.eclipse.rwt.FocusIndicator.getInstance();a.hide(this)}}});
-qx.Class.define("org.eclipse.rwt.widgets.FileUpload",{extend:org.eclipse.rwt.widgets.Button,construct:function(){arguments.callee.base.call(this,"push");this.addState("rwt_PUSH");this.addEventListener($[216],this._layoutInputElement,this);this.addEventListener($[264],this._onMouseOverElement,this);this._formElement=null;this._inputElement=null;this._iframe=null;this._cursor="";this.__onValueChange=qx.lang.Function.bind(this._onValueChange,this);this.setEnableElementFocus(false);this._createIframeWidget()},destruct:function(){this._formElement=null;this._inputElement=null},members:{submit:function(a){if(typeof a!==$[13]){throw new Error("No url given!")}if(this._getFileName()===""){throw new Error("No file selected!")}if(this._formElement===null){throw new Error("Form element not created!")}this._formElement.setAttribute("action",a);this._formElement.submit()},destroy:function(){arguments.callee.base.call(this);this._iframe.destroy()},_createSubelements:function(){arguments.callee.base.call(this);if(this._formElement===null){this._createFormElement();this._createInputElement()}else{this._getTargetNode().appendChild(this._formElement);var a=qx.core.Variant.isSet($[0],$[18]);if(a){this._formElement.appendChild(this._inputElement)}}},_createFormElement:function(){this._formElement=document.createElement("form");this._formElement.setAttribute("target",this._getFrameName());this._formElement.setAttribute("method","POST");var a=qx.core.Variant.isSet($[0],$[18]);if(a){this._formElement.setAttribute("encoding",$[514])}else{this._formElement.setAttribute("enctype",$[514])}this._getTargetNode().appendChild(this._formElement)},_createInputElement:function(){this._inputElement=document.createElement($[85]);this._inputElement.style.position=$[27];this._inputElement.setAttribute("type","file");this._inputElement.setAttribute("name","file");this._inputElement.setAttribute("size","1");this._inputElement.style.cursor=this._cursor;this._inputElement.onchange=this.__onValueChange;org.eclipse.rwt.HtmlUtil.setOpacity(this._inputElement,0);this._formElement.appendChild(this._inputElement)},_createIframeWidget:function(){this._iframe=new qx.ui.embed.Iframe();this._iframe.setSource("about:blank");this._iframe.setVisibility(false);this._iframe.setWidth(0);this._iframe.setHeight(0);this._iframe.setFrameName(this._getFrameName());this._iframe.addToDocument()},_onValueChange:function(b){var e=this._formatFileName(this._getFileName());if(!org.eclipse.swt.EventUtil.getSuspended()){var a=org.eclipse.swt.Request.getInstance();var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);a.addParameter(c+".fileName",e);a.send()}},_getFileName:function(){return this._inputElement.value},_layoutPost:function(a){arguments.callee.base.call(this,a);if(a.width||a.height){this._layoutInputElement()}},_layoutInputElement:function(){if(this.getEnabled()&&this.isSeeable()){var a=10;this._layoutInputElementHorizontal(a);this._layoutInputElementVertical(a)}},_layoutInputElementHorizontal:function(g){var h=0.6;var a=this.getBoxWidth();var e=(a+g*2)/(h);var i=e/10;this._inputElement.style.fontSize=i;var c=0;while(this._inputElement.offsetWidth<=e){i+=10;this._inputElement.style.fontSize=i;c++;if(c>100){var b="Failed to force input-element width.";throw new Error(b)}}var d=this._inputElement.offsetWidth;var f=a-d+g;this._inputElement.style.left=f+"px"},_layoutInputElementVertical:function(b){var a=this.getBoxHeight();this._inputElement.style.height=(a+b*2)+"px";this._inputElement.style.top=(b*-1)+"px"},setStyleProperty:function(b,a){if(b===$[34]){this._cursor=a;if(this._inputElement!=null){this._inputElement.style.cursor=a}}else{arguments.callee.base.call(this,b,a)}},_applyEnabled:function(b,a){arguments.callee.base.call(this,b,a);if(this._inputElement){this._inputElement.style.display=b?"":"none";this._layoutInputElement()}},_afterAppear:function(){arguments.callee.base.call(this);this._layoutInputElement()},_onMouseOver:function(a){if(a.getDomTarget()===this._inputElement){arguments.callee.base.call(this,a)}},_onMouseOverElement:function(a){if(a.getDomTarget()===this._inputElement){this._onMouseOver(a)}},_onMouseDown:function(a){if(a.getDomTarget()===this._inputElement){arguments.callee.base.call(this,a)}if(org.eclipse.rwt.Client.getBrowser()===$[211]){this._onBlur()}},_onMouseUp:function(a){if(a.getDomTarget()===this._inputElement||this.hasState($[47])){arguments.callee.base.call(this,a)}},_onFocus:function(a){arguments.callee.base.call(this,a);this._inputElement.focus()},_onKeyDown:qx.lang.Function.returnTrue,_onKeyUp:qx.lang.Function.returnTrue,_ontabfocus:function(){if(org.eclipse.rwt.Client.getBrowser()===$[211]){this._showFocusIndicator(true)}},_showFocusIndicator:function(a){var b=org.eclipse.rwt.Client.getBrowser()===$[211];if(!b||a){arguments.callee.base.call(this)}},_formatFileName:function(b){var a=b;if(a.indexOf("\\")!=-1){a=a.substr(a.lastIndexOf("\\")+1)}else{if(a.indexOf("/")!=-1){a=a.substr(a.lastIndexOf("/")+1)}}return a},_getFrameName:function(){return"FileUpload_"+this.toHashCode()}}});
-qx.Class.define("org.eclipse.swt.widgets.DateTimeTime",{extend:qx.ui.layout.CanvasLayout,construct:function(a){arguments.callee.base.call(this);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this.setAppearance("datetime-time");this._short=qx.lang.String.contains(a,"short");this._medium=qx.lang.String.contains(a,"medium");this._long=qx.lang.String.contains(a,"long");this._hasSelectionListener=false;this._requestTimer=null;this.addEventListener($[84],this._rwt_onChangeFont,this);this.addEventListener($[12],this._onKeyPress,this);this.addEventListener($[60],this._onKeyUp,this);this.addEventListener($[56],this._onMouseWheel,this);this.addEventListener($[41],this._onContextMenu,this);this.addEventListener($[74],this._onFocusIn,this);this.addEventListener("blur",this._onFocusOut,this);this._focusedTextField=null;this._hoursTextField=new qx.ui.basic.Label("00");this._hoursTextField.setAppearance($[179]);this._hoursTextField.setUserData($[155],2);this._hoursTextField.addEventListener($[2],this._onMouseDown,this);this.add(this._hoursTextField);this._separator3=new qx.ui.basic.Label(":");this._separator3.setAppearance($[230]);this._separator3.addEventListener($[41],this._onContextMenu,this);this.add(this._separator3);this._minutesTextField=new qx.ui.basic.Label("00");this._minutesTextField.setAppearance($[179]);this._minutesTextField.setUserData($[155],2);this._minutesTextField.addEventListener($[2],this._onMouseDown,this);this.add(this._minutesTextField);this._separator4=new qx.ui.basic.Label(":");this._separator4.setAppearance($[230]);if(this._medium||this._long){this.add(this._separator4)}this._secondsTextField=new qx.ui.basic.Label("00");this._secondsTextField.setAppearance($[179]);this._secondsTextField.setUserData($[155],2);this._secondsTextField.addEventListener($[2],this._onMouseDown,this);if(this._medium||this._long){this.add(this._secondsTextField)}this._spinner=new qx.ui.form.Spinner();this._spinner.set({wrap:true,border:null,backgroundColor:null});this._spinner.setMin(0);this._spinner.setMax(23);this._spinner.setValue(0);this._spinner.addEventListener($[79],this._onSpinnerChange,this);this._spinner._textfield.setTabIndex(null);this._spinner._textfield.setFocused=function(){};this._spinner._textfield.setVisibility(false);this._spinner._upbutton.setAppearance($[462]);this._spinner._downbutton.setAppearance($[501]);this._spinner.removeEventListener($[12],this._spinner._onkeypress,this._spinner);this._spinner.removeEventListener($[24],this._spinner._onkeydown,this._spinner);this._spinner.removeEventListener($[60],this._spinner._onkeyup,this._spinner);this._spinner.removeEventListener($[56],this._spinner._onmousewheel,this._spinner);this.add(this._spinner);this._focusedTextField=this._hoursTextField},destruct:function(){this.removeEventListener($[84],this._rwt_onChangeFont,this);this.removeEventListener($[12],this._onKeyPress,this);this.removeEventListener($[60],this._onKeyUp,this);this.removeEventListener($[56],this._onMouseWheel,this);this.removeEventListener($[41],this._onContextMenu,this);this.removeEventListener($[74],this._onFocusIn,this);this.removeEventListener("blur",this._onFocusOut,this);this._hoursTextField.removeEventListener($[2],this._onMouseDown,this);this._minutesTextField.removeEventListener($[2],this._onMouseDown,this);this._secondsTextField.removeEventListener($[2],this._onMouseDown,this);this._spinner.removeEventListener($[79],this._onSpinnerChange,this);this._disposeObjects("_hoursTextField","_minutesTextField","_secondsTextField",$[438],"_spinner","_separator3","_separator4")},statics:{HOURS_TEXTFIELD:8,MINUTES_TEXTFIELD:9,SECONDS_TEXTFIELD:10,HOURS_MINUTES_SEPARATOR:11,MINUTES_SECONDS_SEPARATOR:12,SPINNER:7,_isNoModifierPressed:function(a){return !a.isCtrlPressed()&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isMetaPressed()}},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]){this._hoursTextField.addState(a);this._minutesTextField.addState(a);this._secondsTextField.addState(a);this._spinner.addState(a);this._separator3.addState(a);this._separator4.addState(a)}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]){this._hoursTextField.removeState(a);this._minutesTextField.removeState(a);this._secondsTextField.removeState(a);this._spinner.removeState(a);this._separator3.removeState(a);this._separator4.removeState(a)}},_rwt_onChangeFont:function(a){var b=a.getValue();this._hoursTextField.setFont(b);this._minutesTextField.setFont(b);this._secondsTextField.setFont(b)},_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_onFocusIn:function(a){this._focusedTextField.addState($[30])},_onFocusOut:function(a){this._focusedTextField.removeState($[30])},_onMouseDown:function(a){this._setFocusedTextField(a.getTarget())},_setFocusedTextField:function(a){var b;this._focusedTextField.removeState($[30]);this._focusedTextField=null;if(a===this._hoursTextField){this._spinner.setMin(0);this._spinner.setMax(23);b=this._removeLeadingZero(this._hoursTextField.getText());this._spinner.setValue(parseInt(b,10))}else{if(a===this._minutesTextField){this._spinner.setMin(0);this._spinner.setMax(59);b=this._removeLeadingZero(this._minutesTextField.getText());this._spinner.setValue(parseInt(b,10))}else{if(a===this._secondsTextField){this._spinner.setMin(0);this._spinner.setMax(59);b=this._removeLeadingZero(this._secondsTextField.getText());this._spinner.setValue(parseInt(b,10))}}}this._focusedTextField=a;this._focusedTextField.addState($[30])},_onSpinnerChange:function(a){if(this._focusedTextField!=null){var b=this._focusedTextField.getText();var c=this._addLeadingZero(this._spinner.getValue());this._focusedTextField.setText(c);if(b!=c){this._sendChanges()}}},_onKeyPress:function(a){var c=a.getKeyIdentifier();if(org.eclipse.swt.widgets.DateTimeTime._isNoModifierPressed(a)){switch(c){case"Left":if(this._focusedTextField===this._hoursTextField){if(this._short){this._setFocusedTextField(this._minutesTextField)}else{this._setFocusedTextField(this._secondsTextField)}}else{if(this._focusedTextField===this._minutesTextField){this._setFocusedTextField(this._hoursTextField)}else{if(this._focusedTextField===this._secondsTextField){this._setFocusedTextField(this._minutesTextField)}}}a.preventDefault();a.stopPropagation();break;case $[53]:if(this._focusedTextField===this._hoursTextField){this._setFocusedTextField(this._minutesTextField)}else{if(this._focusedTextField===this._minutesTextField){if(this._short){this._setFocusedTextField(this._hoursTextField)}else{this._setFocusedTextField(this._secondsTextField)}}else{if(this._focusedTextField===this._secondsTextField){this._setFocusedTextField(this._hoursTextField)}}}a.preventDefault();a.stopPropagation();break;case"Up":var b=this._spinner.getValue();if(b==this._spinner.getMax()){this._spinner.setValue(this._spinner.getMin())}else{this._spinner.setValue(b+1)}a.preventDefault();a.stopPropagation();break;case"Down":var b=this._spinner.getValue();if(b==this._spinner.getMin()){this._spinner.setValue(this._spinner.getMax())}else{this._spinner.setValue(b-1)}a.preventDefault();a.stopPropagation();break;case $[58]:case $[55]:case"Home":case"End":a.preventDefault();a.stopPropagation();break}}},_onKeyUp:function(a){var b=a.getKeyIdentifier();var e=this._focusedTextField.getText();e=this._removeLeadingZero(e);if(org.eclipse.swt.widgets.DateTimeTime._isNoModifierPressed(a)){switch(b){case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":var d=this._focusedTextField.getUserData($[155]);var f=b;if(e.length<d){f=e+b}var c=parseInt(f,10);if(c>=this._spinner.getMin()&&c<=this._spinner.getMax()){this._spinner.setValue(c)}else{f=b;c=parseInt(f,10);if(c>=this._spinner.getMin()&&c<=this._spinner.getMax()){this._spinner.setValue(c)}}a.preventDefault();a.stopPropagation();break;case"Home":var f=this._spinner.getMin();this._spinner.setValue(f);a.preventDefault();a.stopPropagation();break;case"End":var f=this._spinner.getMax();this._spinner.setValue(f);a.preventDefault();a.stopPropagation();break}}},_onMouseWheel:function(a){if(this.getFocused()){a.preventDefault();a.stopPropagation();this._spinner._onmousewheel(a)}},_addLeadingZero:function(a){return a<10?"0"+a:""+a},_removeLeadingZero:function(c){var a=c;if(c.length==2){var b=c.substring(0,1);if(b=="0"){a=c.substring(1)}}return a},_sendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var b=c.findIdByWidget(this);a.addParameter(b+".hours",this._removeLeadingZero(this._hoursTextField.getText()));a.addParameter(b+".minutes",this._removeLeadingZero(this._minutesTextField.getText()));a.addParameter(b+".seconds",this._removeLeadingZero(this._secondsTextField.getText()));if(this._hasSelectionListener){this._requestTimer.restart()}}},_onInterval:function(){this._requestTimer.stop();var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addEvent($[64],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()},setHours:function(a){this._hoursTextField.setText(this._addLeadingZero(a));if(this._focusedTextField===this._hoursTextField){this._spinner.setValue(a)}},setMinutes:function(a){this._minutesTextField.setText(this._addLeadingZero(a));if(this._focusedTextField===this._minutesTextField){this._spinner.setValue(a)}},setSeconds:function(a){this._secondsTextField.setText(this._addLeadingZero(a));if(this._focusedTextField===this._secondsTextField){this._spinner.setValue(a)}},setHasSelectionListener:function(a){this._hasSelectionListener=a;this._requestTimer=new qx.client.Timer(110);this._requestTimer.addEventListener($[50],this._onInterval,this)},setBounds:function(e,b,f,c,a){var d;switch(e){case org.eclipse.swt.widgets.DateTimeTime.HOURS_TEXTFIELD:d=this._hoursTextField;break;case org.eclipse.swt.widgets.DateTimeTime.MINUTES_TEXTFIELD:d=this._minutesTextField;break;case org.eclipse.swt.widgets.DateTimeTime.SECONDS_TEXTFIELD:d=this._secondsTextField;break;case org.eclipse.swt.widgets.DateTimeTime.HOURS_MINUTES_SEPARATOR:d=this._separator3;break;case org.eclipse.swt.widgets.DateTimeTime.MINUTES_SECONDS_SEPARATOR:d=this._separator4;break;case org.eclipse.swt.widgets.DateTimeTime.SPINNER:d=this._spinner;break}d.set({left:b,top:f,width:c,height:a})}}});
-qx.Class.define("org.eclipse.swt.widgets.Slider",{extend:org.eclipse.swt.widgets.AbstractSlider,construct:function(a){arguments.callee.base.call(this,qx.lang.String.contains(a,$[52]));this._hasSelectionListener=false;this._requestScheduled=false;this.addEventListener($[41],this._onContextMenu,this);this.addEventListener($[12],this._onKeyPress,this)},statics:{SEND_DELAY:50,_isNoModifierPressed:function(a){return !a.isCtrlPressed()&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isMetaPressed()}},members:{_configureAppearance:function(){this.setAppearance("slider");this._thumb.setAppearance($[559]);this._minButton.setAppearance("slider-min-button");this._maxButton.setAppearance("slider-max-button")},setSelection:function(a){this._setSelection(a)},setMinimum:function(a){this._setMinimum(a)},setMaximum:function(a){this._setMaximum(a)},setIncrement:function(a){this._setIncrement(a)},setPageIncrement:function(a){this._setPageIncrement(a)},setThumb:function(a){this._setThumb(a)},setHasSelectionListener:function(a){this._hasSelectionListener=a},_setSelection:function(a){arguments.callee.base.call(this,a);this._scheduleSendChanges()},_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_onKeyPress:function(a){var c=a.getKeyIdentifier();var b;if(org.eclipse.swt.widgets.Slider._isNoModifierPressed(a)){switch(c){case"Left":b=this._selection-this._increment;a.preventDefault();a.stopPropagation();break;case"Down":if(this._horizontal){b=this._selection-this._increment}else{b=this._selection+this._increment}a.preventDefault();a.stopPropagation();break;case $[53]:b=this._selection+this._increment;a.preventDefault();a.stopPropagation();break;case"Up":if(this._horizontal){b=this._selection+this._increment}else{b=this._selection-this._increment}a.preventDefault();a.stopPropagation();break;case"Home":b=this._minimum;a.preventDefault();a.stopPropagation();break;case"End":b=this._maximum;a.preventDefault();a.stopPropagation();break;case $[55]:if(this._horizontal){b=this._selection-this._pageIncrement}else{b=this._selection+this._pageIncrement}a.preventDefault();a.stopPropagation();break;case $[58]:if(this._horizontal){b=this._selection+this._pageIncrement}else{b=this._selection-this._pageIncrement}a.preventDefault();a.stopPropagation();break}if(b!=undefined){if(b<this._minimum){b=this._minimum}if(b>this._maximum){b=this._maximum}this.setSelection(b);if(this._readyToSendChanges){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,org.eclipse.swt.widgets.Slider.SEND_DELAY)}}}},_onMouseWheel:function(a){if(this.getFocused()){arguments.callee.base.call(this,a);if(this._readyToSendChanges){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,500)}}},_scheduleSendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){if(!this._requestScheduled){this._requestScheduled=true;qx.client.Timer.once(this._sendChanges,this,org.eclipse.swt.widgets.Slider.SEND_DELAY)}}},_sendChanges:function(){var c=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var b=c.findIdByWidget(this);a.addParameter(b+$[144],this._selection);if(this._hasSelectionListener){a.addEvent($[64],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()}this._requestScheduled=false}}});
-qx.Class.define("org.eclipse.swt.widgets.Spinner",{extend:qx.ui.form.Spinner,construct:function(){arguments.callee.base.call(this);this._isModified=false;this._hasModifyListener=false;this._hasSelectionListener=false;this.setWrap(false);this._textfield.setFocused=function(){};this._textfield.addEventListener($[80],this._onChangeValue,this);this._textfield.addEventListener($[12],this._onChangeValue,this);this._textfield.addEventListener("blur",this._onChangeValue,this);this._textfield.addEventListener($[24],this._onKeyDown,this);this._textfield.setTabIndex(null);this.addEventListener($[132],this._onChangeEnabled,this);this.addEventListener($[176],this._onFocusOut,this);this._checkValue=this.__checkValueWithDigits},destruct:function(){this._textfield.removeEventListener($[80],this._onChangeValue,this);this._textfield.removeEventListener($[12],this._onChangeValue,this);this._textfield.removeEventListener("blur",this._onChangeValue,this);this._textfield.removeEventListener($[24],this._onKeyDown,this);this.removeEventListener($[132],this._onChangeEnabled,this);this.removeEventListener($[176],this._onFocusOut,this)},properties:{digits:{check:$[22],init:0,apply:"_applyDigits"},decimalSeparator:{check:$[25],init:".",apply:"_applyDecimalSeparator"}},members:{setFont:function(a){this._textfield.setFont(a)},setMaxLength:function(a){this._textfield.setMaxLength(a)},setMinMaxSelection:function(b,a,c){this.setMin(Math.min(b,this.getMin()));this.setMax(Math.max(a,this.getMax()));this.setValue(c);this.setMin(b);this.setMax(a)},_applyCursor:function(b,a){arguments.callee.base.call(this,b,a);if(b){this._upbutton.setCursor(b);this._downbutton.setCursor(b);this._textfield.setCursor(b)}else{this._upbutton.resetCursor();this._downbutton.resetCursor();this._textfield.resetCursor()}},setHasModifyListener:function(a){this._hasModifyListener=a},setHasSelectionListener:function(a){this._hasSelectionListener=a},_visualizeFocus:function(){this._textfield._visualizeFocus();if(this._textfield.isCreated()){this._textfield.selectAll()}},_visualizeBlur:function(){this._textfield.setSelectionLength(0);this._textfield._visualizeBlur()},_oninput:function(a){this._suspendTextFieldUpdate=true;this._checkValue(true,false);this._suspendTextFieldUpdate=false},_onChangeValue:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()&&!this._isModified){this._isModified=true;var b=org.eclipse.swt.Request.getInstance();b.addEventListener("send",this._onSend,this);if(this._hasSelectionListener){this._addModifyTextEvent();this._sendWidgetSelected()}else{if(this._hasModifyListener){this._addModifyTextEvent();qx.client.Timer.once(this._sendModifyText,this,500)}}}},_onChangeEnabled:function(a){var b=a.getValue();this._upbutton.setEnabled(b&&this.getValue()<this.getMax());this._downbutton.setEnabled(b&&this.getValue()>this.getMin())},_onKeyDown:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){if(a.getKeyIdentifier()==$[68]&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isCtrlPressed()&&!a.isMetaPressed()&&this._hasSelectionListener){a.stopPropagation();this._sendWidgetDefaultSelected()}}},_onmousewheel:function(a){if(this.getFocused()){arguments.callee.base.call(this,a)}},_addModifyTextEvent:function(){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addEvent($[405],b)},_sendWidgetSelected:function(){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addEvent($[64],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()},_sendWidgetDefaultSelected:function(){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addEvent($[165],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()},_onSend:function(a){this._isModified=false;var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addParameter(c+$[144],this.getManager().getValue());b.removeEventListener("send",this._onSend,this)},_sendModifyText:function(a){if(this._isModified){org.eclipse.swt.Request.getInstance().send();this._isModified=false}},_applyDigits:function(c,b){var a=this.getManager().getValue();if(this.getDigits()>0){this._textfield.setValue(this._format(a))}else{this._textfield.setValue(String(a))}},_applyDecimalSeparator:function(c,b){var a=this.getManager().getValue();if(this.getDigits()>0){this._textfield.setValue(this._format(a))}},_format:function(d){var c=this.getDigits();var f=d/Math.pow(10,c);var a=f.toFixed(c);var e=this.getDecimalSeparator();if(e!="."){var b=qx.lang.String.escapeRegexpChars(".");a=a.replace(new RegExp(b),e)}return a},_limit:function(c){var a=c;var b=this.getDigits();if(b>0){a=a*Math.pow(10,b)}a=Math.round(a);if(a>this.getMax()){a=this.getMax()}if(a<this.getMin()){a=this.getMin()}return a},_onFocusOut:function(a){this._checkValue(true,false)},_onkeypress:function(a){var b=a.getKeyIdentifier();var c=this.getDecimalSeparator();if(!(this.getDigits()>0&&b==c)){arguments.callee.base.call(this,a)}},_onchange:function(a){var b=this.getManager().getValue();if(!this._suspendTextFieldUpdate){if(this.getDigits()>0){this._textfield.setValue(this._format(b))}else{this._textfield.setValue(String(b))}}if(b==this.getMin()&&!this.getWrap()){this._downbutton.removeState($[21]);this._downbutton.setEnabled(false);this._timer.stop()}else{this._downbutton.resetEnabled()}if(b==this.getMax()&&!this.getWrap()){this._upbutton.removeState($[21]);this._upbutton.setEnabled(false);this._timer.stop()}else{this._upbutton.resetEnabled()}this.createDispatchDataEvent($[79],b)},__checkValueWithDigits:function(g,b){var k=this._textfield.getInputElement();if(k){if(k.value==""&&!g){this.resetValue()}else{var i=k.value;var e=i;var d=this.getDecimalSeparator();if(this.getDigits()>0&&d!="."){d=qx.lang.String.escapeRegexpChars(d);e=i.replace(new RegExp(d),".")}var j=parseFloat(e);var f=this._limit(j);var a=this.getManager().getValue();var h=f;if(isNaN(j)||j!=f||j!=e){if(b){this._textfield.setValue(this._last_value)}else{if(isNaN(f)){h=a}}}if(!b){var c=String(h);if(this.getDigits()>0){c=this._format(h)}if(h===a&&i!==c&&!this._suspendTextFieldUpdate){this._textfield.setValue(c)}this.getManager().setValue(h)}}}}}});
-qx.Class.define("org.eclipse.swt.widgets.DateTimeDate",{extend:qx.ui.layout.CanvasLayout,construct:function(f,e,b,d,g,c){arguments.callee.base.call(this);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this.setAppearance("datetime-date");this._short=qx.lang.String.contains(f,"short");this._medium=qx.lang.String.contains(f,"medium");this._long=qx.lang.String.contains(f,"long");this._drop_down=qx.lang.String.contains(f,"drop_down");this._hasSelectionListener=false;this._requestTimer=null;this._readyToSendChanges=true;this._weekday=b;this._monthname=e;this._datePattern=c;this.addEventListener($[84],this._rwt_onChangeFont,this);this.addEventListener($[12],this._onKeyPress,this);this.addEventListener($[60],this._onKeyUp,this);this.addEventListener($[56],this._onMouseWheel,this);this.addEventListener($[41],this._onContextMenu,this);this.addEventListener($[74],this._onFocusIn,this);this.addEventListener("blur",this._onFocusOut,this);this._focusedTextField=null;this._weekdayTextField=new qx.ui.basic.Label();this._weekdayTextField.setAppearance($[179]);if(this._long){this.add(this._weekdayTextField)}this._separator0=new qx.ui.basic.Label(",");this._separator0.setAppearance($[230]);if(this._long){this.add(this._separator0)}this._monthTextField=new qx.ui.basic.Label();this._monthTextField.setAppearance($[179]);this._monthTextField.set({textAlign:this._medium?$[23]:$[38]});this._monthInt=1;if(this._medium){this._monthTextField.setText("1")}else{this._monthTextField.setText(this._monthname[this._monthInt-1])}this._monthTextField.addEventListener($[2],this._onTextFieldMouseDown,this);this.add(this._monthTextField);this._separator1=new qx.ui.basic.Label(g);this._separator1.setAppearance($[230]);if(this._medium){this.add(this._separator1)}this._dayTextField=new qx.ui.basic.Label("1");this._dayTextField.setAppearance($[179]);this._dayTextField.setUserData($[155],2);this._dayTextField.set({textAlign:$[23]});this._dayTextField.addEventListener($[2],this._onTextFieldMouseDown,this);if(!this._short){this.add(this._dayTextField)}this._separator2=new qx.ui.basic.Label(",");this._separator2.setAppearance($[230]);if(this._medium){this._separator2.setText(g)}this.add(this._separator2);this._yearTextField=new qx.ui.basic.Label("1970");this._yearTextField.setAppearance($[179]);this._yearTextField.setUserData($[155],4);this._yearTextField.set({textAlign:$[23]});this._lastValidYear=1970;this._yearTextField.addEventListener($[2],this._onTextFieldMouseDown,this);this.add(this._yearTextField);this._spinner=new qx.ui.form.Spinner();this._spinner.set({wrap:true,border:null,backgroundColor:null});this._spinner.setMin(1);this._spinner.setMax(12);this._spinner.setValue(this._monthInt);this._spinner.addEventListener($[79],this._onSpinnerChange,this);this._spinner._textfield.setTabIndex(null);this._spinner._textfield.setFocused=function(){};this._spinner._textfield.setVisibility(false);this._spinner._upbutton.setAppearance($[462]);this._spinner._downbutton.setAppearance($[501]);this._spinner.removeEventListener($[12],this._spinner._onkeypress,this._spinner);this._spinner.removeEventListener($[24],this._spinner._onkeydown,this._spinner);this._spinner.removeEventListener($[60],this._spinner._onkeyup,this._spinner);this._spinner.removeEventListener($[56],this._spinner._onmousewheel,this._spinner);this._spinner.setVisibility(!this._drop_down);this.add(this._spinner);this._dropped=false;this._dropDownButton=null;this._calendar=null;if(this._drop_down){var a=qx.ui.core.ClientDocument.getInstance();a.addEventListener($[249],this._onWindowBlur,this);this.addEventListener($[31],this._onAppear,this);this.addEventListener($[205],this._onChangeVisibility,this);this.addEventListener($[2],this._onMouseDown,this);this.addEventListener($[29],this._onMouseClick,this);this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[14],this._onMouseOut,this);this._dropDownButton=new qx.ui.form.Button();this._dropDownButton.setAppearance("datetime-drop-down-button");this._dropDownButton.setTabIndex(null);this._dropDownButton.setAllowStretchY(true);this.add(this._dropDownButton);org.eclipse.swt.widgets.Calendar.MONTH_NAMES=e;org.eclipse.swt.widgets.Calendar.WEEKDAY_NAMES=d;this._calendar=new org.eclipse.swt.widgets.Calendar();this._calendar.setAppearance("datetime-drop-down-calendar");this._calendar.setDate(new Date(70,0,1));this._calendar.setTabIndex(null);this._calendar.setVisibility(false);this._calendar._lastYearBt.setToolTip(null);this._calendar._lastMonthBt.setToolTip(null);this._calendar._nextMonthBt.setToolTip(null);this._calendar._nextYearBt.setToolTip(null)}this._focusedTextField=this._monthTextField;this._setWeekday()},destruct:function(){this.removeEventListener($[84],this._rwt_onChangeFont,this);this.removeEventListener($[12],this._onKeyPress,this);this.removeEventListener($[60],this._onKeyUp,this);this.removeEventListener($[56],this._onMouseWheel,this);this.removeEventListener($[41],this._onContextMenu,this);this.removeEventListener($[74],this._onFocusIn,this);this.removeEventListener("blur",this._onFocusOut,this);this._monthTextField.removeEventListener($[2],this._onTextFieldMouseDown,this);this._dayTextField.removeEventListener($[2],this._onTextFieldMouseDown,this);this._yearTextField.removeEventListener($[2],this._onTextFieldMouseDown,this);this._spinner.removeEventListener($[79],this._onSpinnerChange,this);this._disposeObjects("_weekdayTextField","_monthTextField","_dayTextField","_yearTextField",$[438],"_spinner","_separator0","_separator1","_separator2");if(this._drop_down){var a=qx.ui.core.ClientDocument.getInstance();a.removeEventListener($[249],this._onWindowBlur,this);this.removeEventListener($[31],this._onAppear,this);this.removeEventListener($[205],this._onChangeVisibility,this);this.removeEventListener($[2],this._onMouseDown,this);this.removeEventListener($[29],this._onMouseClick,this);this.removeEventListener($[9],this._onMouseOver,this);this.removeEventListener($[14],this._onMouseOut,this);this._dropDownButton.dispose();this._dropDownButton=null;if(!qx.core.Object.inGlobalDispose()){this._calendar.setParent(null)}this._calendar.dispose();this._calendar=null}},statics:{WEEKDAY_TEXTFIELD:0,DATE_TEXTFIELD:1,MONTH_TEXTFIELD:2,YEAR_TEXTFIELD:3,WEEKDAY_MONTH_SEPARATOR:4,MONTH_DATE_SEPARATOR:5,DATE_YEAR_SEPARATOR:6,SPINNER:7,DROP_DOWN_BUTTON:13,_isNoModifierPressed:function(a){return !a.isCtrlPressed()&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isMetaPressed()}},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]){this._weekdayTextField.addState(a);this._monthTextField.addState(a);this._dayTextField.addState(a);this._yearTextField.addState(a);this._spinner.addState(a);this._separator0.addState(a);this._separator1.addState(a);this._separator2.addState(a);if(this._drop_down){this._dropDownButton.addState(a);this._calendar.addState(a)}}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]){this._weekdayTextField.removeState(a);this._monthTextField.removeState(a);this._dayTextField.removeState(a);this._yearTextField.removeState(a);this._spinner.removeState(a);this._separator0.removeState(a);this._separator1.removeState(a);this._separator2.removeState(a);if(this._drop_down){this._dropDownButton.removeState(a);this._calendar.removeState(a)}}},_rwt_onChangeFont:function(a){var b=a.getValue();this._weekdayTextField.setFont(b);this._dayTextField.setFont(b);this._monthTextField.setFont(b);this._yearTextField.setFont(b)},_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null&&!this._dropped){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_onFocusIn:function(a){this._focusedTextField.addState($[30])},_onFocusOut:function(a){if(this._focusedTextField===this._yearTextField){this._checkAndApplyYearValue()}this._focusedTextField.removeState($[30])},_onTextFieldMouseDown:function(a){if(this._focusedTextField===this._yearTextField){this._checkAndApplyYearValue()}this._setFocusedTextField(a.getTarget())},_setFocusedTextField:function(a){var b;this._focusedTextField.removeState($[30]);this._focusedTextField=null;if(a===this._dayTextField){this._spinner.setMin(1);this._spinner.setMax(this._getDaysInMonth());b=this._removeLeadingZero(this._dayTextField.getText());this._spinner.setValue(parseInt(b),10)}else{if(a===this._monthTextField){this._spinner.setMin(1);this._spinner.setMax(12);this._spinner.setValue(this._monthInt)}else{if(a===this._yearTextField){this._spinner.setMax(9999);this._spinner.setMin(1752);this._spinner.setValue(this._lastValidYear)}}}this._focusedTextField=a;this._focusedTextField.addState($[30])},_onSpinnerChange:function(a){if(this._focusedTextField!=null){var b=this._focusedTextField.getText();if(this._focusedTextField===this._monthTextField){this._monthInt=this._spinner.getValue();if(this._medium){this._focusedTextField.setText(this._addLeadingZero(this._monthInt))}else{this._focusedTextField.setText(this._monthname[this._monthInt-1])}}else{if(this._focusedTextField===this._yearTextField){this._lastValidYear=this._spinner.getValue();this._focusedTextField.setText(""+this._spinner.getValue())}else{this._focusedTextField.setText(this._addLeadingZero(this._spinner.getValue()))}}if(this._focusedTextField==this._monthTextField||this._focusedTextField==this._yearTextField){var c=this._dayTextField.getText();if(c>this._getDaysInMonth()){this._dayTextField.setText(""+this._getDaysInMonth())}}this._setWeekday();var d=this._focusedTextField.getText();if(b!=d){this._sendChanges()}}},_onKeyPress:function(a){var d=a.getKeyIdentifier();if(this._dropped){this._calendar._onkeypress(a);if(org.eclipse.swt.widgets.DateTimeDate._isNoModifierPressed(a)){switch(d){case $[68]:case $[116]:case $[92]:case"Tab":this._toggleCalendarVisibility();break;case"Left":case $[53]:case"Up":case"Down":case $[58]:case $[55]:var b=this._calendar.getDate();this._setDate(b);this._sendChanges();a.preventDefault();a.stopPropagation();break}}else{if(a.isShiftPressed()){switch(d){case"Tab":this._toggleCalendarVisibility();break;case $[58]:case $[55]:var b=this._calendar.getDate();this._setDate(b);this._sendChanges();a.preventDefault();a.stopPropagation();break}}}}else{if(org.eclipse.swt.widgets.DateTimeDate._isNoModifierPressed(a)){switch(d){case"Left":if(this._datePattern=="MDY"){this._rollLeft(this._monthTextField,this._dayTextField,this._yearTextField)}else{if(this._datePattern=="DMY"){this._rollLeft(this._dayTextField,this._monthTextField,this._yearTextField)}else{if(this._medium){this._rollLeft(this._yearTextField,this._monthTextField,this._dayTextField)}else{this._rollLeft(this._monthTextField,this._dayTextField,this._yearTextField)}}}a.preventDefault();a.stopPropagation();break;case $[53]:if(this._datePattern=="MDY"){this._rollRight(this._monthTextField,this._dayTextField,this._yearTextField)}else{if(this._datePattern=="DMY"){this._rollRight(this._dayTextField,this._monthTextField,this._yearTextField)}else{if(this._medium){this._rollRight(this._yearTextField,this._monthTextField,this._dayTextField)}else{this._rollRight(this._monthTextField,this._dayTextField,this._yearTextField)}}}a.preventDefault();a.stopPropagation();break;case"Up":if(this._focusedTextField===this._yearTextField){this._checkAndApplyYearValue()}var c=this._spinner.getValue();if(c==this._spinner.getMax()){this._spinner.setValue(this._spinner.getMin())}else{this._spinner.setValue(c+1)}a.preventDefault();a.stopPropagation();break;case"Down":if(this._focusedTextField===this._yearTextField){this._checkAndApplyYearValue()}var c=this._spinner.getValue();if(c==this._spinner.getMin()){this._spinner.setValue(this._spinner.getMax())}else{this._spinner.setValue(c-1)}a.preventDefault();a.stopPropagation();break;case $[58]:case $[55]:case"Home":case"End":a.preventDefault();a.stopPropagation();break}}}},_rollRight:function(c,b,a){if(this._focusedTextField===this._yearTextField){this._checkAndApplyYearValue()}if(this._focusedTextField===c){if(b.isSeeable()){this._setFocusedTextField(b)}else{this._setFocusedTextField(a)}}else{if(this._focusedTextField===b){if(a.isSeeable()){this._setFocusedTextField(a)}else{this._setFocusedTextField(c)}}else{if(this._focusedTextField===a){if(c.isSeeable()){this._setFocusedTextField(c)}else{this._setFocusedTextField(b)}}}}},_rollLeft:function(c,b,a){if(this._focusedTextField===this._yearTextField){this._checkAndApplyYearValue()}if(this._focusedTextField===c){if(a.isSeeable()){this._setFocusedTextField(a)}else{this._setFocusedTextField(b)}}else{if(this._focusedTextField===b){if(c.isSeeable()){this._setFocusedTextField(c)}else{this._setFocusedTextField(a)}}else{if(this._focusedTextField===a){if(b.isSeeable()){this._setFocusedTextField(b)}else{this._setFocusedTextField(c)}}}}},_onKeyUp:function(a){if(!this._dropped){var b=a.getKeyIdentifier();var e=this._focusedTextField.getText();e=this._removeLeadingZero(e);if(org.eclipse.swt.widgets.DateTimeDate._isNoModifierPressed(a)){switch(b){case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":var d=this._focusedTextField.getUserData($[155]);if(this._focusedTextField===this._monthTextField){e=""+this._monthInt;d=2}var f=b;if(e.length<d){f=e+b}var c=parseInt(f,10);if(this._focusedTextField===this._dayTextField||this._focusedTextField===this._monthTextField){if(c>=this._spinner.getMin()&&c<=this._spinner.getMax()){this._spinner.setValue(c)}else{f=b;c=parseInt(f,10);if(c>=this._spinner.getMin()&&c<=this._spinner.getMax()){this._spinner.setValue(c)}}}else{if(this._focusedTextField==this._yearTextField){this._focusedTextField.setText(f);if(f.length==4){this._checkAndApplyYearValue()}}}a.preventDefault();a.stopPropagation();break;case"Home":var f=this._spinner.getMin();this._spinner.setValue(f);a.preventDefault();a.stopPropagation();break;case"End":var f=this._spinner.getMax();this._spinner.setValue(f);a.preventDefault();a.stopPropagation();break}}}},_onMouseWheel:function(a){if(this.getFocused()){a.preventDefault();a.stopPropagation();if(!this._dropped){this._spinner._onmousewheel(a)}}},_getDaysInMonth:function(){var a=31;var c=this._monthInt-1;var d=parseInt(this._yearTextField.getText(),10);var b=new Date();b.setYear(d);b.setMonth(c);b.setDate(31);if(b.getMonth()!=c){a=30;b.setMonth(c);b.setDate(30);if(b.getMonth()!=c){a=29;b.setMonth(c);b.setDate(29);if(b.getMonth()!=c){a=28}}}return a},_setWeekday:function(){var a=new Date();a.setDate(parseInt(this._dayTextField.getText(),10));a.setMonth(this._monthInt-1);a.setFullYear(parseInt(this._yearTextField.getText(),10));this._weekdayTextField.setText(this._weekday[a.getDay()+1])},_checkAndApplyYearValue:function(){var a=this._lastValidYear;var b=parseInt(this._yearTextField.getText(),10);if(b>=0&&b<=29){this._lastValidYear=2000+b}else{if(b>=30&&b<=99){this._lastValidYear=1900+b}else{if(b>=1752){this._lastValidYear=b}}}this._yearTextField.setText(""+a);if(a!=this._lastValidYear){this._spinner.setValue(this._lastValidYear)}},_addLeadingZero:function(a){return a<10?"0"+a:""+a},_removeLeadingZero:function(c){var a=c;if(c.length==2){var b=c.substring(0,1);if(b=="0"){a=c.substring(1)}}return a},_sendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var b=c.findIdByWidget(this);a.addParameter(b+".day",this._removeLeadingZero(this._dayTextField.getText()));a.addParameter(b+".month",this._monthInt-1);a.addParameter(b+".year",this._lastValidYear);if(this._hasSelectionListener){this._requestTimer.restart()}}},_onInterval:function(){this._requestTimer.stop();var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addEvent($[64],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()},setMonth:function(a){this._monthInt=a+1;if(this._medium){this._monthTextField.setText(this._addLeadingZero(this._monthInt))}else{this._monthTextField.setText(this._monthname[this._monthInt-1])}if(this._focusedTextField===this._monthTextField){this._spinner.setValue(this._monthInt)}this._setWeekday()},setDay:function(a){this._dayTextField.setText(this._addLeadingZero(a));if(this._focusedTextField===this._dayTextField){this._spinner.setValue(a)}this._setWeekday()},setYear:function(a){this._lastValidYear=a;this._yearTextField.setText(""+a);if(this._focusedTextField===this._yearTextField){this._spinner.setValue(a)}this._setWeekday()},_setDate:function(a){this.setYear(a.getFullYear());this.setMonth(a.getMonth());this.setDay(a.getDate())},setHasSelectionListener:function(a){this._hasSelectionListener=a;this._requestTimer=new qx.client.Timer(110);this._requestTimer.addEventListener($[50],this._onInterval,this)},setBounds:function(e,b,f,c,a){var d=null;switch(e){case org.eclipse.swt.widgets.DateTimeDate.WEEKDAY_TEXTFIELD:d=this._weekdayTextField;break;case org.eclipse.swt.widgets.DateTimeDate.DATE_TEXTFIELD:d=this._dayTextField;break;case org.eclipse.swt.widgets.DateTimeDate.MONTH_TEXTFIELD:d=this._monthTextField;break;case org.eclipse.swt.widgets.DateTimeDate.YEAR_TEXTFIELD:d=this._yearTextField;break;case org.eclipse.swt.widgets.DateTimeDate.WEEKDAY_MONTH_SEPARATOR:d=this._separator0;break;case org.eclipse.swt.widgets.DateTimeDate.MONTH_DATE_SEPARATOR:d=this._separator1;break;case org.eclipse.swt.widgets.DateTimeDate.DATE_YEAR_SEPARATOR:d=this._separator2;break;case org.eclipse.swt.widgets.DateTimeDate.SPINNER:d=this._spinner;break;case org.eclipse.swt.widgets.DateTimeDate.DROP_DOWN_BUTTON:d=this._dropDownButton;break}if(d!=null){d.set({left:b,top:f,width:c,height:a})}},_onAppear:function(a){if(this._calendar!=null){this.getTopLevelWidget().add(this._calendar);this._setCalendarLocation()}},_onWindowBlur:function(a){if(this._dropped){this._toggleCalendarVisibility()}},_onChangeVisibility:function(a){var b=a.getValue();if(!b&&this._dropped){this._toggleCalendarVisibility()}},_onMouseDown:function(a){var b=a.getTarget();if(b.getUserData($[188])){a.stopPropagation()}else{if(b.getUserData($[206])){a.stopPropagation()}else{if(this._dropped&&b!==this._dropDownButton){this._toggleCalendarVisibility()}}}},_onMouseClick:function(a){if(a.isLeftButtonPressed()){var c=a.getTarget();if(c.getUserData($[188])){this._calendar._onDayClicked(a);var b=this._calendar.getDate();this._setDate(b);this._toggleCalendarVisibility();this.setFocused(true);this._sendChanges()}else{if(c.getUserData($[206])){this._calendar._onNavButtonClicked(a)}else{if(c===this._dropDownButton){this._toggleCalendarVisibility()}}}}},_onMouseOver:function(a){var b=a.getTarget();if(b==this._dropDownButton){this._dropDownButton.addState("over")}else{if(b.getUserData($[188])){this._calendar._onDayMouseOver(a)}}},_onMouseOut:function(a){var b=a.getTarget();if(b==this._dropDownButton){this._dropDownButton.removeState("over")}else{if(b.getUserData($[188])){this._calendar._onDayMouseOut(a)}}},_toggleCalendarVisibility:function(){if(this._calendar!=null){this._dropped=!this._dropped;this._calendar.setVisibility(this._dropped);this.setCapture(this._dropped);if(this._dropped){this._bringToFront();this._setCalendarLocation();var c=parseInt(this._yearTextField.getText(),10);var a=parseInt(this._dayTextField.getText(),10);var b=new Date(c,this._monthInt-1,a);this._calendar.setDate(b);this._focusedTextField.removeState($[30])}else{if(this.getFocused()){this._focusedTextField.addState($[30])}}}},_setCalendarLocation:function(){if(this.getElement()&&this._calendar!=null){var b=qx.bom.element.Location.get(this.getElement());var c=qx.html.Window.getInnerHeight(window);var d=b.top+this.getHeight();var a=this._calendar.getHeightValue();if(d+a>c){d=b.top-a}this._calendar.setLocation(b.left,d)}},_bringToFront:function(){var a=this.getTopLevelWidget().getChildren();var b=this._calendar.getZIndex();for(var d in a){var c=a[d];if(c.getZIndex){if(b<c.getZIndex()){b=c.getZIndex()}}}if(b>this._calendar.getZIndex()){this._calendar.setZIndex(b+1)}}}});
-qx.Class.define($[323],{extend:qx.ui.basic.Atom,construct:function(b,a){arguments.callee.base.call(this);if(b.classname!=$[414]){throw new Error("illegal parent, must be a CTabFolder")}this._parent=b;this.setAppearance("ctab-item");this.setVerticalChildrenAlign(qx.constant.Layout.ALIGN_MIDDLE);this.setHorizontalChildrenAlign(qx.constant.Layout.ALIGN_LEFT);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this.setTabIndex(null);this.setLabel($[139]);this.getLabelObject().setMode(qx.constant.Style.LABEL_MODE_HTML);this.getLabelObject().setVerticalAlign(qx.constant.Layout.ALIGN_MIDDLE);this.setLabel("");this._selected=false;this._showClose=false;this._canClose=a;this._unselectedCloseVisible=true;this.updateForeground();this.updateBackground();this.updateBackgroundImage();this.updateBackgroundGradient();this.setTabPosition(b.getTabPosition());if(b.hasState($[229])){this.addState($[229])}this._closeButton=new qx.ui.basic.Image();this._closeButton.setAppearance("ctab-close-button");this._closeButton.setWidth(20);this._closeButton.setHeight("80%");this._closeButton.addEventListener($[29],this._onClose,this);var c=org.eclipse.swt.WidgetManager.getInstance();c.setToolTip(this._closeButton,org.eclipse.swt.custom.CTabFolder.CLOSE_TOOLTIP);this.add(this._closeButton);this._updateCloseButton();this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[14],this._onMouseOut,this);this.addEventListener($[29],this._onClick,this);this.addEventListener($[61],this._onDblClick,this)},destruct:function(){this.removeEventListener($[9],this._onMouseOver,this);this.removeEventListener($[14],this._onMouseOut,this);this.removeEventListener($[29],this._onClick,this);this.removeEventListener($[61],this._onDblClick,this);this._closeButton.removeEventListener($[29],this._onClose,this);var a=org.eclipse.swt.WidgetManager.getInstance();a.setToolTip(this._closeButton,null);this._closeButton.dispose();this._closeButton=null},statics:{STATE_OVER:"over",STATE_SELECTED:$[30],IMG_CLOSE:$[465],IMG_CLOSE_HOVER:$[458]},members:{setTabPosition:function(a){if(a==="top"){this.addState($[175])}else{this.removeState($[175])}},setSelected:function(b){this._selected=b;var a=this._getPrevItem();if(a!=null){if(b){a.addState($[489])}else{a.removeState($[489])}}if(b){this.addState(org.eclipse.swt.custom.CTabItem.STATE_SELECTED)}else{this.removeState(org.eclipse.swt.custom.CTabItem.STATE_SELECTED)}this.updateForeground();this.updateBackground();this.updateBackgroundImage();this.updateBackgroundGradient();this._updateCloseButton()},_getPrevItem:function(){var a=null;var c=this._parent.getChildren();for(var b=0;b<c.length&&c[b]!=this;b++){if(c[b].classname===$[323]){a=c[b]}}return a},isSelected:function(){return this._selected},setShowClose:function(a){this._showClose=a;this._updateCloseButton()},setUnselectedCloseVisible:function(a){this._unselectedCloseVisible=a;this._updateCloseButton()},updateForeground:function(){var a=this.isSelected()?this._parent.getSelectionForeground():this._parent.getTextColor();if(a!=null){this.setTextColor(a)}else{this.resetTextColor()}},updateBackground:function(){var a=this.isSelected()?this._parent.getSelectionBackground():null;if(a!=null){this.setBackgroundColor(a)}else{this.resetBackgroundColor()}},updateBackgroundImage:function(){var a=null;if(this.isSelected()){a=this._parent.getSelectionBackgroundImage()}if(a!=null){this.setUserData($[296],a.slice(1));this.setBackgroundImage(a[0])}else{this.resetBackgroundImage()}},updateBackgroundGradient:function(){var b=null;var a=null;var c=true;var d=this._parent.getSelectionBackgroundGradient();if(this.isSelected()&&d!=null){b=d.colors;a=d.percents;c=d.vertical}var e=org.eclipse.swt.WidgetManager.getInstance();e.setBackgroundGradient(this,b,a,c)},_updateCloseButton:function(){var a=false;if(this._canClose||this._showClose){a=this.isSelected()||(this._unselectedCloseVisible&&this.hasState(org.eclipse.swt.custom.CTabItem.STATE_OVER))}this._closeButton.setVisibility(a)},_onMouseOver:function(a){this.addState(org.eclipse.swt.custom.CTabItem.STATE_OVER);if(a.getTarget()==this._closeButton){this._closeButton.addState(org.eclipse.swt.custom.CTabItem.STATE_OVER)}this._updateCloseButton()},_onMouseOut:function(a){this.removeState(org.eclipse.swt.custom.CTabItem.STATE_OVER);if(a.getTarget()==this._closeButton){this._closeButton.removeState(org.eclipse.swt.custom.CTabItem.STATE_OVER)}this._updateCloseButton()},_onClick:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){if(a.getTarget()!=this._closeButton){a.getTarget().getParent()._notifyItemClick(a.getTarget())}}},_onDblClick:function(a){if(a.getTarget()!=this._closeButton){a.getTarget().getParent()._notifyItemDblClick(a.getTarget())}},_onClose:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var b=org.eclipse.swt.Request.getInstance();var c=d.findIdByWidget(this);b.addEvent("org.eclipse.swt.events.ctabItemClosed",c);b.send()}}}});
-qx.Class.define($[414],{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this.setTabIndex(1);this.setHideFocus(true);this.setAppearance("ctabfolder");this.setOverflow($[17]);this._hasFolderListener=false;this._hasSelectionListener=false;this._tabPosition="top";this._tabHeight=0;this._selectionForeground=null;this._selectionBackground=null;this._selectionBackgroundImage=null;this._selectionBackgroundGradient=null;this._chevron=null;this._chevronMenu=null;this._minMaxState=$[109];this._maxButton=null;this._minButton=null;this._body=new qx.ui.layout.CanvasLayout();this._body.addState($[175]);this._body.setAppearance("ctabfolder-body");this.add(this._body);this._separator=new qx.ui.layout.CanvasLayout();this._separator.setAppearance("ctabfolder-separator");this.add(this._separator);this._frame=new qx.ui.layout.CanvasLayout();this._frame.setAppearance("ctabfolder-frame");this.add(this._frame);this._frameBorder=new org.eclipse.rwt.Border(2,$[20],"black");this.addEventListener($[57],this._updateLayout,this);this.addEventListener($[66],this._updateLayout,this);this.addEventListener($[12],this._onKeyPress,this);this.addEventListener($[41],this._onContextMenu,this)},destruct:function(){this.hideMinButton();this.hideMaxButton();this.removeEventListener($[57],this._updateLayout,this);this.removeEventListener($[66],this._updateLayout,this);this.removeEventListener($[12],this._onKeyPress,this);this.removeEventListener($[41],this._onContextMenu,this);this._disposeObjects("_frame","_separator");this._frameBorder.dispose()},statics:{BUTTON_SIZE:18,MIN_TOOLTIP:"Minimize",MAX_TOOLTIP:"Maximize",RESTORE_TOOLTIP:"Restore",CHEVRON_TOOLTIP:"Show List",CLOSE_TOOLTIP:"Close",setToolTipTexts:function(b,a,c,d,e){org.eclipse.swt.custom.CTabFolder.MIN_TOOLTIP=b;org.eclipse.swt.custom.CTabFolder.MAX_TOOLTIP=a;org.eclipse.swt.custom.CTabFolder.RESTORE_TOOLTIP=c;org.eclipse.swt.custom.CTabFolder.CHEVRON_TOOLTIP=d;org.eclipse.swt.custom.CTabFolder.CLOSE_TOOLTIP=e}},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]||a.substr(0,4)=="rwt_"){this._body.addState(a);this._frame.addState(a);this._mapItems(function(b){b.addState(a)})}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]||a.substr(0,4)=="rwt_"){this._body.removeState(a);this._frame.removeState(a);this._mapItems(function(b){b.removeState(a)})}},setTabPosition:function(a){this._tabPosition=a;this._mapItems(function(b){b.setTabPosition(a)});if(a=="top"){this._body.addState($[175])}else{this._body.removeState($[175])}this._updateLayout()},getTabPosition:function(){return this._tabPosition},setTabHeight:function(b){this._tabHeight=b;var a=this._getButtonTop();if(this._minButton!=null){this._minButton.setTop(a)}if(this._maxButton!=null){this._maxButton.setTop(a)}if(this._chevron!=null){this._chevron.setTop(a)}this._updateLayout()},_applyTextColor:function(b,a){arguments.callee.base.call(this,b,a);this._mapItems(function(c){c.updateForeground()})},_applyBackgroundColor:function(b,a){this._body.setBackgroundColor(b)},_applyBackgroundImage:function(b,a){this._body.setUserData($[296],this.getUserData($[296]));this._body.setBackgroundImage(b)},setSelectionForeground:function(a){this._selectionForeground=a;this._mapItems(function(b){b.updateForeground()})},setSelectionBackground:function(a){this._selectionBackground=a;this._mapItems(function(b){b.updateBackground()});if(a!=null&&!this.hasState($[171])){this._frame.setBorder(null);this._frameBorder.dispose();this._frameBorder=new org.eclipse.rwt.Border(2,$[20],a);this._frame.setBorder(this._frameBorder)}else{this._frame.resetBorder()}},setSelectionBackgroundImage:function(a){this._selectionBackgroundImage=a;this._mapItems(function(b){b.updateBackgroundImage()})},setSelectionBackgroundGradient:function(b,a,c){this._selectionBackgroundGradient={};this._selectionBackgroundGradient.colors=b;this._selectionBackgroundGradient.percents=a;this._selectionBackgroundGradient.vertical=c;this._mapItems(function(d){d.updateBackgroundGradient()})},setBorderVisible:function(a){if(a){this.addState($[229])}else{this.removeState($[229])}this._updateLayout()},getSelectionForeground:function(){return this._selectionForeground},getSelectionBackground:function(){return this._selectionBackground},getSelectionBackgroundImage:function(){return this._selectionBackgroundImage},getSelectionBackgroundGradient:function(){return this._selectionBackgroundGradient},_mapItems:function(c){var b=this.getChildren();for(var a=0;a<b.length;a++){if(b[a].classname===$[323]){c(b[a])}}},_getButtonTop:function(){return(this._tabHeight/2)-(org.eclipse.swt.custom.CTabFolder.BUTTON_SIZE/2)},showChevron:function(e,d,b,a){if(this._chevron==null){this._chevron=new qx.ui.form.Button();this._chevron.setAppearance("ctabfolder-drop-down-button");this._chevron.setShow(qx.constant.Style.BUTTON_SHOW_ICON);this._chevron.addEventListener($[137],this._onChevronExecute,this);var c=org.eclipse.swt.WidgetManager.getInstance();c.setToolTip(this._chevron,org.eclipse.swt.custom.CTabFolder.CHEVRON_TOOLTIP);this.add(this._chevron)}this._chevron.setTop(d);this._chevron.setLeft(e);this._chevron.setWidth(b);this._chevron.setHeight(a)},hideChevron:function(){if(this._chevron!=null){var a=org.eclipse.swt.WidgetManager.getInstance();a.setToolTip(this._chevron,null);this._chevron.removeEventListener($[137],this._onChevronExecute,this);this.remove(this._chevron);this._chevron.dispose();this._chevron=null}},setMinMaxState:function(d){this._minMaxState=d;var e="";var a="";var f="";var b="";switch(d){case"min":e=$[568];a=$[446];f=org.eclipse.swt.custom.CTabFolder.RESTORE_TOOLTIP;b=org.eclipse.swt.custom.CTabFolder.MAX_TOOLTIP;break;case"max":e=$[573];a=$[568];f=org.eclipse.swt.custom.CTabFolder.MIN_TOOLTIP;b=org.eclipse.swt.custom.CTabFolder.RESTORE_TOOLTIP;break;case $[109]:e=$[573];a=$[446];f=org.eclipse.swt.custom.CTabFolder.MIN_TOOLTIP;b=org.eclipse.swt.custom.CTabFolder.MAX_TOOLTIP;break}var c=org.eclipse.swt.WidgetManager.getInstance();if(this._minButton!=null){this._minButton.setIcon(e);c.setToolTip(this._minButton,f)}if(this._maxButton!=null){this._maxButton.setIcon(a);c.setToolTip(this._maxButton,b)}},showMaxButton:function(d,c,b,a){if(this._maxButton==null){this._maxButton=new qx.ui.form.Button();this._maxButton.setAppearance($[347]);this._maxButton.setShow(qx.constant.Style.BUTTON_SHOW_ICON);this.setMinMaxState(this._minMaxState);this._maxButton.addEventListener($[2],this._onMinMaxExecute,this);this.add(this._maxButton)}this._maxButton.setTop(c);this._maxButton.setLeft(d);this._maxButton.setWidth(b);this._maxButton.setHeight(a)},hideMaxButton:function(){if(this._maxButton!=null){this._maxButton.removeEventListener($[2],this._onMinMaxExecute,this);var a=org.eclipse.swt.WidgetManager.getInstance();a.setToolTip(this._maxButton,null);this.remove(this._maxButton);this._maxButton.dispose();this._maxButton=null}},showMinButton:function(d,c,b,a){if(this._minButton==null){this._minButton=new qx.ui.form.Button();this._minButton.setAppearance($[347]);this._minButton.setShow(qx.constant.Style.BUTTON_SHOW_ICON);this.setMinMaxState(this._minMaxState);this._minButton.addEventListener($[2],this._onMinMaxExecute,this);this.add(this._minButton)}this._minButton.setTop(c);this._minButton.setLeft(d);this._minButton.setWidth(b);this._minButton.setHeight(a)},hideMinButton:function(b){if(this._minButton!=null){this._minButton.removeEventListener($[2],this._onMinMaxExecute,this);var a=org.eclipse.swt.WidgetManager.getInstance();a.setToolTip(this._minButton,null);this.remove(this._minButton);this._minButton.dispose();this._minButton=null}},setHasFolderListener:function(a){this._hasFolderListener=a},setHasSelectionListener:function(a){this._hasSelectionListener=a},_updateLayout:function(){var c=this.hasState($[229])?1:0;var a=this.hasState($[171])?0:2;var b=1;var e=this.getWidth()-c*2;var d=this._tabHeight+1;this._body.setLeft(0);this._body.setTop(0);this._body.setWidth(this.getWidth());this._body.setHeight(this.getHeight());this._separator.setLeft(c);this._separator.setWidth(e);this._separator.setHeight(10);this._frame.setLeft(c);this._frame.setWidth(e);this._frame.setHeight(this.getHeight()-c-b-d);if(this._tabPosition=="top"){this._separator.setTop(d);this._frame.setTop(d+1)}else{this._separator.setTop(this.getHeight()-d-1);this._frame.setTop(c)}},_onChevronExecute:function(a){if(this._chevronMenu==null||!this._chevronMenu.isSeeable()){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var d=c.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addEvent("org.eclipse.swt.events.ctabFolderShowList",d);b.send()}}},_onMinMaxExecute:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var c;if(a.getTarget()==this._minButton){if(this._minMaxState=="min"){this.setMinMaxState($[109]);c=$[472]}else{this.setMinMaxState("min");c="org.eclipse.swt.events.ctabFolderMinimized"}}else{if(this._minMaxState==$[109]||this._minMaxState=="min"){this.setMinMaxState("max");c="org.eclipse.swt.events.ctabFolderMaximized"}else{this.setMinMaxState($[109]);c=$[472]}}var d=org.eclipse.swt.WidgetManager.getInstance().findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addParameter(d+".minimized",this._minMaxState=="min");b.addParameter(d+".maximized",this._minMaxState=="max");if(this._hasFolderListener){b.addEvent(c,d);b.send()}}},_onKeyPress:function(a){switch(a.getKeyIdentifier()){case"Left":a.stopPropagation();break;case $[53]:a.stopPropagation();break}},_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_notifyItemClick:function(b){if(!org.eclipse.swt.EventUtil.getSuspended()){if(!b.isSelected()){this._mapItems(function(f){f.setSelected(false)});b.setSelected(true);var e=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var d=e.findIdByWidget(this);var c=e.findIdByWidget(b);a.addParameter(d+$[415],c);a.addEvent($[64],d);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()}}},_notifyItemDblClick:function(b){if(!org.eclipse.swt.EventUtil.getSuspended()){if(this._hasSelectionListener){var e=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var d=e.findIdByWidget(this);var c=e.findIdByWidget(b);a.addParameter(d+$[415],c);a.addEvent($[165],d);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()}}}}});
-qx.Class.define("org.eclipse.swt.widgets.ExpandItem",{extend:qx.ui.layout.CanvasLayout,construct:function(a){arguments.callee.base.call(this);if(a.classname!=$[498]){throw new Error("illegal parent, must be a ExpandBar")}this.setAppearance("expand-item");this._expandBar=a;this._headerHeight=24;this._expanded=false;this._image=null;this._text="";this._header=new qx.ui.basic.Atom($[139],this._image,16,16);this._header.getLabelObject().setPaddingBottom(4);this._header.setAppearance("expand-item-header");this._header.addEventListener($[29],this._onClick,this);this._header.addEventListener($[9],this._onHandleMouseOver,this);this._header.addEventListener($[14],this._onHandleMouseOut,this);this._header.addEventListener($[41],this._onContextMenu,this);this._header.setHeight(this._headerHeight);this._header.setLabel(this._text);this.add(this._header);this._chevron=new qx.ui.basic.Image;this._chevron.setAppearance("expand-item-chevron-button");this._chevron.setTop((this._headerHeight-this._chevron.getHeight())/2);this._chevron.addEventListener($[29],this._onClick,this);this._chevron.addEventListener($[9],this._onHandleMouseOver,this);this._chevron.addEventListener($[14],this._onHandleMouseOut,this);this._chevron.addEventListener($[41],this._onContextMenu,this);this.add(this._chevron)},destruct:function(){this._header.removeEventListener($[29],this._onClick,this);this._header.removeEventListener($[9],this._onHandleMouseOver,this);this._header.removeEventListener($[14],this._onHandleMouseOut,this);this._header.removeEventListener($[41],this._onContextMenu,this);this._chevron.removeEventListener($[29],this._onClick,this);this._chevron.removeEventListener($[9],this._onHandleMouseOver,this);this._chevron.removeEventListener($[14],this._onHandleMouseOut,this);this._chevron.removeEventListener($[41],this._onContextMenu,this);this._disposeObjects("_header","_chevron")},statics:{STATE_EXPANDED:$[265],STATE_OVER:"over"},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]){this._header.addState(a);this._chevron.addState(a)}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]){this._header.removeState(a);this._chevron.removeState(a)}},setExpanded:function(a){this._expanded=a;if(a){this._chevron.addState(org.eclipse.swt.widgets.ExpandItem.STATE_EXPANDED);this._header.addState(org.eclipse.swt.widgets.ExpandItem.STATE_EXPANDED)}else{this._chevron.removeState(org.eclipse.swt.widgets.ExpandItem.STATE_EXPANDED);this._header.removeState(org.eclipse.swt.widgets.ExpandItem.STATE_EXPANDED)}},setImage:function(a){this._image=a;this._header.setIcon(a)},setText:function(a){this._text=a;this._header.setLabel(a)},setHeaderHeight:function(a){this._headerHeight=a;this._header.setHeight(this._headerHeight);this._chevron.setTop((this._headerHeight-this._chevron.getHeight())/2)},_onClick:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var b=org.eclipse.swt.Request.getInstance();var c=d.findIdByWidget(this);if(this._expanded){b.addEvent("org.eclipse.swt.events.expandItemCollapsed",c)}else{b.addEvent("org.eclipse.swt.events.expandItemExpanded",c)}b.send()}},_onContextMenu:function(a){var b=this._expandBar.getContextMenu();if(b!=null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this._expandBar);b.show();a.stopPropagation()}},_onHandleMouseOver:function(a){this._chevron.addState(org.eclipse.swt.widgets.ExpandItem.STATE_OVER)},_onHandleMouseOut:function(a){this._chevron.removeState(org.eclipse.swt.widgets.ExpandItem.STATE_OVER)}}});
-qx.Class.define($[498],{extend:org.eclipse.swt.widgets.Scrollable,construct:function(){arguments.callee.base.call(this,new qx.ui.layout.CanvasLayout());this.setAppearance("expand-bar");this.setHideFocus(true);this._bottomSpacing=new qx.ui.layout.CanvasLayout();org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._bottomSpacing);this._clientArea.add(this._bottomSpacing)},destruct:function(){this._disposeObjects("_bottomSpacing")},members:{addWidget:function(a){this._clientArea.add(a)},setBottomSpacingBounds:function(b,d,c,a){this._bottomSpacing.setLeft(b);this._bottomSpacing.setTop(d);this._bottomSpacing.setWidth(c);this._bottomSpacing.setHeight(a)},showVScrollbar:function(a){this.setScrollBarsVisible(false,a);if(!a){this.setVBarSelection(0)}},setVScrollbarMax:function(a){this._vertScrollBar.setMaximum(a)}}});
-qx.Class.define($[480],{extend:qx.ui.form.TextField,construct:function(a){arguments.callee.base.call(this);if(a){this._inputTag=$[167];this._inputType=null;this._inputOverflow="auto";this.setAppearance("text-area");this.setAllowStretchY(true);this.__oninput=qx.lang.Function.bindEvent(this._oninputDomTextarea,this)}},properties:{wrap:{check:$[3],init:true,apply:$[394]}},members:{_applyElement:function(b,a){arguments.callee.base.call(this,b,a);if(this._inputTag==$[167]){this._styleWrap()}this._inputElement.style.paddingRight="1px"},_applyWrap:function(b,a){if(this._inputTag==$[167]){this._styleWrap()}},_styleWrap:qx.core.Variant.select($[0],{mshtml:function(){if(this._inputElement){this._inputElement.wrap=this.getWrap()?"soft":"off"}},gecko:function(){if(this._inputElement){var b=this.getWrap()?"soft":"off";var a=this.getWrap()?"":"auto";this._inputElement.setAttribute("wrap",b);this._inputElement.style.overflow=a}},"default":function(){if(this._inputElement){var a=this.getWrap()?"soft":"off";this._inputElement.setAttribute("wrap",a)}}}),_applyMaxLength:function(b,a){if(this._inputTag!=$[167]){arguments.callee.base.call(this,b,a)}},_oninputDomTextarea:function(e){var b=this.getMaxLength();var d=true;if(b!=null){var f=this._inputElement.value;if(f.length>this.getMaxLength()){var c=this.getValue();var a=this.getSelectionStart();if(c.length==(f.length-1)){this._inputElement.value=c;this.setSelectionStart(a-1);this.setSelectionLength(0)}else{if(f.length>=c.length&&f!=c){this._inputElement.value=f.slice(0,this.getMaxLength());this.setSelectionStart(Math.min(a,this.getMaxLength()));this.setSelectionLength(0)}}if(this._inputElement.value==c){d=false}}}if(d){this._oninputDom(e)}},setPasswordMode:function(b){var a=b?"password":"text";if(this._inputTag!=$[167]&&this._inputType!=a){this._inputType=a;if(this._isCreated){if(org.eclipse.rwt.Client.getEngine()==$[18]){this._reCreateInputField()}else{this._inputElement.type=this._inputType}}}},_reCreateInputField:function(){var a=this.getSelectionStart();var b=this.getSelectionLength();this._inputElement.parentNode.removeChild(this._inputElement);this._inputElement.onpropertychange=null;this._inputElement=null;this._firstInputFixApplied=false;this._applyElement(this.getElement(),null);this._afterAppear();org.eclipse.swt.TextUtil._updateLineHeight(this);this._postApply();this._applyFocused(this.getFocused());this.setSelectionStart(a);this.setSelectionLength(b)}}});
-qx.Class.define("org.eclipse.rwt.KeyEventUtil",{type:$[33],extend:qx.core.Object,construct:function(){arguments.callee.base.call(this);org.eclipse.rwt.EventHandler.setKeyEventFilter(this._onKeyEvent,this);this._keyBindings={}},members:{cancelEvent:function(){this._getDelegate().cancelEvent()},allowEvent:function(){this._getDelegate().allowEvent()},setKeyBindings:function(a){this._keyBindings=a},_onKeyEvent:function(d,f,c,e){var a;if(this._isKeyBinding(e,f,c)){a=false;if(d===$[24]){org.eclipse.rwt.EventHandlerUtil.stopDomEvent(e);this._attachKeyDown(null,f,c,e);org.eclipse.swt.Request.getInstance().send()}}else{var b=this._getDelegate();a=!b.intercept(d,f,c,e)}return a},_getDelegate:function(){var a;if(qx.core.Variant.isSet($[0],$[40])){a=org.eclipse.rwt.AsyncKeyEventUtil.getInstance()}else{a=org.eclipse.rwt.SyncKeyEventUtil.getInstance()}return a},_isKeyBinding:function(d,e,b){var c=this._getKeyBindingIdentifier(d,e,b);var a=this._keyBindings[c]===true;return a},_getKeyBindingIdentifier:function(d,e,b){var a=[];if(d.altKey){a.push("ALT")}if(d.ctrlKey){a.push("CTRL")}if(d.shiftKey){a.push("SHIFT")}if(!isNaN(e)&&e>0){a.push(e.toString())}else{if(!isNaN(b)&&b>0){var c=String.fromCharCode(b);a.push(c.toUpperCase().charCodeAt(0))}}return a.join("+")},_isRelevantEvent:function(c,e){var a;if(qx.core.Variant.isSet($[0],$[18])){var b=org.eclipse.rwt.EventHandlerUtil;var d=b._isNonPrintableKeyCode(e)||e==27||e==8||e==9;if(d){a=c===$[24]}else{a=c===$[12]}}else{a=c===$[12]}return a},_getTargetControl:function(){var a=org.eclipse.rwt.EventHandler.getCaptureWidget();if(!a){var b=org.eclipse.rwt.EventHandler.getFocusRoot();a=b===null?null:b.getActiveChild()}var c=org.eclipse.swt.WidgetManager.getInstance();while(a!==null&&!c.isControl(a)){a=a.getParent?a.getParent():null}return a},_hasKeyListener:function(a){return a!==null&&a.getUserData("keyListener")===true},_hasTraverseListener:function(a){return a!==null&&a.getUserData("traverseListener")===true},_isTraverseKey:function(b){var a=false;if(b===27||b===13||b===9){a=true}return a},_attachKeyDown:function(d,i,h,e){var f=org.eclipse.swt.Request.getInstance();var a;if(d===null){a="w1"}else{var g=org.eclipse.swt.WidgetManager.getInstance();a=g.findIdByWidget(d)}f.addEvent("org.eclipse.swt.events.keyDown",a);f.addParameter("org.eclipse.swt.events.keyDown.keyCode",i);f.addParameter("org.eclipse.swt.events.keyDown.charCode",h);var b="";var c=org.eclipse.rwt.Client.getPlatform()==="mac"&&e.metaKey;if(e.shiftKey){b+="shift,"}if(e.ctrlKey||c){b+="ctrl,"}if(e.altKey){b+="alt,"}f.addParameter("org.eclipse.swt.events.keyDown.modifier",b)}}});
-qx.Class.define("org.eclipse.swt.widgets.Separator",{extend:qx.ui.layout.BoxLayout,construct:function(){arguments.callee.base.call(this);org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this);this._line=new qx.ui.layout.CanvasLayout();this._line.setAnonymous(true);this._line.setAppearance("separator-line");this.add(this._line)},properties:{appearance:{refine:true,init:"separator"}},destruct:function(){this._line.dispose();this._line=null},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]){this._line.addState(a)}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[54]){this._line.removeState(a)}},setLineStyle:function(a){this._line.addState(a)},setLineOrientation:function(a){if(a==$[46]){this.setHorizontalChildrenAlign($[38]);this._line.setHeight("100%");this._line.addState($[304])}else{this.setVerticalChildrenAlign($[32]);this._line.setWidth("100%");this._line.removeState($[304])}}}});
-qx.Theme.define("org.eclipse.swt.theme.AppearancesBase",{title:"Appearances Base Theme",appearances:{empty:{},widget:{},image:{},"cursor-dnd-move":{style:function(a){return{source:"widget/cursors/move.gif"}}},"cursor-dnd-copy":{style:function(a){return{source:"widget/cursors/copy.gif"}}},"cursor-dnd-alias":{style:function(a){return{source:"widget/cursors/alias.gif"}}},"cursor-dnd-nodrop":{style:function(a){return{source:"widget/cursors/nodrop.gif"}}},"client-document":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{font:b.getCssFont("*","font"),textColor:"black",backgroundColor:"white"}}},"client-document-blocker":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={cursor:$[39],animation:c.getCssAnimation($[273],$[202]),backgroundColor:c.getCssColor($[273],$[5]),backgroundImage:c.getCssImage($[273],$[1]),opacity:c.getCssFloat($[273],$[42])};if(a.backgroundImage==null&&a.backgroundColor==$[8]){a.backgroundImage=$[344]}return a}},atom:{style:function(a){return{cursor:$[39],spacing:4,width:"auto",height:"auto",horizontalChildrenAlign:$[38],verticalChildrenAlign:$[32]}}},label:{},"label-graytext":{style:function(a){}},"label-wrapper":{style:function(c){var b={};var e=new org.eclipse.swt.theme.ThemeValues(c);b.font=e.getCssFont($[76],"font");var d=e.getCssIdentifier($[76],$[333]);if(d!=null&&d!="none"){var a=new qx.ui.core.Font();a.setSize(b.font.getSize());a.setFamily(b.font.getFamily());a.setBold(b.font.getBold());a.setItalic(b.font.getItalic());a.setDecoration(d);b.font=a}b.textColor=e.getCssColor($[76],$[6]);b.backgroundColor=e.getCssColor($[76],$[5]);b.backgroundImage=e.getCssImage($[76],$[1]);b.backgroundGradient=e.getCssGradient($[76],$[1]);b.border=e.getCssBorder($[76],$[4]);b.cursor=e.getCssCursor($[76],$[34]);b.opacity=e.getCssFloat($[76],$[42]);return b}},clabel:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.textColor=c.getCssColor($[113],$[6]);a.backgroundColor=c.getCssColor($[113],$[5]);a.font=c.getCssFont($[113],"font");if(b.rwt_SHADOW_IN){a.border=c.getCssNamedBorder($[324])}else{if(b.rwt_SHADOW_OUT){a.border=c.getCssNamedBorder($[395])}else{a.border=c.getCssBorder($[113],$[4])}}a.backgroundImage=c.getCssImage($[113],$[1]);a.backgroundGradient=c.getCssGradient($[113],$[1]);a.cursor=c.getCssCursor($[113],$[34]);a.padding=c.getCssBoxDimensions($[113],$[37]);a.spacing=c.getCssDimension($[113],$[107]);a.opacity=c.getCssFloat($[113],$[42]);return a}},htmlcontainer:{include:$[82]},popup:{},"widget-tool-tip":{include:"popup",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[106],$[4]);a.animation=c.getCssAnimation($[106],$[202]);a.padding=c.getCssBoxDimensions($[106],$[37]);a.textColor=c.getCssColor($[106],$[6]);a.font=c.getCssFont($[106],"font");a.backgroundColor=c.getCssColor($[106],$[5]);a.backgroundImage=c.getCssImage($[106],$[1]);a.backgroundGradient=c.getCssGradient($[106],$[1]);a.opacity=c.getCssFloat($[106],$[42]);a.shadow=c.getCssShadow($[106],$[169]);return a}},"tool-tip":{include:"popup",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.width="auto";a.height="auto";a.minWidth=36;a.minHeight=36;a.cursor=c.getCssCursor($[111],$[34]);a.font=c.getCssFont($[111],"font");a.textColor=c.getCssColor($[111],$[6]);a.padding=c.getCssBoxDimensions($[111],$[37]);a.border=c.getCssBorder($[111],$[4]);a.backgroundColor=c.getCssColor($[111],$[5]);a.backgroundImage=c.getCssImage($[111],$[1]);a.backgroundGradient=c.getCssGradient($[111],$[1]);a.animation=c.getCssAnimation($[111],$[202]);a.opacity=c.getCssFloat($[111],$[42]);a.shadow=c.getCssShadow($[111],$[169]);return a}},"tool-tip-image":{include:$[35],style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{source:b.getCssImage("ToolTip-Image",$[1])}}},"tool-tip-text":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={font:c.getCssFont($[497],"font"),textColor:c.getCssColor($[497],$[6])};return a}},"tool-tip-message":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={font:c.getCssFont($[321],"font"),textColor:c.getCssColor($[321],$[6])};return a}},iframe:{style:function(a){return{}}},button:{include:"atom",style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.font=c.getCssFont($[16],"font");a.textColor=c.getCssColor($[16],$[6]);a.backgroundColor=c.getCssColor($[16],$[5]);a.backgroundImage=c.getCssImage($[16],$[1]);a.backgroundGradient=c.getCssGradient($[16],$[1]);a.border=c.getCssBorder($[16],$[4]);a.spacing=c.getCssDimension($[16],$[107]);a.padding=c.getCssBoxDimensions($[16],$[37]);a.cursor=c.getCssCursor($[16],$[34]);a.opacity=c.getCssFloat($[16],$[42]);return a}},"push-button":{include:"button",style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.animation=c.getCssAnimation($[16],$[202]);return a}},"check-box":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssBorder($[16],$[4]),font:b.getCssFont($[16],"font"),textColor:b.getCssColor($[16],$[6]),backgroundColor:b.getCssColor($[16],$[5]),backgroundImage:b.getCssImage($[16],$[1]),backgroundGradient:b.getCssGradient($[16],$[1]),spacing:b.getCssDimension($[16],$[107]),padding:b.getCssBoxDimensions($[16],$[37]),selectionIndicator:b.getCssSizedImage("Button-CheckIcon",$[1]),cursor:b.getCssCursor($[16],$[34]),opacity:b.getCssFloat($[16],$[42])}}},"radio-button":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssBorder($[16],$[4]),font:b.getCssFont($[16],"font"),textColor:b.getCssColor($[16],$[6]),backgroundColor:b.getCssColor($[16],$[5]),backgroundImage:b.getCssImage($[16],$[1]),backgroundGradient:b.getCssGradient($[16],$[1]),spacing:b.getCssDimension($[16],$[107]),padding:b.getCssBoxDimensions($[16],$[37]),selectionIndicator:b.getCssSizedImage("Button-RadioIcon",$[1]),cursor:b.getCssCursor($[16],$[34]),opacity:b.getCssFloat($[16],$[42])}}},toolbar:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{font:b.getCssFont("*","font"),overflow:$[17],border:b.getCssBorder($[213],$[4]),textColor:b.getCssColor($[213],$[6]),backgroundColor:b.getCssColor($[213],$[5]),backgroundGradient:b.getCssGradient($[213],$[1]),backgroundImage:b.getCssImage($[213],$[1]),opacity:b.getCssFloat($[213],$[42])}}},"toolbar-separator":{style:function(a){return{}}},"toolbar-separator-line":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a=null;if(b.vertical){a={left:2,height:2,right:2,border:c.getCssNamedBorder($[561])}}else{a={top:2,width:2,bottom:2,border:c.getCssNamedBorder("horizontalDivider")}}return a}},"toolbar-button":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={cursor:$[39],overflow:$[17],width:"auto",verticalChildrenAlign:$[32]};a.spacing=c.getCssDimension($[127],$[107]);a.animation=c.getCssAnimation($[127],$[202]);a.textColor=c.getCssColor($[127],$[6]);a.backgroundColor=c.getCssColor($[127],$[5]);a.opacity=c.getCssFloat($[127],$[42]);a.backgroundImage=c.getCssImage($[127],$[1]);a.backgroundGradient=c.getCssGradient($[127],$[1]);a.border=c.getCssBorder($[127],$[4]);a.padding=c.getCssBoxDimensions($[127],$[37]);a.horizontalChildrenAlign=b.rwt_VERTICAL?"left":$[38];if(b.dropDown){a.dropDownArrow=c.getCssSizedImage($[485],$[1]);a.separatorBorder=c.getCssBorder($[485],$[4])}else{a.dropDownArrow=null;a.separatorBorder=null}return a}},window:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.backgroundColor=c.getCssColor("Shell",$[5]);a.backgroundImage=c.getCssImage("Shell",$[1]);a.backgroundGradient=c.getCssGradient("Shell",$[1]);a.border=c.getCssBorder("Shell",$[4]);a.minWidth=b.rwt_TITLE?80:5;a.minHeight=b.rwt_TITLE?25:5;a.opacity=c.getCssFloat("Shell",$[42]);a.shadow=c.getCssShadow("Shell",$[169]);return a}},"window-captionbar":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={verticalChildrenAlign:$[32]};a.margin=c.getCssBoxDimensions($[130],$[96]);a.padding=c.getCssBoxDimensions($[130],$[37]);a.textColor=c.getCssColor($[130],$[6]);a.backgroundColor=c.getCssColor($[130],$[5]);a.backgroundImage=c.getCssImage($[130],$[1]);a.backgroundGradient=c.getCssGradient($[130],$[1]);a.border=c.getCssBorder($[130],$[4]);if(b.rwt_TITLE){a.minHeight=c.getCssDimension($[130],$[36])}else{a.minHeight=0}a.maxHeight=a.minHeight;return a}},"window-resize-frame":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssNamedBorder($[28])}}},"window-captionbar-icon":{style:function(a){return{marginRight:2}}},"window-captionbar-title":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{cursor:$[39],font:b.getCssFont($[130],"font"),marginRight:2}}},"window-captionbar-minimize-button":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.icon=c.getCssImage($[507],$[1]);a.margin=c.getCssBoxDimensions($[507],$[96]);return a}},"window-captionbar-maximize-button":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.icon=c.getCssImage($[426],$[1]);a.margin=c.getCssBoxDimensions($[426],$[96]);return a}},"window-captionbar-restore-button":{include:$[437]},"window-captionbar-close-button":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.icon=c.getCssImage($[469],$[1]);a.margin=c.getCssBoxDimensions($[469],$[96]);return a}},"window-statusbar":{style:function(a){return{}}},"window-statusbar-text":{style:function(a){return{}}},resizer:{style:function(a){return{}}},"resizer-frame":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssNamedBorder($[28])}}},menu:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{width:"auto",height:"auto",textColor:b.getCssColor("Menu",$[6]),backgroundColor:b.getCssColor("Menu",$[5]),backgroundImage:b.getCssImage("Menu",$[1]),animation:b.getCssAnimation("Menu",$[202]),font:b.getCssFont("Menu","font"),overflow:$[17],border:b.getCssBorder("Menu",$[4]),padding:b.getCssBoxDimensions("Menu",$[37]),opacity:b.getCssFloat("Menu",$[42]),shadow:b.getCssShadow("Menu",$[169])}}},"menu-item":{style:function(c){var e=new org.eclipse.swt.theme.ThemeValues(c);var b={spacing:2,padding:[2,4],backgroundImage:e.getCssImage($[255],$[1]),backgroundGradient:e.getCssGradient($[255],$[1]),backgroundColor:e.getCssColor($[255],$[5]),height:c.bar?"100%":"auto",opacity:e.getCssFloat($[255],$[42])};b.textColor=e.getCssColor($[255],$[6]);if(c.cascade){b.arrow=e.getCssSizedImage("MenuItem-CascadeIcon",$[1])}else{b.arrow=null}if(c.selected){if(c.check){b.selectionIndicator=e.getCssSizedImage($[479],$[1])}else{if(c.radio){b.selectionIndicator=e.getCssSizedImage($[464],$[1])}}}else{if(c.radio){var a=e.getCssSizedImage($[464],$[1])[1];b.selectionIndicator=[null,a,0]}else{if(c.check){var d=e.getCssSizedImage($[479],$[1])[1];b.selectionIndicator=[null,d,0]}else{b.selectionIndicator=null}}}return b}},"menu-separator":{style:function(a){return{height:"auto",marginTop:3,marginBottom:2,paddingLeft:3,paddingRight:3}}},"menu-separator-line":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{right:0,left:0,height:0,border:b.getCssNamedBorder($[561])}}},list:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.cursor=$[39];a.overflow=$[17];a.font=c.getCssFont("List","font");a.textColor=c.getCssColor("List",$[6]);a.backgroundColor=c.getCssColor("List",$[5]);a.border=c.getCssBorder("List",$[4]);return a}},"list-item":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={height:"auto",horizontalChildrenAlign:"left",verticalChildrenAlign:$[32],spacing:4,padding:[3,5],minWidth:"auto"};a.textColor=c.getCssColor($[290],$[6]);a.backgroundColor=c.getCssColor($[290],$[5]);a.backgroundImage=c.getCssImage($[290],$[1]);a.backgroundGradient=c.getCssGradient($[290],$[1]);return a}},"text-field":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.font=c.getCssFont("Text","font");a.textColor=c.getCssColor("Text",$[6]);a.backgroundColor=c.getCssColor("Text",$[5]);a.backgroundImage=c.getCssImage("Text",$[1]);a.backgroundGradient=c.getCssGradient("Text",$[1]);a.border=c.getCssBorder("Text",$[4]);var d=c.getCssBoxDimensions("Text",$[37]);a.paddingRight=d[1];a.paddingLeft=d[3];return a}},"text-field-message":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.font=c.getCssFont("Text","font");a.textColor=c.getCssColor("Text-Message",$[6]);var d=c.getCssBoxDimensions("Text",$[37]);a.paddingRight=d[1];a.paddingLeft=d[3];a.horizontalChildrenAlign="left";return a}},"text-area":{include:"text-field",style:function(a){return{padding:[0,0,0,3]}}},combo:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[135],$[4]);a.backgroundColor=c.getCssColor($[135],$[5]);a.backgroundGradient=c.getCssGradient($[135],$[1]);a.textColor=c.getCssColor($[135],$[6]);a.font=c.getCssFont($[135],"font");return a}},"combo-list":{include:"list",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder("Combo-List",$[4]);a.textColor=c.getCssColor($[135],$[6]);a.font=c.getCssFont("*","font");a.backgroundColor=c.getCssColor($[135],$[5]);a.shadow=c.getCssShadow("Combo-List",$[169]);return a}},"combo-field":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.font=c.getCssFont("*","font");var d=c.getCssBoxDimensions("Combo-Field",$[37]);a.paddingRight=d[1];a.paddingLeft=d[3];a.width=null;a.height=null;a.left=0;a.right=c.getCssDimension($[147],$[19]);a.top=0;a.bottom=0;a.textColor=c.getCssColor($[135],$[6]);return a}},"combo-button":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[147],$[4]);a.width=c.getCssDimension($[147],$[19]);a.height=null;a.top=0;a.bottom=0;a.right=0;a.icon=c.getCssImage("Combo-Button-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssImage($[147],$[1])}else{a.backgroundImage=c.getCssImage($[147],$[1])}a.backgroundGradient=c.getCssGradient($[147],$[1]);a.backgroundColor=c.getCssColor($[147],$[5]);a.cursor=c.getCssCursor($[147],$[34]);return a}},ccombo:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[140],$[4]);a.backgroundColor=c.getCssColor($[140],$[5]);a.backgroundGradient=c.getCssGradient($[140],$[1]);a.textColor=c.getCssColor($[140],$[6]);a.font=c.getCssFont($[140],"font");return a}},"ccombo-list":{include:"list",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[452],$[4]);a.textColor=c.getCssColor($[140],$[6]);a.font=c.getCssFont("*","font");a.backgroundColor=c.getCssColor($[140],$[5]);a.shadow=c.getCssShadow($[452],$[169]);return a}},"ccombo-field":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.font=c.getCssFont("*","font");var d=c.getCssBoxDimensions("CCombo-Field",$[37]);a.paddingRight=d[1];a.paddingLeft=d[3];a.width=null;a.height=null;a.left=0;a.right=c.getCssDimension($[141],$[19]);a.top=0;a.bottom=0;a.textColor=c.getCssColor($[140],$[6]);return a}},"ccombo-button":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[141],$[4]);a.width=c.getCssDimension($[141],$[19]);a.height=null;a.top=0;a.bottom=0;a.right=0;a.icon=c.getCssImage("CCombo-Button-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssImage($[141],$[1])}else{a.backgroundImage=c.getCssImage($[141],$[1])}a.backgroundGradient=c.getCssGradient($[141],$[1]);a.backgroundColor=c.getCssColor($[141],$[5]);a.cursor=c.getCssCursor($[141],$[34]);return a}},tree:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{backgroundColor:b.getCssColor("Tree",$[5]),textColor:b.getCssColor("Tree",$[6]),font:b.getCssFont("*","font"),border:b.getCssBorder("Tree",$[4])}}},"tree-row":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.itemBackground=c.getCssColor($[384],$[5]);a.itemForeground=c.getCssColor($[384],$[6]);a.textDecoration=c.getCssIdentifier($[384],$[333]);return a}},"tree-check-box":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{backgroundImage:b.getCssImage("Tree-Checkbox",$[1])}}},"tree-indent":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{backgroundImage:b.getCssImage("Tree-Indent",$[1])}}},"tree-column":{style:function(i){var a=new org.eclipse.swt.theme.ThemeValues(i);var j={};j.cursor=$[39];j.spacing=2;j.textColor=a.getCssColor($[162],$[6]);j.font=a.getCssFont($[162],"font");j.backgroundColor=a.getCssColor($[162],$[5]);j.backgroundImage=a.getCssImage($[162],$[1]);j.backgroundGradient=a.getCssGradient($[162],$[1]);j.opacity=i.moving?0.6:1;j.padding=a.getCssBoxDimensions($[162],$[37]);var d=[null,null,null,null];var h=[0,0,0,0];var b=[$[20],$[20],$[20],$[20]];if(!i.dummy){var f={vertical:true};var e=new org.eclipse.swt.theme.ThemeValues(f);var g=e.getCssColor($[412],$[6]);g=g==$[8]?$[156]:g;d[1]=g;h[1]=1}var c=a.getCssBorder($[162],$[492]);h[2]=c.getWidthBottom();b[2]=c.getStyleBottom();d[2]=c.getColorBottom();j.border=new org.eclipse.rwt.Border(h,b,d);return j}},"tree-column-resizer":{style:function(a){return{backgroundColor:"#d6d5d9",width:3}}},"tree-column-sort-indicator":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.source=c.getCssImage("TreeColumn-SortIndicator",$[1]);return a}},"tab-view":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.textColor=c.getCssColor("*",$[6]);a.font=c.getCssFont("*","font");a.spacing=-1;a.border=c.getCssBorder("*",$[4]);return a}},"tab-view-bar":{style:function(a){return{height:"auto"}}},"tab-view-pane":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.overflow=$[17];a.backgroundColor=c.getCssColor("*",$[5]);a.border=new org.eclipse.rwt.Border(1,$[20],c.getCssNamedColor($[371]));a.padding=10;return a}},"tab-view-page":{},"tab-view-button":{include:"atom",style:function(c){var b={};var e=new org.eclipse.swt.theme.ThemeValues(c);var h=e.getCssNamedColor($[371]);var f=e.getCssColor($[252],"border-top-color");var g=e.getCssColor($[252],"border-bottom-color");var a=[f,h,h,h];var d=[h,h,g,h];if(c.checked){b.zIndex=1;b.padding=[2,8,4,7];if(c.barTop){b.border=new org.eclipse.rwt.Border([3,1,0,1],$[20],a)}else{b.border=new org.eclipse.rwt.Border([0,1,3,1],$[20],d)}b.margin=[0,-1,0,-2];if(c.alignLeft){if(c.firstChild){b.paddingLeft=6;b.paddingRight=7;b.marginLeft=0}}else{if(c.lastChild){b.paddingLeft=8;b.paddingRight=5;b.marginRight=0}}}else{b.zIndex=0;b.padding=[2,6,2,5];b.marginRight=1;b.marginLeft=0;if(c.alignLeft){if(c.firstChild){b.paddingLeft=6;b.paddingRight=5}}else{if(c.lastChild){b.paddingLeft=6;b.paddingRight=5;b.marginRight=0}}if(c.barTop){b.border=new org.eclipse.rwt.Border([1,1,0,1],$[20],h);b.marginTop=3;b.marginBottom=1}else{b.border=new org.eclipse.rwt.Border([0,1,1,1],$[20],h);b.marginTop=1;b.marginBottom=3}}b.backgroundColor=e.getCssColor($[252],$[5]);b.backgroundImage=e.getCssImage($[252],$[1]);b.backgroundGradient=e.getCssGradient($[252],$[1]);return b}},"group-box":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{backgroundColor:b.getCssColor("Group",$[5]),border:b.getCssBorder("Group",$[4]),font:b.getCssFont("Group","font"),textColor:b.getCssColor("Group",$[6])}}},"group-box-legend":{include:"atom",style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{top:0,left:0,border:b.getCssBorder($[212],$[4]),padding:b.getCssBoxDimensions($[212],$[37]),margin:b.getCssBoxDimensions($[212],$[96]),backgroundColor:b.getCssColor($[212],$[5]),font:b.getCssFont("Group","font"),textColor:b.getCssColor($[212],$[6])}}},"group-box-frame":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);var c=b.getCssBoxDimensions($[487],$[96]);return{top:c[0],right:c[1],bottom:c[2],left:c[3],border:b.getCssBorder($[487],$[4])}}},spinner:{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.font=c.getCssFont($[215],"font");a.textColor=c.getCssColor($[215],$[6]);a.backgroundColor=c.getCssColor($[215],$[5]);a.border=c.getCssBorder($[215],$[4]);a.backgroundGradient=c.getCssGradient($[215],$[1]);return a}},"spinner-text-field":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);var d=c.getCssBoxDimensions("Spinner-Field",$[37]);a.paddingRight=d[1];a.paddingLeft=d[3];a.top=0;a.left=0;a.right=0;a.bottom=0;return a}},"spinner-button-up":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.width=c.getCssDimension($[173],$[19]);a.icon=c.getCssImage("Spinner-UpButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssImage($[173],$[1])}else{a.backgroundImage=c.getCssImage($[173],$[1])}a.backgroundGradient=c.getCssGradient($[173],$[1]);a.border=c.getCssBorder($[173],$[4]);a.backgroundColor=c.getCssColor($[173],$[5]);a.cursor=c.getCssCursor($[173],$[34]);return a}},"spinner-button-down":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.width=c.getCssDimension($[158],$[19]);a.icon=c.getCssImage("Spinner-DownButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssImage($[158],$[1])}else{a.backgroundImage=c.getCssImage($[158],$[1])}a.backgroundGradient=c.getCssGradient($[158],$[1]);a.border=c.getCssBorder($[158],$[4]);a.backgroundColor=c.getCssColor($[158],$[5]);a.cursor=c.getCssCursor($[158],$[34]);return a}},table:{style:function(b){var d=new org.eclipse.swt.theme.ThemeValues(b);var c=d.getCssDimension($[186],$[19]);var f=d.getCssSizedImage($[186],$[1]);var a=d.getCssBoxDimensions($[186],$[96]);if(a.join()!=="0,0,0,0"){c=f[1]+a[1]+a[3]}var e=f[2]+a[0]+a[2];return{textColor:d.getCssColor("Table",$[6]),font:d.getCssFont("*","font"),border:d.getCssBorder("Table",$[4]),checkWidth:c,checkHeight:e}}},"table-client-area":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={backgroundColor:c.getCssColor("Table",$[5]),backgroundImage:c.getCssImage("Table",$[1]),backgroundGradient:c.getCssGradient("Table",$[1])};return a}},"table-column":{style:function(i){var a=new org.eclipse.swt.theme.ThemeValues(i);var j={cursor:$[39],spacing:2,opacity:i.moving?0.6:1};j.padding=a.getCssBoxDimensions($[159],$[37]);j.textColor=a.getCssColor($[159],$[6]);j.font=a.getCssFont($[159],"font");j.backgroundColor=a.getCssColor($[159],$[5]);j.backgroundImage=a.getCssImage($[159],$[1]);j.backgroundGradient=a.getCssGradient($[159],$[1]);var d=[null,null,null,null];var h=[0,0,0,0];var b=[$[20],$[20],$[20],$[20]];if(!i.dummy){var f={vertical:true};var e=new org.eclipse.swt.theme.ThemeValues(f);var g=e.getCssColor($[401],$[6]);g=g==$[8]?$[156]:g;d[1]=g;h[1]=1}var c=a.getCssBorder($[159],$[492]);h[2]=c.getWidthBottom();b[2]=c.getStyleBottom();d[2]=c.getColorBottom();j.border=new org.eclipse.rwt.Border(h,b,d);return j}},"table-column-resizer":{style:function(a){return{width:3,opacity:0.3,backgroundColor:"black"}}},"table-column-sort-indicator":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.source=c.getCssImage("TableColumn-SortIndicator",$[1]);return a}},"table-row":{style:function(d){var e=new org.eclipse.swt.theme.ThemeValues(d);var a={cursor:$[39]};if(d.linesvisible){var c={horizontal:true};var b=new org.eclipse.swt.theme.ThemeValues(c);var f=b.getCssColor($[401],$[6]);f=f==$[8]?$[156]:f;a.border=new org.eclipse.rwt.Border([0,0,1,0],$[20],f)}else{a.border=$[8]}a.textColor=e.getCssColor($[246],$[6]);if(a.textColor==$[8]){a.textColor=$[133]}a.backgroundColor=e.getCssColor($[246],$[5]);a.textDecoration=e.getCssIdentifier($[246],$[333]);return a}},"table-check-box":{include:$[35],style:function(c){var e=new org.eclipse.swt.theme.ThemeValues(c);var b={};var d=e.getCssDimension($[186],$[19]);var f=e.getCssSizedImage($[186],$[1]);var a=e.getCssBoxDimensions($[186],$[96]);if(a.join()!=="0,0,0,0"){b.paddingLeft=a[3]}else{b.paddingLeft=Math.max(0,(d-f[1])/2)}b.paddingTop=a[0];b.source=f[0];return b}},"table-gridline-vertical":{style:function(b){var e={vertical:true};var c=new org.eclipse.swt.theme.ThemeValues(e);var d=c.getCssColor($[401],$[6]);d=d==$[8]?$[156]:d;var a={};a.border=new org.eclipse.rwt.Border([0,0,0,1],$[20],d);return a}},sash:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{backgroundColor:b.getCssColor("Sash",$[5]),backgroundImage:b.getCssImage("Sash",$[1]),border:b.getCssBorder("Sash",$[4]),cursor:a.disabled?$[8]:a.horizontal?$[328]:$[386]}}},"sash-slider":{style:function(a){return{zIndex:10000000,opacity:0.3,backgroundColor:"black"}}},"sash-handle":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.backgroundImage=c.getCssImage($[564],$[1]);a.backgroundGradient=c.getCssGradient($[564],$[1]);a.backgroundRepeat=$[350];return a}},ctabfolder:{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.font=c.getCssFont($[119],"font");a.textColor=c.getCssColor($[119],$[6]);return a}},"ctabfolder-body":{style:function(d){var a={};var e=new org.eclipse.swt.theme.ThemeValues(d);a.backgroundColor=e.getCssColor($[119],$[5]);var c=e.getCssColor($[210],$[313]);var g=e.getCssBoxDimensions($[210],$[396]);var b=d.rwt_BORDER?1:0;if(g[0]>0||g[1]>0||g[2]>0||g[3]>0){var f;if(d.barTop){f=[g[0],g[1],0,0]}else{f=[0,0,g[2],g[3]]}a.border=new org.eclipse.rwt.Border(b,$[114],c,f)}else{a.border=new org.eclipse.rwt.Border(b,$[20],c)}return a}},"ctabfolder-frame":{style:function(d){var b={};if(!d.rwt_FLAT){var a={selected:true};for(property in d){a[property]=d[property]}var e=new org.eclipse.swt.theme.ThemeValues(a);var c=e.getCssColor($[119],$[5]);b.border=new org.eclipse.rwt.Border(2,$[20],c)}else{b.border=$[8]}b.backgroundColor=$[8];return b}},"ctabfolder-separator":{style:function(c){var a={};var e=new org.eclipse.swt.theme.ThemeValues(c);var b=e.getCssColor($[210],$[313]);var d;if(c.barTop){d=new org.eclipse.rwt.Border([0,0,1,0],$[20],b)}else{d=new org.eclipse.rwt.Border([1,0,0,0],$[20],b)}a.border=d;return a}},"ctab-item":{style:function(d){var b={};var e=new org.eclipse.swt.theme.ThemeValues(d);b.cursor=$[39];var g=e.getCssBoxDimensions($[119],$[37]);b.paddingLeft=g[3];b.paddingRight=g[1];b.spacing=e.getCssDimension($[119],$[107]);b.textColor=e.getCssColor($[119],$[6]);var c=e.getCssColor($[210],$[313]);var h=e.getCssBoxDimensions($[210],$[396]).slice(0);if(d.barTop){h[2]=0;h[3]=0}else{h[0]=0;h[1]=0}var a=h[0]>0||h[1]>0||h[2]>0||h[3]>0;var f=[0,0,0,0];if(!d.nextSelected){f[1]=1}if(d.selected){f[3]=1;if(d.barTop){f[0]=1}else{f[2]=1}}if(d.firstItem&&d.rwt_BORDER&&!a){f[3]=1}if(a&&d.selected){b.border=new org.eclipse.rwt.Border(f,$[114],c,h);b.containerOverflow=false}else{b.border=new org.eclipse.rwt.Border(f,$[20],c)}if(d.selected){b.backgroundColor=e.getCssColor($[119],$[5]);b.backgroundImage=e.getCssImage($[119],$[1]);b.backgroundGradient=e.getCssGradient($[119],$[1])}else{b.backgroundColor=$[8];b.backgroundImage=null;b.backgroundGradient=null}return b}},"ctabfolder-button":{include:$[35],style:function(c){var a={};var d=new org.eclipse.swt.theme.ThemeValues(c);if(c.over){a.backgroundColor="white";var b=d.getCssColor($[210],$[313]);a.border=new org.eclipse.rwt.Border(1,$[20],b)}else{a.backgroundColor=$[8];a.border=$[8]}return a}},"ctabfolder-drop-down-button":{include:$[347],style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.icon=c.getCssImage("CTabFolder-DropDownButton-Icon",$[1]);return a}},"ctab-close-button":{include:$[35],style:function(a){return{source:a.over?$[458]:$[465]}}},composite:{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.backgroundColor=c.getCssColor($[254],$[5]);a.backgroundImage=c.getCssImage($[254],$[1]);a.backgroundGradient=c.getCssGradient($[254],$[1]);a.border=c.getCssBorder($[254],$[4]);a.opacity=c.getCssFloat($[254],$[42]);return a}},scrolledcomposite:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};if(b.rwt_BORDER){a.border=c.getCssNamedBorder($[28])}else{a.border=c.getCssBorder("*",$[4])}return a}},coolbar:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder("*",$[4]);a.backgroundGradient=c.getCssGradient("CoolBar",$[1]);a.backgroundImage=c.getCssImage("CoolBar",$[1]);return a}},coolitem:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder("*",$[4]);return a}},"coolitem-handle":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};if(b.vertical){a.height=c.getCssDimension($[357],$[19])}else{a.width=c.getCssDimension($[357],$[19])}a.border=c.getCssBorder($[357],$[4]);a.margin=[1,2,1,0];a.cursor=$[231];return a}},browser:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssBorder("Browser",$[4]),backgroundColor:"white"}}},separator:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{backgroundColor:b.getCssColor($[76],$[5]),backgroundImage:b.getCssImage($[76],$[1]),backgroundGradient:b.getCssGradient($[76],$[1]),border:b.getCssBorder($[76],$[4]),cursor:b.getCssCursor($[76],$[34]),opacity:b.getCssFloat($[76],$[42])}}},"separator-line":{style:function(b){var e=new org.eclipse.swt.theme.ThemeValues(b);var a={};if(b.rwt_VERTICAL){a.width=e.getCssDimension($[183],$[19])}else{a.height=e.getCssDimension($[183],$[19])}a.border=e.getCssBorder($[183],$[4]);var d=b.rwt_VERTICAL?$[46]:$[52];var c;if(a.border===e.getCssNamedBorder($[324])){c="separator.shadowin."+d+".border"}else{if(a.border===e.getCssNamedBorder($[395])){c="separator.shadowout."+d+".border"}}if(c){a.border=e.getCssNamedBorder(c)}a.backgroundColor=e.getCssColor($[183],$[5]);a.backgroundImage=e.getCssImage($[183],$[1]);a.backgroundGradient=e.getCssGradient($[183],$[1]);return a}},link:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{cursor:$[39],padding:2,font:b.getCssFont("Link","font"),border:b.getCssBorder("Link",$[4]),textColor:b.getCssColor("*",$[6])}}},"link-text":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{textColor:$[133]}}},progressbar:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[310],$[4]);a.backgroundColor=c.getCssColor($[310],$[5]);a.backgroundImageSized=c.getCssSizedImage($[310],$[1]);a.backgroundGradient=c.getCssGradient($[310],$[1]);a.separatorBorder=c.getCssBorder($[245],$[4]);a.indicatorColor=c.getCssColor($[245],$[5]);a.indicatorImage=c.getCssSizedImage($[245],$[1]);a.indicatorGradient=c.getCssGradient($[245],$[1]);a.indicatorOpacity=c.getCssFloat($[245],$[42]);return a}},"scrollbar-blocker":{style:function(a){return{backgroundColor:"black",opacity:0.2}}},scale:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssBorder("Scale",$[4]),font:b.getCssFont("*","font"),textColor:b.getCssColor("*",$[6]),backgroundColor:b.getCssColor("Scale",$[5])}}},"scale-line":{include:$[35],style:function(b){var a={};if(b.horizontal){a.left=org.eclipse.swt.widgets.Scale.PADDING;a.top=org.eclipse.swt.widgets.Scale.SCALE_LINE_OFFSET;a.source="widget/scale/h_line.gif"}else{a.left=org.eclipse.swt.widgets.Scale.SCALE_LINE_OFFSET;a.top=org.eclipse.swt.widgets.Scale.PADDING;a.source="widget/scale/v_line.gif"}return a}},"scale-thumb":{include:$[35],style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};if(b.horizontal){a.left=org.eclipse.swt.widgets.Scale.PADDING;a.top=org.eclipse.swt.widgets.Scale.THUMB_OFFSET;a.source="widget/scale/h_thumb.gif"}else{a.left=org.eclipse.swt.widgets.Scale.THUMB_OFFSET;a.top=org.eclipse.swt.widgets.Scale.PADDING;a.source="widget/scale/v_thumb.gif"}a.backgroundColor=c.getCssColor("Scale-Thumb",$[5]);return a}},"scale-min-marker":{include:$[35],style:function(b){var a={};if(b.horizontal){a.left=org.eclipse.swt.widgets.Scale.PADDING+org.eclipse.swt.widgets.Scale.HALF_THUMB;a.source=$[417]}else{a.top=org.eclipse.swt.widgets.Scale.PADDING+org.eclipse.swt.widgets.Scale.HALF_THUMB;a.source=$[447]}return a}},"scale-max-marker":{include:$[35],style:function(b){var a={};if(b.horizontal){a.source=$[417]}else{a.source=$[447]}return a}},"scale-middle-marker":{include:$[35],style:function(b){var a={};if(b.horizontal){a.source="widget/scale/h_marker_small.gif"}else{a.source="widget/scale/v_marker_small.gif"}return a}},"datetime-date":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[86],$[4]);a.font=c.getCssFont($[86],"font");a.textColor=c.getCssColor($[86],$[6]);a.backgroundColor=c.getCssColor($[86],$[5]);a.backgroundGradient=c.getCssGradient($[86],$[1]);return a}},"datetime-time":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[86],$[4]);a.font=c.getCssFont($[86],"font");a.textColor=c.getCssColor($[86],$[6]);a.backgroundColor=c.getCssColor($[86],$[5]);a.backgroundGradient=c.getCssGradient($[86],$[1]);return a}},"datetime-calendar":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[86],$[4]);a.font=c.getCssFont("*","font");a.textColor=c.getCssColor($[86],$[6]);a.backgroundColor=c.getCssColor($[86],$[5]);return a}},"datetime-field":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={cursor:$[39],textAlign:$[38],padding:[0,3]};if(b.selected){a.textColor=c.getCssColor($[560],$[6]);a.backgroundColor=c.getCssColor($[560],$[5])}else{a.textColor=$[8];a.backgroundColor=$[8]}return a}},"datetime-separator":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={cursor:$[39]};return a}},"datetime-button-up":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.width=c.getCssDimension($[172],$[19]);a.icon=c.getCssImage("DateTime-UpButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssImage($[172],$[1])}else{a.backgroundImage=c.getCssImage($[172],$[1])}a.backgroundGradient=c.getCssGradient($[172],$[1]);a.border=c.getCssBorder($[172],$[4]);a.backgroundColor=c.getCssColor($[172],$[5]);a.cursor=c.getCssCursor($[172],$[34]);return a}},"datetime-button-down":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.width=c.getCssDimension($[174],$[19]);a.icon=c.getCssImage("DateTime-DownButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssImage($[174],$[1])}else{a.backgroundImage=c.getCssImage($[174],$[1])}a.backgroundGradient=c.getCssGradient($[174],$[1]);a.border=c.getCssBorder($[174],$[4]);a.backgroundColor=c.getCssColor($[174],$[5]);a.cursor=c.getCssCursor($[174],$[34]);return a}},"datetime-drop-down-button":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[197],$[4]);a.icon=c.getCssImage("DateTime-DropDownButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssImage($[197],$[1])}else{a.backgroundImage=c.getCssImage($[197],$[1])}a.backgroundGradient=c.getCssGradient($[197],$[1]);a.backgroundColor=c.getCssColor($[197],$[5]);a.cursor=c.getCssCursor($[197],$[34]);return a}},"datetime-drop-down-calendar":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder("DateTime-DropDownCalendar",$[4]);a.backgroundColor=c.getCssColor($[86],$[5]);return a}},"calendar-navBar":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssBorder($[277],$[4]),backgroundColor:b.getCssColor($[277],$[5]),padding:[4,4,4,4]}}},"calendar-toolbar-button":{style:function(b){var a={spacing:4,width:16,height:16,clipWidth:16,clipHeight:16,verticalChildrenAlign:$[32]};if(b.pressed||b.checked||b.abandoned){a.padding=[2,0,0,2]}else{a.padding=2}return a}},"calendar-toolbar-previous-year-button":{include:$[309],style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{icon:b.getCssImage($[445],$[1]),cursor:b.getCssCursor($[445],$[34])}}},"calendar-toolbar-previous-month-button":{include:$[309],style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{icon:b.getCssImage($[575],$[1]),cursor:b.getCssCursor($[575],$[34])}}},"calendar-toolbar-next-month-button":{include:$[309],style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{icon:b.getCssImage($[424],$[1]),cursor:b.getCssCursor($[424],$[34])}}},"calendar-toolbar-next-year-button":{include:$[309],style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{icon:b.getCssImage($[555],$[1]),cursor:b.getCssCursor($[555],$[34])}}},"calendar-monthyear":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{font:b.getCssFont($[277],"font"),textAlign:$[38],textColor:b.getCssColor($[277],$[6]),verticalAlign:$[32],cursor:$[39]}}},"calendar-datepane":{style:function(a){return{backgroundColor:$[8]}}},"calendar-week":{style:function(a){var c=new org.eclipse.swt.theme.ThemeValues(a);if(a.header){var b=new org.eclipse.rwt.Border([0,1,1,0],$[20],"gray")}else{var b=new org.eclipse.rwt.Border([0,1,0,0],$[20],"gray")}return{textAlign:$[38],verticalAlign:$[32],border:b}}},"calendar-weekday":{style:function(b){var e=new org.eclipse.swt.theme.ThemeValues(b);var d=new org.eclipse.rwt.Border([0,0,1,0],$[20],"gray");var a=e.getCssFont("*","font");var c=new qx.ui.core.Font();c.setSize(11);c.setFamily(a.getFamily());c.setBold(a.getBold());c.setItalic(a.getItalic());return{font:c,border:d,textAlign:$[38]}}},"calendar-day":{style:function(b){var d=new org.eclipse.swt.theme.ThemeValues(b);var a={textAlign:$[38],verticalAlign:$[32]};if(!b.disabled&&(b.selected||b.otherMonth||b.over)){a.textColor=d.getCssColor($[506],$[6]);a.backgroundColor=d.getCssColor($[506],$[5])}else{a.textColor=$[8];a.backgroundColor=$[8]}var e=b.disabled?d.getCssColor("*",$[6]):"red";var c=new org.eclipse.rwt.Border(1,$[20],e);a.border=b.today?c:$[8];return a}},"expand-bar":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[397],$[4]);a.font=c.getCssFont($[397],"font");a.textColor=c.getCssColor($[397],$[6]);return a}},"expand-item":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{overflow:$[17],border:b.getCssBorder("ExpandItem",$[4])}}},"expand-item-chevron-button":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.width=16;a.height=16;a.clipWidth=16;a.clipHeight=16;a.right=4;a.source=c.getCssImage("ExpandItem-Button",$[1]);a.cursor=c.getCssCursor($[184],$[34]);return a}},"expand-item-header":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.top=0;a.left=0;a.width="100%";a.horizontalChildrenAlign="left";a.verticalChildrenAlign=$[32];a.paddingLeft=4;a.paddingRight=24;a.border=c.getCssBorder($[184],$[4]);a.backgroundColor=c.getCssColor($[184],$[5]);a.cursor=c.getCssCursor($[184],$[34]);a.backgroundImage=c.getCssImage($[184],$[1]);a.backgroundGradient=c.getCssGradient($[184],$[1]);return a}},slider:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssBorder("Slider",$[4]),font:b.getCssFont("*","font"),textColor:b.getCssColor("*",$[6]),backgroundColor:b.getCssColor("Slider",$[5])}}},"slider-thumb":{include:"atom",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.backgroundColor=c.getCssColor($[283],$[5]);a.border=c.getCssBorder($[283],$[4]);a.backgroundImage=c.getCssImage($[283],$[1]);a.backgroundGradient=c.getCssGradient($[283],$[1]);return a}},"slider-min-button":{include:"atom",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.font=c.getCssFont($[16],"font");a.textColor=c.getCssColor($[16],$[6]);a.spacing=c.getCssDimension($[16],$[107]);a.padding=c.getCssBoxDimensions($[16],$[37]);a.backgroundColor=c.getCssColor($[201],$[5]);a.icon=c.getCssSizedImage("Slider-DownButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssSizedImage($[201],$[1])}else{a.backgroundImage=c.getCssImage($[201],$[1])}a.backgroundGradient=c.getCssGradient($[201],$[1]);a.border=c.getCssBorder($[201],$[4]);if(b[$[200]]){a.width=16}else{a.height=16}a.cursor=c.getCssCursor($[201],$[34]);return a}},"slider-max-button":{include:"atom",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.font=c.getCssFont($[16],"font");a.textColor=c.getCssColor($[16],$[6]);a.spacing=c.getCssDimension($[16],$[107]);a.padding=c.getCssBoxDimensions($[16],$[37]);a.backgroundColor=c.getCssColor($[204],$[5]);a.icon=c.getCssSizedImage("Slider-UpButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssSizedImage($[204],$[1])}else{a.backgroundImage=c.getCssImage($[204],$[1])}a.backgroundGradient=c.getCssGradient($[204],$[1]);a.border=c.getCssBorder($[204],$[4]);if(b[$[200]]){a.width=16}else{a.height=16}a.cursor=c.getCssCursor($[204],$[34]);return a}},scrollbar:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={border:c.getCssBorder($[233],$[4]),backgroundColor:c.getCssColor($[233],$[5])};var d=c.getCssDimension($[233],$[19]);if(b[$[200]]){a.height=d}else{a.width=d}return a}},"scrollbar-thumb":{include:"atom",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.backgroundColor=c.getCssColor($[221],$[5]);a.border=c.getCssBorder($[221],$[4]);a.backgroundImage=c.getCssImage($[221],$[1]);a.backgroundGradient=c.getCssGradient($[221],$[1]);a.icon=c.getCssSizedImage("ScrollBar-Thumb-Icon",$[1]);return a}},"scrollbar-min-button":{include:"atom",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.spacing=c.getCssDimension($[16],$[107]);a.padding=c.getCssBoxDimensions($[16],$[37]);a.backgroundColor=c.getCssColor($[181],$[5]);a.icon=c.getCssSizedImage("ScrollBar-DownButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssSizedImage($[181],$[1])}else{a.backgroundImage=c.getCssImage($[181],$[1])}a.backgroundGradient=c.getCssGradient($[181],$[1]);a.border=c.getCssBorder($[181],$[4]);var d=c.getCssDimension($[233],$[19]);if(b[$[200]]){a.width=d}else{a.height=d}a.cursor=c.getCssCursor($[181],$[34]);return a}},"scrollbar-max-button":{include:"atom",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.font=c.getCssFont($[16],"font");a.textColor=c.getCssColor($[16],$[6]);a.spacing=c.getCssDimension($[16],$[107]);a.padding=c.getCssBoxDimensions($[16],$[37]);a.backgroundColor=c.getCssColor($[187],$[5]);a.icon=c.getCssSizedImage("ScrollBar-UpButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssSizedImage($[187],$[1])}else{a.backgroundImage=c.getCssImage($[187],$[1])}a.backgroundGradient=c.getCssGradient($[187],$[1]);a.border=c.getCssBorder($[187],$[4]);var d=c.getCssDimension($[233],$[19]);if(b[$[200]]){a.width=d}else{a.height=d}a.cursor=c.getCssCursor($[187],$[34]);return a}}}});
-qx.Class.define("org.eclipse.rwt.widgets.ControlDecorator",{extend:qx.ui.basic.Image,construct:function(a){arguments.callee.base.call(this);this.setParent(a);this.setZIndex(1000);this._showHover=true;this._text=null},members:{setText:function(a){this._text=a;this._updateToolTip()},setShowHover:function(a){this._showHover=a;this._updateToolTip()},_updateToolTip:function(){var a=org.eclipse.swt.WidgetManager.getInstance();if(this._text===null||this._text===""||!this._showHover){a.setToolTip(this,null)}else{a.setToolTip(this,this._text)}},onWidgetSelected:function(a){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addEvent($[64],c);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.send()},onWidgetDefaultSelected:function(a){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addEvent($[165],c);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.send()}}});
-qx.Class.define("org.eclipse.rwt.MobileWebkitSupport",{type:$[118],statics:{_draggableTypes:{"org.eclipse.swt.widgets.Shell":null,"org.eclipse.swt.widgets.Sash":null,"org.eclipse.swt.widgets.Scale":[$[505]],"org.eclipse.swt.widgets.Slider":[$[559]],"org.eclipse.rwt.widgets.ScrollBar":null,"org.eclipse.swt.custom.ScrolledComposite":[$[182]],"org.eclipse.rwt.widgets.BasicButton":[$[182]],"qx.ui.layout.CanvasLayout":[$[526]],"org.eclipse.swt.widgets.List":[$[182]],"org.eclipse.swt.widgets.Table":[$[336],$[82],$[35],$[182]],"org.eclipse.rwt.widgets.Tree":[$[393],$[82],$[35],$[182]]},_lastMouseOverTarget:null,_lastMouseDownTarget:null,_lastMouseDownPosition:null,_lastMouseClickTarget:null,_lastMouseClickTime:null,_mouseEnabled:true,_fullscreen:window.navigator.standalone,_touchListener:null,_gestureListener:null,_allowedMouseEvents:{INPUT:{mousedown:true,mouseup:true},TEXTAREA:{mousedown:true,mouseup:true},"*":{mousewheel:true}},init:function(){if(org.eclipse.rwt.Client.isMobileSafari()){this._configureToolTip();this._hideTabHighlight();this._bindListeners();this._registerListeners();this._registerFilter()}},addDraggableType:function(a){var b=a in this._draggableTypes;if(!b){this._draggableTypes[a]=null}},setTouchListener:function(b,a){this._touchListener=[b,a]},setGestureListener:function(b,a){this._gestureListener=[b,a]},_isZoomed:function(){var a=window.orientation%180===0;var b=a?screen.width:screen.height;return window.innerWidth!==b},_configureToolTip:function(){var a=org.eclipse.rwt.widgets.WidgetToolTip.getInstance();a.setShowInterval(600);a.setHideInterval(15000);a.setMousePointerOffsetX(-35);a.setMousePointerOffsetY(-60);var b=qx.ui.popup.ToolTipManager.getInstance();b.handleMouseEvent=function(d){var c=d.getType();if(c===$[2]){this._handleMouseOver(d)}else{if(c===$[15]){this.setCurrentToolTip(null)}}}},_hideTabHighlight:function(){qx.html.StyleSheet.createElement(" * { -webkit-tap-highlight-color: rgba(0,0,0,0); }")},_bindListeners:function(){this.__onTouchEvent=qx.lang.Function.bind(this._onTouchEvent,this);this.__onGestureEvent=qx.lang.Function.bind(this._onGestureEvent,this);this.__onOrientationEvent=qx.lang.Function.bind(this._onOrientationEvent,this)},_registerListeners:function(){var a=document.body;a.ontouchstart=this.__onTouchEvent;a.ontouchmove=this.__onTouchEvent;a.ontouchend=this.__onTouchEvent;a.ontouchcancel=this.__onTouchEvent;a.ongesturestart=this.__onGestureEvent;a.ongesturechange=this.__onGestureEvent;a.ongestureend=this.__onGestureEvent;a.onorientationchange=this.__onOrientationEvent},_registerFilter:function(){var a=org.eclipse.rwt.EventHandler;a.setMouseEventFilter(this._filterMouseEvents,this)},_filterMouseEvents:function(b){var c=this._allowedMouseEvents;var a=typeof b.originalEvent===$[10];if(!a){a=c["*"][b.type]===true}if(!a&&typeof c[b.target.tagName]===$[10]){a=c[b.target.tagName][b.type]===true}if(!a){b.preventDefault();b.returnValue=false}return a},_onTouchEvent:function(b){var a=b.type;if(this._fullscreen){b.preventDefault()}if(this._mouseEnabled){switch(a){case"touchstart":this._handleTouchStart(b);break;case"touchend":this._handleTouchEnd(b);break;case"touchmove":this._handleTouchMove(b);break}}else{if(this._touchListener!==null){this._touchListener[0].call(this._touchListener[1],b)}}},_getTouch:function(a){var b=a.touches.item(0);if(b===null){b=a.changedTouches.item(0)}return b},_handleTouchStart:function(a){var d=this._getTouch(a);var b=a.target;var c=[d.clientX,d.clientY];this._moveMouseTo(b,a);this._lastMouseDownTarget=b;this._lastMouseDownPosition=c;this._fireMouseEvent($[2],b,a,c)},_handleTouchMove:function(b){if(!this._isZoomed()){b.preventDefault()}if(this._lastMouseDownPosition!==null){var a=this._lastMouseDownPosition;var c=b.target;var e=this._getTouch(b);var d=[e.clientX,e.clientY];if(this._isDraggableWidget(b.target)){b.preventDefault();this._fireMouseEvent($[45],c,b,d)}else{if(Math.abs(a[0]-d[0])>=15||Math.abs(a[1]-d[1])>=15){this._cancelMouseSession(b)}}}},_isDraggableWidget:function(f){var g=org.eclipse.swt.WidgetManager.getInstance();var b=org.eclipse.rwt.EventHandlerUtil.getOriginalTargetObject(f);var e=g.findControl(b);var a=false;if(e==null){e=b}if(e!=null&&e.classname in this._draggableTypes){var d=this._draggableTypes[e.classname];if(d==null){a=true}else{for(var c=0;c<d.length&&!a;c++){if(b.getAppearance()==d[c]){a=true}}}}return a},_handleTouchEnd:function(a){a.preventDefault();var d=this._getTouch(a);var c=[d.clientX,d.clientY];var b=a.target;if(this._lastMouseDownTarget!==null){this._fireMouseEvent($[15],b,a,c)}if(this._lastMouseDownTarget===b){this._fireMouseEvent($[29],b,a,c);this._lastMouseDownTarget=null;this._lastMouseDownPosition=null;if(this._isDoubleClick(a)){this._lastMouseClickTarget=null;this._lastMouseClickTime=null;this._fireMouseEvent($[61],b,a,c)}else{this._lastMouseClickTarget=b;this._lastMouseClickTime=(new Date()).getTime()}}},_isDoubleClick:function(b){var d=b.target;var a=false;if(this._lastMouseClickTarget===d){var c=((new Date()).getTime())-this._lastMouseClickTime;a=c<org.eclipse.swt.EventUtil.DOUBLE_CLICK_TIME}return a},_onGestureEvent:function(b){var a=b.type;if(this._gestureListener!==null){this._gestureListener[0].call(this._gestureListener[1],b)}switch(a){case"gesturestart":this._disableMouse(b);break;case"gestureend":this._enableMouse(b);break}},_onOrientationEvent:function(a){},_disableMouse:function(a){this._cancelMouseSession(a);this._mouseEnabled=false},_cancelMouseSession:function(a){var b=this._getDummyTarget();this._moveMouseTo(b,a);if(this._lastMouseDownTarget!==null){this._fireMouseEvent($[15],b,a,[0,0])}this._lastMouseDownTarget=null;this._lastMouseDownPosition=null},_getDummyTarget:function(){return qx.ui.core.ClientDocument.getInstance()._getTargetNode()},_enableMouse:function(){this._mouseEnabled=true},_moveMouseTo:function(c,a){var b=this._lastMouseOverTarget;if(b!==c){var d=[0,0];if(b!==null){this._fireMouseEvent($[14],b,a,d)}this._lastMouseOverTarget=c;this._fireMouseEvent($[9],c,a,d)}},_fireMouseEvent:function(c,e,a,b){var d=document.createEvent("MouseEvent");d.initMouseEvent(c,true,true,window,0,b[0],b[1],b[0],b[1],false,false,false,false,qx.event.type.MouseEvent.buttons.left,null);d.originalEvent=a;e.dispatchEvent(d)},_postMouseEvent:function(a){if(a===$[15]){qx.ui.popup.ToolTipManager.getInstance().setCurrentToolTip(null)}}}});
-qx.Class.define("org.eclipse.swt.widgets.ToolTip",{extend:qx.ui.popup.Popup,include:org.eclipse.rwt.FadeAnimationMixin,construct:function(a){arguments.callee.base.call(this);this._style=a;this.setAutoHide(false);this.setDisplay(true);this.setVisibility(false);this.setAppearance("tool-tip");var b=qx.ui.core.ClientDocument.getInstance();this.setMaxWidth(b.getClientWidth()/2);this.setMaxHeight(b.getClientHeight()/2);this.addToDocument();this.addEventListener($[2],this._onMouseDown,this);this._hideAfterTimeout=false;this._hasSelectionListener=false;this._messageFont=this._getMessageFont();this._contentArea=null;this._textArea=null;this._image=null;this._text=null;this._message=null;this._createControls()},destruct:function(){this.removeEventListener($[2],this._onMouseDown,this);this._contentArea.dispose();this._textArea.dispose();this._image.dispose();this._text.dispose();this._message.dispose();this._messageFont=null},members:{setText:function(a){this._text.setText(a);if(this.getVisibility()){this._update()}},setMessage:function(a){this._message.setText(a);if(this.getVisibility()){this._update()}},setLocation:function(a,b){this.setLeft(a);this.setTop(b)},setHideAfterTimeout:function(a){this._hideAfterTimeout=a},setHasSelectionListener:function(a){this._hasSelectionListener=a},setVisible:function(a){this.setVisibility(a);if(a){this._update();this.bringToFront();if(this._hideAfterTimeout){qx.client.Timer.once(this._hide,this,5*1000)}}},addState:function(a){arguments.callee.base.call(this,a);this._image.addState(a)},removeState:function(a){arguments.callee.base.call(this,a);this._image.removeState(a)},_createControls:function(){this._contentArea=new qx.ui.layout.BoxLayout($[52]);this._contentArea.setWidth("100%");this._contentArea.setHeight("100%");this._contentArea.setSpacing(5);this._contentArea.setParent(this);this._image=new qx.ui.basic.Image();this._image.setAppearance("tool-tip-image");this._image.setParent(this._contentArea);this._textArea=new qx.ui.layout.BoxLayout($[46]);this._textArea.setParent(this._contentArea);this._textArea.setHeight("100%");this._textArea.setSpacing(5);this._text=new qx.ui.basic.Label();this._text.setAppearance("tool-tip-text");this._text.setParent(this._textArea);this._message=new qx.ui.basic.Label();this._message.setAppearance("tool-tip-message");this._message.setHeight("auto");this._message.setWrap(true);this._message.setParent(this._textArea)},_update:function(){var c=this._message.getText();var d=this._getTextSize(this._text.getText(),-1);var a=this._getTextSize(c,-1);var b=a.x;while(b>0&&!this._matchesWidthToHeightRatio(a)){b-=10;a=this._getTextSize(c,b)}a.x=this._max(a.x,d.x);this._message.setWidth(a.x);this._message.setHeight(a.y)},_matchesWidthToHeightRatio:function(a){return a.x/a.y<=6},_max:function(d,c){return d>c?d:c},_getTextSize:function(d,a){var c=new Array();c[0]="";c[1]=d;c[2]=this._messageFont.getFamily();c[3]=this._messageFont.getSize();c[4]=this._messageFont.getBold();c[5]=this._messageFont.getItalic();c[6]=a;var b=org.eclipse.swt.FontSizeCalculation._doMeasurement(c);return{x:b[0],y:b[1]}},_onMouseDown:function(a){this._hide();if(this._hasSelectionListener){var c=this._getWidgetId();var b=org.eclipse.swt.Request.getInstance();b.addEvent($[64],c);b.send()}},_hide:function(){this.setVisible(false);qx.ui.core.Widget.flushGlobalQueues();var a=org.eclipse.swt.Request.getInstance();a.addParameter(this._getWidgetId()+".visible",false)},_getWidgetId:function(){var a=org.eclipse.swt.WidgetManager.getInstance();return a.findIdByWidget(this)},_getMessageFont:function(){var a=new org.eclipse.swt.theme.ThemeValues({});return a.getCssFont($[321],"font")}}});
-})(["qx.client","background-image","mousedown","Boolean","border","background-color","color","qx.debug","undefined","mouseover","object","qx.event.type.Event","keypress","string","mouseout","mouseup","Button","hidden","mshtml","width","solid","pressed","Integer","right","keydown","String","scroll","absolute","shadow","click","selected","appear","middle","singleton","cursor","image","height","padding","center","default","gecko","contextmenu","opacity","completed","function","mousemove","vertical","abandoned","bottom","highlight","interval","failed","horizontal","Right","variant_","PageDown","mousewheel","changeWidth","PageUp","computed=this.","keyup","dblclick","sending","timeout","org.eclipse.swt.events.widgetSelected","aborted","changeHeight","receiving","Enter","this.","qx.event.type.DataEvent","webkit","overflow","Number","focus","dragstart","Label","number","backgroundColor","change","changeValue","=value;","label","style","changeFont","input","DateTime","borderLeftWidth","active","parent_unfocused","borderTopWidth","qx.event.type.MouseEvent","Space","scrollY","scrollX","maximized","margin","maxWidth","minWidth","maxHeight","alias","configured","abstract","overflowX","overflowY","create","Widget-ToolTip","spacing","minHeight","normal","Object","ToolTip","backgroundImage","CLabel","rounded","visibility","Escape","CSS1Compat","static","CTabItem","outline","opera","frame","focused","boolean","Theme","\" in class \"","ToolItem","gradient","if(this.","Shell-Titlebar","qx.io.remote.Response","changeEnabled","inherit","filter","Combo","qx.ui.core.Widget","execute","reset","(empty)","CCombo","CCombo-Button","locationX","locationY",".selection","changeLeft","position","Combo-Button","delete this.","pointer","unstyle","fixed","dragover","lightshadow","linesvisible","maxLength","transparent","!==undefined)","Spinner-DownButton","TableColumn","e-resize","Invalid key \"","TreeColumn","return this.","qx.event.type.DragEvent","org.eclipse.swt.events.widgetDefaultSelected","created","textarea","refresh","box-shadow","translucent","rwt_FLAT","DateTime-UpButton","Spinner-UpButton","DateTime-DownButton","barTop","focusout","\",value);","roundrect","datetime-field","display","ScrollBar-DownButton","scrollbar-thumb","Label-SeparatorLine","ExpandItem-Header","qx.ioRemoteDebug","Table-Checkbox","ScrollBar-UpButton","calendar-day","selectionStart","background","\" is not allowed!","stateOverChanged","selectionLength","fontSize","fillType","queued","DateTime-DropDownButton","n-resize","checked","rwt_HORIZONTAL","Slider-DownButton","animation","changeBackgroundColor","Slider-UpButton","changeVisibility","calendar-button","marginTop","marginLeft","paddingTop","CTabFolder","chrome","Group-Label","ToolBar","Display","Spinner","insertDom","focusin","ne-resize","nw-resize","paddingRight","ScrollBar-Thumb","changeFocusedChild","!active","\" is an invalid value for the property \"","animationRenderer","dragdrop","grayed","backgroundLayouted","rwt_BORDER","datetime-separator","w-resize","left-reversed","ScrollBar","paddingBottom","qx.propertyDebugLevel","minimized","stroke","top-reversed","paddingLeft","qx.event.type.FocusEvent","else if(this.","complex","darkshadow","\" in theme \"","ProgressBar-Indicator","TableItem","remove","center-reversed","windowblur","Attention! The value \"","middle-reversed","TabItem","shorthand","Composite","MenuItem","shadowLayouted","keyevent","#000000","-moz-scrollbars-vertical","mouseevent","No such property: ","messageLabel","marginRight","elementOver","expanded","Control","progress","qx.ui.popup.ToolTip","borderWidths","dragmove","windowresize","border-box","Shell-DisplayOverlay","old=this.","Invalid type of key \"","org.eclipse.swt.events.widgetSelected.index","DateTime-Calendar-Navbar","textAlign","qx.event.handler.DragAndDropHandler","received","boxSizing","changeTextColor","Slider-Thumb","changeSelection","-moz-scrollbars-none","The configuration key \"","\"! The type of the key must be \"","Could not parse color: ","changeParent","List-Item","_applyResizable","dragend","!==undefined){",".bounds.x",".bounds.y","backgroundImageSize","borderBottomWidth","backgroundGradient","borderRightWidth","_applyClip","\" in mixin \"","changeTop",".bounds.width","rwt_VERTICAL","changeOverState","borderRadii","Could not evaluate computed style: ","qx.event.type.KeyEvent","calendar-toolbar-button","ProgressBar","dragout","collapsed","border-color","_applyIndicatorFill","marginBottom","-moz-scrollbars-horizontal",".bounds.height","disappear","dragenter","MozOpacity","ToolTip-Message","1px dotted invert","org.eclipse.swt.custom.CTabItem","thinInset","Connection dropped","rwt-resources/themes/images/","toolTipText","row-resize","qx.ui.popup.PopupManager","changeHtml","qx.io.remote.XmlHttpTransport","beforeunload","text-decoration","lastChild","underline","table-column","typeof value === \"number\" && isFinite(value)","readonly","otherMonth","changeDate","crosshair","\" must be defined!","lineHeight","static/image/blank.gif","_applyAnimation","org.eclipse.swt.events.widgetSelected.detail","ctabfolder-button","se-resize","backgroundRepeat","no-repeat","Backspace","dragEnter","updateRows","changeLeadItem","Conflict between mixin \"","_applyBackgroundGradient","CoolItem-Handle","qx.event.type.ChangeEvent","changeActive","_applyIcon","itemFocused","sw-resize","borderColor","changeBackgroundGradient","changeState","not-allowed","stroke-width","appearances","1px dotted","changeFocused","thinborder","_applyOpacity","_applyEnabled","backgroundPosition","_manager","s-resize","\" of property \"","dnd_selected","textDecoration","hoverOut","Variant \"","hasSelectionListener","\"! The value needs to be a map!","TreeItem","changeElement","col-resize","qx.ui.form.Button","userScroll","\"! The value is undefined/null!","hasVerifyOrModifyListener","changeMode","setImage","tree-column","_applyWrap","thinOutset","border-radius","ExpandBar","changeActiveChild","org.eclipse.rwt.widgets.MenuItem","_applyTextAlign","Table-GridLine","borderMaxWidth","qx.compatibility","postApplyDimensions failed ","org.eclipse.swt.events.modifyText","_applyState","if(old===undefined)old=null;","unselectable","qx.ui.embed.Flash","qx.client.NativeWindow","table-column-resizer","Tree-GridLine","' is not a function!","org.eclipse.swt.custom.CTabFolder",".selectedItemId","',sizingMethod='crop')","widget/scale/h_marker_big.gif","sash-handle","' are not compatible '","changeSource","qx.ui.window.Manager","\" is already defined!"," does not support it","DateTime-Calendar-NextMonthButton",":content-box;","Shell-MaxButton","delete window.","bezierCurveTo","qx.ui.window.Window","ignoreFlexible","hasComputed","\" which must be typeof \"","qx.ui.pageview.tabview.TabView","borderBottomStyle","_applyOrientation","qx.io.remote.Exchange","window-captionbar-maximize-button","_focusedTextField","DOMMouseScroll","_applySource","separatorBorder","progid:DXImageTransform.Microsoft.AlphaImageLoader(src='","qx.ui.pageview.AbstractButton","tree-indent","DateTime-Calendar-PreviousYearButton","widget/ctabfolder/maximize.gif","widget/scale/v_marker_big.gif","Malformed settings key \"","\" is not defined.","_applyHeight","qx.ui.pageview.AbstractPage","CCombo-List","\" in member \"","minThumbSize","qx.ui.selection.RadioManager"," has no themeable property \"","qx.util.range.Range","widget/ctabfolder/close_hover.gif","removeChild","borderLeftStyle","var prop=qx.core.Property;","datetime-button-up",".activeControl","MenuItem-RadioIcon","widget/ctabfolder/close.gif"," is not inside this parent.","pointerEvents",":border-box;","Shell-CloseButton","qx.core.Object","if(value===undefined)prop.error(this,2,\"","org.eclipse.swt.events.ctabFolderRestored","createContent","right-reversed",";background-repeat:no-repeat;' ></div>","Includes of mixins must be mixins. The include number '","qx.ui.core.Parent","value !== null","MenuItem-CheckIcon","org.eclipse.rwt.widgets.Text","skipFlexible","quadraticCurveTo","label-graytext","addEventListener(","ToolItem-DropDownIcon","qx.event.handler.FocusHandler","Group-Frame","' in mixin '","nextSelected","bottom-reversed","WebkitUserSelect","border-bottom","center center","itemselected","Cache-Control",".$$properties.","ToolTip-Text","org.eclipse.swt.widgets.ExpandBar","The mixins '","changeChecked","datetime-button-down","\". Must be following the schema \"namespace.key\".","' of theme '","gecko|opera|webkit","scale-thumb","DateTime-Calendar-Day","Shell-MinButton","background-image:url(","changeZIndex","qx.ui.embed.IframeManager","MozUserSelect","_applyHorizontalChildrenAlign","org.eclipse.swt.dnd.","multipart/form-data","hoverFristItem","client-document-blocker","qx.io.remote.AbstractRemoteTransport","qx.io.remote.Request","_applySelectionIndicator","' of class '","qx.io.image.Preloader","scrollHeight","\" of Class \"","if(old===computed)return value;","bottomRight","coolitem-handle","dragFinished","\" failed with exception ","qx.isSource"," modified: Failed to dispatch change event: ","Could not convert system colors to RGB: ","calendar-week","Alpha(opacity=","qx.allowUrlSettings","draggesture","qx.allowUrlVariants","\" which must be an instance of \"","changeSpacing",".focusIndex","_applyBackgroundColor","qx.application.Gui","Invalid Widget: ","static/html/blank.html","stdDeviation","_childrenQueue","if(computed===undefined)computed=null;","borderRightStyle","\" but is typeof \"",") but parent layout ","qx.staticUri","_applyVerticalChildrenAlign","_applySpacing","KhtmlUserSelect","_invalidate","DateTime-Calendar-NextYearButton","Content-Type","It is not possible to set preventDefault to false if it was true before!","qx.ui.form.TextField","slider-thumb","DateTime-Field","verticalDivider","checkDisposedItems","org.eclipse.rwt.widgets.Button","Sash-Handle","qx.resourceUri","Iframe source could not be set! This may be related to AdBlock Plus Firefox Extension.","_applyManager","widget/ctabfolder/restore.gif","Failed to check property ","_applyVisibility","borderTopStyle","itemdefaultselected","widget/ctabfolder/minimize.gif","_applySeparatorBorder","DateTime-Calendar-PreviousMonthButton"]);
\ No newline at end of file
+qx.Class.define("org.eclipse.swt.widgets.List",{extend:org.eclipse.rwt.widgets.BasicList,construct:function(c){arguments.callee.base.call(this,c);this._topIndex=0;this._changeSelectionNotification="state";var a=org.eclipse.swt.Request.getInstance();a.addEventListener("send",this._onSendRequest,this);var b=this.getManager();b.addEventListener($[328],this._onChangeLeadItem,this);b.addEventListener($[271],this._onSelectionChange,this);this.addEventListener($[66],this._onFocusIn,this);this.addEventListener("blur",this._onFocusOut,this);this.addEventListener($[62],this._onDblClick,this);this.addEventListener($[31],this._onAppear,this)},destruct:function(){var a=org.eclipse.swt.Request.getInstance();a.removeEventListener("send",this._onSendRequest,this);var b=this.getManager();b.removeEventListener($[328],this._onChangeLeadItem,this);b.removeEventListener($[271],this._onSelectionChange,this);this.removeEventListener($[66],this._onFocusIn,this);this.removeEventListener("blur",this._onFocusOut,this);this.removeEventListener($[62],this._onDblClick,this);this.removeEventListener($[31],this._onAppear,this)},members:{setTopIndex:function(a){this._topIndex=a;this._applyTopIndex(a)},_applyTopIndex:function(b){var a=this.getManager().getItems();if(a.length>0&&a[0].isCreated()){var c=this.getManager().getItemHeight(a[0]);if(c>0){this._clientArea.setScrollTop(b*c)}}},_getTopIndex:function(){var b=0;var c=this._clientArea.getScrollTop();var a=this.getManager().getItems();if(a.length>0){var d=this.getManager().getItemHeight(a[0]);if(d>0){b=Math.round(c/d)}}return b},_onAppear:function(a){this._applyTopIndex(this._topIndex)},setChangeSelectionNotification:function(a){this._changeSelectionNotification=a},_onChangeLeadItem:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var e=c.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();var d=this._clientArea.indexOf(this.getManager().getLeadItem());b.addParameter(e+$[437],d)}},_onSelectionChange:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var d=c.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addParameter(d+$[143],this._getSelectionIndices());if(this._changeSelectionNotification=="action"){b.addEvent($[61],d);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.send()}}this._updateSelectedItemState()},_onSendRequest:function(a){var b=this._isCreated?this._getTopIndex():0;if(this._topIndex!=b){var e=org.eclipse.swt.WidgetManager.getInstance();var d=e.findIdByWidget(this);var c=org.eclipse.swt.Request.getInstance();c.addParameter(d+".topIndex",b);this._topIndex=b}},_onDblClick:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){if(this._changeSelectionNotification=="action"){var c=org.eclipse.swt.WidgetManager.getInstance();var d=c.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addEvent($[169],d);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.send()}}},_onFocusIn:function(a){this._updateSelectedItemState()},_onFocusOut:function(a){this._updateSelectedItemState()},_updateSelectedItemState:function(){var b=this.getManager().getSelectedItems();for(var a=0;a<b.length;a++){if(this.getFocused()){b[a].removeState($[87])}else{b[a].addState($[87])}}}}});
+qx.Class.define("org.eclipse.swt.TabUtil",{statics:{createTabItem:function(g,f,a){var d=new qx.ui.pageview.tabview.Button();d.setTabIndex(null);d.setLabel($[150]);d.getLabelObject().setMode("html");d.setLabel("");d.setEnableElementFocus(false);d.addEventListener($[398],org.eclipse.swt.TabUtil._onTabItemChangeFocus);d.addEventListener($[29],org.eclipse.swt.TabUtil._onTabItemClick);var e=org.eclipse.swt.WidgetManager.getInstance();var b=e.findWidgetById(f);b.getBar().addAt(d,a);var c=new qx.ui.pageview.tabview.Page(d);b.getPane().add(c);e.add(d,g);e.add(c,g+"pg")},releaseTabItem:function(b){var c=org.eclipse.swt.WidgetManager.getInstance();var a=c.findWidgetById(b);a.removeEventListener($[398],org.eclipse.swt.TabUtil._onTabItemChangeFocus);a.removeEventListener($[29],org.eclipse.swt.TabUtil._onTabItemClick);c.dispose(b+"pg")},_onTabItemChangeFocus:function(a){if(a.getTarget().getFocused()){a.getTarget().getParent().getParent().focus()}},_onTabItemClick:function(a){var b=a.getTarget().getParent().getParent();if(!b.getFocused()){b.focus()}},onTabFolderKeyPress:function(a){var d=a.getTarget();if(d.classname==$[531]){var b=d.getBar().getManager();var c=b.getSelected();if(c!=null){switch(a.getKeyIdentifier()){case"Left":b.selectPrevious(c);org.eclipse.swt.TabUtil.markTabItemFocused(d,a.getTarget());a.stopPropagation();break;case $[51]:b.selectNext(c);org.eclipse.swt.TabUtil.markTabItemFocused(d,a.getTarget());a.stopPropagation();break}}}},onTabFolderChangeFocused:function(a){var c=a.getTarget();var b=c.getBar().getManager().getSelected();org.eclipse.swt.TabUtil.markTabItemFocused(c,b)},markTabItemFocused:function(d,c){var a=d.getBar().getManager().getItems();for(var b=0;b<a.length;b++){a[b].removeState($[133])}if(c!=null&&d.getFocused()){c.addState($[133])}},tabSelected:function(a){var b=a.getTarget();if(!org.eclipse.swt.EventUtil.getSuspended()&&b.getChecked()){var f=org.eclipse.swt.WidgetManager.getInstance();var d=f.findIdByWidget(b);var c=org.eclipse.swt.Request.getInstance();c.addParameter("org.eclipse.swt.events.widgetSelected.item",d);var e=f.findIdByWidget(b.getParent().getParent());org.eclipse.swt.EventUtil.doWidgetSelected(e,0,0,0,0)}}}});
+qx.Class.define("org.eclipse.swt.widgets.DateTimeCalendar",{extend:qx.ui.layout.CanvasLayout,construct:function(c,b,a){arguments.callee.base.call(this);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this.setAppearance("datetime-calendar");this._hasSelectionListener=false;org.eclipse.swt.widgets.Calendar.MONTH_NAMES=b;org.eclipse.swt.widgets.Calendar.WEEKDAY_NAMES=a;this._calendar=new org.eclipse.swt.widgets.Calendar();this._calendar.addEventListener($[323],this._onChangeDate,this);this._calendar.setDate(new Date(74,5,6));this._calendar.setTabIndex(null);this.add(this._calendar);this.addEventListener($[41],this._onContextMenu,this);this.addEventListener($[12],this._onKeyPress,this);this.addEventListener($[55],this._onmousewheel,this);this.addEventListener($[66],this._onFocusIn,this);this.addEventListener("blur",this._onFocusOut,this);this._updateSelectedDayState()},destruct:function(){this._calendar.removeEventListener($[323],this._onChangeDate,this);this.removeEventListener($[41],this._onContextMenu,this);this.removeEventListener($[12],this._onKeyPress,this);this.removeEventListener($[55],this._onmousewheel,this);this.removeEventListener($[66],this._onFocusIn,this);this.removeEventListener("blur",this._onFocusOut,this);this._disposeObjects("_calendar")},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]){this._calendar.addState(a)}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]){this._calendar.removeState(a)}},_onChangeDate:function(){var a=this._calendar.getDate();this._sendChanges(a.getDate(),a.getMonth(),a.getFullYear())},_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_onKeyPress:function(a){this._calendar._onkeypress(a)},_onmousewheel:function(a){a.preventDefault();a.stopPropagation()},_onFocusIn:function(a){this._updateSelectedDayState()},_onFocusOut:function(a){this._updateSelectedDayState()},_updateSelectedDayState:function(){for(var a=0;a<6*7;a++){if(this.getFocused()){this._calendar._dayLabelArr[a].removeState($[87])}else{this._calendar._dayLabelArr[a].addState($[87])}}},_sendChanges:function(a,d,b){if(!org.eclipse.swt.EventUtil.getSuspended()){var f=org.eclipse.swt.WidgetManager.getInstance();var c=org.eclipse.swt.Request.getInstance();var e=f.findIdByWidget(this);c.addParameter(e+".day",a);c.addParameter(e+".month",d);c.addParameter(e+".year",b);if(this._hasSelectionListener){c.addEvent($[61],e);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();c.send()}}},setMonth:function(b){var a=this._calendar.getDate();a.setMonth(b);this._calendar.setDate(a)},setDay:function(b){var a=this._calendar.getDate();a.setDate(b);this._calendar.setDate(a)},setYear:function(b){var a=this._calendar.getDate();a.setYear(b);this._calendar.setDate(a)},setHasSelectionListener:function(a){this._hasSelectionListener=a},setFont:function(){}}});
+qx.Class.define("org.eclipse.swt.widgets.Calendar",{extend:qx.ui.layout.BoxLayout,construct:function(c){arguments.callee.base.call(this);this.setOrientation($[47]);var b=new qx.ui.layout.BoxLayout;b.setAppearance("calendar-navBar");b.set({height:"auto",spacing:1});var f=new qx.ui.form.Button;var a=new qx.ui.form.Button;var m=new qx.ui.basic.Label;var g=new qx.ui.form.Button;var d=new qx.ui.form.Button;var l=org.eclipse.swt.WidgetManager.getInstance();l.setToolTip(f,"Previous year");l.setToolTip(a,"Previous month");l.setToolTip(g,"Next month");l.setToolTip(d,"Next year");f.set({show:"icon",spacing:0,tabIndex:null});f.setUserData($[205],true);a.set({show:"icon",tabIndex:null});a.setUserData($[205],true);g.set({show:"icon",tabIndex:null});g.setUserData($[205],true);d.set({show:"icon",tabIndex:null});d.setUserData($[205],true);f.setAppearance("calendar-toolbar-previous-year-button");a.setAppearance("calendar-toolbar-previous-month-button");g.setAppearance("calendar-toolbar-next-month-button");d.setAppearance("calendar-toolbar-next-year-button");f.addEventListener($[29],this._onNavButtonClicked,this);a.addEventListener($[29],this._onNavButtonClicked,this);g.addEventListener($[29],this._onNavButtonClicked,this);d.addEventListener($[29],this._onNavButtonClicked,this);this._lastYearBt=f;this._lastMonthBt=a;this._nextMonthBt=g;this._nextYearBt=d;m.setAppearance("calendar-monthyear");m.set({width:"1*"});b.add(f,a,m,g,d);this._monthYearLabel=m;b.setHtmlProperty("id","navBar");var o=new qx.ui.layout.CanvasLayout;o.setAppearance("calendar-datepane");o.set({width:org.eclipse.swt.widgets.Calendar.CELL_WIDTH*8,height:org.eclipse.swt.widgets.Calendar.CELL_HEIGHT*7});var k=new qx.ui.basic.Label;k.setAppearance($[530]);k.set({width:org.eclipse.swt.widgets.Calendar.CELL_WIDTH,height:org.eclipse.swt.widgets.Calendar.CELL_HEIGHT,left:0});k.addState("header");o.add(k);this._weekdayLabelArr=[];for(var e=1;e<8;e++){var k=new qx.ui.basic.Label;k.setAppearance("calendar-weekday");k.setSelectable(false);k.setCursor($[38]);k.set({width:org.eclipse.swt.widgets.Calendar.CELL_WIDTH,height:org.eclipse.swt.widgets.Calendar.CELL_HEIGHT,left:e*org.eclipse.swt.widgets.Calendar.CELL_WIDTH});o.add(k);this._weekdayLabelArr.push(k)}this._dayLabelArr=[];this._weekLabelArr=[];for(var h=0;h<6;h++){var k=new qx.ui.basic.Label;k.setAppearance($[530]);k.setSelectable(false);k.setCursor($[38]);k.set({width:org.eclipse.swt.widgets.Calendar.CELL_WIDTH,height:org.eclipse.swt.widgets.Calendar.CELL_HEIGHT,left:0,top:(h+1)*org.eclipse.swt.widgets.Calendar.CELL_HEIGHT});o.add(k);this._weekLabelArr.push(k);for(var j=1;j<8;j++){var k=new qx.ui.basic.Label;k.setAppearance($[213]);k.setSelectable(false);k.setCursor($[38]);k.set({width:org.eclipse.swt.widgets.Calendar.CELL_WIDTH,height:org.eclipse.swt.widgets.Calendar.CELL_HEIGHT,left:j*org.eclipse.swt.widgets.Calendar.CELL_WIDTH,top:(h+1)*org.eclipse.swt.widgets.Calendar.CELL_HEIGHT});k.addEventListener($[2],this._onDayClicked,this);k.addEventListener($[62],this._onDayDblClicked,this);k.addEventListener($[9],this._onDayMouseOver,this);k.addEventListener($[14],this._onDayMouseOut,this);k.setUserData($[213],true);o.add(k);this._dayLabelArr.push(k)}}var n=(c!=null)?c:new Date();this.showMonth(n.getMonth(),n.getFullYear());this.add(b);this.add(o);this.initWidth();this.initHeight()},events:{select:$[68]},statics:{CELL_WIDTH:24,CELL_HEIGHT:16,MONTH_NAMES:[],WEEKDAY_NAMES:[]},properties:{width:{refine:true,init:"auto"},height:{refine:true,init:"auto"},shownMonth:{check:$[22],init:null,nullable:true,event:"changeShownMonth"},shownYear:{check:$[22],init:null,nullable:true,event:"changeShownYear"},date:{check:"Date",init:null,nullable:true,apply:"_applyDate",event:$[323],transform:"_checkDate"}},members:{addState:function(b){arguments.callee.base.call(this,b);if(b.substr(0,8)==$[53]){this._monthYearLabel.addState(b);for(var a=0;a<7;a++){this._weekdayLabelArr[a].addState(b)}for(var a=0;a<6*7;a++){this._dayLabelArr[a].addState(b)}for(var a=0;a<6;a++){this._weekLabelArr[a].addState(b)}}},removeState:function(b){arguments.callee.base.call(this,b);if(b.substr(0,8)==$[53]){this._monthYearLabel.removeState(b);for(var a=0;a<7;a++){this._weekdayLabelArr[a].removeState(b)}for(var a=0;a<6*7;a++){this._dayLabelArr[a].removeState(b)}for(var a=0;a<6;a++){this._weekLabelArr[a].removeState(b)}}},_checkDate:function(a){return(a==null)?null:new Date(a.getTime())},_applyDate:function(f,a){if((f!=null)&&(this.getShownMonth()!=f.getMonth()||this.getShownYear()!=f.getFullYear())){this.showMonth(f.getMonth(),f.getFullYear())}else{var e=(f==null)?-1:f.getDate();for(var c=0;c<6*7;c++){var d=this._dayLabelArr[c];if(d.hasState($[325])){if(d.hasState($[30])){d.removeState($[30])}}else{var b=parseInt(d.getText());if(b==e){d.addState($[30])}else{if(d.hasState($[30])){d.removeState($[30])}}}}}},_onNavButtonClicked:function(a){var b=this.getShownYear();var c=this.getShownMonth();switch(a.getTarget()){case this._lastYearBt:b--;break;case this._lastMonthBt:c--;if(c<0){c=11;b--}break;case this._nextMonthBt:c++;if(c>=12){c=0;b++}break;case this._nextYearBt:b++;break}this.showMonth(c,b)},_onDayClicked:function(a){if(a.isLeftButtonPressed()){var b=a.getTarget().dateTime;this.setDate(new Date(b))}},_onDayDblClicked:function(){this.createDispatchDataEvent("select",this.getDate())},_onDayMouseOver:function(a){a.getTarget().addState("over")},_onDayMouseOut:function(a){a.getTarget().removeState("over")},_onkeypress:function(a){var e=null;var b=null;var d=null;if(a.getModifiers()==0){switch(a.getKeyIdentifier()){case"Left":e=-1;a.preventDefault();a.stopPropagation();break;case $[51]:e=1;a.preventDefault();a.stopPropagation();break;case"Up":e=-7;a.preventDefault();a.stopPropagation();break;case"Down":e=7;a.preventDefault();a.stopPropagation();break;case $[57]:b=-1;a.preventDefault();a.stopPropagation();break;case $[58]:b=1;a.preventDefault();a.stopPropagation();break;case $[118]:if(this.getDate()!=null){this.setDate(null);a.preventDefault();a.stopPropagation();return true}a.preventDefault();a.stopPropagation();break;case"Home":case"End":a.preventDefault();a.stopPropagation();break;case $[71]:case $[91]:if(this.getDate()!=null){this.createDispatchDataEvent("select",this.getDate())}a.preventDefault();a.stopPropagation();return}}else{if(a.isShiftPressed()){switch(a.getKeyIdentifier()){case $[57]:d=-1;a.preventDefault();a.stopPropagation();break;case $[58]:d=1;a.preventDefault();a.stopPropagation();break}}}if(e!=null||b!=null||d!=null){var c=this.getDate();if(c!=null){c=new Date(c.getTime())}if(c==null){c=new Date()}else{if(e!=null){c.setDate(c.getDate()+e)}if(b!=null){c.setMonth(c.getMonth()+b)}if(d!=null){c.setFullYear(c.getFullYear()+d)}}this.setDate(c)}},showMonth:function(b,a){if((b!=null&&b!=this.getShownMonth())||(a!=null&&a!=this.getShownYear())){if(b!=null){this.setShownMonth(b)}if(a!=null){this.setShownYear(a)}this._updateDatePane()}},_updateDatePane:function(){var t=new Date();var d=t.getFullYear();var j=t.getMonth();var z=t.getDate();var a=this.getDate();var r=(a==null)?-1:a.getFullYear();var b=(a==null)?-1:a.getMonth();var w=(a==null)?-1:a.getDate();var e=this.getShownMonth();var q=this.getShownYear();var x=this.__getWeekStart();var u=new Date(this.getShownYear(),this.getShownMonth(),1);var f=this.getShownYear();var v=org.eclipse.swt.widgets.Calendar.MONTH_NAMES[this.getShownMonth()];this._monthYearLabel.setText(v+" "+f);var k=u.getDay();var g=(1+7-k)%7;for(var o=0;o<7;o++){var n=(o+x)%7;var m=this._weekdayLabelArr[o];u.setDate(g+n);var s=org.eclipse.swt.widgets.Calendar.WEEKDAY_NAMES[u.getDay()+1];m.setText(s);if(this.__isWeekend(n)){m.addState("weekend")}else{m.removeState("weekend")}}u=new Date(q,e,1);var p=(7+k-x)%7;u.setDate(u.getDate()-p);for(var l=0;l<6;l++){this._weekLabelArr[l].setText(""+this.__getWeekInYear(u));for(var o=0;o<7;o++){var m=this._dayLabelArr[l*7+o];var f=u.getFullYear();var v=u.getMonth();var h=u.getDate();var c=(r==f&&b==v&&w==h);if(c){m.addState($[30])}else{m.removeState($[30])}if(v!=e){m.addState($[325])}else{m.removeState($[325])}var y=(f==d&&v==j&&h==z);if(y){m.addState("today")}else{m.removeState("today")}m.setText(""+h);m.dateTime=u.getTime();u.setDate(u.getDate()+1)}}},__thursdayOfSameWeek:function(a){return new Date(a.getTime()+(3-((a.getDay()+6)%7))*86400000)},__getWeekInYear:function(a){var d=this.__thursdayOfSameWeek(a);var b=d.getFullYear();var c=this.__thursdayOfSameWeek(new Date(b,0,4));return Math.floor(1.5+(d.getTime()-c.getTime())/86400000/7)},__getWeekStart:function(){var a={MV:5,AE:6,AF:6,BH:6,DJ:6,DZ:6,EG:6,ER:6,ET:6,IQ:6,IR:6,JO:6,KE:6,KW:6,LB:6,LY:6,MA:6,OM:6,QA:6,SA:6,SD:6,SO:6,TN:6,YE:6,AS:0,AU:0,AZ:0,BW:0,CA:0,CN:0,FO:0,GE:0,GL:0,GU:0,HK:0,IE:0,IL:0,IS:0,JM:0,JP:0,KG:0,KR:0,LA:0,MH:0,MN:0,MO:0,MP:0,MT:0,NZ:0,PH:0,PK:0,SG:0,TH:0,TT:0,TW:0,UM:0,US:0,UZ:0,VI:0,ZA:0,ZW:0,MW:0,NG:0,TJ:0};var b=this.__getTerritory();return a[b]!=null?a[b]:1},__getWeekendStart:function(){var a={EG:5,IL:5,SY:5,IN:0,AE:4,BH:4,DZ:4,IQ:4,JO:4,KW:4,LB:4,LY:4,MA:4,OM:4,QA:4,SA:4,SD:4,TN:4,YE:4};var b=this.__getTerritory();return a[b]!=null?a[b]:6},__getWeekendEnd:function(){var a={AE:5,BH:5,DZ:5,IQ:5,JO:5,KW:5,LB:5,LY:5,MA:5,OM:5,QA:5,SA:5,SD:5,TN:5,YE:5,AF:5,IR:5,EG:6,IL:6,SY:6};var b=this.__getTerritory();return a[b]!=null?a[b]:0},__isWeekend:function(b){var c=this.__getWeekendStart();var a=this.__getWeekendEnd();if(a>c){return((b>=c)&&(b<=a))}else{return((b>=c)||(b<=a))}},__getTerritory:function(){var a=org.eclipse.rwt.Client.getTerritory()||org.eclipse.rwt.Client.getLanguage();return a.toUpperCase()}},destruct:function(){this._disposeObjects("_lastYearBt","_lastMonthBt","_nextMonthBt","_nextYearBt","_monthYearLabel");this._disposeObjectDeep("_weekdayLabelArr",1);this._disposeObjectDeep("_dayLabelArr",1);this._disposeObjectDeep("_weekLabelArr",1)}});
+qx.Class.define("org.eclipse.swt.widgets.CoolItem",{extend:qx.ui.layout.CanvasLayout,construct:function(a){arguments.callee.base.call(this);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this.setAppearance("coolitem");this._orientation=a;this._handle=new qx.ui.basic.Terminator();this._handle.addState(a);this._handle.setAppearance($[564]);this._handle.addEventListener($[2],this._onHandleMouseDown,this);this._handle.addEventListener($[45],this._onHandleMouseMove,this);this._handle.addEventListener($[15],this._onHandleMouseUp,this);this.add(this._handle);this._bufferedZIndex=null;this._bufferedControlZIndex=null;this._control=null},destruct:function(){if(this._handle!=null){this._handle.removeEventListener($[2],this._onHandleMouseDown,this);this._handle.removeEventListener($[45],this._onHandleMouseMove,this);this._handle.removeEventListener($[15],this._onHandleMouseUp,this);this._handle.dispose()}},statics:{DRAG_CURSOR:$[232],CONTROL_OFFSET:6},members:{setLocked:function(a){this._handle.setDisplay(!a)},setControl:function(a){if(a!=null){a.setLeft(this.getLeft()+org.eclipse.swt.widgets.CoolItem.CONTROL_OFFSET);a.setDisplay(true)}if(this._control!=null){this._control.setDisplay(false)}this._control=a},updateHandleBounds:function(){if(this._orientation==$[47]){this._handle.setWidth(this.getWidth())}else{this._handle.setHeight(this.getHeight())}},_onHandleMouseDown:function(a){this._handle.setCapture(true);this.getTopLevelWidget().setGlobalCursor(org.eclipse.swt.widgets.CoolItem.DRAG_CURSOR);this._offsetX=a.getPageX()-this.getLeft();this._offsetY=a.getPageY()-this.getTop();this._bufferedZIndex=this.getZIndex();this.setZIndex(10000000-1);if(this._control!=null){this._bufferedControlZIndex=this._control.getZIndex();this._control.setZIndex(10000000)}this.setBackgroundColor(this._findBackground())},_applyLeft:function(c,a){arguments.callee.base.call(this,c,a);if(this._control!=null){var b=c+org.eclipse.swt.widgets.CoolItem.CONTROL_OFFSET;this._control.setLeft(b)}},_applyWidth:function(c,a){arguments.callee.base.call(this,c,a);if(this._control!=null){var b=c-org.eclipse.swt.widgets.CoolItem.CONTROL_OFFSET;this._control.setWidth(b)}},_onHandleMouseMove:function(a){if(this._handle.getCapture()){this.setLeft(a.getPageX()-this._offsetX)}},_onHandleMouseUp:function(a){this._handle.setCapture(false);this.setZIndex(this._bufferedZIndex);if(this._control!=null){this._control.setZIndex(this._bufferedControlZIndex)}this.resetBackgroundColor();this.getTopLevelWidget().setGlobalCursor(null);if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addEvent("org.eclipse.swt.events.widgetMoved",c);b.addParameter(c+$[295],this.getLeft());b.addParameter(c+$[294],this.getTop());b.send()}},_findBackground:function(){var b=true;var a=null;var c=this.getParent();while(b&&c!=null&&a==null){if(c.getBackgroundColor){a=c.getBackgroundColor()}if(c.getParent){c=c.getParent()}else{b=false}}return a}}});
+qx.Class.define($[467],{extend:org.eclipse.rwt.widgets.BasicButton,construct:function(a){arguments.callee.base.call(this,a);switch(a){case"push":case"toggle":this.setAppearance("push-button");break;case"check":this.setAppearance("check-box");break;case"radio":this.setAppearance("radio-button")}this.initTabIndex();this.addEventListener($[66],this._onFocus);this.addEventListener("blur",this._onBlur)},properties:{tabIndex:{refine:true,init:1}},members:{setWrap:function(a){if(a){this.setFlexibleCell(2)}},_afterRenderLayout:function(a){if(this.hasState($[133])){this._showFocusIndicator()}},_showFocusIndicator:function(){var b=org.eclipse.rwt.FocusIndicator.getInstance();var a=this.getCellNode(2)!=null?this.getCellNode(2):this.getCellNode(1);b.show(this,"Button-FocusIndicator",a)},_onFocus:function(a){this._showFocusIndicator()},_onBlur:function(b){var a=org.eclipse.rwt.FocusIndicator.getInstance();a.hide(this)}}});
+qx.Class.define("org.eclipse.rwt.widgets.FileUpload",{extend:org.eclipse.rwt.widgets.Button,construct:function(){arguments.callee.base.call(this,"push");this.addState("rwt_PUSH");this.addEventListener($[228],this._layoutInputElement,this);this.addEventListener($[307],this._onMouseOverElement,this);this._formElement=null;this._inputElement=null;this._iframe=null;this._cursor="";this.__onValueChange=qx.lang.Function.bind(this._onValueChange,this);this.setEnableElementFocus(false);this._createIframeWidget()},destruct:function(){this._formElement=null;this._inputElement=null},members:{submit:function(a){if(typeof a!==$[13]){throw new Error("No url given!")}if(this._getFileName()===""){throw new Error("No file selected!")}if(this._formElement===null){throw new Error("Form element not created!")}this._formElement.setAttribute("action",a);this._formElement.submit()},destroy:function(){arguments.callee.base.call(this);this._iframe.destroy()},_createSubelements:function(){arguments.callee.base.call(this);if(this._formElement===null){this._createFormElement();this._createInputElement()}else{this._getTargetNode().appendChild(this._formElement);var a=qx.core.Variant.isSet($[0],$[18]);if(a){this._formElement.appendChild(this._inputElement)}}},_createFormElement:function(){this._formElement=document.createElement("form");this._formElement.setAttribute("target",this._getFrameName());this._formElement.setAttribute("method","POST");var a=qx.core.Variant.isSet($[0],$[18]);if(a){this._formElement.setAttribute("encoding",$[552])}else{this._formElement.setAttribute("enctype",$[552])}this._getTargetNode().appendChild(this._formElement)},_createInputElement:function(){this._inputElement=document.createElement($[82]);this._inputElement.style.position=$[28];this._inputElement.setAttribute("type","file");this._inputElement.setAttribute("name","file");this._inputElement.setAttribute("size","1");this._inputElement.style.cursor=this._cursor;this._inputElement.onchange=this.__onValueChange;org.eclipse.rwt.HtmlUtil.setOpacity(this._inputElement,0);this._formElement.appendChild(this._inputElement)},_createIframeWidget:function(){this._iframe=new qx.ui.embed.Iframe();this._iframe.setSource("about:blank");this._iframe.setVisibility(false);this._iframe.setWidth(0);this._iframe.setHeight(0);this._iframe.setFrameName(this._getFrameName());this._iframe.addToDocument()},_onValueChange:function(b){var e=this._formatFileName(this._getFileName());if(!org.eclipse.swt.EventUtil.getSuspended()){var a=org.eclipse.swt.Request.getInstance();var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);a.addParameter(c+".fileName",e);a.send()}},_getFileName:function(){return this._inputElement.value},_layoutPost:function(a){arguments.callee.base.call(this,a);if(a.width||a.height){this._layoutInputElement()}},_layoutInputElement:function(){if(this.getEnabled()&&this.isSeeable()){var a=10;this._layoutInputElementHorizontal(a);this._layoutInputElementVertical(a)}},_layoutInputElementHorizontal:function(g){var h=0.6;var a=this.getBoxWidth();var e=(a+g*2)/(h);var i=e/10;this._inputElement.style.fontSize=i;var c=0;while(this._inputElement.offsetWidth<=e){i+=10;this._inputElement.style.fontSize=i;c++;if(c>100){var b="Failed to force input-element width.";throw new Error(b)}}var d=this._inputElement.offsetWidth;var f=a-d+g;this._inputElement.style.left=f+"px"},_layoutInputElementVertical:function(b){var a=this.getBoxHeight();this._inputElement.style.height=(a+b*2)+"px";this._inputElement.style.top=(b*-1)+"px"},setStyleProperty:function(b,a){if(b===$[34]){this._cursor=a;if(this._inputElement!=null){this._inputElement.style.cursor=a}}else{arguments.callee.base.call(this,b,a)}},_applyEnabled:function(b,a){arguments.callee.base.call(this,b,a);if(this._inputElement){this._inputElement.style.display=b?"":"none";this._layoutInputElement()}},_afterAppear:function(){arguments.callee.base.call(this);this._layoutInputElement()},_onMouseOver:function(a){if(a.getDomTarget()===this._inputElement){arguments.callee.base.call(this,a)}},_onMouseOverElement:function(a){if(a.getDomTarget()===this._inputElement){this._onMouseOver(a)}},_onMouseDown:function(a){if(a.getDomTarget()===this._inputElement){arguments.callee.base.call(this,a)}if(org.eclipse.rwt.Client.getBrowser()===$[209]){this._onBlur()}},_onMouseUp:function(a){if(a.getDomTarget()===this._inputElement||this.hasState($[46])){arguments.callee.base.call(this,a)}},_onFocus:function(a){arguments.callee.base.call(this,a);this._inputElement.focus()},_onKeyDown:qx.lang.Function.returnTrue,_onKeyUp:qx.lang.Function.returnTrue,_ontabfocus:function(){if(org.eclipse.rwt.Client.getBrowser()===$[209]){this._showFocusIndicator(true)}},_showFocusIndicator:function(a){var b=org.eclipse.rwt.Client.getBrowser()===$[209];if(!b||a){arguments.callee.base.call(this)}},_formatFileName:function(b){var a=b;if(a.indexOf("\\")!=-1){a=a.substr(a.lastIndexOf("\\")+1)}else{if(a.indexOf("/")!=-1){a=a.substr(a.lastIndexOf("/")+1)}}return a},_getFrameName:function(){return"FileUpload_"+this.toHashCode()}}});
+qx.Class.define("org.eclipse.swt.widgets.DateTimeTime",{extend:qx.ui.layout.CanvasLayout,construct:function(a){arguments.callee.base.call(this);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this.setAppearance("datetime-time");this._short=qx.lang.String.contains(a,"short");this._medium=qx.lang.String.contains(a,"medium");this._long=qx.lang.String.contains(a,"long");this._hasSelectionListener=false;this._requestTimer=null;this.addEventListener($[83],this._rwt_onChangeFont,this);this.addEventListener($[12],this._onKeyPress,this);this.addEventListener($[60],this._onKeyUp,this);this.addEventListener($[55],this._onMouseWheel,this);this.addEventListener($[41],this._onContextMenu,this);this.addEventListener($[66],this._onFocusIn,this);this.addEventListener("blur",this._onFocusOut,this);this._focusedTextField=null;this._hoursTextField=new qx.ui.basic.Label("00");this._hoursTextField.setAppearance($[157]);this._hoursTextField.setUserData($[175],2);this._hoursTextField.addEventListener($[2],this._onMouseDown,this);this.add(this._hoursTextField);this._separator3=new qx.ui.basic.Label(":");this._separator3.setAppearance($[253]);this._separator3.addEventListener($[41],this._onContextMenu,this);this.add(this._separator3);this._minutesTextField=new qx.ui.basic.Label("00");this._minutesTextField.setAppearance($[157]);this._minutesTextField.setUserData($[175],2);this._minutesTextField.addEventListener($[2],this._onMouseDown,this);this.add(this._minutesTextField);this._separator4=new qx.ui.basic.Label(":");this._separator4.setAppearance($[253]);if(this._medium||this._long){this.add(this._separator4)}this._secondsTextField=new qx.ui.basic.Label("00");this._secondsTextField.setAppearance($[157]);this._secondsTextField.setUserData($[175],2);this._secondsTextField.addEventListener($[2],this._onMouseDown,this);if(this._medium||this._long){this.add(this._secondsTextField)}this._spinner=new qx.ui.form.Spinner();this._spinner.set({wrap:true,border:null,backgroundColor:null});this._spinner.setMin(0);this._spinner.setMax(23);this._spinner.setValue(0);this._spinner.addEventListener($[79],this._onSpinnerChange,this);this._spinner._textfield.setTabIndex(null);this._spinner._textfield.setFocused=function(){};this._spinner._textfield.setVisibility(false);this._spinner._upbutton.setAppearance($[426]);this._spinner._downbutton.setAppearance($[451]);this._spinner.removeEventListener($[12],this._spinner._onkeypress,this._spinner);this._spinner.removeEventListener($[23],this._spinner._onkeydown,this._spinner);this._spinner.removeEventListener($[60],this._spinner._onkeyup,this._spinner);this._spinner.removeEventListener($[55],this._spinner._onmousewheel,this._spinner);this.add(this._spinner);this._focusedTextField=this._hoursTextField},destruct:function(){this.removeEventListener($[83],this._rwt_onChangeFont,this);this.removeEventListener($[12],this._onKeyPress,this);this.removeEventListener($[60],this._onKeyUp,this);this.removeEventListener($[55],this._onMouseWheel,this);this.removeEventListener($[41],this._onContextMenu,this);this.removeEventListener($[66],this._onFocusIn,this);this.removeEventListener("blur",this._onFocusOut,this);this._hoursTextField.removeEventListener($[2],this._onMouseDown,this);this._minutesTextField.removeEventListener($[2],this._onMouseDown,this);this._secondsTextField.removeEventListener($[2],this._onMouseDown,this);this._spinner.removeEventListener($[79],this._onSpinnerChange,this);this._disposeObjects("_hoursTextField","_minutesTextField","_secondsTextField",$[462],"_spinner","_separator3","_separator4")},statics:{HOURS_TEXTFIELD:8,MINUTES_TEXTFIELD:9,SECONDS_TEXTFIELD:10,HOURS_MINUTES_SEPARATOR:11,MINUTES_SECONDS_SEPARATOR:12,SPINNER:7,_isNoModifierPressed:function(a){return !a.isCtrlPressed()&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isMetaPressed()}},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]){this._hoursTextField.addState(a);this._minutesTextField.addState(a);this._secondsTextField.addState(a);this._spinner.addState(a);this._separator3.addState(a);this._separator4.addState(a)}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]){this._hoursTextField.removeState(a);this._minutesTextField.removeState(a);this._secondsTextField.removeState(a);this._spinner.removeState(a);this._separator3.removeState(a);this._separator4.removeState(a)}},_rwt_onChangeFont:function(a){var b=a.getValue();this._hoursTextField.setFont(b);this._minutesTextField.setFont(b);this._secondsTextField.setFont(b)},_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_onFocusIn:function(a){this._focusedTextField.addState($[30])},_onFocusOut:function(a){this._focusedTextField.removeState($[30])},_onMouseDown:function(a){this._setFocusedTextField(a.getTarget())},_setFocusedTextField:function(a){var b;this._focusedTextField.removeState($[30]);this._focusedTextField=null;if(a===this._hoursTextField){this._spinner.setMin(0);this._spinner.setMax(23);b=this._removeLeadingZero(this._hoursTextField.getText());this._spinner.setValue(parseInt(b,10))}else{if(a===this._minutesTextField){this._spinner.setMin(0);this._spinner.setMax(59);b=this._removeLeadingZero(this._minutesTextField.getText());this._spinner.setValue(parseInt(b,10))}else{if(a===this._secondsTextField){this._spinner.setMin(0);this._spinner.setMax(59);b=this._removeLeadingZero(this._secondsTextField.getText());this._spinner.setValue(parseInt(b,10))}}}this._focusedTextField=a;this._focusedTextField.addState($[30])},_onSpinnerChange:function(a){if(this._focusedTextField!=null){var b=this._focusedTextField.getText();var c=this._addLeadingZero(this._spinner.getValue());this._focusedTextField.setText(c);if(b!=c){this._sendChanges()}}},_onKeyPress:function(a){var c=a.getKeyIdentifier();if(org.eclipse.swt.widgets.DateTimeTime._isNoModifierPressed(a)){switch(c){case"Left":if(this._focusedTextField===this._hoursTextField){if(this._short){this._setFocusedTextField(this._minutesTextField)}else{this._setFocusedTextField(this._secondsTextField)}}else{if(this._focusedTextField===this._minutesTextField){this._setFocusedTextField(this._hoursTextField)}else{if(this._focusedTextField===this._secondsTextField){this._setFocusedTextField(this._minutesTextField)}}}a.preventDefault();a.stopPropagation();break;case $[51]:if(this._focusedTextField===this._hoursTextField){this._setFocusedTextField(this._minutesTextField)}else{if(this._focusedTextField===this._minutesTextField){if(this._short){this._setFocusedTextField(this._hoursTextField)}else{this._setFocusedTextField(this._secondsTextField)}}else{if(this._focusedTextField===this._secondsTextField){this._setFocusedTextField(this._hoursTextField)}}}a.preventDefault();a.stopPropagation();break;case"Up":var b=this._spinner.getValue();if(b==this._spinner.getMax()){this._spinner.setValue(this._spinner.getMin())}else{this._spinner.setValue(b+1)}a.preventDefault();a.stopPropagation();break;case"Down":var b=this._spinner.getValue();if(b==this._spinner.getMin()){this._spinner.setValue(this._spinner.getMax())}else{this._spinner.setValue(b-1)}a.preventDefault();a.stopPropagation();break;case $[57]:case $[58]:case"Home":case"End":a.preventDefault();a.stopPropagation();break}}},_onKeyUp:function(a){var b=a.getKeyIdentifier();var e=this._focusedTextField.getText();e=this._removeLeadingZero(e);if(org.eclipse.swt.widgets.DateTimeTime._isNoModifierPressed(a)){switch(b){case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":var d=this._focusedTextField.getUserData($[175]);var f=b;if(e.length<d){f=e+b}var c=parseInt(f,10);if(c>=this._spinner.getMin()&&c<=this._spinner.getMax()){this._spinner.setValue(c)}else{f=b;c=parseInt(f,10);if(c>=this._spinner.getMin()&&c<=this._spinner.getMax()){this._spinner.setValue(c)}}a.preventDefault();a.stopPropagation();break;case"Home":var f=this._spinner.getMin();this._spinner.setValue(f);a.preventDefault();a.stopPropagation();break;case"End":var f=this._spinner.getMax();this._spinner.setValue(f);a.preventDefault();a.stopPropagation();break}}},_onMouseWheel:function(a){if(this.getFocused()){a.preventDefault();a.stopPropagation();this._spinner._onmousewheel(a)}},_addLeadingZero:function(a){return a<10?"0"+a:""+a},_removeLeadingZero:function(c){var a=c;if(c.length==2){var b=c.substring(0,1);if(b=="0"){a=c.substring(1)}}return a},_sendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var b=c.findIdByWidget(this);a.addParameter(b+".hours",this._removeLeadingZero(this._hoursTextField.getText()));a.addParameter(b+".minutes",this._removeLeadingZero(this._minutesTextField.getText()));a.addParameter(b+".seconds",this._removeLeadingZero(this._secondsTextField.getText()));if(this._hasSelectionListener){this._requestTimer.restart()}}},_onInterval:function(){this._requestTimer.stop();var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addEvent($[61],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()},setHours:function(a){this._hoursTextField.setText(this._addLeadingZero(a));if(this._focusedTextField===this._hoursTextField){this._spinner.setValue(a)}},setMinutes:function(a){this._minutesTextField.setText(this._addLeadingZero(a));if(this._focusedTextField===this._minutesTextField){this._spinner.setValue(a)}},setSeconds:function(a){this._secondsTextField.setText(this._addLeadingZero(a));if(this._focusedTextField===this._secondsTextField){this._spinner.setValue(a)}},setHasSelectionListener:function(a){this._hasSelectionListener=a;this._requestTimer=new qx.client.Timer(110);this._requestTimer.addEventListener($[49],this._onInterval,this)},setBounds:function(e,b,f,c,a){var d;switch(e){case org.eclipse.swt.widgets.DateTimeTime.HOURS_TEXTFIELD:d=this._hoursTextField;break;case org.eclipse.swt.widgets.DateTimeTime.MINUTES_TEXTFIELD:d=this._minutesTextField;break;case org.eclipse.swt.widgets.DateTimeTime.SECONDS_TEXTFIELD:d=this._secondsTextField;break;case org.eclipse.swt.widgets.DateTimeTime.HOURS_MINUTES_SEPARATOR:d=this._separator3;break;case org.eclipse.swt.widgets.DateTimeTime.MINUTES_SECONDS_SEPARATOR:d=this._separator4;break;case org.eclipse.swt.widgets.DateTimeTime.SPINNER:d=this._spinner;break}d.set({left:b,top:f,width:c,height:a})}}});
+qx.Class.define("org.eclipse.swt.widgets.Slider",{extend:org.eclipse.swt.widgets.AbstractSlider,construct:function(a){arguments.callee.base.call(this,qx.lang.String.contains(a,$[52]));this._hasSelectionListener=false;this._requestScheduled=false;this.addEventListener($[41],this._onContextMenu,this);this.addEventListener($[12],this._onKeyPress,this)},statics:{SEND_DELAY:50,_isNoModifierPressed:function(a){return !a.isCtrlPressed()&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isMetaPressed()}},members:{_configureAppearance:function(){this.setAppearance("slider");this._thumb.setAppearance($[412]);this._minButton.setAppearance("slider-min-button");this._maxButton.setAppearance("slider-max-button")},setSelection:function(a){this._setSelection(a)},setMinimum:function(a){this._setMinimum(a)},setMaximum:function(a){this._setMaximum(a)},setIncrement:function(a){this._setIncrement(a)},setPageIncrement:function(a){this._setPageIncrement(a)},setThumb:function(a){this._setThumb(a)},setHasSelectionListener:function(a){this._hasSelectionListener=a},_setSelection:function(a){arguments.callee.base.call(this,a);this._scheduleSendChanges()},_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_onKeyPress:function(a){var c=a.getKeyIdentifier();var b;if(org.eclipse.swt.widgets.Slider._isNoModifierPressed(a)){switch(c){case"Left":b=this._selection-this._increment;a.preventDefault();a.stopPropagation();break;case"Down":if(this._horizontal){b=this._selection-this._increment}else{b=this._selection+this._increment}a.preventDefault();a.stopPropagation();break;case $[51]:b=this._selection+this._increment;a.preventDefault();a.stopPropagation();break;case"Up":if(this._horizontal){b=this._selection+this._increment}else{b=this._selection-this._increment}a.preventDefault();a.stopPropagation();break;case"Home":b=this._minimum;a.preventDefault();a.stopPropagation();break;case"End":b=this._maximum;a.preventDefault();a.stopPropagation();break;case $[58]:if(this._horizontal){b=this._selection-this._pageIncrement}else{b=this._selection+this._pageIncrement}a.preventDefault();a.stopPropagation();break;case $[57]:if(this._horizontal){b=this._selection+this._pageIncrement}else{b=this._selection-this._pageIncrement}a.preventDefault();a.stopPropagation();break}if(b!=undefined){if(b<this._minimum){b=this._minimum}if(b>this._maximum){b=this._maximum}this.setSelection(b);if(this._readyToSendChanges){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,org.eclipse.swt.widgets.Slider.SEND_DELAY)}}}},_onMouseWheel:function(a){if(this.getFocused()){arguments.callee.base.call(this,a);if(this._readyToSendChanges){this._readyToSendChanges=false;qx.client.Timer.once(this._sendChanges,this,500)}}},_scheduleSendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){if(!this._requestScheduled){this._requestScheduled=true;qx.client.Timer.once(this._sendChanges,this,org.eclipse.swt.widgets.Slider.SEND_DELAY)}}},_sendChanges:function(){var c=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var b=c.findIdByWidget(this);a.addParameter(b+$[143],this._selection);if(this._hasSelectionListener){a.addEvent($[61],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()}this._requestScheduled=false}}});
+qx.Class.define("org.eclipse.swt.widgets.Spinner",{extend:qx.ui.form.Spinner,construct:function(){arguments.callee.base.call(this);this._isModified=false;this._hasModifyListener=false;this._hasSelectionListener=false;this.setWrap(false);this._textfield.setFocused=function(){};this._textfield.addEventListener($[80],this._onChangeValue,this);this._textfield.addEventListener($[12],this._onChangeValue,this);this._textfield.addEventListener("blur",this._onChangeValue,this);this._textfield.addEventListener($[23],this._onKeyDown,this);this._textfield.setTabIndex(null);this.addEventListener($[131],this._onChangeEnabled,this);this.addEventListener($[177],this._onFocusOut,this);this._checkValue=this.__checkValueWithDigits},destruct:function(){this._textfield.removeEventListener($[80],this._onChangeValue,this);this._textfield.removeEventListener($[12],this._onChangeValue,this);this._textfield.removeEventListener("blur",this._onChangeValue,this);this._textfield.removeEventListener($[23],this._onKeyDown,this);this.removeEventListener($[131],this._onChangeEnabled,this);this.removeEventListener($[177],this._onFocusOut,this)},properties:{digits:{check:$[22],init:0,apply:"_applyDigits"},decimalSeparator:{check:$[25],init:".",apply:"_applyDecimalSeparator"}},members:{setFont:function(a){this._textfield.setFont(a)},setMaxLength:function(a){this._textfield.setMaxLength(a)},setMinMaxSelection:function(b,a,c){this.setMin(Math.min(b,this.getMin()));this.setMax(Math.max(a,this.getMax()));this.setValue(c);this.setMin(b);this.setMax(a)},_applyCursor:function(b,a){arguments.callee.base.call(this,b,a);if(b){this._upbutton.setCursor(b);this._downbutton.setCursor(b);this._textfield.setCursor(b)}else{this._upbutton.resetCursor();this._downbutton.resetCursor();this._textfield.resetCursor()}},setHasModifyListener:function(a){this._hasModifyListener=a},setHasSelectionListener:function(a){this._hasSelectionListener=a},_visualizeFocus:function(){this._textfield._visualizeFocus();if(this._textfield.isCreated()){this._textfield.selectAll()}},_visualizeBlur:function(){this._textfield.setSelectionLength(0);this._textfield._visualizeBlur()},_oninput:function(a){this._suspendTextFieldUpdate=true;this._checkValue(true,false);this._suspendTextFieldUpdate=false},_onChangeValue:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()&&!this._isModified){this._isModified=true;var b=org.eclipse.swt.Request.getInstance();b.addEventListener("send",this._onSend,this);if(this._hasSelectionListener){this._addModifyTextEvent();this._sendWidgetSelected()}else{if(this._hasModifyListener){this._addModifyTextEvent();qx.client.Timer.once(this._sendModifyText,this,500)}}}},_onChangeEnabled:function(a){var b=a.getValue();this._upbutton.setEnabled(b&&this.getValue()<this.getMax());this._downbutton.setEnabled(b&&this.getValue()>this.getMin())},_onKeyDown:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){if(a.getKeyIdentifier()==$[71]&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isCtrlPressed()&&!a.isMetaPressed()&&this._hasSelectionListener){a.stopPropagation();this._sendWidgetDefaultSelected()}}},_onmousewheel:function(a){if(this.getFocused()){arguments.callee.base.call(this,a)}},_addModifyTextEvent:function(){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addEvent($[568],b)},_sendWidgetSelected:function(){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addEvent($[61],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()},_sendWidgetDefaultSelected:function(){var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addEvent($[169],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()},_onSend:function(a){this._isModified=false;var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addParameter(c+$[143],this.getManager().getValue());b.removeEventListener("send",this._onSend,this)},_sendModifyText:function(a){if(this._isModified){org.eclipse.swt.Request.getInstance().send();this._isModified=false}},_applyDigits:function(c,b){var a=this.getManager().getValue();if(this.getDigits()>0){this._textfield.setValue(this._format(a))}else{this._textfield.setValue(String(a))}},_applyDecimalSeparator:function(c,b){var a=this.getManager().getValue();if(this.getDigits()>0){this._textfield.setValue(this._format(a))}},_format:function(d){var c=this.getDigits();var f=d/Math.pow(10,c);var a=f.toFixed(c);var e=this.getDecimalSeparator();if(e!="."){var b=qx.lang.String.escapeRegexpChars(".");a=a.replace(new RegExp(b),e)}return a},_limit:function(c){var a=c;var b=this.getDigits();if(b>0){a=a*Math.pow(10,b)}a=Math.round(a);if(a>this.getMax()){a=this.getMax()}if(a<this.getMin()){a=this.getMin()}return a},_onFocusOut:function(a){this._checkValue(true,false)},_onkeypress:function(a){var b=a.getKeyIdentifier();var c=this.getDecimalSeparator();if(!(this.getDigits()>0&&b==c)){arguments.callee.base.call(this,a)}},_onchange:function(a){var b=this.getManager().getValue();if(!this._suspendTextFieldUpdate){if(this.getDigits()>0){this._textfield.setValue(this._format(b))}else{this._textfield.setValue(String(b))}}if(b==this.getMin()&&!this.getWrap()){this._downbutton.removeState($[21]);this._downbutton.setEnabled(false);this._timer.stop()}else{this._downbutton.resetEnabled()}if(b==this.getMax()&&!this.getWrap()){this._upbutton.removeState($[21]);this._upbutton.setEnabled(false);this._timer.stop()}else{this._upbutton.resetEnabled()}this.createDispatchDataEvent($[79],b)},__checkValueWithDigits:function(g,b){var k=this._textfield.getInputElement();if(k){if(k.value==""&&!g){this.resetValue()}else{var i=k.value;var e=i;var d=this.getDecimalSeparator();if(this.getDigits()>0&&d!="."){d=qx.lang.String.escapeRegexpChars(d);e=i.replace(new RegExp(d),".")}var j=parseFloat(e);var f=this._limit(j);var a=this.getManager().getValue();var h=f;if(isNaN(j)||j!=f||j!=e){if(b){this._textfield.setValue(this._last_value)}else{if(isNaN(f)){h=a}}}if(!b){var c=String(h);if(this.getDigits()>0){c=this._format(h)}if(h===a&&i!==c&&!this._suspendTextFieldUpdate){this._textfield.setValue(c)}this.getManager().setValue(h)}}}}}});
+qx.Class.define("org.eclipse.swt.widgets.DateTimeDate",{extend:qx.ui.layout.CanvasLayout,construct:function(f,e,b,d,g,c){arguments.callee.base.call(this);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this.setAppearance("datetime-date");this._short=qx.lang.String.contains(f,"short");this._medium=qx.lang.String.contains(f,"medium");this._long=qx.lang.String.contains(f,"long");this._drop_down=qx.lang.String.contains(f,"drop_down");this._hasSelectionListener=false;this._requestTimer=null;this._readyToSendChanges=true;this._weekday=b;this._monthname=e;this._datePattern=c;this.addEventListener($[83],this._rwt_onChangeFont,this);this.addEventListener($[12],this._onKeyPress,this);this.addEventListener($[60],this._onKeyUp,this);this.addEventListener($[55],this._onMouseWheel,this);this.addEventListener($[41],this._onContextMenu,this);this.addEventListener($[66],this._onFocusIn,this);this.addEventListener("blur",this._onFocusOut,this);this._focusedTextField=null;this._weekdayTextField=new qx.ui.basic.Label();this._weekdayTextField.setAppearance($[157]);if(this._long){this.add(this._weekdayTextField)}this._separator0=new qx.ui.basic.Label(",");this._separator0.setAppearance($[253]);if(this._long){this.add(this._separator0)}this._monthTextField=new qx.ui.basic.Label();this._monthTextField.setAppearance($[157]);this._monthTextField.set({textAlign:this._medium?$[24]:$[37]});this._monthInt=1;if(this._medium){this._monthTextField.setText("1")}else{this._monthTextField.setText(this._monthname[this._monthInt-1])}this._monthTextField.addEventListener($[2],this._onTextFieldMouseDown,this);this.add(this._monthTextField);this._separator1=new qx.ui.basic.Label(g);this._separator1.setAppearance($[253]);if(this._medium){this.add(this._separator1)}this._dayTextField=new qx.ui.basic.Label("1");this._dayTextField.setAppearance($[157]);this._dayTextField.setUserData($[175],2);this._dayTextField.set({textAlign:$[24]});this._dayTextField.addEventListener($[2],this._onTextFieldMouseDown,this);if(!this._short){this.add(this._dayTextField)}this._separator2=new qx.ui.basic.Label(",");this._separator2.setAppearance($[253]);if(this._medium){this._separator2.setText(g)}this.add(this._separator2);this._yearTextField=new qx.ui.basic.Label("1970");this._yearTextField.setAppearance($[157]);this._yearTextField.setUserData($[175],4);this._yearTextField.set({textAlign:$[24]});this._lastValidYear=1970;this._yearTextField.addEventListener($[2],this._onTextFieldMouseDown,this);this.add(this._yearTextField);this._spinner=new qx.ui.form.Spinner();this._spinner.set({wrap:true,border:null,backgroundColor:null});this._spinner.setMin(1);this._spinner.setMax(12);this._spinner.setValue(this._monthInt);this._spinner.addEventListener($[79],this._onSpinnerChange,this);this._spinner._textfield.setTabIndex(null);this._spinner._textfield.setFocused=function(){};this._spinner._textfield.setVisibility(false);this._spinner._upbutton.setAppearance($[426]);this._spinner._downbutton.setAppearance($[451]);this._spinner.removeEventListener($[12],this._spinner._onkeypress,this._spinner);this._spinner.removeEventListener($[23],this._spinner._onkeydown,this._spinner);this._spinner.removeEventListener($[60],this._spinner._onkeyup,this._spinner);this._spinner.removeEventListener($[55],this._spinner._onmousewheel,this._spinner);this._spinner.setVisibility(!this._drop_down);this.add(this._spinner);this._dropped=false;this._dropDownButton=null;this._calendar=null;if(this._drop_down){var a=qx.ui.core.ClientDocument.getInstance();a.addEventListener($[243],this._onWindowBlur,this);this.addEventListener($[31],this._onAppear,this);this.addEventListener($[198],this._onChangeVisibility,this);this.addEventListener($[2],this._onMouseDown,this);this.addEventListener($[29],this._onMouseClick,this);this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[14],this._onMouseOut,this);this._dropDownButton=new qx.ui.form.Button();this._dropDownButton.setAppearance("datetime-drop-down-button");this._dropDownButton.setTabIndex(null);this._dropDownButton.setAllowStretchY(true);this.add(this._dropDownButton);org.eclipse.swt.widgets.Calendar.MONTH_NAMES=e;org.eclipse.swt.widgets.Calendar.WEEKDAY_NAMES=d;this._calendar=new org.eclipse.swt.widgets.Calendar();this._calendar.setAppearance("datetime-drop-down-calendar");this._calendar.setDate(new Date(70,0,1));this._calendar.setTabIndex(null);this._calendar.setVisibility(false);this._calendar._lastYearBt.setToolTip(null);this._calendar._lastMonthBt.setToolTip(null);this._calendar._nextMonthBt.setToolTip(null);this._calendar._nextYearBt.setToolTip(null)}this._focusedTextField=this._monthTextField;this._setWeekday()},destruct:function(){this.removeEventListener($[83],this._rwt_onChangeFont,this);this.removeEventListener($[12],this._onKeyPress,this);this.removeEventListener($[60],this._onKeyUp,this);this.removeEventListener($[55],this._onMouseWheel,this);this.removeEventListener($[41],this._onContextMenu,this);this.removeEventListener($[66],this._onFocusIn,this);this.removeEventListener("blur",this._onFocusOut,this);this._monthTextField.removeEventListener($[2],this._onTextFieldMouseDown,this);this._dayTextField.removeEventListener($[2],this._onTextFieldMouseDown,this);this._yearTextField.removeEventListener($[2],this._onTextFieldMouseDown,this);this._spinner.removeEventListener($[79],this._onSpinnerChange,this);this._disposeObjects("_weekdayTextField","_monthTextField","_dayTextField","_yearTextField",$[462],"_spinner","_separator0","_separator1","_separator2");if(this._drop_down){var a=qx.ui.core.ClientDocument.getInstance();a.removeEventListener($[243],this._onWindowBlur,this);this.removeEventListener($[31],this._onAppear,this);this.removeEventListener($[198],this._onChangeVisibility,this);this.removeEventListener($[2],this._onMouseDown,this);this.removeEventListener($[29],this._onMouseClick,this);this.removeEventListener($[9],this._onMouseOver,this);this.removeEventListener($[14],this._onMouseOut,this);this._dropDownButton.dispose();this._dropDownButton=null;if(!qx.core.Object.inGlobalDispose()){this._calendar.setParent(null)}this._calendar.dispose();this._calendar=null}},statics:{WEEKDAY_TEXTFIELD:0,DATE_TEXTFIELD:1,MONTH_TEXTFIELD:2,YEAR_TEXTFIELD:3,WEEKDAY_MONTH_SEPARATOR:4,MONTH_DATE_SEPARATOR:5,DATE_YEAR_SEPARATOR:6,SPINNER:7,DROP_DOWN_BUTTON:13,_isNoModifierPressed:function(a){return !a.isCtrlPressed()&&!a.isShiftPressed()&&!a.isAltPressed()&&!a.isMetaPressed()}},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]){this._weekdayTextField.addState(a);this._monthTextField.addState(a);this._dayTextField.addState(a);this._yearTextField.addState(a);this._spinner.addState(a);this._separator0.addState(a);this._separator1.addState(a);this._separator2.addState(a);if(this._drop_down){this._dropDownButton.addState(a);this._calendar.addState(a)}}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]){this._weekdayTextField.removeState(a);this._monthTextField.removeState(a);this._dayTextField.removeState(a);this._yearTextField.removeState(a);this._spinner.removeState(a);this._separator0.removeState(a);this._separator1.removeState(a);this._separator2.removeState(a);if(this._drop_down){this._dropDownButton.removeState(a);this._calendar.removeState(a)}}},_rwt_onChangeFont:function(a){var b=a.getValue();this._weekdayTextField.setFont(b);this._dayTextField.setFont(b);this._monthTextField.setFont(b);this._yearTextField.setFont(b)},_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null&&!this._dropped){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_onFocusIn:function(a){this._focusedTextField.addState($[30])},_onFocusOut:function(a){if(this._focusedTextField===this._yearTextField){this._checkAndApplyYearValue()}this._focusedTextField.removeState($[30])},_onTextFieldMouseDown:function(a){if(this._focusedTextField===this._yearTextField){this._checkAndApplyYearValue()}this._setFocusedTextField(a.getTarget())},_setFocusedTextField:function(a){var b;this._focusedTextField.removeState($[30]);this._focusedTextField=null;if(a===this._dayTextField){this._spinner.setMin(1);this._spinner.setMax(this._getDaysInMonth());b=this._removeLeadingZero(this._dayTextField.getText());this._spinner.setValue(parseInt(b),10)}else{if(a===this._monthTextField){this._spinner.setMin(1);this._spinner.setMax(12);this._spinner.setValue(this._monthInt)}else{if(a===this._yearTextField){this._spinner.setMax(9999);this._spinner.setMin(1752);this._spinner.setValue(this._lastValidYear)}}}this._focusedTextField=a;this._focusedTextField.addState($[30])},_onSpinnerChange:function(a){if(this._focusedTextField!=null){var b=this._focusedTextField.getText();if(this._focusedTextField===this._monthTextField){this._monthInt=this._spinner.getValue();if(this._medium){this._focusedTextField.setText(this._addLeadingZero(this._monthInt))}else{this._focusedTextField.setText(this._monthname[this._monthInt-1])}}else{if(this._focusedTextField===this._yearTextField){this._lastValidYear=this._spinner.getValue();this._focusedTextField.setText(""+this._spinner.getValue())}else{this._focusedTextField.setText(this._addLeadingZero(this._spinner.getValue()))}}if(this._focusedTextField==this._monthTextField||this._focusedTextField==this._yearTextField){var c=this._dayTextField.getText();if(c>this._getDaysInMonth()){this._dayTextField.setText(""+this._getDaysInMonth())}}this._setWeekday();var d=this._focusedTextField.getText();if(b!=d){this._sendChanges()}}},_onKeyPress:function(a){var d=a.getKeyIdentifier();if(this._dropped){this._calendar._onkeypress(a);if(org.eclipse.swt.widgets.DateTimeDate._isNoModifierPressed(a)){switch(d){case $[71]:case $[118]:case $[91]:case"Tab":this._toggleCalendarVisibility();break;case"Left":case $[51]:case"Up":case"Down":case $[57]:case $[58]:var b=this._calendar.getDate();this._setDate(b);this._sendChanges();a.preventDefault();a.stopPropagation();break}}else{if(a.isShiftPressed()){switch(d){case"Tab":this._toggleCalendarVisibility();break;case $[57]:case $[58]:var b=this._calendar.getDate();this._setDate(b);this._sendChanges();a.preventDefault();a.stopPropagation();break}}}}else{if(org.eclipse.swt.widgets.DateTimeDate._isNoModifierPressed(a)){switch(d){case"Left":if(this._datePattern=="MDY"){this._rollLeft(this._monthTextField,this._dayTextField,this._yearTextField)}else{if(this._datePattern=="DMY"){this._rollLeft(this._dayTextField,this._monthTextField,this._yearTextField)}else{if(this._medium){this._rollLeft(this._yearTextField,this._monthTextField,this._dayTextField)}else{this._rollLeft(this._monthTextField,this._dayTextField,this._yearTextField)}}}a.preventDefault();a.stopPropagation();break;case $[51]:if(this._datePattern=="MDY"){this._rollRight(this._monthTextField,this._dayTextField,this._yearTextField)}else{if(this._datePattern=="DMY"){this._rollRight(this._dayTextField,this._monthTextField,this._yearTextField)}else{if(this._medium){this._rollRight(this._yearTextField,this._monthTextField,this._dayTextField)}else{this._rollRight(this._monthTextField,this._dayTextField,this._yearTextField)}}}a.preventDefault();a.stopPropagation();break;case"Up":if(this._focusedTextField===this._yearTextField){this._checkAndApplyYearValue()}var c=this._spinner.getValue();if(c==this._spinner.getMax()){this._spinner.setValue(this._spinner.getMin())}else{this._spinner.setValue(c+1)}a.preventDefault();a.stopPropagation();break;case"Down":if(this._focusedTextField===this._yearTextField){this._checkAndApplyYearValue()}var c=this._spinner.getValue();if(c==this._spinner.getMin()){this._spinner.setValue(this._spinner.getMax())}else{this._spinner.setValue(c-1)}a.preventDefault();a.stopPropagation();break;case $[57]:case $[58]:case"Home":case"End":a.preventDefault();a.stopPropagation();break}}}},_rollRight:function(c,b,a){if(this._focusedTextField===this._yearTextField){this._checkAndApplyYearValue()}if(this._focusedTextField===c){if(b.isSeeable()){this._setFocusedTextField(b)}else{this._setFocusedTextField(a)}}else{if(this._focusedTextField===b){if(a.isSeeable()){this._setFocusedTextField(a)}else{this._setFocusedTextField(c)}}else{if(this._focusedTextField===a){if(c.isSeeable()){this._setFocusedTextField(c)}else{this._setFocusedTextField(b)}}}}},_rollLeft:function(c,b,a){if(this._focusedTextField===this._yearTextField){this._checkAndApplyYearValue()}if(this._focusedTextField===c){if(a.isSeeable()){this._setFocusedTextField(a)}else{this._setFocusedTextField(b)}}else{if(this._focusedTextField===b){if(c.isSeeable()){this._setFocusedTextField(c)}else{this._setFocusedTextField(a)}}else{if(this._focusedTextField===a){if(b.isSeeable()){this._setFocusedTextField(b)}else{this._setFocusedTextField(c)}}}}},_onKeyUp:function(a){if(!this._dropped){var b=a.getKeyIdentifier();var e=this._focusedTextField.getText();e=this._removeLeadingZero(e);if(org.eclipse.swt.widgets.DateTimeDate._isNoModifierPressed(a)){switch(b){case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":var d=this._focusedTextField.getUserData($[175]);if(this._focusedTextField===this._monthTextField){e=""+this._monthInt;d=2}var f=b;if(e.length<d){f=e+b}var c=parseInt(f,10);if(this._focusedTextField===this._dayTextField||this._focusedTextField===this._monthTextField){if(c>=this._spinner.getMin()&&c<=this._spinner.getMax()){this._spinner.setValue(c)}else{f=b;c=parseInt(f,10);if(c>=this._spinner.getMin()&&c<=this._spinner.getMax()){this._spinner.setValue(c)}}}else{if(this._focusedTextField==this._yearTextField){this._focusedTextField.setText(f);if(f.length==4){this._checkAndApplyYearValue()}}}a.preventDefault();a.stopPropagation();break;case"Home":var f=this._spinner.getMin();this._spinner.setValue(f);a.preventDefault();a.stopPropagation();break;case"End":var f=this._spinner.getMax();this._spinner.setValue(f);a.preventDefault();a.stopPropagation();break}}}},_onMouseWheel:function(a){if(this.getFocused()){a.preventDefault();a.stopPropagation();if(!this._dropped){this._spinner._onmousewheel(a)}}},_getDaysInMonth:function(){var a=31;var c=this._monthInt-1;var d=parseInt(this._yearTextField.getText(),10);var b=new Date();b.setYear(d);b.setMonth(c);b.setDate(31);if(b.getMonth()!=c){a=30;b.setMonth(c);b.setDate(30);if(b.getMonth()!=c){a=29;b.setMonth(c);b.setDate(29);if(b.getMonth()!=c){a=28}}}return a},_setWeekday:function(){var a=new Date();a.setDate(parseInt(this._dayTextField.getText(),10));a.setMonth(this._monthInt-1);a.setFullYear(parseInt(this._yearTextField.getText(),10));this._weekdayTextField.setText(this._weekday[a.getDay()+1])},_checkAndApplyYearValue:function(){var a=this._lastValidYear;var b=parseInt(this._yearTextField.getText(),10);if(b>=0&&b<=29){this._lastValidYear=2000+b}else{if(b>=30&&b<=99){this._lastValidYear=1900+b}else{if(b>=1752){this._lastValidYear=b}}}this._yearTextField.setText(""+a);if(a!=this._lastValidYear){this._spinner.setValue(this._lastValidYear)}},_addLeadingZero:function(a){return a<10?"0"+a:""+a},_removeLeadingZero:function(c){var a=c;if(c.length==2){var b=c.substring(0,1);if(b=="0"){a=c.substring(1)}}return a},_sendChanges:function(){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var b=c.findIdByWidget(this);a.addParameter(b+".day",this._removeLeadingZero(this._dayTextField.getText()));a.addParameter(b+".month",this._monthInt-1);a.addParameter(b+".year",this._lastValidYear);if(this._hasSelectionListener){this._requestTimer.restart()}}},_onInterval:function(){this._requestTimer.stop();var c=org.eclipse.swt.WidgetManager.getInstance();var b=c.findIdByWidget(this);var a=org.eclipse.swt.Request.getInstance();a.addEvent($[61],b);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()},setMonth:function(a){this._monthInt=a+1;if(this._medium){this._monthTextField.setText(this._addLeadingZero(this._monthInt))}else{this._monthTextField.setText(this._monthname[this._monthInt-1])}if(this._focusedTextField===this._monthTextField){this._spinner.setValue(this._monthInt)}this._setWeekday()},setDay:function(a){this._dayTextField.setText(this._addLeadingZero(a));if(this._focusedTextField===this._dayTextField){this._spinner.setValue(a)}this._setWeekday()},setYear:function(a){this._lastValidYear=a;this._yearTextField.setText(""+a);if(this._focusedTextField===this._yearTextField){this._spinner.setValue(a)}this._setWeekday()},_setDate:function(a){this.setYear(a.getFullYear());this.setMonth(a.getMonth());this.setDay(a.getDate())},setHasSelectionListener:function(a){this._hasSelectionListener=a;this._requestTimer=new qx.client.Timer(110);this._requestTimer.addEventListener($[49],this._onInterval,this)},setBounds:function(e,b,f,c,a){var d=null;switch(e){case org.eclipse.swt.widgets.DateTimeDate.WEEKDAY_TEXTFIELD:d=this._weekdayTextField;break;case org.eclipse.swt.widgets.DateTimeDate.DATE_TEXTFIELD:d=this._dayTextField;break;case org.eclipse.swt.widgets.DateTimeDate.MONTH_TEXTFIELD:d=this._monthTextField;break;case org.eclipse.swt.widgets.DateTimeDate.YEAR_TEXTFIELD:d=this._yearTextField;break;case org.eclipse.swt.widgets.DateTimeDate.WEEKDAY_MONTH_SEPARATOR:d=this._separator0;break;case org.eclipse.swt.widgets.DateTimeDate.MONTH_DATE_SEPARATOR:d=this._separator1;break;case org.eclipse.swt.widgets.DateTimeDate.DATE_YEAR_SEPARATOR:d=this._separator2;break;case org.eclipse.swt.widgets.DateTimeDate.SPINNER:d=this._spinner;break;case org.eclipse.swt.widgets.DateTimeDate.DROP_DOWN_BUTTON:d=this._dropDownButton;break}if(d!=null){d.set({left:b,top:f,width:c,height:a})}},_onAppear:function(a){if(this._calendar!=null){this.getTopLevelWidget().add(this._calendar);this._setCalendarLocation()}},_onWindowBlur:function(a){if(this._dropped){this._toggleCalendarVisibility()}},_onChangeVisibility:function(a){var b=a.getValue();if(!b&&this._dropped){this._toggleCalendarVisibility()}},_onMouseDown:function(a){var b=a.getTarget();if(b.getUserData($[213])){a.stopPropagation()}else{if(b.getUserData($[205])){a.stopPropagation()}else{if(this._dropped&&b!==this._dropDownButton){this._toggleCalendarVisibility()}}}},_onMouseClick:function(a){if(a.isLeftButtonPressed()){var c=a.getTarget();if(c.getUserData($[213])){this._calendar._onDayClicked(a);var b=this._calendar.getDate();this._setDate(b);this._toggleCalendarVisibility();this.setFocused(true);this._sendChanges()}else{if(c.getUserData($[205])){this._calendar._onNavButtonClicked(a)}else{if(c===this._dropDownButton){this._toggleCalendarVisibility()}}}}},_onMouseOver:function(a){var b=a.getTarget();if(b==this._dropDownButton){this._dropDownButton.addState("over")}else{if(b.getUserData($[213])){this._calendar._onDayMouseOver(a)}}},_onMouseOut:function(a){var b=a.getTarget();if(b==this._dropDownButton){this._dropDownButton.removeState("over")}else{if(b.getUserData($[213])){this._calendar._onDayMouseOut(a)}}},_toggleCalendarVisibility:function(){if(this._calendar!=null){this._dropped=!this._dropped;this._calendar.setVisibility(this._dropped);this.setCapture(this._dropped);if(this._dropped){this._bringToFront();this._setCalendarLocation();var c=parseInt(this._yearTextField.getText(),10);var a=parseInt(this._dayTextField.getText(),10);var b=new Date(c,this._monthInt-1,a);this._calendar.setDate(b);this._focusedTextField.removeState($[30])}else{if(this.getFocused()){this._focusedTextField.addState($[30])}}}},_setCalendarLocation:function(){if(this.getElement()&&this._calendar!=null){var b=qx.bom.element.Location.get(this.getElement());var c=qx.html.Window.getInnerHeight(window);var d=b.top+this.getHeight();var a=this._calendar.getHeightValue();if(d+a>c){d=b.top-a}this._calendar.setLocation(b.left,d)}},_bringToFront:function(){var a=this.getTopLevelWidget().getChildren();var b=this._calendar.getZIndex();for(var d in a){var c=a[d];if(c.getZIndex){if(b<c.getZIndex()){b=c.getZIndex()}}}if(b>this._calendar.getZIndex()){this._calendar.setZIndex(b+1)}}}});
+qx.Class.define($[326],{extend:qx.ui.basic.Atom,construct:function(b,a){arguments.callee.base.call(this);if(b.classname!=$[404]){throw new Error("illegal parent, must be a CTabFolder")}this._parent=b;this.setAppearance("ctab-item");this.setVerticalChildrenAlign(qx.constant.Layout.ALIGN_MIDDLE);this.setHorizontalChildrenAlign(qx.constant.Layout.ALIGN_LEFT);this.setOverflow(qx.constant.Style.OVERFLOW_HIDDEN);this.setTabIndex(null);this.setLabel($[150]);this.getLabelObject().setMode(qx.constant.Style.LABEL_MODE_HTML);this.getLabelObject().setVerticalAlign(qx.constant.Layout.ALIGN_MIDDLE);this.setLabel("");this._selected=false;this._showClose=false;this._canClose=a;this._unselectedCloseVisible=true;this.updateForeground();this.updateBackground();this.updateBackgroundImage();this.updateBackgroundGradient();this.setTabPosition(b.getTabPosition());if(b.hasState($[233])){this.addState($[233])}this._closeButton=new qx.ui.basic.Image();this._closeButton.setAppearance("ctab-close-button");this._closeButton.setWidth(20);this._closeButton.setHeight("80%");this._closeButton.addEventListener($[29],this._onClose,this);var c=org.eclipse.swt.WidgetManager.getInstance();c.setToolTip(this._closeButton,org.eclipse.swt.custom.CTabFolder.CLOSE_TOOLTIP);this.add(this._closeButton);this._updateCloseButton();this.addEventListener($[9],this._onMouseOver,this);this.addEventListener($[14],this._onMouseOut,this);this.addEventListener($[29],this._onClick,this);this.addEventListener($[62],this._onDblClick,this)},destruct:function(){this.removeEventListener($[9],this._onMouseOver,this);this.removeEventListener($[14],this._onMouseOut,this);this.removeEventListener($[29],this._onClick,this);this.removeEventListener($[62],this._onDblClick,this);this._closeButton.removeEventListener($[29],this._onClose,this);var a=org.eclipse.swt.WidgetManager.getInstance();a.setToolTip(this._closeButton,null);this._closeButton.dispose();this._closeButton=null},statics:{STATE_OVER:"over",STATE_SELECTED:$[30],IMG_CLOSE:$[461],IMG_CLOSE_HOVER:$[545]},members:{setTabPosition:function(a){if(a==="top"){this.addState($[171])}else{this.removeState($[171])}},setSelected:function(b){this._selected=b;var a=this._getPrevItem();if(a!=null){if(b){a.addState($[499])}else{a.removeState($[499])}}if(b){this.addState(org.eclipse.swt.custom.CTabItem.STATE_SELECTED)}else{this.removeState(org.eclipse.swt.custom.CTabItem.STATE_SELECTED)}this.updateForeground();this.updateBackground();this.updateBackgroundImage();this.updateBackgroundGradient();this._updateCloseButton()},_getPrevItem:function(){var a=null;var c=this._parent.getChildren();for(var b=0;b<c.length&&c[b]!=this;b++){if(c[b].classname===$[326]){a=c[b]}}return a},isSelected:function(){return this._selected},setShowClose:function(a){this._showClose=a;this._updateCloseButton()},setUnselectedCloseVisible:function(a){this._unselectedCloseVisible=a;this._updateCloseButton()},updateForeground:function(){var a=this.isSelected()?this._parent.getSelectionForeground():this._parent.getTextColor();if(a!=null){this.setTextColor(a)}else{this.resetTextColor()}},updateBackground:function(){var a=this.isSelected()?this._parent.getSelectionBackground():null;if(a!=null){this.setBackgroundColor(a)}else{this.resetBackgroundColor()}},updateBackgroundImage:function(){var a=null;if(this.isSelected()){a=this._parent.getSelectionBackgroundImage()}if(a!=null){this.setUserData($[287],a.slice(1));this.setBackgroundImage(a[0])}else{this.resetBackgroundImage()}},updateBackgroundGradient:function(){var b=null;var a=null;var c=true;var d=this._parent.getSelectionBackgroundGradient();if(this.isSelected()&&d!=null){b=d.colors;a=d.percents;c=d.vertical}var e=org.eclipse.swt.WidgetManager.getInstance();e.setBackgroundGradient(this,b,a,c)},_updateCloseButton:function(){var a=false;if(this._canClose||this._showClose){a=this.isSelected()||(this._unselectedCloseVisible&&this.hasState(org.eclipse.swt.custom.CTabItem.STATE_OVER))}this._closeButton.setVisibility(a)},_onMouseOver:function(a){this.addState(org.eclipse.swt.custom.CTabItem.STATE_OVER);if(a.getTarget()==this._closeButton){this._closeButton.addState(org.eclipse.swt.custom.CTabItem.STATE_OVER)}this._updateCloseButton()},_onMouseOut:function(a){this.removeState(org.eclipse.swt.custom.CTabItem.STATE_OVER);if(a.getTarget()==this._closeButton){this._closeButton.removeState(org.eclipse.swt.custom.CTabItem.STATE_OVER)}this._updateCloseButton()},_onClick:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){if(a.getTarget()!=this._closeButton){a.getTarget().getParent()._notifyItemClick(a.getTarget())}}},_onDblClick:function(a){if(a.getTarget()!=this._closeButton){a.getTarget().getParent()._notifyItemDblClick(a.getTarget())}},_onClose:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var b=org.eclipse.swt.Request.getInstance();var c=d.findIdByWidget(this);b.addEvent("org.eclipse.swt.events.ctabItemClosed",c);b.send()}}}});
+qx.Class.define($[404],{extend:qx.ui.layout.CanvasLayout,construct:function(){arguments.callee.base.call(this);this.setTabIndex(1);this.setHideFocus(true);this.setAppearance("ctabfolder");this.setOverflow($[17]);this._hasFolderListener=false;this._hasSelectionListener=false;this._tabPosition="top";this._tabHeight=0;this._selectionForeground=null;this._selectionBackground=null;this._selectionBackgroundImage=null;this._selectionBackgroundGradient=null;this._chevron=null;this._chevronMenu=null;this._minMaxState=$[108];this._maxButton=null;this._minButton=null;this._body=new qx.ui.layout.CanvasLayout();this._body.addState($[171]);this._body.setAppearance("ctabfolder-body");this.add(this._body);this._separator=new qx.ui.layout.CanvasLayout();this._separator.setAppearance("ctabfolder-separator");this.add(this._separator);this._frame=new qx.ui.layout.CanvasLayout();this._frame.setAppearance("ctabfolder-frame");this.add(this._frame);this._frameBorder=new org.eclipse.rwt.Border(2,$[20],"black");this.addEventListener($[56],this._updateLayout,this);this.addEventListener($[76],this._updateLayout,this);this.addEventListener($[12],this._onKeyPress,this);this.addEventListener($[41],this._onContextMenu,this)},destruct:function(){this.hideMinButton();this.hideMaxButton();this.removeEventListener($[56],this._updateLayout,this);this.removeEventListener($[76],this._updateLayout,this);this.removeEventListener($[12],this._onKeyPress,this);this.removeEventListener($[41],this._onContextMenu,this);this._disposeObjects("_frame","_separator");this._frameBorder.dispose()},statics:{BUTTON_SIZE:18,MIN_TOOLTIP:"Minimize",MAX_TOOLTIP:"Maximize",RESTORE_TOOLTIP:"Restore",CHEVRON_TOOLTIP:"Show List",CLOSE_TOOLTIP:"Close",setToolTipTexts:function(b,a,c,d,e){org.eclipse.swt.custom.CTabFolder.MIN_TOOLTIP=b;org.eclipse.swt.custom.CTabFolder.MAX_TOOLTIP=a;org.eclipse.swt.custom.CTabFolder.RESTORE_TOOLTIP=c;org.eclipse.swt.custom.CTabFolder.CHEVRON_TOOLTIP=d;org.eclipse.swt.custom.CTabFolder.CLOSE_TOOLTIP=e}},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]||a.substr(0,4)=="rwt_"){this._body.addState(a);this._frame.addState(a);this._mapItems(function(b){b.addState(a)})}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]||a.substr(0,4)=="rwt_"){this._body.removeState(a);this._frame.removeState(a);this._mapItems(function(b){b.removeState(a)})}},setTabPosition:function(a){this._tabPosition=a;this._mapItems(function(b){b.setTabPosition(a)});if(a=="top"){this._body.addState($[171])}else{this._body.removeState($[171])}this._updateLayout()},getTabPosition:function(){return this._tabPosition},setTabHeight:function(b){this._tabHeight=b;var a=this._getButtonTop();if(this._minButton!=null){this._minButton.setTop(a)}if(this._maxButton!=null){this._maxButton.setTop(a)}if(this._chevron!=null){this._chevron.setTop(a)}this._updateLayout()},_applyTextColor:function(b,a){arguments.callee.base.call(this,b,a);this._mapItems(function(c){c.updateForeground()})},_applyBackgroundColor:function(b,a){this._body.setBackgroundColor(b)},_applyBackgroundImage:function(b,a){this._body.setUserData($[287],this.getUserData($[287]));this._body.setBackgroundImage(b)},setSelectionForeground:function(a){this._selectionForeground=a;this._mapItems(function(b){b.updateForeground()})},setSelectionBackground:function(a){this._selectionBackground=a;this._mapItems(function(b){b.updateBackground()});if(a!=null&&!this.hasState($[159])){this._frame.setBorder(null);this._frameBorder.dispose();this._frameBorder=new org.eclipse.rwt.Border(2,$[20],a);this._frame.setBorder(this._frameBorder)}else{this._frame.resetBorder()}},setSelectionBackgroundImage:function(a){this._selectionBackgroundImage=a;this._mapItems(function(b){b.updateBackgroundImage()})},setSelectionBackgroundGradient:function(b,a,c){this._selectionBackgroundGradient={};this._selectionBackgroundGradient.colors=b;this._selectionBackgroundGradient.percents=a;this._selectionBackgroundGradient.vertical=c;this._mapItems(function(d){d.updateBackgroundGradient()})},setBorderVisible:function(a){if(a){this.addState($[233])}else{this.removeState($[233])}this._updateLayout()},getSelectionForeground:function(){return this._selectionForeground},getSelectionBackground:function(){return this._selectionBackground},getSelectionBackgroundImage:function(){return this._selectionBackgroundImage},getSelectionBackgroundGradient:function(){return this._selectionBackgroundGradient},_mapItems:function(c){var b=this.getChildren();for(var a=0;a<b.length;a++){if(b[a].classname===$[326]){c(b[a])}}},_getButtonTop:function(){return(this._tabHeight/2)-(org.eclipse.swt.custom.CTabFolder.BUTTON_SIZE/2)},showChevron:function(e,d,b,a){if(this._chevron==null){this._chevron=new qx.ui.form.Button();this._chevron.setAppearance("ctabfolder-drop-down-button");this._chevron.setShow(qx.constant.Style.BUTTON_SHOW_ICON);this._chevron.addEventListener($[137],this._onChevronExecute,this);var c=org.eclipse.swt.WidgetManager.getInstance();c.setToolTip(this._chevron,org.eclipse.swt.custom.CTabFolder.CHEVRON_TOOLTIP);this.add(this._chevron)}this._chevron.setTop(d);this._chevron.setLeft(e);this._chevron.setWidth(b);this._chevron.setHeight(a)},hideChevron:function(){if(this._chevron!=null){var a=org.eclipse.swt.WidgetManager.getInstance();a.setToolTip(this._chevron,null);this._chevron.removeEventListener($[137],this._onChevronExecute,this);this.remove(this._chevron);this._chevron.dispose();this._chevron=null}},setMinMaxState:function(d){this._minMaxState=d;var e="";var a="";var f="";var b="";switch(d){case"min":e=$[438];a=$[511];f=org.eclipse.swt.custom.CTabFolder.RESTORE_TOOLTIP;b=org.eclipse.swt.custom.CTabFolder.MAX_TOOLTIP;break;case"max":e=$[573];a=$[438];f=org.eclipse.swt.custom.CTabFolder.MIN_TOOLTIP;b=org.eclipse.swt.custom.CTabFolder.RESTORE_TOOLTIP;break;case $[108]:e=$[573];a=$[511];f=org.eclipse.swt.custom.CTabFolder.MIN_TOOLTIP;b=org.eclipse.swt.custom.CTabFolder.MAX_TOOLTIP;break}var c=org.eclipse.swt.WidgetManager.getInstance();if(this._minButton!=null){this._minButton.setIcon(e);c.setToolTip(this._minButton,f)}if(this._maxButton!=null){this._maxButton.setIcon(a);c.setToolTip(this._maxButton,b)}},showMaxButton:function(d,c,b,a){if(this._maxButton==null){this._maxButton=new qx.ui.form.Button();this._maxButton.setAppearance($[327]);this._maxButton.setShow(qx.constant.Style.BUTTON_SHOW_ICON);this.setMinMaxState(this._minMaxState);this._maxButton.addEventListener($[2],this._onMinMaxExecute,this);this.add(this._maxButton)}this._maxButton.setTop(c);this._maxButton.setLeft(d);this._maxButton.setWidth(b);this._maxButton.setHeight(a)},hideMaxButton:function(){if(this._maxButton!=null){this._maxButton.removeEventListener($[2],this._onMinMaxExecute,this);var a=org.eclipse.swt.WidgetManager.getInstance();a.setToolTip(this._maxButton,null);this.remove(this._maxButton);this._maxButton.dispose();this._maxButton=null}},showMinButton:function(d,c,b,a){if(this._minButton==null){this._minButton=new qx.ui.form.Button();this._minButton.setAppearance($[327]);this._minButton.setShow(qx.constant.Style.BUTTON_SHOW_ICON);this.setMinMaxState(this._minMaxState);this._minButton.addEventListener($[2],this._onMinMaxExecute,this);this.add(this._minButton)}this._minButton.setTop(c);this._minButton.setLeft(d);this._minButton.setWidth(b);this._minButton.setHeight(a)},hideMinButton:function(b){if(this._minButton!=null){this._minButton.removeEventListener($[2],this._onMinMaxExecute,this);var a=org.eclipse.swt.WidgetManager.getInstance();a.setToolTip(this._minButton,null);this.remove(this._minButton);this._minButton.dispose();this._minButton=null}},setHasFolderListener:function(a){this._hasFolderListener=a},setHasSelectionListener:function(a){this._hasSelectionListener=a},_updateLayout:function(){var c=this.hasState($[233])?1:0;var a=this.hasState($[159])?0:2;var b=1;var e=this.getWidth()-c*2;var d=this._tabHeight+1;this._body.setLeft(0);this._body.setTop(0);this._body.setWidth(this.getWidth());this._body.setHeight(this.getHeight());this._separator.setLeft(c);this._separator.setWidth(e);this._separator.setHeight(10);this._frame.setLeft(c);this._frame.setWidth(e);this._frame.setHeight(this.getHeight()-c-b-d);if(this._tabPosition=="top"){this._separator.setTop(d);this._frame.setTop(d+1)}else{this._separator.setTop(this.getHeight()-d-1);this._frame.setTop(c)}},_onChevronExecute:function(a){if(this._chevronMenu==null||!this._chevronMenu.isSeeable()){if(!org.eclipse.swt.EventUtil.getSuspended()){var c=org.eclipse.swt.WidgetManager.getInstance();var d=c.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addEvent("org.eclipse.swt.events.ctabFolderShowList",d);b.send()}}},_onMinMaxExecute:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var c;if(a.getTarget()==this._minButton){if(this._minMaxState=="min"){this.setMinMaxState($[108]);c=$[427]}else{this.setMinMaxState("min");c="org.eclipse.swt.events.ctabFolderMinimized"}}else{if(this._minMaxState==$[108]||this._minMaxState=="min"){this.setMinMaxState("max");c="org.eclipse.swt.events.ctabFolderMaximized"}else{this.setMinMaxState($[108]);c=$[427]}}var d=org.eclipse.swt.WidgetManager.getInstance().findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addParameter(d+".minimized",this._minMaxState=="min");b.addParameter(d+".maximized",this._minMaxState=="max");if(this._hasFolderListener){b.addEvent(c,d);b.send()}}},_onKeyPress:function(a){switch(a.getKeyIdentifier()){case"Left":a.stopPropagation();break;case $[51]:a.stopPropagation();break}},_onContextMenu:function(a){var b=this.getContextMenu();if(b!=null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this);b.show();a.stopPropagation()}},_notifyItemClick:function(b){if(!org.eclipse.swt.EventUtil.getSuspended()){if(!b.isSelected()){this._mapItems(function(f){f.setSelected(false)});b.setSelected(true);var e=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var d=e.findIdByWidget(this);var c=e.findIdByWidget(b);a.addParameter(d+$[470],c);a.addEvent($[61],d);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()}}},_notifyItemDblClick:function(b){if(!org.eclipse.swt.EventUtil.getSuspended()){if(this._hasSelectionListener){var e=org.eclipse.swt.WidgetManager.getInstance();var a=org.eclipse.swt.Request.getInstance();var d=e.findIdByWidget(this);var c=e.findIdByWidget(b);a.addParameter(d+$[470],c);a.addEvent($[169],d);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();a.send()}}}}});
+qx.Class.define("org.eclipse.swt.widgets.ExpandItem",{extend:qx.ui.layout.CanvasLayout,construct:function(a){arguments.callee.base.call(this);if(a.classname!=$[509]){throw new Error("illegal parent, must be a ExpandBar")}this.setAppearance("expand-item");this._expandBar=a;this._headerHeight=24;this._expanded=false;this._image=null;this._text="";this._header=new qx.ui.basic.Atom($[150],this._image,16,16);this._header.getLabelObject().setPaddingBottom(4);this._header.setAppearance("expand-item-header");this._header.addEventListener($[29],this._onClick,this);this._header.addEventListener($[9],this._onHandleMouseOver,this);this._header.addEventListener($[14],this._onHandleMouseOut,this);this._header.addEventListener($[41],this._onContextMenu,this);this._header.setHeight(this._headerHeight);this._header.setLabel(this._text);this.add(this._header);this._chevron=new qx.ui.basic.Image;this._chevron.setAppearance("expand-item-chevron-button");this._chevron.setTop((this._headerHeight-this._chevron.getHeight())/2);this._chevron.addEventListener($[29],this._onClick,this);this._chevron.addEventListener($[9],this._onHandleMouseOver,this);this._chevron.addEventListener($[14],this._onHandleMouseOut,this);this._chevron.addEventListener($[41],this._onContextMenu,this);this.add(this._chevron)},destruct:function(){this._header.removeEventListener($[29],this._onClick,this);this._header.removeEventListener($[9],this._onHandleMouseOver,this);this._header.removeEventListener($[14],this._onHandleMouseOut,this);this._header.removeEventListener($[41],this._onContextMenu,this);this._chevron.removeEventListener($[29],this._onClick,this);this._chevron.removeEventListener($[9],this._onHandleMouseOver,this);this._chevron.removeEventListener($[14],this._onHandleMouseOut,this);this._chevron.removeEventListener($[41],this._onContextMenu,this);this._disposeObjects("_header","_chevron")},statics:{STATE_EXPANDED:$[279],STATE_OVER:"over"},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]){this._header.addState(a);this._chevron.addState(a)}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]){this._header.removeState(a);this._chevron.removeState(a)}},setExpanded:function(a){this._expanded=a;if(a){this._chevron.addState(org.eclipse.swt.widgets.ExpandItem.STATE_EXPANDED);this._header.addState(org.eclipse.swt.widgets.ExpandItem.STATE_EXPANDED)}else{this._chevron.removeState(org.eclipse.swt.widgets.ExpandItem.STATE_EXPANDED);this._header.removeState(org.eclipse.swt.widgets.ExpandItem.STATE_EXPANDED)}},setImage:function(a){this._image=a;this._header.setIcon(a)},setText:function(a){this._text=a;this._header.setLabel(a)},setHeaderHeight:function(a){this._headerHeight=a;this._header.setHeight(this._headerHeight);this._chevron.setTop((this._headerHeight-this._chevron.getHeight())/2)},_onClick:function(a){if(!org.eclipse.swt.EventUtil.getSuspended()){var d=org.eclipse.swt.WidgetManager.getInstance();var b=org.eclipse.swt.Request.getInstance();var c=d.findIdByWidget(this);if(this._expanded){b.addEvent("org.eclipse.swt.events.expandItemCollapsed",c)}else{b.addEvent("org.eclipse.swt.events.expandItemExpanded",c)}b.send()}},_onContextMenu:function(a){var b=this._expandBar.getContextMenu();if(b!=null){b.setLocation(a.getPageX(),a.getPageY());b.setOpener(this._expandBar);b.show();a.stopPropagation()}},_onHandleMouseOver:function(a){this._chevron.addState(org.eclipse.swt.widgets.ExpandItem.STATE_OVER)},_onHandleMouseOut:function(a){this._chevron.removeState(org.eclipse.swt.widgets.ExpandItem.STATE_OVER)}}});
+qx.Class.define($[509],{extend:org.eclipse.swt.widgets.Scrollable,construct:function(){arguments.callee.base.call(this,new qx.ui.layout.CanvasLayout());this.setAppearance("expand-bar");this.setHideFocus(true);this._bottomSpacing=new qx.ui.layout.CanvasLayout();org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this._bottomSpacing);this._clientArea.add(this._bottomSpacing)},destruct:function(){this._disposeObjects("_bottomSpacing")},members:{addWidget:function(a){this._clientArea.add(a)},setBottomSpacingBounds:function(b,d,c,a){this._bottomSpacing.setLeft(b);this._bottomSpacing.setTop(d);this._bottomSpacing.setWidth(c);this._bottomSpacing.setHeight(a)},showVScrollbar:function(a){this.setScrollBarsVisible(false,a);if(!a){this.setVBarSelection(0)}},setVScrollbarMax:function(a){this._vertScrollBar.setMaximum(a)}}});
+qx.Class.define($[481],{extend:qx.ui.form.TextField,construct:function(a){arguments.callee.base.call(this);if(a){this._inputTag=$[174];this._inputType=null;this._inputOverflow="auto";this.setAppearance("text-area");this.setAllowStretchY(true);this.__oninput=qx.lang.Function.bindEvent(this._oninputDomTextarea,this)}},properties:{wrap:{check:$[3],init:true,apply:$[359]}},members:{_applyElement:function(b,a){arguments.callee.base.call(this,b,a);if(this._inputTag==$[174]){this._styleWrap()}this._inputElement.style.paddingRight="1px"},_applyWrap:function(b,a){if(this._inputTag==$[174]){this._styleWrap()}},_styleWrap:qx.core.Variant.select($[0],{mshtml:function(){if(this._inputElement){this._inputElement.wrap=this.getWrap()?"soft":"off"}},gecko:function(){if(this._inputElement){var b=this.getWrap()?"soft":"off";var a=this.getWrap()?"":"auto";this._inputElement.setAttribute("wrap",b);this._inputElement.style.overflow=a}},"default":function(){if(this._inputElement){var a=this.getWrap()?"soft":"off";this._inputElement.setAttribute("wrap",a)}}}),_applyMaxLength:function(b,a){if(this._inputTag!=$[174]){arguments.callee.base.call(this,b,a)}},_oninputDomTextarea:function(e){var b=this.getMaxLength();var d=true;if(b!=null){var f=this._inputElement.value;if(f.length>this.getMaxLength()){var c=this.getValue();var a=this.getSelectionStart();if(c.length==(f.length-1)){this._inputElement.value=c;this.setSelectionStart(a-1);this.setSelectionLength(0)}else{if(f.length>=c.length&&f!=c){this._inputElement.value=f.slice(0,this.getMaxLength());this.setSelectionStart(Math.min(a,this.getMaxLength()));this.setSelectionLength(0)}}if(this._inputElement.value==c){d=false}}}if(d){this._oninputDom(e)}},setPasswordMode:function(b){var a=b?"password":"text";if(this._inputTag!=$[174]&&this._inputType!=a){this._inputType=a;if(this._isCreated){if(org.eclipse.rwt.Client.getEngine()==$[18]){this._reCreateInputField()}else{this._inputElement.type=this._inputType}}}},_reCreateInputField:function(){var a=this.getSelectionStart();var b=this.getSelectionLength();this._inputElement.parentNode.removeChild(this._inputElement);this._inputElement.onpropertychange=null;this._inputElement=null;this._firstInputFixApplied=false;this._applyElement(this.getElement(),null);this._afterAppear();org.eclipse.swt.TextUtil._updateLineHeight(this);this._postApply();this._applyFocused(this.getFocused());this.setSelectionStart(a);this.setSelectionLength(b)}}});
+qx.Class.define("org.eclipse.rwt.KeyEventUtil",{type:$[33],extend:qx.core.Object,construct:function(){arguments.callee.base.call(this);org.eclipse.rwt.EventHandler.setKeyEventFilter(this._onKeyEvent,this);this._keyBindings={}},members:{cancelEvent:function(){this._getDelegate().cancelEvent()},allowEvent:function(){this._getDelegate().allowEvent()},setKeyBindings:function(a){this._keyBindings=a},_onKeyEvent:function(d,f,c,e){var a;if(this._isKeyBinding(e,f,c)){a=false;if(d===$[23]){org.eclipse.rwt.EventHandlerUtil.stopDomEvent(e);this._attachKeyDown(null,f,c,e);org.eclipse.swt.Request.getInstance().send()}}else{var b=this._getDelegate();a=!b.intercept(d,f,c,e)}return a},_getDelegate:function(){var a;if(qx.core.Variant.isSet($[0],$[40])){a=org.eclipse.rwt.AsyncKeyEventUtil.getInstance()}else{a=org.eclipse.rwt.SyncKeyEventUtil.getInstance()}return a},_isKeyBinding:function(d,e,b){var c=this._getKeyBindingIdentifier(d,e,b);var a=this._keyBindings[c]===true;return a},_getKeyBindingIdentifier:function(d,e,b){var a=[];if(d.altKey){a.push("ALT")}if(d.ctrlKey){a.push("CTRL")}if(d.shiftKey){a.push("SHIFT")}if(!isNaN(e)&&e>0){a.push(e.toString())}else{if(!isNaN(b)&&b>0){var c=String.fromCharCode(b);a.push(c.toUpperCase().charCodeAt(0))}}return a.join("+")},_isRelevantEvent:function(c,e){var a;if(qx.core.Variant.isSet($[0],$[18])){var b=org.eclipse.rwt.EventHandlerUtil;var d=b._isNonPrintableKeyCode(e)||e==27||e==8||e==9;if(d){a=c===$[23]}else{a=c===$[12]}}else{a=c===$[12]}return a},_getTargetControl:function(){var a=org.eclipse.rwt.EventHandler.getCaptureWidget();if(!a){var b=org.eclipse.rwt.EventHandler.getFocusRoot();a=b===null?null:b.getActiveChild()}var c=org.eclipse.swt.WidgetManager.getInstance();while(a!==null&&!c.isControl(a)){a=a.getParent?a.getParent():null}return a},_hasKeyListener:function(a){return a!==null&&a.getUserData("keyListener")===true},_hasTraverseListener:function(a){return a!==null&&a.getUserData("traverseListener")===true},_isTraverseKey:function(b){var a=false;if(b===27||b===13||b===9){a=true}return a},_attachKeyDown:function(d,i,h,e){var f=org.eclipse.swt.Request.getInstance();var a;if(d===null){a="w1"}else{var g=org.eclipse.swt.WidgetManager.getInstance();a=g.findIdByWidget(d)}f.addEvent("org.eclipse.swt.events.keyDown",a);f.addParameter("org.eclipse.swt.events.keyDown.keyCode",i);f.addParameter("org.eclipse.swt.events.keyDown.charCode",h);var b="";var c=org.eclipse.rwt.Client.getPlatform()==="mac"&&e.metaKey;if(e.shiftKey){b+="shift,"}if(e.ctrlKey||c){b+="ctrl,"}if(e.altKey){b+="alt,"}f.addParameter("org.eclipse.swt.events.keyDown.modifier",b)}}});
+qx.Class.define("org.eclipse.swt.widgets.Separator",{extend:qx.ui.layout.BoxLayout,construct:function(){arguments.callee.base.call(this);org.eclipse.swt.WidgetUtil.fixIEBoxHeight(this);this._line=new qx.ui.layout.CanvasLayout();this._line.setAnonymous(true);this._line.setAppearance("separator-line");this.add(this._line)},properties:{appearance:{refine:true,init:"separator"}},destruct:function(){this._line.dispose();this._line=null},members:{addState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]){this._line.addState(a)}},removeState:function(a){arguments.callee.base.call(this,a);if(a.substr(0,8)==$[53]){this._line.removeState(a)}},setLineStyle:function(a){this._line.addState(a)},setLineOrientation:function(a){if(a==$[47]){this.setHorizontalChildrenAlign($[37]);this._line.setHeight("100%");this._line.addState($[308])}else{this.setVerticalChildrenAlign($[32]);this._line.setWidth("100%");this._line.removeState($[308])}}}});
+qx.Theme.define("org.eclipse.swt.theme.AppearancesBase",{title:"Appearances Base Theme",appearances:{empty:{},widget:{},image:{},"cursor-dnd-move":{style:function(a){return{source:"widget/cursors/move.gif"}}},"cursor-dnd-copy":{style:function(a){return{source:"widget/cursors/copy.gif"}}},"cursor-dnd-alias":{style:function(a){return{source:"widget/cursors/alias.gif"}}},"cursor-dnd-nodrop":{style:function(a){return{source:"widget/cursors/nodrop.gif"}}},"client-document":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{font:b.getCssFont("*","font"),textColor:"black",backgroundColor:"white"}}},"client-document-blocker":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={cursor:$[38],animation:c.getCssAnimation($[314],$[187]),backgroundColor:c.getCssColor($[314],$[5]),backgroundImage:c.getCssImage($[314],$[1]),opacity:c.getCssFloat($[314],$[43])};if(a.backgroundImage==null&&a.backgroundColor==$[8]){a.backgroundImage=$[351]}return a}},atom:{style:function(a){return{cursor:$[38],spacing:4,width:"auto",height:"auto",horizontalChildrenAlign:$[37],verticalChildrenAlign:$[32]}}},label:{},"label-graytext":{style:function(a){}},"label-wrapper":{style:function(c){var b={};var e=new org.eclipse.swt.theme.ThemeValues(c);b.font=e.getCssFont($[74],"font");var d=e.getCssIdentifier($[74],$[324]);if(d!=null&&d!="none"){var a=new qx.ui.core.Font();a.setSize(b.font.getSize());a.setFamily(b.font.getFamily());a.setBold(b.font.getBold());a.setItalic(b.font.getItalic());a.setDecoration(d);b.font=a}b.textColor=e.getCssColor($[74],$[6]);b.backgroundColor=e.getCssColor($[74],$[5]);b.backgroundImage=e.getCssImage($[74],$[1]);b.backgroundGradient=e.getCssGradient($[74],$[1]);b.border=e.getCssBorder($[74],$[4]);b.cursor=e.getCssCursor($[74],$[34]);b.opacity=e.getCssFloat($[74],$[43]);return b}},clabel:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.textColor=c.getCssColor($[117],$[6]);a.backgroundColor=c.getCssColor($[117],$[5]);a.font=c.getCssFont($[117],"font");if(b.rwt_SHADOW_IN){a.border=c.getCssNamedBorder($[361])}else{if(b.rwt_SHADOW_OUT){a.border=c.getCssNamedBorder($[383])}else{a.border=c.getCssBorder($[117],$[4])}}a.backgroundImage=c.getCssImage($[117],$[1]);a.backgroundGradient=c.getCssGradient($[117],$[1]);a.cursor=c.getCssCursor($[117],$[34]);a.padding=c.getCssBoxDimensions($[117],$[36]);a.spacing=c.getCssDimension($[117],$[110]);a.opacity=c.getCssFloat($[117],$[43]);return a}},htmlcontainer:{include:$[85]},popup:{},"widget-tool-tip":{include:"popup",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[99],$[4]);a.animation=c.getCssAnimation($[99],$[187]);a.padding=c.getCssBoxDimensions($[99],$[36]);a.textColor=c.getCssColor($[99],$[6]);a.font=c.getCssFont($[99],"font");a.backgroundColor=c.getCssColor($[99],$[5]);a.backgroundImage=c.getCssImage($[99],$[1]);a.backgroundGradient=c.getCssGradient($[99],$[1]);a.opacity=c.getCssFloat($[99],$[43]);a.shadow=c.getCssShadow($[99],$[158]);return a}},"tool-tip":{include:"popup",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.width="auto";a.height="auto";a.minWidth=36;a.minHeight=36;a.cursor=c.getCssCursor($[102],$[34]);a.font=c.getCssFont($[102],"font");a.textColor=c.getCssColor($[102],$[6]);a.padding=c.getCssBoxDimensions($[102],$[36]);a.border=c.getCssBorder($[102],$[4]);a.backgroundColor=c.getCssColor($[102],$[5]);a.backgroundImage=c.getCssImage($[102],$[1]);a.backgroundGradient=c.getCssGradient($[102],$[1]);a.animation=c.getCssAnimation($[102],$[187]);a.opacity=c.getCssFloat($[102],$[43]);a.shadow=c.getCssShadow($[102],$[158]);return a}},"tool-tip-image":{include:$[35],style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{source:b.getCssImage("ToolTip-Image",$[1])}}},"tool-tip-text":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={font:c.getCssFont($[537],"font"),textColor:c.getCssColor($[537],$[6])};return a}},"tool-tip-message":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={font:c.getCssFont($[357],"font"),textColor:c.getCssColor($[357],$[6])};return a}},iframe:{style:function(a){return{}}},button:{include:"atom",style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.font=c.getCssFont($[16],"font");a.textColor=c.getCssColor($[16],$[6]);a.backgroundColor=c.getCssColor($[16],$[5]);a.backgroundImage=c.getCssImage($[16],$[1]);a.backgroundGradient=c.getCssGradient($[16],$[1]);a.border=c.getCssBorder($[16],$[4]);a.spacing=c.getCssDimension($[16],$[110]);a.padding=c.getCssBoxDimensions($[16],$[36]);a.cursor=c.getCssCursor($[16],$[34]);a.opacity=c.getCssFloat($[16],$[43]);return a}},"push-button":{include:"button",style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.animation=c.getCssAnimation($[16],$[187]);return a}},"check-box":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssBorder($[16],$[4]),font:b.getCssFont($[16],"font"),textColor:b.getCssColor($[16],$[6]),backgroundColor:b.getCssColor($[16],$[5]),backgroundImage:b.getCssImage($[16],$[1]),backgroundGradient:b.getCssGradient($[16],$[1]),spacing:b.getCssDimension($[16],$[110]),padding:b.getCssBoxDimensions($[16],$[36]),selectionIndicator:b.getCssSizedImage("Button-CheckIcon",$[1]),cursor:b.getCssCursor($[16],$[34]),opacity:b.getCssFloat($[16],$[43])}}},"radio-button":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssBorder($[16],$[4]),font:b.getCssFont($[16],"font"),textColor:b.getCssColor($[16],$[6]),backgroundColor:b.getCssColor($[16],$[5]),backgroundImage:b.getCssImage($[16],$[1]),backgroundGradient:b.getCssGradient($[16],$[1]),spacing:b.getCssDimension($[16],$[110]),padding:b.getCssBoxDimensions($[16],$[36]),selectionIndicator:b.getCssSizedImage("Button-RadioIcon",$[1]),cursor:b.getCssCursor($[16],$[34]),opacity:b.getCssFloat($[16],$[43])}}},toolbar:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{font:b.getCssFont("*","font"),overflow:$[17],border:b.getCssBorder($[190],$[4]),textColor:b.getCssColor($[190],$[6]),backgroundColor:b.getCssColor($[190],$[5]),backgroundGradient:b.getCssGradient($[190],$[1]),backgroundImage:b.getCssImage($[190],$[1]),opacity:b.getCssFloat($[190],$[43])}}},"toolbar-separator":{style:function(a){return{}}},"toolbar-separator-line":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a=null;if(b.vertical){a={left:2,height:2,right:2,border:c.getCssNamedBorder($[413])}}else{a={top:2,width:2,bottom:2,border:c.getCssNamedBorder("horizontalDivider")}}return a}},"toolbar-button":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={cursor:$[38],overflow:$[17],width:"auto",verticalChildrenAlign:$[32]};a.spacing=c.getCssDimension($[134],$[110]);a.animation=c.getCssAnimation($[134],$[187]);a.textColor=c.getCssColor($[134],$[6]);a.backgroundColor=c.getCssColor($[134],$[5]);a.opacity=c.getCssFloat($[134],$[43]);a.backgroundImage=c.getCssImage($[134],$[1]);a.backgroundGradient=c.getCssGradient($[134],$[1]);a.border=c.getCssBorder($[134],$[4]);a.padding=c.getCssBoxDimensions($[134],$[36]);a.horizontalChildrenAlign=b.rwt_VERTICAL?"left":$[37];if(b.dropDown){a.dropDownArrow=c.getCssSizedImage($[435],$[1]);a.separatorBorder=c.getCssBorder($[435],$[4])}else{a.dropDownArrow=null;a.separatorBorder=null}return a}},window:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.backgroundColor=c.getCssColor("Shell",$[5]);a.backgroundImage=c.getCssImage("Shell",$[1]);a.backgroundGradient=c.getCssGradient("Shell",$[1]);a.border=c.getCssBorder("Shell",$[4]);a.minWidth=b.rwt_TITLE?80:5;a.minHeight=b.rwt_TITLE?25:5;a.opacity=c.getCssFloat("Shell",$[43]);a.shadow=c.getCssShadow("Shell",$[158]);return a}},"window-captionbar":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={verticalChildrenAlign:$[32]};a.margin=c.getCssBoxDimensions($[127],$[96]);a.padding=c.getCssBoxDimensions($[127],$[36]);a.textColor=c.getCssColor($[127],$[6]);a.backgroundColor=c.getCssColor($[127],$[5]);a.backgroundImage=c.getCssImage($[127],$[1]);a.backgroundGradient=c.getCssGradient($[127],$[1]);a.border=c.getCssBorder($[127],$[4]);if(b.rwt_TITLE){a.minHeight=c.getCssDimension($[127],$[39])}else{a.minHeight=0}a.maxHeight=a.minHeight;return a}},"window-resize-frame":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssNamedBorder($[27])}}},"window-captionbar-icon":{style:function(a){return{marginRight:2}}},"window-captionbar-title":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{cursor:$[38],font:b.getCssFont($[127],"font"),marginRight:2}}},"window-captionbar-minimize-button":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.icon=c.getCssImage($[493],$[1]);a.margin=c.getCssBoxDimensions($[493],$[96]);return a}},"window-captionbar-maximize-button":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.icon=c.getCssImage($[516],$[1]);a.margin=c.getCssBoxDimensions($[516],$[96]);return a}},"window-captionbar-restore-button":{include:$[469]},"window-captionbar-close-button":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.icon=c.getCssImage($[444],$[1]);a.margin=c.getCssBoxDimensions($[444],$[96]);return a}},"window-statusbar":{style:function(a){return{}}},"window-statusbar-text":{style:function(a){return{}}},resizer:{style:function(a){return{}}},"resizer-frame":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssNamedBorder($[27])}}},menu:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{width:"auto",height:"auto",textColor:b.getCssColor("Menu",$[6]),backgroundColor:b.getCssColor("Menu",$[5]),backgroundImage:b.getCssImage("Menu",$[1]),animation:b.getCssAnimation("Menu",$[187]),font:b.getCssFont("Menu","font"),overflow:$[17],border:b.getCssBorder("Menu",$[4]),padding:b.getCssBoxDimensions("Menu",$[36]),opacity:b.getCssFloat("Menu",$[43]),shadow:b.getCssShadow("Menu",$[158])}}},"menu-item":{style:function(c){var e=new org.eclipse.swt.theme.ThemeValues(c);var b={spacing:2,padding:[2,4],backgroundImage:e.getCssImage($[250],$[1]),backgroundGradient:e.getCssGradient($[250],$[1]),backgroundColor:e.getCssColor($[250],$[5]),height:c.bar?"100%":"auto",opacity:e.getCssFloat($[250],$[43])};b.textColor=e.getCssColor($[250],$[6]);if(c.cascade){b.arrow=e.getCssSizedImage("MenuItem-CascadeIcon",$[1])}else{b.arrow=null}if(c.selected){if(c.check){b.selectionIndicator=e.getCssSizedImage($[443],$[1])}else{if(c.radio){b.selectionIndicator=e.getCssSizedImage($[529],$[1])}}}else{if(c.radio){var a=e.getCssSizedImage($[529],$[1])[1];b.selectionIndicator=[null,a,0]}else{if(c.check){var d=e.getCssSizedImage($[443],$[1])[1];b.selectionIndicator=[null,d,0]}else{b.selectionIndicator=null}}}return b}},"menu-separator":{style:function(a){return{height:"auto",marginTop:3,marginBottom:2,paddingLeft:3,paddingRight:3}}},"menu-separator-line":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{right:0,left:0,height:0,border:b.getCssNamedBorder($[413])}}},list:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.cursor=$[38];a.overflow=$[17];a.font=c.getCssFont("List","font");a.textColor=c.getCssColor("List",$[6]);a.backgroundColor=c.getCssColor("List",$[5]);a.border=c.getCssBorder("List",$[4]);return a}},"list-item":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={height:"auto",horizontalChildrenAlign:"left",verticalChildrenAlign:$[32],spacing:4,padding:[3,5],minWidth:"auto"};a.textColor=c.getCssColor($[293],$[6]);a.backgroundColor=c.getCssColor($[293],$[5]);a.backgroundImage=c.getCssImage($[293],$[1]);a.backgroundGradient=c.getCssGradient($[293],$[1]);return a}},"text-field":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.font=c.getCssFont("Text","font");a.textColor=c.getCssColor("Text",$[6]);a.backgroundColor=c.getCssColor("Text",$[5]);a.backgroundImage=c.getCssImage("Text",$[1]);a.backgroundGradient=c.getCssGradient("Text",$[1]);a.border=c.getCssBorder("Text",$[4]);var d=c.getCssBoxDimensions("Text",$[36]);a.paddingRight=d[1];a.paddingLeft=d[3];return a}},"text-field-message":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.font=c.getCssFont("Text","font");a.textColor=c.getCssColor("Text-Message",$[6]);var d=c.getCssBoxDimensions("Text",$[36]);a.paddingRight=d[1];a.paddingLeft=d[3];a.horizontalChildrenAlign="left";return a}},"text-area":{include:"text-field",style:function(a){return{padding:[0,0,0,3]}}},combo:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[141],$[4]);a.backgroundColor=c.getCssColor($[141],$[5]);a.backgroundGradient=c.getCssGradient($[141],$[1]);a.textColor=c.getCssColor($[141],$[6]);a.font=c.getCssFont($[141],"font");return a}},"combo-list":{include:"list",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder("Combo-List",$[4]);a.textColor=c.getCssColor($[141],$[6]);a.font=c.getCssFont("*","font");a.backgroundColor=c.getCssColor($[141],$[5]);a.shadow=c.getCssShadow("Combo-List",$[158]);return a}},"combo-field":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.font=c.getCssFont("*","font");var d=c.getCssBoxDimensions("Combo-Field",$[36]);a.paddingRight=d[1];a.paddingLeft=d[3];a.width=null;a.height=null;a.left=0;a.right=c.getCssDimension($[147],$[19]);a.top=0;a.bottom=0;a.textColor=c.getCssColor($[141],$[6]);return a}},"combo-button":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[147],$[4]);a.width=c.getCssDimension($[147],$[19]);a.height=null;a.top=0;a.bottom=0;a.right=0;a.icon=c.getCssImage("Combo-Button-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssImage($[147],$[1])}else{a.backgroundImage=c.getCssImage($[147],$[1])}a.backgroundGradient=c.getCssGradient($[147],$[1]);a.backgroundColor=c.getCssColor($[147],$[5]);a.cursor=c.getCssCursor($[147],$[34]);return a}},ccombo:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[135],$[4]);a.backgroundColor=c.getCssColor($[135],$[5]);a.backgroundGradient=c.getCssGradient($[135],$[1]);a.textColor=c.getCssColor($[135],$[6]);a.font=c.getCssFont($[135],"font");return a}},"ccombo-list":{include:"list",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[428],$[4]);a.textColor=c.getCssColor($[135],$[6]);a.font=c.getCssFont("*","font");a.backgroundColor=c.getCssColor($[135],$[5]);a.shadow=c.getCssShadow($[428],$[158]);return a}},"ccombo-field":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.font=c.getCssFont("*","font");var d=c.getCssBoxDimensions("CCombo-Field",$[36]);a.paddingRight=d[1];a.paddingLeft=d[3];a.width=null;a.height=null;a.left=0;a.right=c.getCssDimension($[146],$[19]);a.top=0;a.bottom=0;a.textColor=c.getCssColor($[135],$[6]);return a}},"ccombo-button":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[146],$[4]);a.width=c.getCssDimension($[146],$[19]);a.height=null;a.top=0;a.bottom=0;a.right=0;a.icon=c.getCssImage("CCombo-Button-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssImage($[146],$[1])}else{a.backgroundImage=c.getCssImage($[146],$[1])}a.backgroundGradient=c.getCssGradient($[146],$[1]);a.backgroundColor=c.getCssColor($[146],$[5]);a.cursor=c.getCssCursor($[146],$[34]);return a}},tree:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{backgroundColor:b.getCssColor("Tree",$[5]),textColor:b.getCssColor("Tree",$[6]),font:b.getCssFont("*","font"),border:b.getCssBorder("Tree",$[4])}}},"tree-row":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.itemBackground=c.getCssColor($[390],$[5]);a.itemForeground=c.getCssColor($[390],$[6]);a.textDecoration=c.getCssIdentifier($[390],$[324]);return a}},"tree-check-box":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{backgroundImage:b.getCssImage("Tree-Checkbox",$[1])}}},"tree-indent":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{backgroundImage:b.getCssImage("Tree-Indent",$[1])}}},"tree-column":{style:function(i){var a=new org.eclipse.swt.theme.ThemeValues(i);var j={};j.cursor=$[38];j.spacing=2;j.textColor=a.getCssColor($[153],$[6]);j.font=a.getCssFont($[153],"font");j.backgroundColor=a.getCssColor($[153],$[5]);j.backgroundImage=a.getCssImage($[153],$[1]);j.backgroundGradient=a.getCssGradient($[153],$[1]);j.opacity=i.moving?0.6:1;j.padding=a.getCssBoxDimensions($[153],$[36]);var d=[null,null,null,null];var h=[0,0,0,0];var b=[$[20],$[20],$[20],$[20]];if(!i.dummy){var f={vertical:true};var e=new org.eclipse.swt.theme.ThemeValues(f);var g=e.getCssColor($[452],$[6]);g=g==$[8]?$[155]:g;d[1]=g;h[1]=1}var c=a.getCssBorder($[153],$[540]);h[2]=c.getWidthBottom();b[2]=c.getStyleBottom();d[2]=c.getColorBottom();j.border=new org.eclipse.rwt.Border(h,b,d);return j}},"tree-column-resizer":{style:function(a){return{backgroundColor:"#d6d5d9",width:3}}},"tree-column-sort-indicator":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.source=c.getCssImage("TreeColumn-SortIndicator",$[1]);return a}},"tab-view":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.textColor=c.getCssColor("*",$[6]);a.font=c.getCssFont("*","font");a.spacing=-1;a.border=c.getCssBorder("*",$[4]);return a}},"tab-view-bar":{style:function(a){return{height:"auto"}}},"tab-view-pane":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.overflow=$[17];a.backgroundColor=c.getCssColor("*",$[5]);a.border=new org.eclipse.rwt.Border(1,$[20],c.getCssNamedColor($[379]));a.padding=10;return a}},"tab-view-page":{},"tab-view-button":{include:"atom",style:function(c){var b={};var e=new org.eclipse.swt.theme.ThemeValues(c);var h=e.getCssNamedColor($[379]);var f=e.getCssColor($[217],"border-top-color");var g=e.getCssColor($[217],"border-bottom-color");var a=[f,h,h,h];var d=[h,h,g,h];if(c.checked){b.zIndex=1;b.padding=[2,8,4,7];if(c.barTop){b.border=new org.eclipse.rwt.Border([3,1,0,1],$[20],a)}else{b.border=new org.eclipse.rwt.Border([0,1,3,1],$[20],d)}b.margin=[0,-1,0,-2];if(c.alignLeft){if(c.firstChild){b.paddingLeft=6;b.paddingRight=7;b.marginLeft=0}}else{if(c.lastChild){b.paddingLeft=8;b.paddingRight=5;b.marginRight=0}}}else{b.zIndex=0;b.padding=[2,6,2,5];b.marginRight=1;b.marginLeft=0;if(c.alignLeft){if(c.firstChild){b.paddingLeft=6;b.paddingRight=5}}else{if(c.lastChild){b.paddingLeft=6;b.paddingRight=5;b.marginRight=0}}if(c.barTop){b.border=new org.eclipse.rwt.Border([1,1,0,1],$[20],h);b.marginTop=3;b.marginBottom=1}else{b.border=new org.eclipse.rwt.Border([0,1,1,1],$[20],h);b.marginTop=1;b.marginBottom=3}}b.backgroundColor=e.getCssColor($[217],$[5]);b.backgroundImage=e.getCssImage($[217],$[1]);b.backgroundGradient=e.getCssGradient($[217],$[1]);return b}},"group-box":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{backgroundColor:b.getCssColor("Group",$[5]),border:b.getCssBorder("Group",$[4]),font:b.getCssFont("Group","font"),textColor:b.getCssColor("Group",$[6])}}},"group-box-legend":{include:"atom",style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{top:0,left:0,border:b.getCssBorder($[193],$[4]),padding:b.getCssBoxDimensions($[193],$[36]),margin:b.getCssBoxDimensions($[193],$[96]),backgroundColor:b.getCssColor($[193],$[5]),font:b.getCssFont("Group","font"),textColor:b.getCssColor($[193],$[6])}}},"group-box-frame":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);var c=b.getCssBoxDimensions($[536],$[96]);return{top:c[0],right:c[1],bottom:c[2],left:c[3],border:b.getCssBorder($[536],$[4])}}},spinner:{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.font=c.getCssFont($[218],"font");a.textColor=c.getCssColor($[218],$[6]);a.backgroundColor=c.getCssColor($[218],$[5]);a.border=c.getCssBorder($[218],$[4]);a.backgroundGradient=c.getCssGradient($[218],$[1]);return a}},"spinner-text-field":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);var d=c.getCssBoxDimensions("Spinner-Field",$[36]);a.paddingRight=d[1];a.paddingLeft=d[3];a.top=0;a.left=0;a.right=0;a.bottom=0;return a}},"spinner-button-up":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.width=c.getCssDimension($[154],$[19]);a.icon=c.getCssImage("Spinner-UpButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssImage($[154],$[1])}else{a.backgroundImage=c.getCssImage($[154],$[1])}a.backgroundGradient=c.getCssGradient($[154],$[1]);a.border=c.getCssBorder($[154],$[4]);a.backgroundColor=c.getCssColor($[154],$[5]);a.cursor=c.getCssCursor($[154],$[34]);return a}},"spinner-button-down":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.width=c.getCssDimension($[156],$[19]);a.icon=c.getCssImage("Spinner-DownButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssImage($[156],$[1])}else{a.backgroundImage=c.getCssImage($[156],$[1])}a.backgroundGradient=c.getCssGradient($[156],$[1]);a.border=c.getCssBorder($[156],$[4]);a.backgroundColor=c.getCssColor($[156],$[5]);a.cursor=c.getCssCursor($[156],$[34]);return a}},table:{style:function(b){var d=new org.eclipse.swt.theme.ThemeValues(b);var c=d.getCssDimension($[196],$[19]);var f=d.getCssSizedImage($[196],$[1]);var a=d.getCssBoxDimensions($[196],$[96]);if(a.join()!=="0,0,0,0"){c=f[1]+a[1]+a[3]}var e=f[2]+a[0]+a[2];return{textColor:d.getCssColor("Table",$[6]),font:d.getCssFont("*","font"),border:d.getCssBorder("Table",$[4]),checkWidth:c,checkHeight:e}}},"table-client-area":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={backgroundColor:c.getCssColor("Table",$[5]),backgroundImage:c.getCssImage("Table",$[1]),backgroundGradient:c.getCssGradient("Table",$[1])};return a}},"table-column":{style:function(i){var a=new org.eclipse.swt.theme.ThemeValues(i);var j={cursor:$[38],spacing:2,opacity:i.moving?0.6:1};j.padding=a.getCssBoxDimensions($[168],$[36]);j.textColor=a.getCssColor($[168],$[6]);j.font=a.getCssFont($[168],"font");j.backgroundColor=a.getCssColor($[168],$[5]);j.backgroundImage=a.getCssImage($[168],$[1]);j.backgroundGradient=a.getCssGradient($[168],$[1]);var d=[null,null,null,null];var h=[0,0,0,0];var b=[$[20],$[20],$[20],$[20]];if(!i.dummy){var f={vertical:true};var e=new org.eclipse.swt.theme.ThemeValues(f);var g=e.getCssColor($[368],$[6]);g=g==$[8]?$[155]:g;d[1]=g;h[1]=1}var c=a.getCssBorder($[168],$[540]);h[2]=c.getWidthBottom();b[2]=c.getStyleBottom();d[2]=c.getColorBottom();j.border=new org.eclipse.rwt.Border(h,b,d);return j}},"table-column-resizer":{style:function(a){return{width:3,opacity:0.3,backgroundColor:"black"}}},"table-column-sort-indicator":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.source=c.getCssImage("TableColumn-SortIndicator",$[1]);return a}},"table-row":{style:function(d){var e=new org.eclipse.swt.theme.ThemeValues(d);var a={cursor:$[38]};if(d.linesvisible){var c={horizontal:true};var b=new org.eclipse.swt.theme.ThemeValues(c);var f=b.getCssColor($[368],$[6]);f=f==$[8]?$[155]:f;a.border=new org.eclipse.rwt.Border([0,0,1,0],$[20],f)}else{a.border=$[8]}a.textColor=e.getCssColor($[240],$[6]);if(a.textColor==$[8]){a.textColor=$[125]}a.backgroundColor=e.getCssColor($[240],$[5]);a.textDecoration=e.getCssIdentifier($[240],$[324]);return a}},"table-check-box":{include:$[35],style:function(c){var e=new org.eclipse.swt.theme.ThemeValues(c);var b={};var d=e.getCssDimension($[196],$[19]);var f=e.getCssSizedImage($[196],$[1]);var a=e.getCssBoxDimensions($[196],$[96]);if(a.join()!=="0,0,0,0"){b.paddingLeft=a[3]}else{b.paddingLeft=Math.max(0,(d-f[1])/2)}b.paddingTop=a[0];b.source=f[0];return b}},"table-gridline-vertical":{style:function(b){var e={vertical:true};var c=new org.eclipse.swt.theme.ThemeValues(e);var d=c.getCssColor($[368],$[6]);d=d==$[8]?$[155]:d;var a={};a.border=new org.eclipse.rwt.Border([0,0,0,1],$[20],d);return a}},sash:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{backgroundColor:b.getCssColor("Sash",$[5]),backgroundImage:b.getCssImage("Sash",$[1]),border:b.getCssBorder("Sash",$[4]),cursor:a.disabled?$[8]:a.horizontal?$[322]:$[369]}}},"sash-slider":{style:function(a){return{zIndex:10000000,opacity:0.3,backgroundColor:"black"}}},"sash-handle":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.backgroundImage=c.getCssImage($[475],$[1]);a.backgroundGradient=c.getCssGradient($[475],$[1]);a.backgroundRepeat=$[378];return a}},ctabfolder:{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.font=c.getCssFont($[116],"font");a.textColor=c.getCssColor($[116],$[6]);return a}},"ctabfolder-body":{style:function(d){var a={};var e=new org.eclipse.swt.theme.ThemeValues(d);a.backgroundColor=e.getCssColor($[116],$[5]);var c=e.getCssColor($[184],$[284]);var g=e.getCssBoxDimensions($[184],$[391]);var b=d.rwt_BORDER?1:0;if(g[0]>0||g[1]>0||g[2]>0||g[3]>0){var f;if(d.barTop){f=[g[0],g[1],0,0]}else{f=[0,0,g[2],g[3]]}a.border=new org.eclipse.rwt.Border(b,$[120],c,f)}else{a.border=new org.eclipse.rwt.Border(b,$[20],c)}return a}},"ctabfolder-frame":{style:function(d){var b={};if(!d.rwt_FLAT){var a={selected:true};for(property in d){a[property]=d[property]}var e=new org.eclipse.swt.theme.ThemeValues(a);var c=e.getCssColor($[116],$[5]);b.border=new org.eclipse.rwt.Border(2,$[20],c)}else{b.border=$[8]}b.backgroundColor=$[8];return b}},"ctabfolder-separator":{style:function(c){var a={};var e=new org.eclipse.swt.theme.ThemeValues(c);var b=e.getCssColor($[184],$[284]);var d;if(c.barTop){d=new org.eclipse.rwt.Border([0,0,1,0],$[20],b)}else{d=new org.eclipse.rwt.Border([1,0,0,0],$[20],b)}a.border=d;return a}},"ctab-item":{style:function(d){var b={};var e=new org.eclipse.swt.theme.ThemeValues(d);b.cursor=$[38];var g=e.getCssBoxDimensions($[116],$[36]);b.paddingLeft=g[3];b.paddingRight=g[1];b.spacing=e.getCssDimension($[116],$[110]);b.textColor=e.getCssColor($[116],$[6]);var c=e.getCssColor($[184],$[284]);var h=e.getCssBoxDimensions($[184],$[391]).slice(0);if(d.barTop){h[2]=0;h[3]=0}else{h[0]=0;h[1]=0}var a=h[0]>0||h[1]>0||h[2]>0||h[3]>0;var f=[0,0,0,0];if(!d.nextSelected){f[1]=1}if(d.selected){f[3]=1;if(d.barTop){f[0]=1}else{f[2]=1}}if(d.firstItem&&d.rwt_BORDER&&!a){f[3]=1}if(a&&d.selected){b.border=new org.eclipse.rwt.Border(f,$[120],c,h);b.containerOverflow=false}else{b.border=new org.eclipse.rwt.Border(f,$[20],c)}if(d.selected){b.backgroundColor=e.getCssColor($[116],$[5]);b.backgroundImage=e.getCssImage($[116],$[1]);b.backgroundGradient=e.getCssGradient($[116],$[1])}else{b.backgroundColor=$[8];b.backgroundImage=null;b.backgroundGradient=null}return b}},"ctabfolder-button":{include:$[35],style:function(c){var a={};var d=new org.eclipse.swt.theme.ThemeValues(c);if(c.over){a.backgroundColor="white";var b=d.getCssColor($[184],$[284]);a.border=new org.eclipse.rwt.Border(1,$[20],b)}else{a.backgroundColor=$[8];a.border=$[8]}return a}},"ctabfolder-drop-down-button":{include:$[327],style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.icon=c.getCssImage("CTabFolder-DropDownButton-Icon",$[1]);return a}},"ctab-close-button":{include:$[35],style:function(a){return{source:a.over?$[545]:$[461]}}},composite:{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.backgroundColor=c.getCssColor($[229],$[5]);a.backgroundImage=c.getCssImage($[229],$[1]);a.backgroundGradient=c.getCssGradient($[229],$[1]);a.border=c.getCssBorder($[229],$[4]);a.opacity=c.getCssFloat($[229],$[43]);return a}},scrolledcomposite:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};if(b.rwt_BORDER){a.border=c.getCssNamedBorder($[27])}else{a.border=c.getCssBorder("*",$[4])}return a}},coolbar:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder("*",$[4]);a.backgroundGradient=c.getCssGradient("CoolBar",$[1]);a.backgroundImage=c.getCssImage("CoolBar",$[1]);return a}},coolitem:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder("*",$[4]);return a}},"coolitem-handle":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};if(b.vertical){a.height=c.getCssDimension($[338],$[19])}else{a.width=c.getCssDimension($[338],$[19])}a.border=c.getCssBorder($[338],$[4]);a.margin=[1,2,1,0];a.cursor=$[232];return a}},browser:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssBorder("Browser",$[4]),backgroundColor:"white"}}},separator:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{backgroundColor:b.getCssColor($[74],$[5]),backgroundImage:b.getCssImage($[74],$[1]),backgroundGradient:b.getCssGradient($[74],$[1]),border:b.getCssBorder($[74],$[4]),cursor:b.getCssCursor($[74],$[34]),opacity:b.getCssFloat($[74],$[43])}}},"separator-line":{style:function(b){var e=new org.eclipse.swt.theme.ThemeValues(b);var a={};if(b.rwt_VERTICAL){a.width=e.getCssDimension($[188],$[19])}else{a.height=e.getCssDimension($[188],$[19])}a.border=e.getCssBorder($[188],$[4]);var d=b.rwt_VERTICAL?$[47]:$[52];var c;if(a.border===e.getCssNamedBorder($[361])){c="separator.shadowin."+d+".border"}else{if(a.border===e.getCssNamedBorder($[383])){c="separator.shadowout."+d+".border"}}if(c){a.border=e.getCssNamedBorder(c)}a.backgroundColor=e.getCssColor($[188],$[5]);a.backgroundImage=e.getCssImage($[188],$[1]);a.backgroundGradient=e.getCssGradient($[188],$[1]);return a}},link:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{cursor:$[38],padding:2,font:b.getCssFont("Link","font"),border:b.getCssBorder("Link",$[4]),textColor:b.getCssColor("*",$[6])}}},"link-text":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{textColor:$[125]}}},progressbar:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[261],$[4]);a.backgroundColor=c.getCssColor($[261],$[5]);a.backgroundImageSized=c.getCssSizedImage($[261],$[1]);a.backgroundGradient=c.getCssGradient($[261],$[1]);a.separatorBorder=c.getCssBorder($[215],$[4]);a.indicatorColor=c.getCssColor($[215],$[5]);a.indicatorImage=c.getCssSizedImage($[215],$[1]);a.indicatorGradient=c.getCssGradient($[215],$[1]);a.indicatorOpacity=c.getCssFloat($[215],$[43]);return a}},"scrollbar-blocker":{style:function(a){return{backgroundColor:"black",opacity:0.2}}},scale:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssBorder("Scale",$[4]),font:b.getCssFont("*","font"),textColor:b.getCssColor("*",$[6]),backgroundColor:b.getCssColor("Scale",$[5])}}},"scale-line":{include:$[35],style:function(b){var a={};if(b.horizontal){a.left=org.eclipse.swt.widgets.Scale.PADDING;a.top=org.eclipse.swt.widgets.Scale.SCALE_LINE_OFFSET;a.source="widget/scale/h_line.gif"}else{a.left=org.eclipse.swt.widgets.Scale.SCALE_LINE_OFFSET;a.top=org.eclipse.swt.widgets.Scale.PADDING;a.source="widget/scale/v_line.gif"}return a}},"scale-thumb":{include:$[35],style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};if(b.horizontal){a.left=org.eclipse.swt.widgets.Scale.PADDING;a.top=org.eclipse.swt.widgets.Scale.THUMB_OFFSET;a.source="widget/scale/h_thumb.gif"}else{a.left=org.eclipse.swt.widgets.Scale.THUMB_OFFSET;a.top=org.eclipse.swt.widgets.Scale.PADDING;a.source="widget/scale/v_thumb.gif"}a.backgroundColor=c.getCssColor("Scale-Thumb",$[5]);return a}},"scale-min-marker":{include:$[35],style:function(b){var a={};if(b.horizontal){a.left=org.eclipse.swt.widgets.Scale.PADDING+org.eclipse.swt.widgets.Scale.HALF_THUMB;a.source=$[482]}else{a.top=org.eclipse.swt.widgets.Scale.PADDING+org.eclipse.swt.widgets.Scale.HALF_THUMB;a.source=$[508]}return a}},"scale-max-marker":{include:$[35],style:function(b){var a={};if(b.horizontal){a.source=$[482]}else{a.source=$[508]}return a}},"scale-middle-marker":{include:$[35],style:function(b){var a={};if(b.horizontal){a.source="widget/scale/h_marker_small.gif"}else{a.source="widget/scale/v_marker_small.gif"}return a}},"datetime-date":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[86],$[4]);a.font=c.getCssFont($[86],"font");a.textColor=c.getCssColor($[86],$[6]);a.backgroundColor=c.getCssColor($[86],$[5]);a.backgroundGradient=c.getCssGradient($[86],$[1]);return a}},"datetime-time":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[86],$[4]);a.font=c.getCssFont($[86],"font");a.textColor=c.getCssColor($[86],$[6]);a.backgroundColor=c.getCssColor($[86],$[5]);a.backgroundGradient=c.getCssGradient($[86],$[1]);return a}},"datetime-calendar":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[86],$[4]);a.font=c.getCssFont("*","font");a.textColor=c.getCssColor($[86],$[6]);a.backgroundColor=c.getCssColor($[86],$[5]);return a}},"datetime-field":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={cursor:$[38],textAlign:$[37],padding:[0,3]};if(b.selected){a.textColor=c.getCssColor($[407],$[6]);a.backgroundColor=c.getCssColor($[407],$[5])}else{a.textColor=$[8];a.backgroundColor=$[8]}return a}},"datetime-separator":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={cursor:$[38]};return a}},"datetime-button-up":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.width=c.getCssDimension($[162],$[19]);a.icon=c.getCssImage("DateTime-UpButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssImage($[162],$[1])}else{a.backgroundImage=c.getCssImage($[162],$[1])}a.backgroundGradient=c.getCssGradient($[162],$[1]);a.border=c.getCssBorder($[162],$[4]);a.backgroundColor=c.getCssColor($[162],$[5]);a.cursor=c.getCssCursor($[162],$[34]);return a}},"datetime-button-down":{style:function(b){var a={};var c=new org.eclipse.swt.theme.ThemeValues(b);a.width=c.getCssDimension($[160],$[19]);a.icon=c.getCssImage("DateTime-DownButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssImage($[160],$[1])}else{a.backgroundImage=c.getCssImage($[160],$[1])}a.backgroundGradient=c.getCssGradient($[160],$[1]);a.border=c.getCssBorder($[160],$[4]);a.backgroundColor=c.getCssColor($[160],$[5]);a.cursor=c.getCssCursor($[160],$[34]);return a}},"datetime-drop-down-button":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[208],$[4]);a.icon=c.getCssImage("DateTime-DropDownButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssImage($[208],$[1])}else{a.backgroundImage=c.getCssImage($[208],$[1])}a.backgroundGradient=c.getCssGradient($[208],$[1]);a.backgroundColor=c.getCssColor($[208],$[5]);a.cursor=c.getCssCursor($[208],$[34]);return a}},"datetime-drop-down-calendar":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder("DateTime-DropDownCalendar",$[4]);a.backgroundColor=c.getCssColor($[86],$[5]);return a}},"calendar-navBar":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssBorder($[296],$[4]),backgroundColor:b.getCssColor($[296],$[5]),padding:[4,4,4,4]}}},"calendar-toolbar-button":{style:function(b){var a={spacing:4,width:16,height:16,clipWidth:16,clipHeight:16,verticalChildrenAlign:$[32]};if(b.pressed||b.checked||b.abandoned){a.padding=[2,0,0,2]}else{a.padding=2}return a}},"calendar-toolbar-previous-year-button":{include:$[313],style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{icon:b.getCssImage($[446],$[1]),cursor:b.getCssCursor($[446],$[34])}}},"calendar-toolbar-previous-month-button":{include:$[313],style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{icon:b.getCssImage($[448],$[1]),cursor:b.getCssCursor($[448],$[34])}}},"calendar-toolbar-next-month-button":{include:$[313],style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{icon:b.getCssImage($[434],$[1]),cursor:b.getCssCursor($[434],$[34])}}},"calendar-toolbar-next-year-button":{include:$[313],style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{icon:b.getCssImage($[487],$[1]),cursor:b.getCssCursor($[487],$[34])}}},"calendar-monthyear":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{font:b.getCssFont($[296],"font"),textAlign:$[37],textColor:b.getCssColor($[296],$[6]),verticalAlign:$[32],cursor:$[38]}}},"calendar-datepane":{style:function(a){return{backgroundColor:$[8]}}},"calendar-week":{style:function(a){var c=new org.eclipse.swt.theme.ThemeValues(a);if(a.header){var b=new org.eclipse.rwt.Border([0,1,1,0],$[20],"gray")}else{var b=new org.eclipse.rwt.Border([0,1,0,0],$[20],"gray")}return{textAlign:$[37],verticalAlign:$[32],border:b}}},"calendar-weekday":{style:function(b){var e=new org.eclipse.swt.theme.ThemeValues(b);var d=new org.eclipse.rwt.Border([0,0,1,0],$[20],"gray");var a=e.getCssFont("*","font");var c=new qx.ui.core.Font();c.setSize(11);c.setFamily(a.getFamily());c.setBold(a.getBold());c.setItalic(a.getItalic());return{font:c,border:d,textAlign:$[37]}}},"calendar-day":{style:function(b){var d=new org.eclipse.swt.theme.ThemeValues(b);var a={textAlign:$[37],verticalAlign:$[32]};if(!b.disabled&&(b.selected||b.otherMonth||b.over)){a.textColor=d.getCssColor($[494],$[6]);a.backgroundColor=d.getCssColor($[494],$[5])}else{a.textColor=$[8];a.backgroundColor=$[8]}var e=b.disabled?d.getCssColor("*",$[6]):"red";var c=new org.eclipse.rwt.Border(1,$[20],e);a.border=b.today?c:$[8];return a}},"expand-bar":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.border=c.getCssBorder($[336],$[4]);a.font=c.getCssFont($[336],"font");a.textColor=c.getCssColor($[336],$[6]);return a}},"expand-item":{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{overflow:$[17],border:b.getCssBorder("ExpandItem",$[4])}}},"expand-item-chevron-button":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.width=16;a.height=16;a.clipWidth=16;a.clipHeight=16;a.right=4;a.source=c.getCssImage("ExpandItem-Button",$[1]);a.cursor=c.getCssCursor($[207],$[34]);return a}},"expand-item-header":{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.top=0;a.left=0;a.width="100%";a.horizontalChildrenAlign="left";a.verticalChildrenAlign=$[32];a.paddingLeft=4;a.paddingRight=24;a.border=c.getCssBorder($[207],$[4]);a.backgroundColor=c.getCssColor($[207],$[5]);a.cursor=c.getCssCursor($[207],$[34]);a.backgroundImage=c.getCssImage($[207],$[1]);a.backgroundGradient=c.getCssGradient($[207],$[1]);return a}},slider:{style:function(a){var b=new org.eclipse.swt.theme.ThemeValues(a);return{border:b.getCssBorder("Slider",$[4]),font:b.getCssFont("*","font"),textColor:b.getCssColor("*",$[6]),backgroundColor:b.getCssColor("Slider",$[5])}}},"slider-thumb":{include:"atom",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.backgroundColor=c.getCssColor($[302],$[5]);a.border=c.getCssBorder($[302],$[4]);a.backgroundImage=c.getCssImage($[302],$[1]);a.backgroundGradient=c.getCssGradient($[302],$[1]);return a}},"slider-min-button":{include:"atom",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.font=c.getCssFont($[16],"font");a.textColor=c.getCssColor($[16],$[6]);a.spacing=c.getCssDimension($[16],$[110]);a.padding=c.getCssBoxDimensions($[16],$[36]);a.backgroundColor=c.getCssColor($[180],$[5]);a.icon=c.getCssSizedImage("Slider-DownButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssSizedImage($[180],$[1])}else{a.backgroundImage=c.getCssImage($[180],$[1])}a.backgroundGradient=c.getCssGradient($[180],$[1]);a.border=c.getCssBorder($[180],$[4]);if(b[$[181]]){a.width=16}else{a.height=16}a.cursor=c.getCssCursor($[180],$[34]);return a}},"slider-max-button":{include:"atom",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.font=c.getCssFont($[16],"font");a.textColor=c.getCssColor($[16],$[6]);a.spacing=c.getCssDimension($[16],$[110]);a.padding=c.getCssBoxDimensions($[16],$[36]);a.backgroundColor=c.getCssColor($[210],$[5]);a.icon=c.getCssSizedImage("Slider-UpButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssSizedImage($[210],$[1])}else{a.backgroundImage=c.getCssImage($[210],$[1])}a.backgroundGradient=c.getCssGradient($[210],$[1]);a.border=c.getCssBorder($[210],$[4]);if(b[$[181]]){a.width=16}else{a.height=16}a.cursor=c.getCssCursor($[210],$[34]);return a}},scrollbar:{style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={border:c.getCssBorder($[242],$[4]),backgroundColor:c.getCssColor($[242],$[5])};var d=c.getCssDimension($[242],$[19]);if(b[$[181]]){a.height=d}else{a.width=d}return a}},"scrollbar-thumb":{include:"atom",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.backgroundColor=c.getCssColor($[254],$[5]);a.border=c.getCssBorder($[254],$[4]);a.backgroundImage=c.getCssImage($[254],$[1]);a.backgroundGradient=c.getCssGradient($[254],$[1]);a.icon=c.getCssSizedImage("ScrollBar-Thumb-Icon",$[1]);return a}},"scrollbar-min-button":{include:"atom",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.spacing=c.getCssDimension($[16],$[110]);a.padding=c.getCssBoxDimensions($[16],$[36]);a.backgroundColor=c.getCssColor($[200],$[5]);a.icon=c.getCssSizedImage("ScrollBar-DownButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssSizedImage($[200],$[1])}else{a.backgroundImage=c.getCssImage($[200],$[1])}a.backgroundGradient=c.getCssGradient($[200],$[1]);a.border=c.getCssBorder($[200],$[4]);var d=c.getCssDimension($[242],$[19]);if(b[$[181]]){a.width=d}else{a.height=d}a.cursor=c.getCssCursor($[200],$[34]);return a}},"scrollbar-max-button":{include:"atom",style:function(b){var c=new org.eclipse.swt.theme.ThemeValues(b);var a={};a.font=c.getCssFont($[16],"font");a.textColor=c.getCssColor($[16],$[6]);a.spacing=c.getCssDimension($[16],$[110]);a.padding=c.getCssBoxDimensions($[16],$[36]);a.backgroundColor=c.getCssColor($[206],$[5]);a.icon=c.getCssSizedImage("ScrollBar-UpButton-Icon",$[1]);if(a.icon===org.eclipse.swt.theme.ThemeValues.NONE_IMAGE){a.icon=c.getCssSizedImage($[206],$[1])}else{a.backgroundImage=c.getCssImage($[206],$[1])}a.backgroundGradient=c.getCssGradient($[206],$[1]);a.border=c.getCssBorder($[206],$[4]);var d=c.getCssDimension($[242],$[19]);if(b[$[181]]){a.width=d}else{a.height=d}a.cursor=c.getCssCursor($[206],$[34]);return a}}}});
+qx.Class.define("org.eclipse.rwt.widgets.ControlDecorator",{extend:qx.ui.basic.Image,construct:function(a){arguments.callee.base.call(this);this.setParent(a);this.setZIndex(1000);this._showHover=true;this._text=null},members:{setText:function(a){this._text=a;this._updateToolTip()},setShowHover:function(a){this._showHover=a;this._updateToolTip()},_updateToolTip:function(){var a=org.eclipse.swt.WidgetManager.getInstance();if(this._text===null||this._text===""||!this._showHover){a.setToolTip(this,null)}else{a.setToolTip(this,this._text)}},onWidgetSelected:function(a){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addEvent($[61],c);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.send()},onWidgetDefaultSelected:function(a){var d=org.eclipse.swt.WidgetManager.getInstance();var c=d.findIdByWidget(this);var b=org.eclipse.swt.Request.getInstance();b.addEvent($[169],c);org.eclipse.swt.EventUtil.addWidgetSelectedModifier();b.send()}}});
+qx.Class.define("org.eclipse.rwt.MobileWebkitSupport",{type:$[119],statics:{_draggableTypes:{"org.eclipse.swt.widgets.Shell":null,"org.eclipse.swt.widgets.Sash":null,"org.eclipse.swt.widgets.Scale":[$[408]],"org.eclipse.swt.widgets.Slider":[$[412]],"org.eclipse.rwt.widgets.ScrollBar":null,"org.eclipse.swt.custom.ScrolledComposite":[$[197]],"org.eclipse.rwt.widgets.BasicButton":[$[197]],"qx.ui.layout.CanvasLayout":[$[564]],"org.eclipse.swt.widgets.List":[$[197]],"org.eclipse.swt.widgets.Table":[$[332],$[85],$[35],$[197]],"org.eclipse.rwt.widgets.Tree":[$[329],$[85],$[35],$[197]]},_lastMouseOverTarget:null,_lastMouseDownTarget:null,_lastMouseDownPosition:null,_lastMouseClickTarget:null,_lastMouseClickTime:null,_mouseEnabled:true,_fullscreen:window.navigator.standalone,_touchListener:null,_gestureListener:null,_allowedMouseEvents:{INPUT:{mousedown:true,mouseup:true},TEXTAREA:{mousedown:true,mouseup:true},"*":{mousewheel:true}},init:function(){if(org.eclipse.rwt.Client.isMobileSafari()){this._configureToolTip();this._hideTabHighlight();this._bindListeners();this._registerListeners();this._registerFilter()}},addDraggableType:function(a){var b=a in this._draggableTypes;if(!b){this._draggableTypes[a]=null}},setTouchListener:function(b,a){this._touchListener=[b,a]},setGestureListener:function(b,a){this._gestureListener=[b,a]},_isZoomed:function(){var a=window.orientation%180===0;var b=a?screen.width:screen.height;return window.innerWidth!==b},_configureToolTip:function(){var a=org.eclipse.rwt.widgets.WidgetToolTip.getInstance();a.setShowInterval(600);a.setHideInterval(15000);a.setMousePointerOffsetX(-35);a.setMousePointerOffsetY(-60);var b=qx.ui.popup.ToolTipManager.getInstance();b.handleMouseEvent=function(d){var c=d.getType();if(c===$[2]){this._handleMouseOver(d)}else{if(c===$[15]){this.setCurrentToolTip(null)}}}},_hideTabHighlight:function(){qx.html.StyleSheet.createElement(" * { -webkit-tap-highlight-color: rgba(0,0,0,0); }")},_bindListeners:function(){this.__onTouchEvent=qx.lang.Function.bind(this._onTouchEvent,this);this.__onGestureEvent=qx.lang.Function.bind(this._onGestureEvent,this);this.__onOrientationEvent=qx.lang.Function.bind(this._onOrientationEvent,this)},_registerListeners:function(){var a=document.body;a.ontouchstart=this.__onTouchEvent;a.ontouchmove=this.__onTouchEvent;a.ontouchend=this.__onTouchEvent;a.ontouchcancel=this.__onTouchEvent;a.ongesturestart=this.__onGestureEvent;a.ongesturechange=this.__onGestureEvent;a.ongestureend=this.__onGestureEvent;a.onorientationchange=this.__onOrientationEvent},_registerFilter:function(){var a=org.eclipse.rwt.EventHandler;a.setMouseEventFilter(this._filterMouseEvents,this)},_filterMouseEvents:function(b){var c=this._allowedMouseEvents;var a=typeof b.originalEvent===$[10];if(!a){a=c["*"][b.type]===true}if(!a&&typeof c[b.target.tagName]===$[10]){a=c[b.target.tagName][b.type]===true}if(!a){b.preventDefault();b.returnValue=false}return a},_onTouchEvent:function(b){var a=b.type;if(this._fullscreen){b.preventDefault()}if(this._mouseEnabled){switch(a){case"touchstart":this._handleTouchStart(b);break;case"touchend":this._handleTouchEnd(b);break;case"touchmove":this._handleTouchMove(b);break}}else{if(this._touchListener!==null){this._touchListener[0].call(this._touchListener[1],b)}}},_getTouch:function(a){var b=a.touches.item(0);if(b===null){b=a.changedTouches.item(0)}return b},_handleTouchStart:function(a){var d=this._getTouch(a);var b=a.target;var c=[d.clientX,d.clientY];this._moveMouseTo(b,a);this._lastMouseDownTarget=b;this._lastMouseDownPosition=c;this._fireMouseEvent($[2],b,a,c)},_handleTouchMove:function(b){if(!this._isZoomed()){b.preventDefault()}if(this._lastMouseDownPosition!==null){var a=this._lastMouseDownPosition;var c=b.target;var e=this._getTouch(b);var d=[e.clientX,e.clientY];if(this._isDraggableWidget(b.target)){b.preventDefault();this._fireMouseEvent($[45],c,b,d)}else{if(Math.abs(a[0]-d[0])>=15||Math.abs(a[1]-d[1])>=15){this._cancelMouseSession(b)}}}},_isDraggableWidget:function(f){var g=org.eclipse.swt.WidgetManager.getInstance();var b=org.eclipse.rwt.EventHandlerUtil.getOriginalTargetObject(f);var e=g.findControl(b);var a=false;if(e==null){e=b}if(e!=null&&e.classname in this._draggableTypes){var d=this._draggableTypes[e.classname];if(d==null){a=true}else{for(var c=0;c<d.length&&!a;c++){if(b.getAppearance()==d[c]){a=true}}}}return a},_handleTouchEnd:function(a){a.preventDefault();var d=this._getTouch(a);var c=[d.clientX,d.clientY];var b=a.target;if(this._lastMouseDownTarget!==null){this._fireMouseEvent($[15],b,a,c)}if(this._lastMouseDownTarget===b){this._fireMouseEvent($[29],b,a,c);this._lastMouseDownTarget=null;this._lastMouseDownPosition=null;if(this._isDoubleClick(a)){this._lastMouseClickTarget=null;this._lastMouseClickTime=null;this._fireMouseEvent($[62],b,a,c)}else{this._lastMouseClickTarget=b;this._lastMouseClickTime=(new Date()).getTime()}}},_isDoubleClick:function(b){var d=b.target;var a=false;if(this._lastMouseClickTarget===d){var c=((new Date()).getTime())-this._lastMouseClickTime;a=c<org.eclipse.swt.EventUtil.DOUBLE_CLICK_TIME}return a},_onGestureEvent:function(b){var a=b.type;if(this._gestureListener!==null){this._gestureListener[0].call(this._gestureListener[1],b)}switch(a){case"gesturestart":this._disableMouse(b);break;case"gestureend":this._enableMouse(b);break}},_onOrientationEvent:function(a){},_disableMouse:function(a){this._cancelMouseSession(a);this._mouseEnabled=false},_cancelMouseSession:function(a){var b=this._getDummyTarget();this._moveMouseTo(b,a);if(this._lastMouseDownTarget!==null){this._fireMouseEvent($[15],b,a,[0,0])}this._lastMouseDownTarget=null;this._lastMouseDownPosition=null},_getDummyTarget:function(){return qx.ui.core.ClientDocument.getInstance()._getTargetNode()},_enableMouse:function(){this._mouseEnabled=true},_moveMouseTo:function(c,a){var b=this._lastMouseOverTarget;if(b!==c){var d=[0,0];if(b!==null){this._fireMouseEvent($[14],b,a,d)}this._lastMouseOverTarget=c;this._fireMouseEvent($[9],c,a,d)}},_fireMouseEvent:function(c,e,a,b){var d=document.createEvent("MouseEvent");d.initMouseEvent(c,true,true,window,0,b[0],b[1],b[0],b[1],false,false,false,false,qx.event.type.MouseEvent.buttons.left,null);d.originalEvent=a;e.dispatchEvent(d)},_postMouseEvent:function(a){if(a===$[15]){qx.ui.popup.ToolTipManager.getInstance().setCurrentToolTip(null)}}}});
+qx.Class.define("org.eclipse.swt.widgets.ToolTip",{extend:qx.ui.popup.Popup,include:org.eclipse.rwt.FadeAnimationMixin,construct:function(a){arguments.callee.base.call(this);this._style=a;this.setAutoHide(false);this.setDisplay(true);this.setVisibility(false);this.setAppearance("tool-tip");var b=qx.ui.core.ClientDocument.getInstance();this.setMaxWidth(b.getClientWidth()/2);this.setMaxHeight(b.getClientHeight()/2);this.addToDocument();this.addEventListener($[2],this._onMouseDown,this);this._hideAfterTimeout=false;this._hasSelectionListener=false;this._messageFont=this._getMessageFont();this._contentArea=null;this._textArea=null;this._image=null;this._text=null;this._message=null;this._createControls()},destruct:function(){this.removeEventListener($[2],this._onMouseDown,this);this._contentArea.dispose();this._textArea.dispose();this._image.dispose();this._text.dispose();this._message.dispose();this._messageFont=null},members:{setText:function(a){this._text.setText(a);if(this.getVisibility()){this._update()}},setMessage:function(a){this._message.setText(a);if(this.getVisibility()){this._update()}},setLocation:function(a,b){this.setLeft(a);this.setTop(b)},setHideAfterTimeout:function(a){this._hideAfterTimeout=a},setHasSelectionListener:function(a){this._hasSelectionListener=a},setVisible:function(a){this.setVisibility(a);if(a){this._update();this.bringToFront();if(this._hideAfterTimeout){qx.client.Timer.once(this._hide,this,5*1000)}}},addState:function(a){arguments.callee.base.call(this,a);this._image.addState(a)},removeState:function(a){arguments.callee.base.call(this,a);this._image.removeState(a)},_createControls:function(){this._contentArea=new qx.ui.layout.BoxLayout($[52]);this._contentArea.setWidth("100%");this._contentArea.setHeight("100%");this._contentArea.setSpacing(5);this._contentArea.setParent(this);this._image=new qx.ui.basic.Image();this._image.setAppearance("tool-tip-image");this._image.setParent(this._contentArea);this._textArea=new qx.ui.layout.BoxLayout($[47]);this._textArea.setParent(this._contentArea);this._textArea.setHeight("100%");this._textArea.setSpacing(5);this._text=new qx.ui.basic.Label();this._text.setAppearance("tool-tip-text");this._text.setParent(this._textArea);this._message=new qx.ui.basic.Label();this._message.setAppearance("tool-tip-message");this._message.setHeight("auto");this._message.setWrap(true);this._message.setParent(this._textArea)},_update:function(){var c=this._message.getText();var d=this._getTextSize(this._text.getText(),-1);var a=this._getTextSize(c,-1);var b=a.x;while(b>0&&!this._matchesWidthToHeightRatio(a)){b-=10;a=this._getTextSize(c,b)}a.x=this._max(a.x,d.x);this._message.setWidth(a.x);this._message.setHeight(a.y)},_matchesWidthToHeightRatio:function(a){return a.x/a.y<=6},_max:function(d,c){return d>c?d:c},_getTextSize:function(d,a){var c=new Array();c[0]="";c[1]=d;c[2]=this._messageFont.getFamily();c[3]=this._messageFont.getSize();c[4]=this._messageFont.getBold();c[5]=this._messageFont.getItalic();c[6]=a;var b=org.eclipse.swt.FontSizeCalculation._doMeasurement(c);return{x:b[0],y:b[1]}},_onMouseDown:function(a){this._hide();if(this._hasSelectionListener){var c=this._getWidgetId();var b=org.eclipse.swt.Request.getInstance();b.addEvent($[61],c);b.send()}},_hide:function(){this.setVisible(false);qx.ui.core.Widget.flushGlobalQueues();var a=org.eclipse.swt.Request.getInstance();a.addParameter(this._getWidgetId()+".visible",false)},_getWidgetId:function(){var a=org.eclipse.swt.WidgetManager.getInstance();return a.findIdByWidget(this)},_getMessageFont:function(){var a=new org.eclipse.swt.theme.ThemeValues({});return a.getCssFont($[357],"font")}}});
+})(["qx.client","background-image","mousedown","Boolean","border","background-color","color","qx.debug","undefined","mouseover","object","qx.event.type.Event","keypress","string","mouseout","mouseup","Button","hidden","mshtml","width","solid","pressed","Integer","keydown","right","String","scroll","shadow","absolute","click","selected","appear","middle","singleton","cursor","image","padding","center","default","height","gecko","contextmenu","completed","opacity","function","mousemove","abandoned","vertical","highlight","interval","bottom","Right","horizontal","variant_","failed","mousewheel","changeWidth","PageUp","PageDown","computed=this.","keyup","org.eclipse.swt.events.widgetSelected","dblclick","aborted","sending","timeout","focus","receiving","qx.event.type.DataEvent","webkit","overflow","Enter","dragstart","Number","Label","this.","changeHeight","backgroundColor","number","change","changeValue","=value;","input","changeFont","style","label","DateTime","parent_unfocused","borderLeftWidth","borderTopWidth","active","Space","maximized","scrollY","scrollX","qx.event.type.MouseEvent","margin","abstract","overflowY","Widget-ToolTip","minHeight","minWidth","ToolTip","configured","maxHeight","overflowX","maxWidth","create","normal","alias","spacing","Object","frame","visibility","backgroundImage","outline","CTabItem","CLabel","Escape","static","rounded","CSS1Compat","opera","\" in class \"","qx.io.remote.Response","inherit","Theme","Shell-Titlebar","filter","gradient","if(this.","changeEnabled","boolean","focused","ToolItem","CCombo","position","execute","dragover","unstyle","reset","Combo","locationX",".selection","pointer","locationY","CCombo-Button","Combo-Button","delete this.","changeLeft","(empty)","fixed","qx.ui.core.Widget","TreeColumn","Spinner-UpButton","transparent","Spinner-DownButton","datetime-field","box-shadow","rwt_FLAT","DateTime-DownButton","return this.","DateTime-UpButton","lightshadow","\",value);","qx.event.type.DragEvent","Invalid key \"","e-resize","TableColumn","org.eclipse.swt.events.widgetDefaultSelected","created","barTop","refresh","roundrect","textarea","maxLength","translucent","focusout","!==undefined)","linesvisible","Slider-DownButton","rwt_HORIZONTAL","stateOverChanged","display","CTabFolder","queued","qx.ioRemoteDebug","animation","Label-SeparatorLine","background","ToolBar","n-resize","marginLeft","Group-Label","changeBackgroundColor","selectionLength","Table-Checkbox","scrollbar-thumb","changeVisibility","paddingTop","ScrollBar-DownButton","Display","fillType","checked","\" is not allowed!","calendar-button","ScrollBar-UpButton","ExpandItem-Header","DateTime-DropDownButton","chrome","Slider-UpButton","fontSize","selectionStart","calendar-day","marginTop","ProgressBar-Indicator","top-reversed","TabItem","Spinner","center-reversed","changeFocusedChild","paddingLeft","left-reversed","Attention! The value \"","shadowLayouted","complex","else if(this.","\" is an invalid value for the property \"","insertDom","Composite","focusin","!active","w-resize","rwt_BORDER","qx.event.type.FocusEvent","grayed","paddingBottom","nw-resize","ne-resize","\" in theme \"","TableItem","animationRenderer","ScrollBar","windowblur","dragdrop","qx.propertyDebugLevel","remove","shorthand","middle-reversed","stroke","MenuItem","backgroundLayouted","minimized","datetime-separator","ScrollBar-Thumb","darkshadow","paddingRight","borderRadii","_applyIndicatorFill","Could not evaluate computed style: ","qx.ui.popup.ToolTip","ProgressBar","progress","marginBottom","!==undefined){","Could not parse color: ","_applyClip","dragmove","changeTextColor","No such property: ","org.eclipse.swt.events.widgetSelected.index","changeSelection","backgroundGradient","The configuration key \"","\" in mixin \"","_applyResizable","mouseevent","\"! The type of the key must be \"","received","expanded",".bounds.height","textAlign","-moz-scrollbars-none","-moz-scrollbars-horizontal","border-color","keyevent","qx.event.type.KeyEvent","backgroundImageSize","boxSizing","dragend","old=this.","Invalid type of key \"","dragout","List-Item",".bounds.y",".bounds.x","DateTime-Calendar-Navbar","messageLabel","marginRight","changeParent","border-box","borderWidths","Slider-Thumb","changeOverState","qx.event.handler.DragAndDropHandler","#000000","-moz-scrollbars-vertical","elementOver","rwt_VERTICAL","changeTop","borderRightWidth","collapsed","disappear","calendar-toolbar-button","Shell-DisplayOverlay",".bounds.width","windowresize","Control","borderBottomWidth","changeMode","s-resize","_manager","row-resize","changeDate","text-decoration","otherMonth","org.eclipse.swt.custom.CTabItem","ctabfolder-button","changeLeadItem","tree-column","qx.ui.popup.PopupManager","textDecoration","table-column","changeState","stroke-width","readonly","ExpandBar","lineHeight","CoolItem-Handle","lastChild","crosshair","setImage","dragenter","backgroundRepeat","org.eclipse.rwt.widgets.MenuItem","\" must be defined!","Variant \"","rwt-resources/themes/images/","hoverOut","org.eclipse.swt.events.widgetSelected.detail","backgroundPosition","static/image/blank.gif","Backspace","hasSelectionListener","changeElement","changeActiveChild","not-allowed","ToolTip-Message","1px dotted invert","_applyWrap","changeBackgroundGradient","thinInset","dragEnter","borderColor","sw-resize","updateRows","Conflict between mixin \"","changeHtml","Table-GridLine","col-resize","_applyOpacity","changeActive","1px dotted","userScroll","\" of property \"","_applyAnimation","_applyTextAlign","underline","no-repeat","thinborder","toolTipText","_applyBackgroundGradient","borderMaxWidth","thinOutset","itemFocused","typeof value === \"number\" && isFinite(value)","dnd_selected","MozOpacity","hasVerifyOrModifyListener","Connection dropped","TreeItem","border-radius","se-resize","beforeunload","qx.io.remote.XmlHttpTransport","appearances","_applyEnabled","\"! The value is undefined/null!","changeFocused","qx.event.type.ChangeEvent","_applyIcon","\"! The value needs to be a map!","qx.ui.form.Button","_applyManager","org.eclipse.swt.custom.CTabFolder","org.eclipse.swt.dnd.","\" in member \"","DateTime-Field","scale-thumb","separatorBorder","\" which must be an instance of \"","if(old===computed)return value;","slider-thumb","verticalDivider","removeChild","\" is already defined!","changeSource","' is not a function!","borderLeftStyle","qx.allowUrlSettings","delete window.","_applyState","qx.ui.form.TextField","qx.ui.pageview.AbstractButton","createContent","if(old===undefined)old=null;","datetime-button-up","org.eclipse.swt.events.ctabFolderRestored","CCombo-List","\" failed with exception ","DOMMouseScroll"," has no themeable property \"","table-column-resizer","qx.ui.core.Parent","DateTime-Calendar-NextMonthButton","ToolItem-DropDownIcon","' in mixin '",".focusIndex","widget/ctabfolder/restore.gif","changeSpacing","qx.ui.window.Manager",") but parent layout ","skipFlexible","MenuItem-CheckIcon","Shell-CloseButton","_applySelectionIndicator","DateTime-Calendar-PreviousYearButton","borderBottomStyle","DateTime-Calendar-PreviousMonthButton","_applyOrientation","quadraticCurveTo","datetime-button-down","Tree-GridLine","draggesture","MozUserSelect","bezierCurveTo","value !== null","center center",";background-repeat:no-repeat;' ></div>","\" but is typeof \"","qx.client.NativeWindow","widget/ctabfolder/close.gif","_focusedTextField","' of class '","itemselected","tree-indent","Content-Type","org.eclipse.rwt.widgets.Button","qx.ui.pageview.AbstractPage","window-captionbar-maximize-button",".selectedItemId","KhtmlUserSelect","borderTopStyle","qx.compatibility","\". Must be following the schema \"namespace.key\".","Sash-Handle","\" of Class \"","Invalid Widget: ","qx.isSource","unselectable","checkDisposedItems","org.eclipse.rwt.widgets.Text","widget/scale/h_marker_big.gif","qx.core.Object","postApplyDimensions failed ","if(computed===undefined)computed=null;",".$$properties.","DateTime-Calendar-NextYearButton","qx.ui.selection.RadioManager"," does not support it","ignoreFlexible","_applyVisibility",".activeControl","Shell-MinButton","DateTime-Calendar-Day","qx.io.remote.Exchange","It is not possible to set preventDefault to false if it was true before!","itemdefaultselected","_applyHeight","nextSelected","bottomRight","qx.io.remote.AbstractRemoteTransport","qx.event.handler.FocusHandler","Includes of mixins must be mixins. The include number '","' are not compatible '","_childrenQueue","qx.ui.embed.IframeManager","Iframe source could not be set! This may be related to AdBlock Plus Firefox Extension.","widget/scale/v_marker_big.gif","org.eclipse.swt.widgets.ExpandBar","qx.application.Gui","widget/ctabfolder/maximize.gif","qx.resourceUri","minThumbSize","scrollHeight","qx.util.range.Range","Shell-MaxButton",":border-box;","label-graytext","if(value===undefined)prop.error(this,2,\"","Cache-Control"," modified: Failed to dispatch change event: ",":content-box;","bottom-reversed","_applyVerticalChildrenAlign","_applySource","static/html/blank.html"," is not inside this parent.","sash-handle","MenuItem-RadioIcon","calendar-week","qx.ui.pageview.tabview.TabView","changeChecked","gecko|opera|webkit","',sizingMethod='crop')","_applySpacing","Group-Frame","ToolTip-Text","_applyHorizontalChildrenAlign","\" is not defined.","border-bottom","' of theme '","hoverFristItem","qx.io.remote.Request","qx.ui.window.Window","widget/ctabfolder/close_hover.gif","client-document-blocker","Could not convert system colors to RGB: ","qx.io.image.Preloader","WebkitUserSelect","_applySeparatorBorder","The mixins '","multipart/form-data","_invalidate","_applyBackgroundColor","background-image:url(","right-reversed","qx.staticUri","qx.allowUrlVariants","Malformed settings key \"","\" which must be typeof \"","dragFinished","hasComputed","Failed to check property ","coolitem-handle","changeZIndex","var prop=qx.core.Property;","pointerEvents","org.eclipse.swt.events.modifyText","addEventListener(","borderRightStyle","Alpha(opacity=","stdDeviation","widget/ctabfolder/minimize.gif","qx.ui.embed.Flash","progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"]);
\ No newline at end of file
