2009-05-20 9 views
2

My gwt 1.6アプリケーションがハイパーリンクのマウスクリックを傍受するため、ユーザーが「著者」へのリンクをShift-クリックすると、著者のページに移動する代わりにEdit ...ダイアログボックスが表示されます。ページ。それはうまくいきます。コントロールのクリックのコンテキストメニューを抑制する、gwt 1.6

私は、ユーザーが複数の著者を選択するためにコントロールをクリックできるようにしたいと思いますが、ブラウザのデフォルトのポップアップメニューを非表示にする方法を理解できません。このコードはシフトクリックを正しく処理しますが、私は時を制御クリックホストされているブラウザに失敗し、Firefoxで半失敗(handleCtrlClick()と呼ばれるが、私はまだブラウザのメニューを取得します):


    public void onModuleLoad() { 
    Event.addNativePreviewHandler(this); 
    } 

    // 
    // Preview events-- look for shift-clicks on paper/author links, and pops up 
    // edit dialog boxes. 
    // And looks for control-click to do multiple selection. 
    // 
    public void onPreviewNativeEvent(Event.NativePreviewEvent pe) { 
    NativeEvent e = pe.getNativeEvent(); 
    switch (Event.getTypeInt(e.getType())) { 
    case Event.ONCLICK: 
     if (e.getShiftKey()) { handleShiftClick(e); } 
     if (e.getCtrlKey()) { handleCtrlClick(e); } 
     break; 
    case Event.ONCONTEXTMENU: 
     if (e.getCtrlKey()) { // THIS IS NOT WORKING... 
     e.preventDefault(); 
     e.stopPropagation(); 
     } 
     break; 
    } 
    } 

ブレークポイントONCONTEXTMENUの中にセットされたケースは決して呼び出されません。

答えて

0

私は近づいています:


    public void onModuleLoad() { 
    Event.addNativePreviewHandler(this); // Catch shift- or control- clicks on links 
    addContextMenuEventListener(RootPanel.getBodyElement()); 
    }

protected native void addContextMenuEventListener(Element elem) /-{ elem.oncontextmenu = function(e) { return false; // TODO: only return false if control key down... }; }-/;

これは、右クリックメニューを完全に無効にします。コントロールキーが押された場合にのみ無効にしたいのですが...

1

マウスを使用していない限り、Ctrl +右クリック以外の複数の項目を選択するには、IIRC Ctrl +クリックが正しい方法です(iMac )、その場合私はあなたを助けることができません。

詳細を教えてください。

編集:

なぜ、(おそらく垂直メニューバー+のMenuItemに基づいて)独自のコンテキストメニューウィジェットを作成し、唯一のCtrl +右クリックでそれを表示する(例えば、それを無効にする)コンテキストメニューを無効にしませんか?言い換えれば

あなたは多少この(擬似コード)のようなMouseHandlerを作成したい:

public void onMouseDown(MouseDownEvent event) { 
    Widget sender = (Widget) event.getSource(); 

    int button = event.getNativeButton(); 


    if (button == NativeEvent.BUTTON_LEFT) { 
     if(event.is_ctrl_also) 
     { 
      // Add to selection 
      selection = selection + sender; 
     } 
     else 
     { 
      // Lose selection and start a new one 
      selection = sender; 
     } 
    } 
    else if(button == NativeEvent.BUTTON_RIGHT) { 
     if(event.is_ctrl_also) 
     { 
      // show context menu 
      this.contextmenu.show(); 
     } 
     else 
     { 
      // do something else 
     } 
    } 

    return; 
} 

が、私はCtrlキーを押しながらLeftclickがたContextMenuイベントを発射してバグに遭遇していませんでしたが、私はあなたの確信しています順列を使ってFirefoxを回避することもできます。

+0

希望する動作: コントロール左クリック:複数選択 右クリック:ブラウザのメニューをポップアップします。 問題は、Firefox(少なくとも)はコントロールの左クリックを右クリックと同じように扱うことです(oncontextmenuイベントを発生させます)。 – gavinandresen