Wicket で複数行のテキストを出力するコンポーネント
org.apache.wicket.markup.html.basic.MultiLineLabel
これは、1行でなく2行以上になるテキストを渡すと <p> で囲まれてしまう。
これを回避するのはビヘビアで行うのはあちこち書くとコード量増えるので、
MultiLineLabel を継承したクラスで対処したものを使用する方が楽に思えた。
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.MarkupStream;
import org.apache.wicket.markup.html.basic.MultiLineLabel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.string.AppendingStringBuffer;
/**
* <p>タグで囲まない MultiLineLabel
*/
public class NoPtagMultiLineLabel extends MultiLineLabel{
public NonPtagMultiLineLabel(String id){
super(id);
}
public NoPtagMultiLineLabel(String id,String label){
super(id,label);
}
public NoPtagMultiLineLabel(String id,IModel<?> model){
super(id,model);
}
@Override
protected void onComponentTagBody(final MarkupStream markupStream,final ComponentTag openTag){
final CharSequence body = this.toMultilineMarkup(getDefaultModelObjectAsString());
replaceComponentTagBody(markupStream,openTag,body);
}
private CharSequence toMultilineMarkup(final CharSequence s){
if (s==null) return null;
final AppendingStringBuffer buffer = new AppendingStringBuffer();
for(int i=0;i < s.length();i++){
final char c = s.charAt(i);
switch(c){
case '\n':
buffer.append("<br/>");
break;
case '\r':
break;
default:
buffer.append(c);
break;
}
}
return buffer;
}
}