0

ユーザーが Sencha の EXT GWT 2.x を使用してコンテキスト メニュー (右クリック メニュー) をアクティブにしたときに、選択したテキストを強調表示したままにする方法を見つけようとしています (ただし、3.x ソリューションがあればそれで問題ありません)。

使用例:

  1. ユーザーは画面上のコンテンツを表示しています。
  2. ユーザーがテキストのブロック (およびフレーズなど) を選択します。
  3. ユーザーは右クリックしてコンテキスト メニューを表示し、選択したテキストに対してアクションを実行してコンテキスト メニューを表示できるようにします。メニューが表示されても、選択したテキストは選択されたままです。

テストでは、メニューが表示されると、GXT コンテキスト メニューがテキストの選択を自動的に解除するように見えます。これを防ぎ、選択したテキストに対してアクションを実行する方法はありますか?

これまでのところ、私は試しました:

a. コンテキスト メニュー イベント ( Events.OnContextMenu) のパネルにリスナーを追加して、変更できるプロパティがあるかどうかを確認します ( contextMenu.disableTextSelection(false)ビューの構築時に既に設定されている場合でも)。

b. ネイティブ メソッドを同じリスナー ( Events.OnContextMenu) に追加することにより、コンテキスト メニューの外観によって作成された選択解除効果をオーバーライドします。次に、JS を使用して現在選択されているテキストを取得し、それを一時変数にコピーして、すぐに追加します。ページの範囲に戻りますが(すでに選択されているテキストを効果的に再選択します)、これも機能しませんでした。ネイティブ メソッドが起動され、テキストが検出され、範囲内にドロップされたように見えることを確認できましたが、おそらく別のイベントが発生するか、メニューが表示される前に選択をクリアする他のアクションが発生するようです。

どんなアイデアでも大歓迎です。

4

1 に答える 1

0

私はまだ公式の解決策を認識しておらず、これは GXT 2.x のバグであると考え始めていますが、回避策を見つけることができたので、他の誰かが同様の問題に遭遇した場合に備えてここに投稿しています。 .

まず、この問題は IE ではなく Firefox で発生するようです。Firefox の場合、次のように動作しました (概要の後のコード スニペットの例)。

  1. Events.OnContextMenuコンポーネント/コンテナ/パネル/etc のイベントにリスナーを追加します。
    • メソッドをオーバーライドし、handleEventJS を使用してユーザーが画面上のテキストを選択したかどうかを検出するネイティブ メソッドを追加します。テキストが選択されている場合は、それを JavaScriptObject (GWT によって提供される JS オブジェクトの不透明なラッパー。詳細については GWT のドキュメントを参照してください) に保存します。
  2. Events.Showコンテキスト メニュー オブジェクト のイベントにリスナーを追加します。
    • メソッドをオーバーライドし、handleEventJS を使用して以前の選択を再選択するネイティブ メソッドを追加します。
  3. Events.Hideコンテキスト メニュー オブジェクト のイベントにリスナーを追加します。
    • handleEvent メソッドをオーバーライドし、選択変数をクリアしてから、ネイティブ メソッドを実行して残りの選択をクリアします (必要な場合)。

これらの手順を使用して、Firefox でコンテキスト メニューを表示するときにテキストを選択したままにすることができました。

サンプル コード
(これらは、手順をよりよく説明するための単なるサンプル コード ブロックです。このコードをコピーして貼り付けても、必要なすべてが得られるわけではありません)

public class ContextMenuExample {

    JavaScriptObject selection;
    Menu contextMenu = new Menu();

  public void buildPanelExample() {

    ContentPanel panel = new ContentPanel();  
    panel.addListener(Events.onContextMenu, new Listener<BaseEvent>() {
      if (!GXT.isIE) {
        selection = findSelectedTextOnScreen();
      }
    });

    contextMenu.addListener(Events.Show, new Listener<BaseEvent>() {
      if (!GXT.isIE) {
        reSelectText(selection);
      }
    });

    contextMenu.addListener(Events.Hide, new Listener<BaseEvent>() {
      if (!GXT.isIE) {
        clearSelection();
      }
    });

    private native JavaScriptObject findSelectedTextOnScreen() /*-{
      // use JS method to get selected text as a range
      return selectedText;
    }-*/;

    private native void reSelectedText(JavaScriptObject range) /*-{
      // use JS method to find a range a select it
    }-*/;

    private native void clearSelection() /*-{ 
      // us JS to clear any selected ranges 
    }-*/;

    private void clearSelections() {
      selection = null;
      clearSelection();
    }

  }
}
于 2012-08-31T17:15:15.173 に答える