日時支援

DateTimeAssist によって、JSF DateTime 文字列を含む 入力フィールドのキーボード対話およびマウス対話を管理します。

これらのオブジェクトは、一般的な方法では使用できません (ユーザーはオブジェクトを作成して使用することはできません)。代わりに、これらのオブジェクトは入力支援の振る舞いによって作成されます。

日時文字列を含む入力フィールドに 日時支援が適用されたときに、 キー・ストローク、マウス対話、 およびクリップボード対話を処理する方法の概略を、 以下で説明します。

ぼかし/フォーカス対話

フィールドがフォーカスを受信すると、 値が「入力フォーマット」に変換され、 正しい値になるように強制変換されます。 次に、プロンプト文字によって先行ゼロが置き換えられて、 その結果が表示された後に、 カーソルが最初の入力位置の前に置かれます。

日時の「入力フォーマット」は、日時形式を基にして構成されます。 y、G、M、d、h、H、m のいずれでもない 日付コンポーネントが、すべてこのフォーマットから除去され、 すべての「テキスト」コンポーネント (3 文字以上を使用するコンポーネント) が 数値コンポーネントに変わります (例えば MMMM は MM になります)。 単一文字のコンポーネントは、すべて 2 文字の コンポーネントに変わります (例えば d は dd になります)。 「年」のコンポーネントは、yyyy または yy のいずれかに変換されます。 エポックは、 リテラルに変換されるか (ヒジュラ暦、 ユダヤ暦および仏教暦のケースと同様に、 エポックが変更できない場合)、 または先行文字の入力を許可するように (キリスト教暦および 日本のグレゴリオ暦のケースのように) 変換されます。 この結果作られる入力フォーマットは、 一意的に日付値を決定する 「数値コンポーネント」のみを含みます (単一文字の エポックを除く (存在する場合))。 値は入力フォーマットに変換され、 有意になるように強制変換されます (ヌル以外の場合)。 この強制変換によって、不正確なコンポーネントは、 制約のために調整された「今日の日付」の 適切なコンポーネントに置き換えられます。 例えば、月が「14」と入力された場合、 現在が 9 月であれば「09」に変更されます。 月が「02」、日付が「31」と入力された場合、 今日が 9 月 30 日であれば、 日付は 28 (または 29) に変更されます。 つまり、まず日付が「30」に変更されて、 さらに 30 から 28 (または 29) に バインドされることになります。 これは、2 月の日数が 30 日間もないためです。

例えば、日時フォーマットが EEEE MMMM dd,yyyy であるとすると、 入力フォーマットは「MM dd,yyyy」になります。 値として 2003 年 9 月 31 日が与えられると、 入力フォーマット (09/31/2003) に変換されて、 強制変換された結果「*9 30, 2003」と表示されます。

フィールドがフォーカスを失うと、 プロンプト文字がフィールドから除去されて、 値は正しい値へ強制変換されます (つまり onblur 後は、 常に「正しい」値になります)。 この後、(元の) フォーマットを使用して、 その値は再フォーマットされます。 onBlur における「強制変換」は、onfocus での強制変換と同じです。 プロンプト文字は、 単にフィールドから「除去」されるだけです (ゼロで置き換えられません)。 したがって、 プロンプト文字が * で、コンポーネントが「19**」として残っている場合は、 コンポーネントの値は (「1900」ではなく)「19」になります。

キー・ストローク対話

数字キーが押されると (つまり、keypress イベントが生成されると)、 カーソルが入力位置の前に置かれていた場合、 結果として作られる日付コンポーネントは、検査済みの制約となります。 この結果が有効な場合、 カーソル位置にある文字 (またはプロンプト文字) が 上書きされるか、または選択した中での最初の文字が 上書きされます (残りの文字はプロンプト文字に設定されます)。 例えば、カーソルが月コンポーネント 「*3」内の * 文字の前にある状態で、ユーザーが 1 を押すと、 無効という結果になります (このコンポーネントは 13 という 値を持つことができません)。 一方、ゼロが押されるとコンポーネントは有効になり (03 は有効な月です)、 ゼロがプロンプト文字を上書きします。 この後、ユーザーが入力可能な次の位置 (またはフィールドの最後) に、 カーソルが進みます。 無効なキーが押されても、「何も起こりません」。 エポックが (編集可能な状態で) 表示されていて、 カーソルがエポックの先頭文字に置かれている場合、 適切な文字 (例えば、キリスト教文字の場合なら A または B) を押すと、 すべてのエポック文字が入力され (例えば、A を押すと AD が入力される)、 カーソルは次の編集可能な位置へ進みます。

有効なコンポーネントを構成しているものが、 別のコンポーネントに依存している場合、 複雑な問題が生じる可能性があります。 例えば、日付を MM/DD/YY と規定して、 ユーザーが 11 30 06 と入力するとします。 日付が最初から空白だった場合、 ユーザーは単に 11 30 06 と入力することができます。 しかし、最初に日付が 12/31/06 と入力されているときに、 ユーザーが 11 を入力すると、 値「31」は有効な値ではなくなって しまいます (11 月には 31 日が存在しないからです)。 コンポーネント間に依存関係が存在する場合は、 ユーザーの入力を「妨害する」 (例えば、「11」という入力を 許可しない) のではなく、無効になった文字を「クリア」します。 したがって、ユーザーが 11 を入力した場合には、31 を クリアして、11 の入力を許可します。 これらの依存関係は、 日付コンポーネント単独でも発生する場合があります。 例えば、月に「09」が入力されているとします。 ユーザーが「12」を入力する場合、 まず「1」を入力すると、 「19」が有効な月ではなくなるため、問題が生じます。 ここでも、入力を妨害するのではなく、 問題のある文字をクリアします (したがって、 ユーザーが「1」を入力すると、2 が抹消されます)。 日付を構成している 2 つの文字の間には、 依存関係が存在します。 これらの文字によって、月、月ごとの日数、1 年の月数 (ユダヤ暦)、 および年 (その年が閏年であるかどうか、 またはユダヤ暦で完全な年、通常の年または不十分な年であるかどうか) が 構成されます。

制御キーが押される (つまり、 キー・コードで指示されている制御キーによって、キーダウン・イベントが 生成される) と、DateTimeAssist はキーダウン・イベント上で 制御キーを処理します (これは Windows® で 標準です)。 制御キーが右矢印の場合、 文字列内において入力が可能な次の位置へ、カーソルが進みます。 左矢印が押された場合、 入力が可能な位置のすぐあとに、カーソルが 「戻されます」(したがって、再び左矢印が押されるまで 入力ができなくなる場合があります -- 左矢印をもう一度押すと、 バックスペース・キーが使える位置に、カーソルを置くことができます)。 Del キーが押されると、 カーソル位置の後ろにある文字 (複数の文字が選択されていれば、 その選択箇所) が削除され、カーソルが進みます。 バックスペース・キーが押されると、 カーソル位置の前にある文字が削除され、カーソルは戻ります。 タブまたは Enter が押されると、 アクションを処理する通常フォームが実行されます。 これ以外に、特殊な処理が行われる 制御キーはありません (例えば、HOME および END については、 特殊な処理は行われず、予想されるとおりに機能します)。

マウス対話

ユーザーがフィールド内をクリックした (そのクリックによって、 何らかの選択が行われない) 場合、 ユーザーが入力可能な「次の」文字の前に、カーソルが置かれます。

クリップボード対話

切り取り/コピー/貼り付けにおける、 それぞれの相互作用は IE 内でのみ 処理され (Mozilla ではサポートしていません)、IE 内のみに 制限されたサポートが提供されます (相互作用を 管理するためのイベントの完全なセットは提供されますが、IE では クリップボードそのものに対するアクセスが制限されるため、 行える作業にも制約があります)。

コピー作業によって、 選択した箇所をクリップボードの <verbatim> タグにコピーします。 切り取り作業も、ほぼ同様の内容になりますが、 選択した箇所をクリアする (すべての入力位置を空白に設定する) 点が 異なります。 貼り付け作業の場合、 クリップボード上の値が日時文字列であると見なされれば、 「入力できる」文字 (非リテラル文字) のみが貼り付けられ、 それ以外の場合は文字列全体が貼り付けられます。 この貼り付け作業は、「入力」位置に対してのみ 文字を適用します (リテラルをスキップします)。 任意の文字の入力に関する妥当性検査が失敗した場合、 貼り付け作業全体がキャンセルされます。 検査が成功した場合は、 貼り付けられた文字の最後にカーソルが置かれます (ただし、 ブラウザーによって カーソル位置が移動させられてしまう場合もあります)。


フィードバック