03-20-2014, 04:01 PM
画面に対して「F2キー」が押されたら、ある処理を実行する、という機能を実装しているのですが、
レコードグリッドのセルにフォーカスがあるときにだけ、その処理が実行されない、という問題が起きています。
ヘルプを読んだところ、「レコードグリッド」ところに、F2キーを押して編集状態にする云々、という記述があり、
どうやら、セルにフォーカスが入った際に全選択の状態になるため、
F2キーを押すと、選択状態がクリアされ、カーソルが、セルの最後の位置に来る、という機能があるようです。
オープンコントロールを見たところ、SkinnedSRGTextFieldFeel という処理の中で、
セルの中で現在の選択状態を判断して、イベントをconsumeしているようなのですが、
セル内が空文字の場合、常にこの条件に当てはまってしまい、
常にF2キーの押下イベントが握りつぶされてしまうのようなのです。
カスタムセルのオーバーライドなら最低限の知識はあるのですが、
このルックアンドフィールの反映方法がよくわからず、
知っている方がいらっしゃったら教えてください。
レコードグリッドのセルにフォーカスがあるときにだけ、その処理が実行されない、という問題が起きています。
ヘルプを読んだところ、「レコードグリッド」ところに、F2キーを押して編集状態にする云々、という記述があり、
どうやら、セルにフォーカスが入った際に全選択の状態になるため、
F2キーを押すと、選択状態がクリアされ、カーソルが、セルの最後の位置に来る、という機能があるようです。
オープンコントロールを見たところ、SkinnedSRGTextFieldFeel という処理の中で、
セルの中で現在の選択状態を判断して、イベントをconsumeしているようなのですが、
セル内が空文字の場合、常にこの条件に当てはまってしまい、
常にF2キーの押下イベントが握りつぶされてしまうのようなのです。
カスタムセルのオーバーライドなら最低限の知識はあるのですが、
このルックアンドフィールの反映方法がよくわからず、
知っている方がいらっしゃったら教えてください。
Code:
{define-class public open CustomSkinnedSRGTextFieldFeel
{inherits SkinnedSRGTextFieldFeel}
{method public open {on-key-press ev:KeyPress}:void
||F2キーが押されても、セルに値がなければ無視
{if-non-null ui = self.ui-object asa #SkinnableTextFieldUI then
let constant rng:StringDataModelWritableRange =
(ui.control asa TextField).selected-range
{switch ev.value
case KeyPressValue.f2 do
{if 0 == rng.data-model.size then
{return}
}
}
}
{super.on-key-press ev}
}
}
{def rs =
{RecordSet
{RecordFields
{RecordField "data1", default-value = ""},
{RecordField "data2", default-value = "aaa"}
},
{RecordData}
}
}
{let rg:RecordGrid =
{RecordGrid
record-source = rs
}
}
{def vb = {VBox {TextField}, rg} }
{value vb}
{do
||F2 キーの押下イベント
def handler =
{on Action do
{popup-message "F2 が押された"}
}
def key-accel = {KeyAccel key-accel-string = "F2", handler}
def fm = {vb.get-focus-manager}
{fm.add-key-accel key-accel}
}
{do
|| 上記でカスタマイズした セルのテキストフィールド用フィールをインストール
|| ※FIXME! この記述では正しく反映されていない
def look-and-feel = {StyledLookAndFeel}
{look-and-feel.register-control-feel SRGTextField, CustomSkinnedSRGTextFieldFeel}
def style-sheet =
{get-default-style-sheet}
{install-style-sheet
style-sheet,
look-and-feel = look-and-feel
}
}