DataTableクラスはお気楽なんだけど、テンプレートがあまりにそっけなくてカラム毎に細かく制御したい時に途方に暮れるよね(僕だけかな?)
twitterで呟いてみた
DataTableで個別のカラム毎に処理を変えたい場合、Component階層から目的のカラムをさがしだしてごゴニョゴニョする感じでいいのかな。
t_yanoさんからreplyが来た。感激!
DataTable作るときにIColumnオブジェクトをaddしていくのだから、独自のIColumnをaddすればいいのではないか。 *P3
それまで僕はICoumnで変更ができるなんて可能性を考えもしなかった。(@秒速)
みてみると下のようなメソッドがAbstractColumnに。
public Component getHeader(String componentId)
{
return new Label(componentId, getDisplayModel());
}
で早速オーバーライド。
@Override
public Component getHeader(String componentId) {
Component header = super.getHeader(componentId);
header.add(new AttributeAppender("class", Model.of("photo"), " "));
return header;
}
結果は thのクラスにはphotoがつかず、spanについたorz。
<th class="first-child nth-child-odd nth-child-1" wicket:id="header">
<span class="photo first-child nth-child-odd only-child nth-child-1 last-child" wicket:id="label">イメージ</span>
</th>
ソースを見てみるとHeadersToolbarというクラスでthを作っている感じ。
WicketTesterで、pathを表示。
searchResultTable:topToolbars:2:toolbar:headers:1:header org.apache.wicket.markup.html.WebMarkupContainer []
searchResultTable:topToolbars:2:toolbar:headers:1:header:label org.apache.wicket.markup.html.basic.Label [イメージ]
という事で
DataTable.get("topToolbars:2:toolbar:headers:1:header").add(
new AttributeAppender("class", Model.of("photo"), " "));
これでTHにclassが追加されました:)
2009-09-16 追記
その後、org.apache.wicket.extensions.markup.html.repeater.data.table.HeadersToolBarのソースを見てみると
if (column instanceof IStyledColumn) {
header.add(new CssAttributeBehavior() {
private static final long serialVersionUID = 1L;
@Override
protected String getCssClass() {
return ((IStyledColumn<?>) column).getCssClass();
}
});
}
こんなのを見つけました。
げ。そのCssClassをbehaviorを使って追加しているようです。
よって、IColumnに次のようなメソッドをつけるのが一番簡単でした;ぐぬぬ。勉強になったからいいや。
@Override
public String getCssClass() {
return super.getCssClass() + " photo";
}