とりあえず、フィールドで持ってみました
Code:
||セルの振舞いを定義する Mixinクラス
{define-class public abstract CellReacterMixin
field public cell-reacter-proc:#{proc-type {RecordGridCell}:void}
{constructor public {default
cell-reacter-proc:#{proc-type {RecordGridCell}:void} = null,
... }
set self.cell-reacter-proc = cell-reacter-proc
}
||セルの振舞いを処理する 振舞いは独自に指定できるようにプロシージャで定義
{method public {set-custom-react cell:RecordGridCell}:void
{if-non-null react-proc = self.cell-reacter-proc then
{react-proc cell}
}
}
{getter public {as-RecordGridCell}:#RecordGridCell
{type-switch self
case rgc:RecordGridCell do
{return rgc}
else
{return null}
}
}
{method public {get-cell-react-option option-name:String}:any
{if-non-null cell = self.as-RecordGridCell then
{if-non-null record = cell.record, rf = cell.field then
{return {cell.record.get rf.name & option-name}}
}
}
{return null}
}
}
||読み取り専用背景色
{def public READONLY_BACKGROUND_COLOR :String = "#D0D0D0"}
||エラー用背景色
{def public ERROR_BACKGROUND_COLOR:String = "#FFB0B0"}
||必須入力用背景色
{def public REQUIRED_BACKGROUND_COLOR:String = "#FFFFCC"}
||カスタムレコードフィールドのコード名
{def public ERROR-FIELD-NAME:String = "_error?"}
{def public READ-ONLY-FIELD-NAME:String = "_read-only?"}
{def public REQUIRED-FIELD-NAME:String = "_required?"}
||エラー、表示のみ、必須 のプロパティを指定するための実装
{define-class public DefaultCellReactMixin {inherits CellReacterMixin}
field constant error?:String = ERROR-FIELD-NAME
field constant read-only?:String = READ-ONLY-FIELD-NAME
field constant required?:String = REQUIRED-FIELD-NAME
{constructor public {default ...}
{construct-super {splice...}}
}
||セルの振舞いを定義するためのフィールドを追加するプロシージャ
{define-proc public {get-cusotmed-field fields:RecordFields}:RecordFields
def ary-rf:{Array-of RecordField} = {{Array-of RecordField}}
{for rf in fields do
{ary-rf.append rf}
let read-only-def-val:bool = false
let required-def-val:bool = false
{ary-rf.append {RecordField rf.name & ERROR-FIELD-NAME,
domain = bool, default-value = false}}
{ary-rf.append {RecordField rf.name & READ-ONLY-FIELD-NAME,
domain = bool, default-value = read-only-def-val}}
{ary-rf.append {RecordField rf.name & REQUIRED-FIELD-NAME,
domain = bool, default-value = required-def-val}}
}
{return {RecordFields {splice ary-rf}}}
}
{define-proc public {default-cell-reacter cell:RecordGridCell}:void
{type-switch cell
case react-mxin:DefaultCellReactMixin do
||選択されている場合は、背景色、文字色が設定済みなので、後続の処理を行わない
{if not cell.selected? then
{if-non-null record = cell.record then
|| 表示のみの反映が高位なので、最初に判断
{if {react-mxin.get-cell-react-option react-mxin.read-only?} then
set cell.editable? = false
set cell.background = READONLY_BACKGROUND_COLOR
elseif {react-mxin.get-cell-react-option react-mxin.error?} then
||エラー時は背景を赤色にする
set cell.background = ERROR_BACKGROUND_COLOR
elseif {react-mxin.get-cell-react-option react-mxin.required?} then
||必須時は背景を黄色にする
set cell.background = REQUIRED_BACKGROUND_COLOR
else
{unset cell.background}
}
}
}
}
}
}
||セルの振舞いを独自に指定したセル
{define-class public open CustomReactCell
{inherits StandardStringCell, DefaultCellReactMixin }
{constructor public {default ...}
{construct-super.StandardStringCell}
{construct-super.DefaultCellReactMixin
cell-reacter-proc = DefaultCellReactMixin.default-cell-reacter,
{splice ...}}
}
{method public open {refresh-data}:void
{super.refresh-data}
{self.set-custom-react self}
}
}
{let people:RecordSet =
{RecordSet
{DefaultCellReactMixin.get-cusotmed-field
{RecordFields {RecordField "First", domain = String} }
},
{RecordData First = "John"},
{RecordData First = "Jane"},
{RecordData First = "Jane"}
}
}
{def grid =
{RecordGrid
height = 1.5in,
automatic-columns? = false,
{RecordGridColumn cell-spec = CustomReactCell, "First" },
record-source = people
}
}
{def real-grid =
{RecordGrid
width = 6in,
height = 1in,
record-source = people
}
}
{VBox
grid,
real-grid
}