2011-10-23 3 views
0

Nous avons codé un plugin de navigateur. Il déclenche des événements personnalisés tels que 'mycustomevent'. Je dois incorporer (c'est-à-dire affecter des auditeurs pour) ces événements personnalisés dans GWT. Voici ma classe de plugin dans GWT.événements de plugin personnalisés dans GWT

class PluginObject extends Composite implements HasMyCustomEventHandler{ 
    private Element plugin; 
    private HTML html; 
    private HandlerManager handlerManager; 

    public PluginObject(){ 
     handlerManager = new HandlerManager(this); 
     html = new HTML("<object id='plugin0' type='application/x-ourplugin' width='300' height='300'>" 
         +"<param name='onload' value='pluginLoaded' />" 
         +"</object>"); 
     initWidget(html); 
     plugin = html.getElement().getFirstChildElement(); 
    } 
} 

Voici comment je l'ajoute dans ma vue (j'utilise gwtp). Il est ajouté et fonctionne correctement dans la page et je peux appeler ses fonctions js de gwt avec JSNI.

@Inject 
public MyPageView(){ 

    ... 
    plugin = new PluginObject(); 
    panel.add(plugin); 
} 

Je dois pouvoir affecter des gestionnaires pour les événements déclenchés par le plugin. Je voudrais être en mesure de faire ce qui suit dans mon présentateur, mais jusqu'à présent, j'ai été incapable de le brancher.

@Override 
protected void onBind(){ 
    super.onBind(); 
    registerHandler(getView().getPluginObject().addMyCustomEventHandler(
     new MyCustomEventHandler() { 
      @Override 
      public void onMyCustomEvent(MyCustomEvent event) { 
       // call some other presenter stuff here... 
      } 
     })); 
} 

Ce qui précède mentionne quelques classes supplémentaires. J'ai une classe MyCustomEvent définie, une interface MyCustomEventHandler qui étend EventHandler défini, et une interface HasMyCustomEventHandler qui étend HasHandlers défini mais après les avoir tous câblés, je n'ai rien. Je les ai omis pour la brièveté, je serais heureux d'ajouter quelque chose qui pourrait aider.

Je peux ajouter des écouteurs d'événement dans js.

obj.addEventListener("mycustomevent", function(){ foo(); }, false); 

et attraper l'événement (foo() est appelée) à chaque fois, donc je suis confiant que les événements sont tirés.

J'ai essayé d'ajouter ce qui suit à ma classe PluginObject, mais c'est juste que je devine des choses que j'ai trouvées en train de chercher. Cela n'a pas fonctionné.

public HandlerRegistration addMyCustomEventHandler(MyCustomEventhandler handler){ 
    return handlerManager.addHandler(MyCustomEvent.TYPE, handler); 
} 

Quelle est la bonne approche ici?

Répondre

0

Voici ce que j'ai fini par faire dans le PluginObject. J'aimerais entendre des façons de l'améliorer. J'ai raccroché un moment sur subscribeToBrowserEvents() et la référence à 'this'. Initialement, j'appelais la méthode addEvent et je me référais à

[email protected] 

Qui référençait le mauvais endroit lors de l'exécution. Plus sur le problème ici this bit of the JSNI docs. Prendre plaisir.

class PluginObject extends Composite implements HasMyCustomEventHandler{ 

public PluginObject(){ 
    handlerManager = new HandlerManager(this); 

    html = new HTML("<object id='plugin0' type='application/x-myplugin' width='300' height='300'>" 
         +"<param name='onload' value='pluginLoaded' />" 
         +"</object>"); 
    initWidget(html); 
    plugin = html.getElement().getFirstChildElement();  
} 

public void bindBrowserEvents(){ 
    subscribeToBrowserEvents(plugin); 
} 

public void eventHandlerMethod(String message){ 
    MyCustomEvent event = new MyCustomEvent(message);  
    fireEvent(event); 
} 
@Override 
public void fireEvent(GwtEvent<?> event){ 
    handlerManager.fireEvent(event); 
} 

public native void subscribeToBrowserEvents(Element eventObject) /*-{ 

    var pluginReference = this; 

    // bind the listener 
    function addEvent(obj, name, func) 
    { 
     if (window.addEventListener) { 
      obj.addEventListener(name, func, false); 
     } else { 
      obj.attachEvent("on"+name, func); 
     } 
    } 

    addEvent(eventObject.br,'mycustomevent', 
     function(message){ 
      [email protected].SomeTest2.client.core.PluginObject::eventHandlerMethod(Ljava/lang/String;)(message); 
     }); 
}-*/; 

@Override 
protected void onAttach(){ 
    super.onAttach(); 
    // bind in the onAttach, it was not working earlier. I assume the plugin needs to exist before the bindings will work 
    bindBrowserEvents(); 
} 

@Override 
public HandlerRegistration addMyCustomEventHandler(MyCustomEventHandler handler) 
{ 
    return handlerManager.addHandler(MyCustomEvent.TYPE, handler); 
} 
} 
Questions connexes