私は SWT (JFace なし) で作業しており、サイドバーを使用しているツリーの動作をカスタマイズしようとしています。
ツリーの最上位の項目は選択できないようにする必要があります。それらは基本的にヘッダーです。これらのアイテムの子のみを選択可能にする必要があります。結果として、これを示す方法で UI を動作させたいと考えています。これらの最上位アイテムの 1 つをクリックすると、展開または縮小する必要がありますが、インジケーターの状態が変化し、子の可視性が変化する以外に、視覚的なフィードバックを提供するべきではありません。
問題は、OS X では、展開/折りたたみインジケーターが右または下を指す三角形 (画像か Unicode 文字かは不明) であり、「選択」状態に基づいて色付けされていることです。 . 矢印の色が変わることを除いて、トップレベルのアイテムに関連するすべての動作をオーバーライドすることができました。
SWT.EraseItem
背景の色が変わらないように、リスナーを使用して背景の描画にフックしました。これは期待どおりに機能します。- リスナーを使用
SWT.PaintItem
して、最上位アイテムのテキストの色が変わらないようにしました。これは期待どおりに機能しますが、インジケーターに影響を与えていないようです。GC の前景色をリセットしないことも試みましたが、インジケーターの色は変わります。
未選択:
選択済み
私がやろうとしたことのいくつかは、すべて失敗しました:
インジケーターの上に長方形を描くだけです。PaintListener を何にアタッチしても、インジケーターは常に一番上にあるようです。
Selection イベント タイプでリスナーを使用し、最上位の項目の 1 つであるかどうかを確認してから
event.item
、イベント ビットと再描画フラグをいじります。これはまったくうまくいかないようです。動作は完全に予測不可能です。コードは次のようになります。sideBar.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { TreeItem eventItem = (TreeItem) event.item; if(sideBarRoots.contains(event.item)) { event.detail = 0; event.type = 0; event.doit = false; sideBar.setRedraw(false); } else { sideBar.setRedraw(true); event.type = SWT.Selection; event.doit = true; } } });
再描画フラグは単なるヒントであるため、適切に設定される場合と設定されない場合があります。効果がないか、サイドバーに何も再描画されない状態にロックされる可能性があります。
この動作の多くが、基礎となるネイティブ ウィジェットの動作と密接に関連していることは承知していますが、カスタム ウィジェットを最初からロールバックすることなく、探している動作を取得する方法があるかどうか疑問に思っていました。