02-21-2014, 06:06 PM
02-24-2014, 05:34 PM
Curlでは特に定義されていないような・・・?
エクセルの場合は、Alt+↓ なので、これに合わせるようにしてみました。
ただ、グリッド内のドロップダウン(DropdownCell)の場合は、
いろいろ気をつけないといけないようです。
コードの中にコメントでも書きましたが、セルの取得方法と、
DropdownListUI.show-dropdown の呼び出しタイミングについて、
もっと良い方法があれば教えてください。
Code:
{define-class public open CustomDropdownCell {inherits StandardDropdownCell }
{method protected open {create-editor}:DropdownList
def dl = {super.create-editor}
||下矢印キー押下で、リストを表示
{dl.add-event-handler
{on k:KeyPress do
{if k.value == KeyPressValue.down and k.alt? == true
then
{type-switch dl.ui-object
case dl-ui:SkinnableDropdownListUI do
||セルフォーカスが移動しないように一応コンシュ-ム
{k.consume}
||ドロップダウンリストが格納されているセルを取得
||※ わざわざparent.parent で取得している理由は、self にしてしまうと、
|| 最初にドロップダウンリストを作成したセル=最初にフォーカスが入ったセルに
|| ポインタが張られてしまうので、
|| 毎回コントロールからセルを逆取得している
{type-switch dl.parent.parent
case cell:StandardDropdownCell do
set cell.edit-active? = true
}
||after を利用しないと、リストのペインが中途半端な位置に表示されてしまう
||(edit-active?で高さを変更している処理の途中で実行されるため?)
{after 0s do
{dl-ui.show-dropdown}
}
}
}
}
}
{return dl}
}
}
{let people:RecordSet =
{RecordSet
{RecordFields
{RecordField "First", domain = String},
{RecordField "Last", domain =
{StandardStringDomain
default-value = "",
allowable-values =
{{Array-of String}
"","Mino","Okada","Mori"
}
}
},
{RecordField "Age", domain = int}
},
{RecordData First = "Monta", Last = "", Age = 18},
{RecordData First = "Hitoshi", Last = "", Age = 20},
{RecordData First = "Akira", Last = "", Age = 40}
}
}
{value
{RecordGrid
record-source = people,
{RecordGridColumn "Last", cell-spec = CustomDropdownCell},
height = 3cm
}
}