カスタム・コンポーネントにおけるベース・テキスト方向の制御

このセクションは、JViews リッチ・クライアントに適用されます。
カスタム・グラフィック・オブジェクトがプリミティブであり (コンテナーではない)、テキストを含まない場合は、何も行う必要はありません。
カスタム・グラフィック・オブジェクトにテキストが含まれているか、あるいは、テキストのある子オブジェクトを含むコンテナーである場合は、2 つの方法が使用可能です。

IlvBaseTextDirectionInterface のメソッドの使用

これは、IlvGraphic のサブクラスではないオブジェクトに必要とされる最小限の機能です。 すべての IlvGraphic オブジェクトでも、このインターフェースを実装します。 テキストを表示するコンテナーはいずれも、IlvBaseTextDirectionInterface を実装する必要があります。
このインターフェースは、以下のメソッドを定義します。
  • public void setBaseTextDirection(int textDir) は、オブジェクトのベース・テキスト方向を変更します。
  • public int getBaseTextDirection() は、オブジェクトの保管されたベース・テキスト方向を返します。
  • public int getResolvedBaseTextDirection() は、LTRRTL、あるいは Contextual のいずれか 1 つのみを返します。GUI の「コンポーネントの向き」を考慮に入れて、コンポーネント方向を解決する必要があります。 継承方向は、親コンテナー (ある場合) の解決済みベース・テキスト方向を考慮に入れて、解決する必要があります。 親コンテナーがない場合は、デフォルト値として LTRRTL、または Contextual の 1 つを返す必要があります。
これらのメソッドを最初から実装するには、JViews のベース・テキスト方向に対する制御のロジックとメカニズムを詳細に理解している必要があります。 そうした知識がない場合には、より簡単な方法を使用することができます。 「IlvGraphic のサブクラスの使用」を参照してください。

IlvGraphic のサブクラスの使用

IlvBaseTextDirectionInterface のメソッドの使用 で述べた public メソッドと、ベース・テキスト方向を扱うために使用されるその他のいくつかのメソッドが、クラス IlvGraphic で使用可能です。カスタム・グラフィック・オブジェクトでベース・テキスト方向を制御するためには、このクラスを拡張して、そこに既に実装されている BIDI 機能を使用することができます。 それを行う最も簡単な方法は、IlvBidiGraphic を基本クラスとすることで、これには、IlvBaseTextDirectionInterface のすべてのメソッドの完全な実装が含まれています。
IlvBidiGraphic のサブクラスは以下を実装しています。
  • public boolean isBaseTextDirectionSensitive()。これは、解決済みベース・テキスト方向がグラフィック・オブジェクトのバウンディング・ボックスに何らかの影響を与える場合に true を返します。
  • public boolean usesBidiMarkers()。 インプレース編集の実装が BIDI マーカーを使用する場合に true を返します。 IlvBidiGraphic から実装している場合は、常に false を返します。
  • public void baseTextDirectionChanged(int, int)。これは、解決済みベース・テキスト方向が変更されると常に対応します。 例えば、内部の描画キャッシュが解決済みベース・テキスト方向により影響を受けると、それらはこのメソッド内で削除されます。 現行クラスが IlvGraphicBag の場合は、実装ですべての内包サブオブジェクトに対して baseTextDirectionChanged(int, int) を繰り返し呼び出す必要はありません。IlvBidiGraphic の実装が自動的にこれを行います。
  • public void draw(Graphics, IlvTransformer)。これは、解決済みベース・テキスト方向を考慮して、テキストを描写します。
  • public IlvRect boundingBox(IlvTransformer)。これは、解決済みベース・テキスト方向を考慮します。
  • containsintersectsinside などの他のメソッドの実装でも、解決済みベース・テキスト方向を考慮に入れる必要がある場合があります。
IlvBidiGraphic を基本クラスとして使用できない場合、直接 IlvGraphic にサブクラスを作成することができます。
IlvGraphic に含まれている実装は空であるか、あるいは部分的でしかないため、以下のようにさらに多くのメソッドを実装する必要があります。
  • baseTextDirection を Bean プロパティーとして定義します。
  • setBaseTextDirection および getBaseTextDirection を実装します。
    int _baseTextDirection;
    
    public void setBaseTextDirection(int baseTextDirection)
    {
      if (baseTextDirection == _baseTextDirection)
          return;
      int oldBTDir = getResolvedBaseTextDirection();
      _baseTextDirection = baseTextDirection;
      int newBTDir = getResolvedBaseTextDirection();
      if (oldBTDir != newBTDir)
          baseTextDirectionChanged(oldBTDir, newBTDir);
    }
    
    public int getBaseTextDirection()
    {
      return _baseTextDirection;
    }
  • クラスが IlvGraphicSet である場合、以下のように、解決済みベース・テキスト方向が変更されたときにすべての内包オブジェクトに通知する別のバリアントを使用する必要があります。
    int _baseTextDirection;
    
    public void setBaseTextDirection(int baseTextDirection)
    {
      if (baseTextDirection == _baseTextDirection)
          return;
      IlvGraphicVector v = IlvGraphicUtil.startBidiChange(this);
      try {
          _baseTextDirection = baseTextDirection;
      } finally {
          // this calls applyToObject on all contained objects
          // and calls baseTextDirectionChanged on this and all
          // contained objects when needed.
          IlvGraphicUtil.stopBidiChange(this, v, false);
      } 
    }
    
    public int getBaseTextDirection()
    {
      return _baseTextDirection;
    }
  • setBaseTextDirectionDuringConstruction をオーバーライドすると、通知せずにデータ・メンバーを変更します。
    protected void setBaseTextDirectionDuringConstruction(int baseTextDirection)
    {
      _baseTextDirection = baseTextDirection;
    }
IlvBidiGraphic について、既に述べた他のメソッドをオーバーライドします。(詳細については、[タイトルなし] にリストされているメソッドを参照してください。)

レンダリング

どのアプローチ (IlvBaseTextDirectionInterface メソッド、あるいは、IlvGraphic のサブクラス) を採用したとしても、テキストがレンダリングされるときには、その実際のベース・テキスト方向を実施する必要があります。
JViews には、以下の技法があります。
  • テキストの表示に TextLayout.draw が使用される場合に TextLayout 属性を使用。
  • テキストの表示に Graphics2D.drawString が使用される場合に、ユニコード制御文字を使用。
  • テキストの表示に Graphics2D.drawGlyphVector が使用される場合に BIDI テキスト再配列用の ICU を使用。
  • テキストが Swing 入力フィールドを使用して表示される場合に、Swing API (例えば、applyComponentOrientation) を使用。