Open Flash Chart and Wicket has been edited by Ryan McKinley (Dec 05, 2008).

(View changes)

Content:

Here is a starter to use Open Flash Charts and Wicket:

/**
 * @see <a href="" class="code-quote">"http://code.google.com/p/swfobject/">SWFObject</a>
 */
public class OpenFlashChart extends Panel implements IResourceListener
{
  static final ResourceReference SWF = new ResourceReference( OpenFlashChart.class, "open-flash-chart.swf" );
  
  final WebResource jsonResource;
  final SWFObject swf;
  final IModel<Chart> chart;

  public OpenFlashChart(final String id, final IModel<Chart> chart, final int width, final int height) 
  {
    this( id, chart, width+"", height+"" );
  }
  
  public OpenFlashChart(final String id, final IModel<Chart> chart, final String width, final String height) 
  {
    super(id);
    this.chart = chart;
    
    final IResourceStream json = new AbstractStringResourceStream( "text/plain") {
      @Override
      public String getString() {
        return chart.getObject().toString();
      }
    };

    jsonResource = new WebResource() {
      @Override
      public IResourceStream getResourceStream() {
        return json;
      }
    };
    jsonResource.setCacheable(false);
    
    String swfURL = RequestUtils.toAbsolutePath( urlFor( SWF ).toString() );
    swf = new SWFObject( "chart", swfURL, "500", "300" );
    add( swf );
  }
  
  @Override
  protected void onBeforeRender() {
    CharSequence dataPath = 
      RequestCycle.get().urlFor(OpenFlashChart.this, IResourceListener.INTERFACE); 
    
    String data = "" dataPath.toString() );
    
    swf.setFlashvar( "data-file", data );
    swf.setParam( "allowScriptAccess", "sameDomain" );
    
    super.onBeforeRender();
  }

  /**
   * Actually handle the request
   */
  public void onResourceRequested() {
    jsonResource.onResourceRequested();
  }
}

Here is the general component to show SWF data:

public final class SWFObject extends Panel {
  private static int foID = 100;
  
  private static final IModel<String> DEFAULT_ALTERNATIVE_CONTENT = new Model<String>(
      "<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 static final String NL = "\r\n";
 
  final Map<String, CharSequence> flashvars = new HashMap<String, CharSequence>();
  final Map<String, CharSequence> params = new HashMap<String, CharSequence>();
  
  final String flashObjectID;

  
  public SWFObject(String id, final String swfFullURL, final String width, final String height) {
    this(id, swfFullURL, width, height, "9", null);
  }
   
  public SWFObject(String id, final String swfFullURL, 
      final String width, final String height, 
      final String flashMinimumVersion,  Object alternative ) 
  {
    super(id);
    flashObjectID = "swf"+(foID++);
    
    // Add a header contributor
    add (HeaderContributor.forJavaScript(
        new ResourceReference(SWFObject.class, "swfobject.js") ) );
    
    
    final WebMarkupContainer swf = new WebMarkupContainer("swf");
    swf.setOutputMarkupId(true);
    add(swf);
     
    add(new Label("js", new AbstractReadOnlyModel<String>() {
      @Override
      public String getObject() {
        StringBuilder b = new StringBuilder(512);
         

//        var so = new SWFObject("/TTT/files/open-flash-chart.swf", "chart", "500", "300", "9", "#FFFFFF");
//        so.addVariable("data-file", "/data.json" );
//        so.addParam("allowScriptAccess", "sameDomain");
//        so.write("my_chart");
        
        b.append("<script type=\"text/_javascript_\">").append(NL)
         .append("<!--/*--><![CDATA[/*><!--*/").append(NL)
         .append("var "+flashObjectID+" = new SWFObject(\"")
         .append(swfFullURL).append("\",\"")
         .append( "xxxxxxxx\", \"") //swf.getMarkupId()).append("\"
         .append(width).append("\",\"")
         .append(height).append("\",\"")
         .append(flashMinimumVersion).append("\");" ).append( NL );
//        
//         .append(
//           RequestUtils.toAbsolutePath(urlFor(
//             new ResourceReference(SWFObject.class, "expressInstall.swf")).toString())).append("\"");
//         
        if (!flashvars.isEmpty()) {
          for( Map.Entry<String, CharSequence> entry : flashvars.entrySet() ) {
            b.append( flashObjectID ).append( ".addVariable(\"" )
             .append( entry.getKey()).append( "\", \"" )
             .append( entry.getValue() ).append( "\" );" ).append( NL );
          }
        }
         
        if (!params.isEmpty()) {
          for( Map.Entry<String, CharSequence> entry : params.entrySet() ) {
            b.append( flashObjectID ).append( ".addParam(\"" )
             .append( entry.getKey()).append( "\", \"" )
             .append( entry.getValue() ).append( "\" );" ).append( NL );
          }
        }
         
        b.append( flashObjectID ).append( ".write( \"" )
         .append( swf.getMarkupId()).append("\");").append( NL );
        
        b.append("/*-->]]>*/").append(NL);
        b.append("</script>");
        return b.toString();
      }
    }).setRenderBodyOnly(true).setEscapeModelStrings(false));
    
    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);
  }

  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, CharSequence value) {
    flashvars.put(name, value);
  }
   
  public void unsetFlashvar(String name) {
    flashvars.remove(name);
  }
   
  public void setParam(String name, CharSequence value) {
    params.put(name, value);
  }
   
  public void unsetParam(String name) {
    params.remove(name);
  }
}

Reply via email to