JavaTM 2
Platform
Std. Ed. v1.4.0

javax.swing.plaf.basic
クラス BasicTextUI

java.lang.Object
  |
  +--javax.swing.plaf.ComponentUI
        |
        +--javax.swing.plaf.TextUI
              |
              +--javax.swing.plaf.basic.BasicTextUI
すべての実装インタフェース:
ViewFactory
直系の既知のサブクラス:
BasicEditorPaneUI, BasicTextAreaUI, BasicTextFieldUI, DefaultTextUI

public abstract class BasicTextUI
extends TextUI
implements ViewFactory

テキストコンポーネントの Look & Feel の基礎となるクラスです。このクラスは、JTextComponent の拡張のための Look & Feel を作成するときに便利な、エディタのビューおよびコントローラの基本的なサービスを提供します。

多くの場合、状態は関連する JTextComponent にバウンドプロパティとして保持されており、UI では各プロパティのデフォルト値がインストールされます。このデフォルトの動作により、すべてのプロパティに対して値がインストールされますが、通常、Look & Feel の実装ではさらに多くのことが行われます。Look & Feel の実装により、少なくともキーバインディングがインストールされるのが普通です。

また、JTextComponent に関連した DocumentAbstractDocument のサブクラスである場合、このクラスは並行サポートも提供します。View または View 階層へのアクセスは、モデルを変更するスレッドと、描画したいモデルとビュー間の座標変換を行なったりするための Swing イベントスレッドとの間で直列化されます。ルートビューにアクセスするには、最初に AbstractDocument の読み込みロックを取得して、そのロックを最終ブロックで解放する必要があります。

定義する必要がある重要なメソッドは、UIManager からデフォルトの値を取り出すために使われるキーの基礎である getPropertyPrefix() メソッドです。取得した文字列は、名前の特定の Look & Feel 部分 (Metal、Motif など) のない TextUI の型 (TextField、TextArea など) を反映します。

モデルのビューを構築するには、次に示す方法のどれかを使います。

  1. 1 つの方法は、単純に UI で ViewFactory インタフェースを定義し直すことです。デフォルトでは、この UI はそれ自体が View の実装のファクトリとして動作します。これは、単純なファクトリに便利です。この方法を実行するには、create(javax.swing.text.Element) メソッドを実装し直します。
  2. さらに複雑なドキュメントを作成する場合の一般的な方法は、EditorKit の実装がファクトリを返すようにすることです。EditorKit はある種のドキュメントを維持するために必要なものをすべて結び付けるので、通常、ファクトリは重要な役割を担います。この場合、ファクトリは EditorKit の実装によって作成されます。
  3. あまり一般的ではない方法として、UI の実装にファクトリの別のオブジェクトを作成させる方法があります。そのためには、ファクトリを返すように #createViewFactory メソッドを実装し直す必要があります。

警告: このクラスの直列化されたオブジェクトは、今後の Swing リリースとの互換性がなくなります。現在の直列化のサポートは、短期記憶や、同じバージョンの Swing を実行するアプリケーション間の RMI に適しています。バージョン 1.4 の時点では、JavaBeans の長期記憶用のサポートは、すべて java.beans パッケージに追加されています。XMLEncoder を参照してください。


入れ子クラスの概要
static class BasicTextUI.BasicCaret
           
static class BasicTextUI.BasicHighlighter
           
 
コンストラクタの概要
BasicTextUI()
          新しい UI を作成します。
 
メソッドの概要
 View create(Element elem)
          要素のビューを作成します。
 View create(Element elem, int p0, int p1)
          要素のビューを作成します。
protected  Caret createCaret()
          キャレットに使うオブジェクトを作成します。
protected  Highlighter createHighlighter()
          ハイライトを追加するために使うオブジェクトを作成します。
protected  Keymap createKeymap()
          テキストコンポーネントに使うキーマップを作成し、それに必要なバインディングをインストールします。
 void damageRange(JTextComponent tc, int p0, int p1)
          モデルの指定された部分に対応するビューの部分がペイントし直されます。
 void damageRange(JTextComponent t, int p0, int p1, Position.Bias p0Bias, Position.Bias p1Bias)
          モデル内の指定された一部分に対応するビューの部分が描画し直されます。
protected  JTextComponent getComponent()
          この UI の実装に関連したテキストコンポーネントを取得します。
 EditorKit getEditorKit(JTextComponent tc)
          UI の EditorKit を取得します。
protected  String getKeymapName()
          この UI にデフォルトでインストールまたは使用されるキーマップの名前を取得します。
 Dimension getMaximumSize(JComponent c)
          エディタコンポーネントの最大サイズを返します。
 Dimension getMinimumSize(JComponent c)
          エディタコンポーネントの最小サイズを返します。
 int getNextVisualPositionFrom(JTextComponent t, int pos, Position.Bias b, int direction, Position.Bias[] biasRet)
          キャレットが配置される可能性のある、視覚的に表された次のモデル位置を決定する手段を提供します。
 Dimension getPreferredSize(JComponent c)
          エディタコンポーネントの適切なサイズを取得します。
protected abstract  String getPropertyPrefix()
          UIManager を使ってプロパティを参照するためのキーとして使われる名前を返します。
 View getRootView(JTextComponent tc)
          モデルが空間的にどのように表現されているかを判定するためにトラバースすることのできる、関連したテキストコンポーネント (すなわち階層のルート) を割り当てられた View を取得します。
 String getToolTipText(JTextComponent t, Point pt)
          渡された位置でツールヒントとして使われる文字列を返します。
protected  Rectangle getVisibleEditorRect()
          ルート View に指定する割り当てを取得します。
protected  void installDefaults()
          フォント、フォアグラウンド、バックグラウンド、キャレットの色、選択の色、選択されたテキストの色、無効になったテキストの色、ボーダの色などのコンポーネントプロパティを初期化します。
protected  void installKeyboardActions()
           
protected  void installListeners()
          UI のリスナーをインストールします。
 void installUI(JComponent c)
          コンポーネントの UI をインストールします。
protected  void modelChanged()
          モデルの変更にフラグを立てます。
 Rectangle modelToView(JTextComponent tc, int pos)
          モデル内の指定された位置を、ビュー座標体系内の場所に変換します。
 Rectangle modelToView(JTextComponent tc, int pos, Position.Bias bias)
          モデル内の指定された位置を、ビュー座標体系内の場所に変換します。
 void paint(Graphics g, JComponent c)
          インタフェースをペイントします。
protected  void paintBackground(Graphics g)
          ビューのバックグラウンドをペイントします。
protected  void paintSafely(Graphics g)
          このスレッドのビューからモデルが変更されないという保証付きで、安全にインタフェースをペイントします。
protected  void propertyChange(PropertyChangeEvent evt)
          関連する JTextComponent でバウンドプロパティが変更されたときに呼び出されます。
protected  void setView(View v)
          ビュー階層の現在のルートを設定し、invalidate() を呼び出します。
protected  void uninstallDefaults()
          null に明示的にオーバーライドされていないコンポーネントプロパティを設定します。
protected  void uninstallKeyboardActions()
           
protected  void uninstallListeners()
          UI のリスナーをアンインストールします。
 void uninstallUI(JComponent c)
          コンポーネントの UI をアンインストールします。
 void update(Graphics g, JComponent c)
          スーパークラスは制御不可能な方法でバックグラウンドをペイントします。
 int viewToModel(JTextComponent tc, Point pt)
          ビュー座標体系内の指定された位置を、モデル内の最も近い場所に変換します。
 int viewToModel(JTextComponent tc, Point pt, Position.Bias[] biasReturn)
          ビュー座標体系内の指定された位置を、モデル内の最も近い場所に変換します。
 
クラス javax.swing.plaf.ComponentUI から継承したメソッド
contains, createUI, getAccessibleChild, getAccessibleChildrenCount
 
クラス java.lang.Object から継承したメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

コンストラクタの詳細

BasicTextUI

public BasicTextUI()
新しい UI を作成します。

メソッドの詳細

createCaret

protected Caret createCaret()
キャレットに使うオブジェクトを作成します。デフォルトでは、BasicCaret のインスタンスが生成されます。このメソッドを定義し直すと、InputPosition インタフェースを実装するほかのクラス、または JCaret のサブクラスを提供できます。

戻り値:
キャレットオブジェクト

createHighlighter

protected Highlighter createHighlighter()
ハイライトを追加するために使うオブジェクトを作成します。デフォルトでは、BasicHighlighter のインスタンスが生成されます。このメソッドを定義し直すと、Highlighter インタフェースを実装するほかのクラス、または DefaultHighlighter のサブクラスを提供できます。

戻り値:
ハイライタ

getKeymapName

protected String getKeymapName()
この UI にデフォルトでインストールまたは使用されるキーマップの名前を取得します。これは、クラス名に基づいて名前を作成するために実装されます。名前は、パッケージの接頭辞が削除されたクラス名です。

戻り値:
名前

createKeymap

protected Keymap createKeymap()
テキストコンポーネントに使うキーマップを作成し、それに必要なバインディングをインストールします。デフォルトでは、キーマップはこの型の TextUI のすべてのインスタンスで共有されます。キーマップの名前は、getKeymapName メソッドで定義されます。キーマップが見つからない場合は、JTextComponent の DEFAULT_KEYMAP が使われます。

キーマップを作成するために使われるバインディングのセットは、getPropertyPrefix() メソッドと文字列 .keyBindings を結合したキーを使って UIManager から取得されます。型は、JTextComponent.KeyBinding[] であると見なされます。

戻り値:
キーマップ
関連項目:
getKeymapName(), JTextComponent

propertyChange

protected void propertyChange(PropertyChangeEvent evt)
関連する JTextComponent でバウンドプロパティが変更されたときに呼び出されます。これは、UI が JTextComponent のサブクラスのバウンドプロパティをどのように表示するかを反映するために UI の実装によって変更されるフックです。このメソッドは、実装されても何も実行しません。つまり、JTextComponent 自体でのプロパティに対する応答は、このメソッドの呼び出しの前に処理されます。

パラメータ:
evt - プロパティ変更イベント

getPropertyPrefix

protected abstract String getPropertyPrefix()
UIManager を使ってプロパティを参照するためのキーとして使われる名前を返します。この名前は、すべての標準テキストプロパティの接頭辞として使われます。

戻り値:
名前

installDefaults

protected void installDefaults()
フォント、フォアグラウンド、バックグラウンド、キャレットの色、選択の色、選択されたテキストの色、無効になったテキストの色、ボーダの色などのコンポーネントプロパティを初期化します。フォント、フォアグラウンド、バックグラウンドのプロパティは現在の値が null または UIResource の場合にだけ設定され、ほかのプロパティは現在の値が null の場合に設定されます。

関連項目:
uninstallDefaults(), installUI(javax.swing.JComponent)

uninstallDefaults

protected void uninstallDefaults()
null に明示的にオーバーライドされていないコンポーネントプロパティを設定します。現在の値が UIResouce でなければ、プロパティはオーバーライドされたと判断されます。

関連項目:
installDefaults(), uninstallUI(javax.swing.JComponent)

installListeners

protected void installListeners()
UI のリスナーをインストールします。


uninstallListeners

protected void uninstallListeners()
UI のリスナーをアンインストールします。


installKeyboardActions

protected void installKeyboardActions()

uninstallKeyboardActions

protected void uninstallKeyboardActions()

paintBackground

protected void paintBackground(Graphics g)
ビューのバックグラウンドをペイントします。このメソッドは、関連するコンポーネントで isOpaque() が true の場合にだけ呼び出されます。デフォルトでは、コンポーネントのバックグラウンドカラーをペイントします。

パラメータ:
g - グラフィックスコンテキスト

getComponent

protected final JTextComponent getComponent()
この UI の実装に関連したテキストコンポーネントを取得します。これは、UI がインストールされるまで null になります。

戻り値:
エディタコンポーネント

modelChanged

protected void modelChanged()
モデルの変更にフラグを立てます。このメソッドは、モデルが変更されると呼び出されます。関連するモデルのデフォルトのルート要素を表すように、ビュー階層を再構築するために実装されます。


setView

protected final void setView(View v)
ビュー階層の現在のルートを設定し、invalidate() を呼び出します。子コンポーネントがある場合、それらは削除されます。つまり、それらはビューに埋め込まれたコンポーネントから派生していると見なされます。

パラメータ:
v - ルートビュー

paintSafely

protected void paintSafely(Graphics g)
このスレッドのビューからモデルが変更されないという保証付きで、安全にインタフェースをペイントします。このメソッドは、後方から前方に向かって描画しながら次のことを実行します。
  1. コンポーネントが不透明とマークされている場合、バックグラウンドはコンポーネントの現在のバックグラウンドカラーでペイントされる
  2. ハイライト (存在する場合) がペイントされる
  3. ビュー階層がペイントされる
  4. キャレットがペイントされる

パラメータ:
g - グラフィックスコンテキスト

installUI

public void installUI(JComponent c)
コンポーネントの UI をインストールします。このメソッドは、次のことを実行します。
  1. 関連するコンポーネントを不透明に設定する。これはもっとも一般的な場合であり、サブクラスでまたは JTextComponent で直接簡単に変更できる。これにより、コンポーネントのバックグラウンドカラーがペイントされる
  2. 関連するコンポーネントにデフォルトのキャレットおよびハイライタをインストールする
  3. エディタおよびモデルに接続する。モデルがない場合は、デフォルトのモデルを作成する
  4. モデルを表すために使われるビューファクトリおよびビュー階層を作成する

オーバーライド:
クラス ComponentUI 内の installUI
パラメータ:
c - エディタコンポーネント
関連項目:
ComponentUI.installUI(javax.swing.JComponent)

uninstallUI

public void uninstallUI(JComponent c)
コンポーネントの UI をアンインストールします。このメソッドは、リスナーの削除、ハイライタのアンインストール、ビューの削除を行い、キーマップを無効にします。

オーバーライド:
クラス ComponentUI 内の uninstallUI
パラメータ:
c - エディタコンポーネント
関連項目:
ComponentUI.uninstallUI(javax.swing.JComponent)

update

public void update(Graphics g,
                   JComponent c)
スーパークラスは制御不可能な方法でバックグラウンドをペイントします。つまり、イメージをバックグラウンドにタイリングします。これが 2 度行われないようにするためには、このメソッドを実装し直してペイントだけを行います。

注: また、デフォルトの描画の場合は問題ありませんが、スーパークラスの場合はバックグラウンド描画時にスレッドセーフではありません。

オーバーライド:
クラス ComponentUI 内の update
パラメータ:
g - ペイント先となる Graphics コンテキスト
c - ペイントされるコンポーネント。この引数はしばしば無視されるが、UI オブジェクトが状態なしで複数のコンポーネントに共有される場合に使用されることがある
関連項目:
ComponentUI.paint(java.awt.Graphics, javax.swing.JComponent), JComponent.paintComponent(java.awt.Graphics)

paint

public final void paint(Graphics g,
                        JComponent c)
インタフェースをペイントします。このメソッドは、描画時にこのスレッドのビューからモデルが変更されないという保証の下に paintSafely メソッドに送られます (関連モデルが AbstractDocument から引き出される場合)。これにより、モデルが非同期で更新されるようにします。

オーバーライド:
クラス ComponentUI 内の paint
パラメータ:
g - グラフィックスコンテキスト
c - エディタコンポーネント
関連項目:
ComponentUI.update(java.awt.Graphics, javax.swing.JComponent)

getPreferredSize

public Dimension getPreferredSize(JComponent c)
エディタコンポーネントの適切なサイズを取得します。この要求の受信前にコンポーネントのサイズが指定されている場合、ビュー階層の適切なサイズを要求する前に、コンポーネントのサイズを反映するようにビュー階層のサイズが設定されます。これにより、書式付きビューは、要求の応答前に現在のコンポーネントのサイズに書式設定されます。ほかのビューは、現在の書式設定されているサイズを無視し、どちらの場合でも同じ応答を返します。

オーバーライド:
クラス ComponentUI 内の getPreferredSize
パラメータ:
c - エディタコンポーネント
戻り値:
サイズ
関連項目:
JComponent.getPreferredSize(), LayoutManager.preferredLayoutSize(java.awt.Container)

getMinimumSize

public Dimension getMinimumSize(JComponent c)
エディタコンポーネントの最小サイズを返します。

オーバーライド:
クラス ComponentUI 内の getMinimumSize
パラメータ:
c - エディタコンポーネント
戻り値:
サイズ
関連項目:
JComponent.getMinimumSize(), LayoutManager.minimumLayoutSize(java.awt.Container), ComponentUI.getPreferredSize(javax.swing.JComponent)

getMaximumSize

public Dimension getMaximumSize(JComponent c)
エディタコンポーネントの最大サイズを返します。

オーバーライド:
クラス ComponentUI 内の getMaximumSize
パラメータ:
c - エディタコンポーネント
戻り値:
サイズ
関連項目:
JComponent.getMaximumSize(), LayoutManager2.maximumLayoutSize(java.awt.Container)

getVisibleEditorRect

protected Rectangle getVisibleEditorRect()
ルート View に指定する割り当てを取得します。階層イベントのセットの関係で、このメソッドには適切でない名前がついています。返される Rectangle は可視性とはまったく関係がありません。この変換を計算するために、コンポーネントはゼロでない正のサイズを持つ必要があります。

戻り値:
ルートビューのバウンディングボックス

modelToView

public Rectangle modelToView(JTextComponent tc,
                             int pos)
                      throws BadLocationException
モデル内の指定された位置を、ビュー座標体系内の場所に変換します。この変換を計算するために、コンポーネントはゼロでない正のサイズを持つ必要があります。

定義:
クラス TextUI 内の modelToView
パラメータ:
tc - この UI がインストールされているテキストコンポーネント
pos - 変換対象のモデル内でのローカル位置 <= 0
戻り値:
矩形の座標。モデルがペイントされていない場合は null
例外:
BadLocationException - 指定された位置が、関連するドキュメント内の有効な位置を表さない場合
関連項目:
TextUI.modelToView(javax.swing.text.JTextComponent, int)

modelToView

public Rectangle modelToView(JTextComponent tc,
                             int pos,
                             Position.Bias bias)
                      throws BadLocationException
モデル内の指定された位置を、ビュー座標体系内の場所に変換します。この変換を計算するために、コンポーネントはゼロでない正のサイズを持つ必要があります。

定義:
クラス TextUI 内の modelToView
パラメータ:
tc - この UI がインストールされているテキストコンポーネント
pos - 変換対象のモデル内でのローカル位置 <= 0
戻り値:
矩形の座標。モデルがペイントされていない場合は null
例外:
BadLocationException - 指定された位置が、関連するドキュメント内の有効な位置を表さない場合
関連項目:
TextUI.modelToView(javax.swing.text.JTextComponent, int)

viewToModel

public int viewToModel(JTextComponent tc,
                       Point pt)
ビュー座標体系内の指定された位置を、モデル内の最も近い場所に変換します。この変換を計算するために、コンポーネントはゼロでない正のサイズを持つ必要があります。

定義:
クラス TextUI 内の viewToModel
パラメータ:
tc - この UI がインストールされているテキストコンポーネント
pt - 変換対象のビューの座標系での位置。この場合の座標系は、マウスイベントと同じ座標系でなければならない
戻り値:
ドキュメントの先頭からのオフセット <= 0。ペイントされていない場合は -1
関連項目:
TextUI.viewToModel(javax.swing.text.JTextComponent, java.awt.Point)

viewToModel

public int viewToModel(JTextComponent tc,
                       Point pt,
                       Position.Bias[] biasReturn)
ビュー座標体系内の指定された位置を、モデル内の最も近い場所に変換します。この変換を計算するために、コンポーネントはゼロでない正のサイズを持つ必要があります。

定義:
クラス TextUI 内の viewToModel
パラメータ:
tc - この UI がインストールされているテキストコンポーネント
pt - 変換対象のビューの座標系での位置。この場合の座標系は、マウスイベントと同じ座標系でなければならない
biasReturn - 指定された点がモデルの前の文字、あるいは次の文字に近いのかを示すために、このメソッドによって書き込まれる
戻り値:
ドキュメントの先頭からのオフセット <= 0。コンポーネントがまだ正のサイズを持っていない場合は -1
関連項目:
TextUI.viewToModel(javax.swing.text.JTextComponent, java.awt.Point)

getNextVisualPositionFrom

public int getNextVisualPositionFrom(JTextComponent t,
                                     int pos,
                                     Position.Bias b,
                                     int direction,
                                     Position.Bias[] biasRet)
                              throws BadLocationException
キャレットが配置される可能性のある、視覚的に表された次のモデル位置を決定する手段を提供します。ビューによっては、可視ではないか、モデル内と同じ順序でないか、またはモデル内の位置へのアクセスを許可しない場合があります。

定義:
クラス TextUI 内の getNextVisualPositionFrom
パラメータ:
pos - 変換対象の位置 <= 0
direction - キーボード上に通常ある矢印キーと見なすことができる、現在の位置からの方向。SwingConstants.WEST、SwingConstants.EAST、SwingConstants.NORTH、または SwingConstants.SOUTH
戻り値:
次の可視の位置をもっともよく表すモデル内の位置
例外:
BadLocationException
IllegalArgumentException - 方向が無効な場合

damageRange

public void damageRange(JTextComponent tc,
                        int p0,
                        int p1)
モデルの指定された部分に対応するビューの部分がペイントし直されます。ビューが現在ペイントされていない場合は何も行われません。

定義:
クラス TextUI 内の damageRange
パラメータ:
tc - この UI がインストールされているテキストコンポーネント
p0 - 範囲の始点 <= 0
p1 - 範囲の終点 <= p0
関連項目:
TextUI.damageRange(javax.swing.text.JTextComponent, int, int)

damageRange

public void damageRange(JTextComponent t,
                        int p0,
                        int p1,
                        Position.Bias p0Bias,
                        Position.Bias p1Bias)
モデル内の指定された一部分に対応するビューの部分が描画し直されます。

定義:
クラス TextUI 内の damageRange
パラメータ:
p0 - 範囲の始点 <= 0
p1 - 範囲の終点 <= p0

getEditorKit

public EditorKit getEditorKit(JTextComponent tc)
UI の EditorKit を取得します。

定義:
クラス TextUI 内の getEditorKit
パラメータ:
tc - この UI がインストールされているテキストコンポーネント
戻り値:
エディタ機能
関連項目:
TextUI.getEditorKit(javax.swing.text.JTextComponent)

getRootView

public View getRootView(JTextComponent tc)
モデルが空間的にどのように表現されているかを判定するためにトラバースすることのできる、関連したテキストコンポーネント (すなわち階層のルート) を割り当てられた View を取得します。

注: View 階層はルートビューからトラバースすることができ、他のことも同様にできます。このように行われたことは、TextUI を通じた単純なメソッド呼び出しのように保護することができません。したがって、並行性の考えられる適切なオペレーションは、このメソッドを呼び出す論理で処理が行われるようにする必要があります。

定義:
クラス TextUI 内の getRootView
パラメータ:
tc - この UI がインストールされているテキストコンポーネント
戻り値:
ビュー
関連項目:
TextUI.getRootView(javax.swing.text.JTextComponent)

getToolTipText

public String getToolTipText(JTextComponent t,
                             Point pt)
渡された位置でツールヒントとして使われる文字列を返します。ルート View へメソッドを転送します。

オーバーライド:
クラス TextUI 内の getToolTipText
導入されたバージョン:
1.4
関連項目:
JTextComponent.getToolTipText(java.awt.event.MouseEvent), View.getToolTipText(float, float, java.awt.Shape)

create

public View create(Element elem)
要素のビューを作成します。ビューを作成するファクトリをサブクラスに直接実装するには、このメソッドを実装し直す必要があります。デフォルトでは、要素を表すことができないことを示す null を返します。

定義:
インタフェース ViewFactory 内の create
パラメータ:
elem - 要素
戻り値:
ビュー
関連項目:
View

create

public View create(Element elem,
                   int p0,
                   int p1)
要素のビューを作成します。ビューを作成するファクトリをサブクラスに直接実装するには、このメソッドを実装し直す必要があります。デフォルトでは、要素の部分を表現できないことを示す null を返します。

パラメータ:
elem - 要素
p0 - 開始オフセット <= 0
p1 - 終了オフセット <= p0
戻り値:
ビュー

JavaTM 2
Platform
Std. Ed. v1.4.0

バグの報告と機能のリクエスト
これ以外の API リファレンスおよび開発者用ドキュメントについては、 Java 2 SDK SE 開発者用ドキュメントを参照してください。 開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、 およびコード実例が含まれています。

Java、Java 2D、および JDBC は米国ならびにその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2002 Sun Microsystems, Inc. 901 San Antonio Road
Palo Alto, California, 94303, U.S.A. All Rights Reserved.