Подавить контекстное меню, вызываемое щелчком мыши, gwt 1.6 - PullRequest
2 голосов
/ 20 мая 2009

Мое приложение gwt 1.6 перехватывает щелчки мышью по гиперссылкам, поэтому, когда пользователь щелкает по ссылкам на «авторов», нажимая клавишу «Shift», он получает диалоговое окно «Редактировать ...» вместо перехода на страницу автора. Это хорошо работает.

Теперь я бы хотел, чтобы пользователь мог удерживать нажатой клавишу «Control», чтобы выбрать более одного автора, но я не могу понять, как отключить всплывающее меню браузера по умолчанию. Этот код корректно обрабатывает нажатие клавиш Shift, но происходит сбой в размещенном браузере, когда я управляю щелчком мыши, и пол-сбои в 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, никогда не вызывается.

Ответы [ 2 ]

1 голос
/ 23 мая 2009

IIRC ctrl + щелчок - это правильный способ выбора нескольких элементов, а не ctrl + щелчок правой кнопкой мыши, если только вы не используете однокнопочную мышь (iMac), в этом случае я не могу вам помочь.

Не могли бы вы предоставить более подробную информацию?

Edit:

Почему бы не переопределить контекстное меню (например, отключить его), а затем создать собственный виджет контекстного меню (возможно, на основе вертикальных MenuBar + MenuItems) и отображать его только по Ctrl + RightClick?

Другими словами, вы бы создали 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 голосов
/ 21 мая 2009

Я все ближе:


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

<p>protected native void addContextMenuEventListener(Element elem) /<em>-{
    elem.oncontextmenu = function(e) {
      return false; // TODO: only return false if control key down...
    };
  }-</em>/;
Это полностью отключает контекстное меню; Я бы очень хотел отключить его ТОЛЬКО при нажатии клавиши управления ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...