Oh, and the RootPanel way of dynamically adding the plugin's javascript will probably only work in onModuleLoad. The DOM approach I gave should work at any time (i.e. as a response to user action).
On Thu, Mar 12, 2009 at 3:21 PM, Vitali Lovich <[email protected]> wrote: > Uggh - sorry. Gmail decided to send the message for me. I've completed > the class below. > > Anyways, plugins would extend PluginEntry. Again, your GWT would be > reponsible for actually injecting the plugin javascript into your page. Not > sure what the GWT-preferred way would be, but in theory (I haven't tried > this out), you might be able to do a RootPanel.get().add(new HTML("<script > src='plugin/to/load'/>")), although I'd test it first (I highly doubt this > would work). > > A more explicit approach might be: > > Document dom = Document.get(); > Element head = dom.getElementsByTagName("head").getItem(0); > Element pluginScript = dom.createElement("script"); > pluginScript.setPropertyString("src", "plugin.js"); > pluginScript.setPropertyString("type", "text/javascript"); > Document.appendChild(head, pluginScript); > > This should work (assuming the browser supports loading scripts added > dynamically to the head element). I'd recommend testing this on several > browsers - I'm not sure which support it (although I suspect all of the > major ones). > > Good luck. > > On Thu, Mar 12, 2009 at 3:03 PM, Vitali Lovich <[email protected]> wrote: > >> Well, one thing you can do is have the EntryPoint, and just tell plugin >> developers that they have to attach to some particular div element in a >> particular way, as opposed to the traditional root (i.e. >> RootPanel.get("plugin-name-div")). >> >> Then the user can request certain plugins to be added in which your GWT >> code should create the div's for those plugins and load their scripts. >> >> Hope this helps you get started. Also, I would recommend staying away >> from JSNI if you're not doing something that is absolutely not supported >> within the GWT framework. >> >> Just as an extension to the Java approach below, I would prefer something >> like: >> >> public abstract class PluginEntry implements EntryPoint >> { >> String name; >> >> publc PluginEntry(String pluginName) >> { >> name = pluginName; >> } >> >> public final void onModuleEntry() >> { > > RootPanel pluginPanel = RootPanel.get("plugins-location"); > >> pluginPanel.add(new HTML("<div id='" + name + "'></div>")); > > onPluginEntry(RootPanel.get(name)); > >> } >> >> protected abstract void onPluginEntry(RootPanel pluginPanel); > > } >> >> On Thu, Mar 12, 2009 at 2:13 PM, Matías Costa <[email protected]>wrote: >> >>> On Thu, Mar 12, 2009 at 5:40 PM, Rosh PR <[email protected]> wrote: >>> >>>> One of the problems I'm facing over here is how will i compile a >>>> small set of gwt code with out any EntryPoint and use the >>>> generated *javascript* from the framework. I know we can compile >>>> without the Entrypoint but the main problem I'm facing is compiling >>>> code to javascript instead of java classes and loading it to the >>>> framework which will have to use these JS and display the plugin >>>> widget on the framework console on runtime. >>>> >>> >>> Interesting problem. >>> >>> This is going to need some kind of infraestructure and policy. I am just >>> thinking out loud waiting more experienced people point problems and what >>> can work. To start you need two things: >>> >>> a) Know what plugins exists, a registry of plugins >>> b) Attach them into a panel, listen events and useful stuff >>> >>> To install the plugins you can drop them in folder. To know what exists >>> you can do it manually, setting up a file and fetching it from the client >>> side. To do it automatically you can do it server side and rpc-serialize'it >>> to client side. >>> >>> To load them the main problem is obfuscated code. I imagine you can't mix >>> up source comming from different optimizer executions. Let's suposse we can. >>> Then if we know the plugin main object name, we can construct a jsni method >>> to forge a call to the pluing initializer function, with the panel id to be >>> attached. >>> >>> native void initPlugin(String objectName, String panelId) /*-{ >>> var method = "@"+objectName+"::doInit(Ljava/lang/String;)"; >>> eval( method+"('"+panelId+"');" ); >>> >>> >>> >>> }-*/; >>> >>> That should give to the plugin the ability to put itself into the panel >>> and call whatever container hooks needs. >>> >>> Another way is doing plugin static iniatilazation self injection: >>> >>> class CoolPlugin extends Plugin { >>> static { >>> Application.staticSomething.register(new CoolPlugin()); >>> } >>> >>> So the application can take further actions... >>> >>> >>> >>> >>> >> > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/Google-Web-Toolkit?hl=en -~----------~----~----~----~------~----~------~--~---
