2011-10-23 4 views
0

ブラウザプラグインをコーディングしました。それは 'mycustomevent'のようなカスタムイベントを発生させます。これらのカスタムイベントをGWTに取り込む(つまり、リスナーを割り当てる)必要があります。ここにGWTのプラグインクラスがあります。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(); 
    } 
} 

ここでは、私のビュー(gwtpを使用しています)にどのように追加していますか?それは追加されているし、ページで正しく機能していると私はJSNIとgwtからそのjs関数を呼び出すことができます。

@Inject 
public MyPageView(){ 

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

プラグインから起動されたイベントにハンドラを割り当てる必要があります。私はプレゼンターで次のことをすることができるようにしたいと思いますが、これまでのところ私はそれを繋ぐことができませんでした。

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

上記にはいくつかのクラスが追加されています。私は定義されたMyCustomEventクラス、定義されたEventHandlerを拡張するMyCustomEventHandlerインターフェース、HasHandlersを定義したHasMyCustomEventHandlerインターフェースを持っています。私は簡潔にそれらを省略しました、私は助けるかもしれない何かを追加してうれしいです。

私はイベントリスナーを裸のjsに追加できます。

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

イベントをキャッチすると(foo()が呼び出されるたびに)、イベントが発生すると確信しています。

私はPluginObjectクラスに以下を追加しようとしましたが、これは私が検索したものから推測しているだけです。それは働いていません。

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

ここで適切なアプローチは何ですか?

答えて

0

ここで私はPluginObjectでやりました。私はそれを改善する方法を聞くのが大好きです。私はsubscribeToBrowserEvents()と 'this'への参照についてしばらくぶらぶらしてしまいました。当初はaddEventメソッドを呼び出していました。

[email protected] 

実行時に間違った場所を参照していました。この問題の詳細はthis bit of the JSNI docsにあります。楽しい。

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]::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); 
} 
}