/* @ITMillApache2LicenseForJavaFiles@ */ package com.vaadin.ui; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import com.vaadin.event.MouseEvents.ClickEvent; import com.vaadin.event.MouseEvents.ClickListener; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.PaintTarget; import com.vaadin.terminal.Resource; import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.ui.VEmbedded; /** * Component for embedding external objects. * * @author IT Mill Ltd. * @version * @VERSION@ * @since 3.0 */ @SuppressWarnings("serial") @ClientWidget(VEmbedded.class) public class Embedded extends AbstractComponent { private static final String CLICK_EVENT = VEmbedded.CLICK_EVENT_IDENTIFIER; /** * General object type. */ public static final int TYPE_OBJECT = 0; /** * Image types. */ public static final int TYPE_IMAGE = 1; /** * Browser ("iframe") type. */ public static final int TYPE_BROWSER = 2; /** * Type of the object. */ private int type = TYPE_OBJECT; /** * Source of the embedded object. */ private Resource source = null; /** * Generic object attributes. */ private String mimeType = null; private String standby = null; /** * Hash of object parameters. */ private final Map parameters = new HashMap(); /** * Applet or other client side runnable properties. */ private String codebase = null; private String codetype = null; private String classId = null; private String archive = null; /** * Creates a new empty Embedded object. */ public Embedded() { } /** * Creates a new empty Embedded object with caption. * * @param caption */ public Embedded(String caption) { setCaption(caption); } /** * Creates a new Embedded object whose contents is loaded from given * resource. The dimensions are assumed if possible. The type is guessed * from resource. * * @param caption * @param source * the Source of the embedded object. */ public Embedded(String caption, Resource source) { setCaption(caption); setSource(source); } /** * Invoked when the component state should be painted. */ @Override public void paintContent(PaintTarget target) throws PaintException { switch (type) { case TYPE_IMAGE: target.addAttribute("type", "image"); break; case TYPE_BROWSER: target.addAttribute("type", "browser"); break; default: break; } if (getSource() != null) { target.addAttribute("src", getSource()); } if (mimeType != null && !"".equals(mimeType)) { target.addAttribute("mimetype", mimeType); } if (classId != null && !"".equals(classId)) { target.addAttribute("classid", classId); } if (codebase != null && !"".equals(codebase)) { target.addAttribute("codebase", codebase); } if (codetype != null && !"".equals(codetype)) { target.addAttribute("codetype", codetype); } if (standby != null && !"".equals(standby)) { target.addAttribute("standby", standby); } if (archive != null && !"".equals(archive)) { target.addAttribute("archive", archive); } // Params for (final Iterator i = getParameterNames(); i.hasNext();) { target.startTag("embeddedparam"); final String key = i.next(); target.addAttribute("name", key); target.addAttribute("value", getParameter(key)); target.endTag("embeddedparam"); } } /** * Sets an object parameter. Parameters are optional information, and they * are passed to the instantiated object. Parameters are are stored as name * value pairs. This overrides the previous value assigned to this * parameter. * * @param name * the name of the parameter. * @param value * the value of the parameter. */ public void setParameter(String name, String value) { parameters.put(name, value); requestRepaint(); } /** * Gets the value of an object parameter. Parameters are optional * information, and they are passed to the instantiated object. Parameters * are are stored as name value pairs. * * @return the Value of parameter or null if not found. */ public String getParameter(String name) { return parameters.get(name); } /** * Removes an object parameter from the list. * * @param name * the name of the parameter to remove. */ public void removeParameter(String name) { parameters.remove(name); requestRepaint(); } /** * Gets the embedded object parameter names. * * @return the Iterator of parameters names. */ public Iterator getParameterNames() { return parameters.keySet().iterator(); } /** * Gets the codebase, the root-path used to access resources with relative * paths. * * @return the code base. */ public String getCodebase() { return codebase; } /** * Gets the MIME-Type of the code. * * @return the MIME-Type of the code. */ public String getCodetype() { return codetype; } /** * Gets the MIME-Type of the object. * * @return the MIME-Type of the object. */ public String getMimeType() { return mimeType; } /** * Gets the standby text displayed when the object is loading. * * @return the standby text. */ public String getStandby() { return standby; } /** * Sets the codebase, the root-path used to access resources with relative * paths. * * @param codebase * the codebase to set. */ public void setCodebase(String codebase) { if (codebase != this.codebase || (codebase != null && !codebase.equals(this.codebase))) { this.codebase = codebase; requestRepaint(); } } /** * Sets the codetype, the MIME-Type of the code. * * @param codetype * the codetype to set. */ public void setCodetype(String codetype) { if (codetype != this.codetype || (codetype != null && !codetype.equals(this.codetype))) { this.codetype = codetype; requestRepaint(); } } /** * Sets the mimeType, the MIME-Type of the object. * * @param mimeType * the mimeType to set. */ public void setMimeType(String mimeType) { if (mimeType != this.mimeType || (mimeType != null && !mimeType.equals(this.mimeType))) { this.mimeType = mimeType; requestRepaint(); } } /** * Sets the standby, the text to display while loading the object. * * @param standby * the standby to set. */ public void setStandby(String standby) { if (standby != this.standby || (standby != null && !standby.equals(this.standby))) { this.standby = standby; requestRepaint(); } } /** * Gets the classId attribute. * * @return the class id. */ public String getClassId() { return classId; } /** * Sets the classId attribute. * * @param classId * the classId to set. */ public void setClassId(String classId) { if (classId != this.classId || (classId != null && !classId.equals(classId))) { this.classId = classId; requestRepaint(); } } /** * Gets the resource contained in the embedded object. * * @return the Resource */ public Resource getSource() { return source; } /** * Gets the type of the embedded object. *

* This can be one of the following: *

    *
  • TYPE_OBJECT (This is the default) *
  • TYPE_IMAGE *
*

* * @return the type. */ public int getType() { return type; } /** * Sets the object source resource. The dimensions are assumed if possible. * The type is guessed from resource. * * @param source * the source to set. */ public void setSource(Resource source) { if (source != null && !source.equals(this.source)) { this.source = source; final String mt = source.getMIMEType(); if (mimeType == null) { mimeType = mt; } if (mt.equals("image/svg+xml")) { type = TYPE_OBJECT; } else if ((mt.substring(0, mt.indexOf("/")) .equalsIgnoreCase("image"))) { type = TYPE_IMAGE; } else { // Keep previous type } requestRepaint(); } } /** * Sets the object type. *

* This can be one of the following: *

    *
  • TYPE_OBJECT (This is the default) *
  • TYPE_IMAGE *
*

* * @param type * the type to set. */ public void setType(int type) { if (type != TYPE_OBJECT && type != TYPE_IMAGE && type != TYPE_BROWSER) { throw new IllegalArgumentException("Unsupported type"); } if (type != this.type) { this.type = type; requestRepaint(); } } /** * Gets the archive attribute. * * @return the archive attribute. */ public String getArchive() { return archive; } /** * Sets the archive attribute. * * @param archive * the archive string to set. */ public void setArchive(String archive) { if (archive != this.archive || (archive != null && !archive.equals(this.archive))) { this.archive = archive; requestRepaint(); } } /** * Add a click listener to the component. The listener is called whenever * the user clicks inside the component. Depending on the content the event * may be blocked and in that case no event is fired. * * Use {@link #removeListener(ClickListener)} to remove the listener. * * @param listener * The listener to add */ public void addListener(ClickListener listener) { addListener(CLICK_EVENT, ClickEvent.class, listener, ClickListener.clickMethod); } /** * Remove a click listener from the component. The listener should earlier * have been added using {@link #addListener(ClickListener)}. * * @param listener * The listener to remove */ public void removeListener(ClickListener listener) { removeListener(CLICK_EVENT, ClickEvent.class, listener); } @Override public void changeVariables(Object source, Map variables) { super.changeVariables(source, variables); if (variables.containsKey(CLICK_EVENT)) { fireClick((Map) variables.get(CLICK_EVENT)); } } private void fireClick(Map parameters) { MouseEventDetails mouseDetails = MouseEventDetails .deSerialize((String) parameters.get("mouseDetails")); fireEvent(new ClickEvent(this, mouseDetails)); } }