@qooxdoo/framework
Version:
The JS Framework for Coders
453 lines (385 loc) • 10.4 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2008 1&1 Internet AG, Germany, http://www.1und1.de
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Christian Hagendorn (chris_schmidt)
************************************************************************ */
/**
* The Flash widget embeds the HMTL Flash element
*/
qx.Class.define("qx.ui.embed.Flash",
{
extend : qx.ui.core.Widget,
/**
* Constructs a flash widget.
*
* @param source {String} The URL of the Flash movie to display.
* @param id {String?null} The unique id for the Flash movie.
*/
construct : function(source, id)
{
this.base(arguments);
if (qx.core.Environment.get("qx.debug"))
{
qx.core.Assert.assertString(source, "Invalid parameter 'source'.");
if (id) {
qx.core.Assert.assertString(id, "Invalid parameter 'id'.");
}
}
this.setSource(source);
if (id) {
this.setId(id);
} else {
this.setId("flash" + this.toHashCode());
}
//init properties
this.initQuality();
this.initWmode();
this.initAllowScriptAccess();
this.initLiveConnect();
// Creates the Flash DOM element (movie) on appear,
// because otherwise IE 7 and higher blocks the
// ExternelInterface from Flash.
this.addListenerOnce("appear", function()
{
this._checkLoading();
this.getContentElement().createFlash();
}, this);
},
events :
{
/**
* Fired when the flash object still is loading.
*
* The loading action can be prevented by calling
* {@link qx.event.type.Event#preventDefault} on the event object
*/
"loading" : "qx.event.type.Event",
/**
* Fired after the flash object has been loaded.
*
* The loaded action can be prevented by calling
* {@link qx.event.type.Event#preventDefault} on the event object
*/
"loaded" : "qx.event.type.Event",
/**
* Fired after the flash object has got a timeout.
*
* The timeout action can be prevented by calling
* {@link qx.event.type.Event#preventDefault} on the event object
*/
"timeout" : "qx.event.type.Event"
},
properties :
{
/**
* The URL of the Flash movie.
*/
source :
{
check : "String",
apply : "_applySource"
},
/**
* The unique Flash movie id.
*/
id :
{
check : "String",
apply : "_applyId"
},
/**
* Set the quality attribute for the Flash movie.
*/
quality :
{
check : ["low", "autolow", "autohigh", "medium", "high", "best"],
init : "best",
nullable : true,
apply : "_applyQuality"
},
/**
* Set the scale attribute for the Flash movie.
*/
scale :
{
check : ["showall", "noborder", "exactfit", "noscale"],
nullable : true,
apply : "_applyScale"
},
/**
* Set the wmode attribute for the Flash movie.
*/
wmode :
{
check : ["window", "opaque", "transparent"],
init : "opaque",
nullable : true,
apply : "_applyWmode"
},
/**
* Set the play attribute for the Flash movie.
*/
play :
{
check : "Boolean",
nullable : true,
apply : "_applyPlay"
},
/**
* Set the loop attribute for the Flash movie.
*/
loop :
{
check : "Boolean",
nullable : true,
apply : "_applyLoop"
},
/**
* Set the mayscript attribute for the Flash movie.
*/
mayScript :
{
check : "Boolean",
nullable : false,
apply : "_applyMayScript"
},
/**
* Set the menu attribute for the Flash movie.
*/
menu :
{
check : "Boolean",
nullable : true,
apply : "_applyMenu"
},
/**
* Set allow script access
**/
allowScriptAccess :
{
check : ["sameDomain", "always", "never"],
init : "sameDomain",
nullable : true,
apply : "_applyAllowScriptAccess"
},
/**
* Enable/disable live connection
**/
liveConnect :
{
check : "Boolean",
init : true,
nullable : true,
apply : "_applyLiveConnect"
},
/**
* Set the 'FlashVars' to pass variables to the Flash movie.
*/
variables :
{
init : {},
check : "Map",
apply : "_applyVariables"
},
/**
* A timeout when trying to load the flash source.
*/
loadTimeout :
{
check : "Integer",
init : 10000
}
},
members :
{
/** @type {Integer} The time stamp when the loading begins. */
__time : null,
/*
---------------------------------------------------------------------------
PUBLIC WIDGET API
---------------------------------------------------------------------------
*/
/**
* Returns the DOM element of the Flash movie.
*
* Note: If you call the method before the widget is rendered, it will
* always return <code>null</code>. Therefore call the method after
* the {@link #appear} event is fired.
*
* @return {Element|null} The DOM element of the Flash movie.
*/
getFlashElement : function()
{
var element = this.getContentElement();
if (element) {
return element.getFlashElement();
} else {
return null;
}
},
/**
* Checks if the movie is loaded.
*
* @return {Boolean} <code>true</code> When the movie is completely loaded,
* otherwise <code>false</code>.
*/
isLoaded : function() {
return this.getPercentLoaded() === 100;
},
/**
* Returns the current loaded state from the Flash movie.
*
* @return {Integer} The loaded percent value.
*/
getPercentLoaded : function()
{
var flashFE = this.getFlashElement();
// First make sure the movie is defined and has received a non-zero object id.
if(typeof(flashFE) != "undefined" && flashFE != null)
{
try {
return flashFE.PercentLoaded();
}
catch(err)
{
// Not an accessible function yet.
return 0;
}
}
else {
return 0;
}
},
// overridden
_createContentElement : function() {
var el = new qx.html.Flash();
el.connectWidget(this);
return el;
},
/**
* Checks the current loaded state and fires one of the defined events:
* {@link #loading}, {@link #loaded} or {@link #timeout}.
*
* Note the {@link #timeout} event is fired when the check reached the
* defined {@link #loadTimeout}.
*/
_checkLoading : function()
{
var source = this.getSource();
if(source != "" && source != null && source != "undefined")
{
if(!this.isLoaded())
{
if(!this.__time) {
this.__time = new Date().getTime();
}
var timeDiff = new Date().getTime() - this.__time;
if(this.getLoadTimeout() > timeDiff)
{
var timer = qx.util.TimerManager.getInstance();
timer.start(this._checkLoading, 0, this, null, 10);
this.fireEvent("loading");
}
else
{
if (qx.core.Environment.get("qx.debug")) {
this.debug("Timeout after: " + timeDiff);
}
this.fireEvent("timeout");
this.__time = null;
}
}
else
{
this.fireEvent("loaded");
this.__time = null;
}
}
},
/*
---------------------------------------------------------------------------
APPLY METHODS
---------------------------------------------------------------------------
*/
// property apply
_applySource : function(value, old)
{
var source = qx.util.ResourceManager.getInstance().toUri(value);
this.getContentElement().setSource(source);
qx.ui.core.queue.Layout.add(this);
},
// property apply
_applyId : function(value, old)
{
this.getContentElement().setId(value);
qx.ui.core.queue.Layout.add(this);
},
// property apply
_applyVariables : function(value, old)
{
this.getContentElement().setVariables(value);
qx.ui.core.queue.Layout.add(this);
},
// property apply
_applyMayScript : function (value, old)
{
this.getContentElement().setAttribute("mayscript", value ? "" : false);
qx.ui.core.queue.Layout.add(this);
},
// property apply
_applyQuality : function(value, old) {
this.__flashParamHelper("quality", value);
},
// property apply
_applyScale : function(value, old) {
this.__flashParamHelper("scale", value);
},
// property apply
_applyWmode : function(value, old) {
this.__flashParamHelper("wmode", value);
},
// property apply
_applyPlay : function(value, old) {
this.__flashParamHelper("play", value);
},
// property apply
_applyLoop : function(value, old) {
this.__flashParamHelper("loop", value);
},
// property apply
_applyMenu : function(value, old) {
this.__flashParamHelper("menu", value);
},
// property apply
_applyAllowScriptAccess : function(value, old) {
this.__flashParamHelper("allowScriptAccess", value);
},
// property apply
_applyLiveConnect : function(value, old) {
this.__flashParamHelper("swLiveConnect", value);
},
/*
---------------------------------------------------------------------------
HELPER METHODS
---------------------------------------------------------------------------
*/
/**
* Set the attribute for the Flash DOM element.
*
* @param key {String} Flash Player attribute name.
* @param value {String?null} The value for the attribute, <code>null</code>
* if the attribute should be removed from the DOM element.
*/
__flashParamHelper : function(key, value)
{
this.getContentElement().setParam(key, value);
qx.ui.core.queue.Layout.add(this);
}
}
});