F2キーが効かない? - umemura - 03-20-2014
画面に対して「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
}
}
RE: F2キーが効かない? - dyoshida - 03-23-2014
ご希望のルックアンドフィールの反映方法ではないのですが、
レコードグリッドのセルがフォーカスを持っている場合も、F2キーのキー アクセラレータラの方を
有効にするのであれば、RecordGridUI.reserved-key?をオーバーライドしてF2を追加する
というのはどうでしょうか?
適切でない感があるコードですが・・・
Code: {define-class public open MyRecordGridUI {inherits SkinnableRecordGridUI}
{method public open {reserved-key? ev:KeyPress}:bool
{return
{super.reserved-key? ev} or
(ev.value == KeyPressValue.f2)
}
}
}
{define-class public open MyRecordGrid {inherits RecordGrid}
{constructor {default ...}
{construct-super
{splice ...},
ui-object = {MyRecordGridUI}
}
}
}
{def rs =
{RecordSet
{RecordFields
{RecordField "data1", default-value = ""},
{RecordField "data2", default-value = "aaa"}
},
{RecordData}
}
}
{let rg:MyRecordGrid =
{MyRecordGrid
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}
}
RE: F2キーが効かない? - umemura - 03-24-2014
dyoshida さん、返信ありがとうございます。
RecordGridUI.reserved-key? というものがあるのですね。
F2キーには、セルへのフォーカス遷移時に選択された文字の選択状態をはずす、
という機能があるようなので、その機能は生かすようにするため、
下記のようなコードにしてみます。
ありがとうございました。
Code: {define-class public open MyRecordGridUI {inherits SkinnableRecordGridUI}
{method public open {reserved-key? ev:KeyPress}:bool
{return {super.reserved-key? ev} or {self.check-f2-event ev}}
}
{method public open {check-f2-event ev:KeyPress}:bool
{type-switch self.grid-focus
case str-cell:StandardStringCell do
def editor = str-cell.current-editor
||F2キーが押されても、セルに値がなければ無視
{if-non-null ui = editor.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 true}
}
}
}
}
{return false}
}
}
ルックアンドフィールドの反映方法も後学として知っておきたいので、
もしご存知のかたがいらっしゃったら教えてください。
RE: F2キーが効かない? - umemura - 03-27-2014
素早く複数のセルへ連続入力すると、エラーになってしまったので、少し修正。
Code: {method public open {check-f2-event ev:KeyPress}:bool
{type-switch self.grid-focus
case str-cell:StandardStringCell do
def editor = str-cell.current-editor
||F2キーが押されても、セルに値がなければ無視
{if-non-null editor then
{type-switch editor.ui-object
case tf-ui:SkinnableTextFieldUI do
let constant rng:StringDataModelWritableRange =
(tf-ui.control asa TextField).selected-range
{switch ev.value
case KeyPressValue.f2 do
{if 0 == rng.data-model.size then
{return true}
}
}
}
}
}
{return false}
}
|