Sure!
AutoInstallShockwaveComponent.java
import java.util.Hashtable;
import java.util.Map;
import java.util.Set;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.behavior.HeaderContributor;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.protocol.http.RequestUtils;
/**
* Classe permettant d'afficher un fichier *.swf tout en ayant une
fonction
* d'auto-installation du FlashPlayer si la version courante n'est pas
* suffisante. Ne fonctionne pas du tout si javascript est désactivé
(affiche le
* contenu alternatif).
*
* @see <a href="http://code.google.com/p/swfobject/">SWFObject</a>
* @version 11/09/2008
*/
public final class AutoInstallShockWaveComponent extends Panel {
/** Modèle contenu alternatif par défaut (si non précisé). */
private static final IModel DEFAULT_ALTERNATIVE_CONTENT = new Model(
"<h1>Unable to display flash content!</h1><p>You either
have JavaScript disabled or your browser doesn't support
SWFObject.</p><p><a
href=\"http://www.adobe.com/go/getflashplayer\"><img
src=\"http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif\"
alt=\"Get Adobe Flash player\" /></a></p>");
private final Map<String, String> flashvars = new
Hashtable<String, String>();
private final Map<String, String> params = new Hashtable<String,
String>();
private final Map<String, String> attributes = new
Hashtable<String, String>();
/**
* Constructeur minimal. Spécifie l'url du fichier swf + ses
dimensions.
*
* @param id
* [EMAIL PROTECTED] Panel#getId()}
* @param swfFullURL
* Adresse URL relative ou absolue du fichier *.swf à
utiliser.
* @param width
* Largeur du fichier swf.
* @param height
* Hauteur du fichier swf.
*/
public AutoInstallShockWaveComponent(String id, final String
swfFullURL, final String width, final String height) {
this(id, swfFullURL, width, height, "9", null);
}
/**
* Constructeur complet. Spécifie la version minimale de flash,
ainsi que le
* contenu alternatif à afficher.
*
* @param id
* [EMAIL PROTECTED] Panel#getId()}
* @param swfFullURL
* Adresse URL relative ou absolue du fichier *.swf à
utiliser.
* @param width
* Largeur du fichier swf.
* @param height
* Hauteur du fichier swf.
* @param flashMinimumVersion
* Version minimale de Flash (p.ex, "9.0.0")
* @param alternative
* Contenu alternatif, typiquement une [EMAIL PROTECTED]
String}
ou un
* [EMAIL PROTECTED] IModel}. Passez <code>null</code> pour
utiliser le
* contenu alternatif par défaut (infos + lien vers flash
* player).
*/
public AutoInstallShockWaveComponent(String id, final String
swfFullURL, final String width, final String height, final String
flashMinimumVersion,
Object alternative) {
super(id);
add(HeaderContributor.forJavaScript(new
ResourceReference(AutoInstallShockWaveComponent.class,
"swfobject.js")));
final WebMarkupContainer swf = new WebMarkupContainer("swf");
swf.setOutputMarkupId(true);
add(swf);
add(new Label("js", new Model() {
public Object getObject() {
StringBuilder b = new StringBuilder(512);
b.append("<script type=\"text/javascript\">");
b.append(NL);
b.append("<!--/*--><![CDATA[/*><!--*/").append(NL);
b.append("swfobject.embedSWF(\"").append(swfFullURL).append("\",
\"").append(swf.getMarkupId()).append("\", \"");
b.append(width).append("\",
\"").append(height).append("\",
\"").append(flashMinimumVersion).append("\", \"");
b.append(RequestUtils.toAbsolutePath(urlFor(new
ResourceReference(AutoInstallShockWaveComponent.class,
"expressInstall.swf")).toString()))
.append("\"");
if (!flashvars.isEmpty()) {
b.append(", ").append(formatMapForJS(flashvars));
}
if (!params.isEmpty()) {
b.append(", ").append(formatMapForJS(params));
}
if (!attributes.isEmpty()) {
b.append(", ").append(formatMapForJS(attributes));
}
b.append(");");
b.append(NL);
b.append("/*-->]]>*/").append(NL);
b.append("</script>");
return b.toString();
}
}).setRenderBodyOnly(true).setEscapeModelStrings(false));
/* Ajout contenu alternatif */
Label alternativecontent;
if (alternative == null) {
alternativecontent = new Label("alternativecontent",
DEFAULT_ALTERNATIVE_CONTENT);
} else if (alternative instanceof String) {
alternativecontent = new Label("alternativecontent",
(String) alternative);
} else if (alternative instanceof IModel) {
alternativecontent = new Label("alternativecontent",
(IModel) alternative);
} else {
alternativecontent = new Label("alternativecontent", ""
+ alternative);
}
alternativecontent.setRenderBodyOnly(true);
alternativecontent.setEscapeModelStrings(false);
swf.add(alternativecontent);
}
private static final String NL = "\r\n";
private static String formatMapForJS(Map<String, String> map) {
if (map.isEmpty()) {
return "{}";
}
StringBuilder b = new StringBuilder(64);
b.append("{ ").append(NL);
Set<String> keySet = map.keySet();
int i = 0;
for (String key : keySet) {
b.append(key).append(" :
\"").append(map.get(key)).append("\" ");
if (++i >= keySet.size()) {
b.append(NL);
} else {
b.append(", ");
}
}
b.append(" }");
return b.toString();
}
public void setFlashvar(String name, String value) {
flashvars.put(name, value);
}
public void unsetFlashvar(String name) {
flashvars.remove(name);
}
public void setParam(String name, String value) {
params.put(name, value);
}
public void unsetParam(String name) {
params.remove(name);
}
public void setAttribute(String name, String value) {
attributes.put(name, value);
}
public void unsetAttribute(String name) {
attributes.remove(name);
}
}
AutoInstallShockwaveComponent.html
<html xmlns:wicket="http://wicket.apache.org">
<head>
</head>
<body>
<wicket:panel>
<span wicket:id="js">[here comes some js code]</span>
<div wicket:id="swf">
<div wicket:id="alternativecontent">
[here comes the alternative content]
</div>
</div>
</wicket:panel>
</body>
</html>
You have to download SWFObject from http://code.google.com/p/swfobject/
too, and add the files swfobject.js, expressInstall.swf next to the
AutoInstallShockwaveComponent.java to have it work
any feedback will be appreciated. I didn't try to add several
autoinstall to a page, so if you try, let me know if it works
;)
Kaspar Fischer a écrit :
Hi Sébastien!
I am interested! Could you post the code/markup?
Thanks a lot for sharing,
Kaspar
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]