package gueei.binding.markupDemoICS.widget; import gueei.binding.IBindableView; import gueei.binding.ViewAttribute; import java.io.ByteArrayOutputStream; import android.content.Context; import android.graphics.Canvas; import android.os.Handler; import android.util.AttributeSet; import android.view.View; import android.webkit.WebView; import com.uwyn.jhighlight.renderer.XhtmlRendererFactory; public class CodeView extends WebView implements IBindableView<CodeView> { public CodeView(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) { super(context, attrs, defStyle, privateBrowsing); } public CodeView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public CodeView(Context context, AttributeSet attrs) { super(context, attrs); } public CodeView(Context context) { super(context); } @Override public ViewAttribute<? extends View, ?> createViewAttribute( String attributeId) { if ("resourceId".equals(attributeId)){ return resId; }else if ("resourceType".equals(attributeId)){ return resType; }else if ("title".equals(attributeId)){ return title; } return null; } private final ResourceIdViewAttribute resId = new ResourceIdViewAttribute(this, "resourceId"); private final ResourceTypeViewAttribute resType = new ResourceTypeViewAttribute(this, "resourceType"); private final TitleViewAttribute title = new TitleViewAttribute(this, "resourceType"); @Override protected void onDraw(Canvas canvas) { renderView(); super.onDraw(canvas); } private void renderView(){ if (isDirty){ final ByteArrayOutputStream bos = new ByteArrayOutputStream(); final Handler handler = new Handler(); (new Thread(){ @Override public void run() { try { XhtmlRendererFactory.getRenderer(resType.get()).highlight(title.get(), getContext().getResources().openRawResource(resId.get()), bos, "UTF-8", false); handler.post(new Runnable(){ public void run() { loadData(bos.toString(), "text/html", "UTF-8"); } }); } catch (Exception e) { e.printStackTrace(); } } }).run(); isDirty = false; } } private boolean isDirty = false; private class ResourceIdViewAttribute extends ViewAttribute<CodeView, Integer>{ public ResourceIdViewAttribute(CodeView view, String attributeName) { super(Integer.class, view, attributeName); } private int mValue = 0; @Override protected void doSetAttributeValue(Object newValue) { if (newValue!=null){ mValue = Integer.parseInt(newValue.toString()); isDirty = true; invalidate(); } } @Override public Integer get() { return mValue; } } private class ResourceTypeViewAttribute extends ViewAttribute<CodeView, String>{ public ResourceTypeViewAttribute(CodeView view, String attributeName) { super(String.class, view, attributeName); } private String mValue = "xml"; @Override protected void doSetAttributeValue(Object newValue) { if (newValue!=null){ mValue = newValue.toString(); isDirty = true; invalidate(); } } @Override public String get() { return mValue; } } private class TitleViewAttribute extends ViewAttribute<CodeView, String>{ public TitleViewAttribute(CodeView view, String attributeName) { super(String.class, view, attributeName); } private String mValue = "xml"; @Override protected void doSetAttributeValue(Object newValue) { if (newValue!=null){ mValue = newValue.toString(); isDirty = true; invalidate(); } } @Override public String get() { return mValue; } } }