package com.mozz.htmlnative.css.stylehandler; import android.content.Context; import android.graphics.Typeface; import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.mozz.htmlnative.HNativeEngine; import com.mozz.htmlnative.HtmlTag; import com.mozz.htmlnative.common.PixelValue; import com.mozz.htmlnative.css.InheritStylesRegistry; import com.mozz.htmlnative.dom.DomElement; import com.mozz.htmlnative.exception.AttrApplyException; import com.mozz.htmlnative.utils.ParametersUtils; import com.mozz.htmlnative.view.LayoutParamsLazyCreator; class TextViewStyleHandler extends StyleHandler { private static final String FONT_SIZE = "font-size"; private static final String COLOR = "color"; private static final String TEXT = "text"; private static final String LINE_HEIGHT = "line-height"; private static final String FONT_STYLE = "font-style"; private static final String FONT_WEIGHT = "font-weight"; private static final String TEXT_ALIGN = "text-align"; private static final String HREF = "href"; private static final String TEXT_WORD_SPACING = "word-spacing"; private static final String TEXT_OVER_FLOW = "text-overflow"; private static final String TEXT_TRANSFORM = "text-transform"; private static final int DEFAULT_SIZE = 14; private static final int DEFAULT_H1_SIZE = ParametersUtils.emToPx(2); private static final int DEFAULT_H1_PADDING = ParametersUtils.emToPx(0.67f); private static final int DEFAULT_H2_SIZE = ParametersUtils.emToPx(1.5f); private static final int DEFAULT_H2_PADDING = (int) ParametersUtils.emToPx(.75f); private static final int DEFAULT_H3_SIZE = (int) ParametersUtils.emToPx(1.17f); private static final int DEFAULT_H3_PADDING = (int) ParametersUtils.emToPx(.83f); private static final int DEFAULT_H4_SIZE = (int) ParametersUtils.emToPx(1.f); private static final int DEFAULT_H4_PADDING = (int) ParametersUtils.emToPx(1.12f); private static final int DEFAULT_H5_SIZE = (int) ParametersUtils.emToPx(0.8f); private static final int DEFAULT_H5_PADDING = (int) ParametersUtils.emToPx(1.12f); private static final int DEFAULT_H6_SIZE = (int) ParametersUtils.emToPx(.6f); private static final int DEFAULT_H6_PADDING = (int) ParametersUtils.emToPx(1.12f); private static final int DEFAULT_P_PADDING = (int) ParametersUtils.dpToPx(5); static { InheritStylesRegistry.register(FONT_SIZE); InheritStylesRegistry.register(COLOR); InheritStylesRegistry.register(LINE_HEIGHT); InheritStylesRegistry.register(FONT_STYLE); InheritStylesRegistry.register(FONT_WEIGHT); InheritStylesRegistry.register(TEXT_ALIGN); InheritStylesRegistry.register(TEXT_WORD_SPACING); } @Override public void apply(Context context, View v, DomElement domElement, View parent, LayoutParamsLazyCreator paramsLazyCreator, String params, final Object value, boolean isParent) throws AttrApplyException { final TextView textView = (TextView) v; switch (params) { case COLOR: textView.setTextColor(ParametersUtils.toColor(value)); break; case TEXT: textView.setText(value.toString()); break; case FONT_SIZE: PixelValue size = ParametersUtils.toPixel(value); if (size.getUnit() == PixelValue.UNSET) { textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, (float) size.getValue()); } else { textView.setTextSize(size.getUnit(), (float) size.getValue()); } break; case LINE_HEIGHT: float lineHeight = (float) ParametersUtils.toPixel(value).getPxValue(); textView.setLineSpacing(0, lineHeight); break; case FONT_WEIGHT: java.lang.String s = value.toString(); if (s.equals("bold")) { textView.setTypeface(Typeface.DEFAULT, Typeface.BOLD); } else if (s.equals("normal")) { textView.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); } break; case FONT_STYLE: java.lang.String s2 = value.toString(); if (s2.equals("italic")) { int style = textView.getTypeface().getStyle(); if (style == Typeface.BOLD) { style = Typeface.BOLD_ITALIC; } else { style = Typeface.ITALIC; } textView.setTypeface(Typeface.DEFAULT, style); } else if (s2.equals("normal")) { int style = textView.getTypeface().getStyle(); if (style == Typeface.BOLD_ITALIC) { style = Typeface.BOLD; } else { style = Typeface.NORMAL; } textView.setTypeface(Typeface.DEFAULT, style); } break; case HREF: if (domElement.getType().equals(HtmlTag.A)) { textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (HNativeEngine.getHrefLinkHandler() != null) { HNativeEngine.getHrefLinkHandler().onHref(value.toString(), textView); } } }); } break; case TEXT_ALIGN: java.lang.String val = value.toString(); switch (val) { case "center": textView.setGravity(Gravity.CENTER); break; case "left": textView.setGravity(Gravity.START); break; case "right": textView.setGravity(Gravity.END); break; } break; case TEXT_WORD_SPACING: { String ss = value.toString(); if (ss.equals("normal")) { textView.setLetterSpacing(textView.getLetterSpacing()); } else { PixelValue f = ParametersUtils.toPixel(value); textView.setLetterSpacing((float) f.getEmValue()); } break; } case TEXT_OVER_FLOW: { String ss = value.toString(); if (ss.equals("ellipsis")) { textView.setEllipsize(TextUtils.TruncateAt.END); } break; } case TEXT_TRANSFORM: { switch (value.toString()) { case "uppercase": textView.setAllCaps(true); break; case "lowercase": textView.setAllCaps(false); break; } } break; } } @Override public void setDefault(Context context, View v, DomElement domElement, LayoutParamsLazyCreator paramsLazyCreator, View parent) throws AttrApplyException { TextView textView = (TextView) v; if (!TextUtils.isEmpty(domElement.getInner()) && TextUtils.isEmpty(textView.getText())) { textView.setText(domElement.getInner()); } textView.setTextSize(DEFAULT_SIZE); switch (domElement.getType()) { case HtmlTag.H1: textView.setTextSize(DEFAULT_H1_SIZE); paramsLazyCreator.width = ViewGroup.LayoutParams.MATCH_PARENT; StyleHelper.setPadding(textView, DEFAULT_H1_PADDING, textView.getPaddingLeft(), DEFAULT_H1_PADDING, textView.getPaddingRight()); StyleHelper.setBold(textView); break; case HtmlTag.H2: textView.setTextSize(DEFAULT_H2_SIZE); paramsLazyCreator.width = ViewGroup.LayoutParams.MATCH_PARENT; StyleHelper.setPadding(textView, DEFAULT_H2_PADDING, textView.getPaddingLeft(), DEFAULT_H2_PADDING, textView.getPaddingRight()); StyleHelper.setBold(textView); break; case HtmlTag.H3: textView.setTextSize(DEFAULT_H3_SIZE); paramsLazyCreator.width = ViewGroup.LayoutParams.MATCH_PARENT; StyleHelper.setPadding(textView, DEFAULT_H3_PADDING, textView.getPaddingLeft(), DEFAULT_H3_PADDING, textView.getPaddingRight()); StyleHelper.setBold(textView); break; case HtmlTag.H4: textView.setTextSize(DEFAULT_H4_SIZE); paramsLazyCreator.width = ViewGroup.LayoutParams.MATCH_PARENT; StyleHelper.setPadding(textView, DEFAULT_H4_PADDING, textView.getPaddingLeft(), DEFAULT_H4_PADDING, textView.getPaddingRight()); StyleHelper.setBold(textView); break; case HtmlTag.H5: textView.setTextSize(DEFAULT_H5_SIZE); paramsLazyCreator.width = ViewGroup.LayoutParams.MATCH_PARENT; StyleHelper.setPadding(textView, DEFAULT_H5_PADDING, textView.getPaddingLeft(), DEFAULT_H5_PADDING, textView.getPaddingRight()); StyleHelper.setBold(textView); break; case HtmlTag.H6: textView.setTextSize(DEFAULT_H6_SIZE); paramsLazyCreator.width = ViewGroup.LayoutParams.MATCH_PARENT; StyleHelper.setPadding(textView, DEFAULT_H6_PADDING, textView.getPaddingLeft(), DEFAULT_H6_PADDING, textView.getPaddingRight()); StyleHelper.setBold(textView); break; case HtmlTag.P: StyleHelper.setTopPadding(textView, DEFAULT_P_PADDING); StyleHelper.setBottomPadding(textView, DEFAULT_P_PADDING); paramsLazyCreator.width = ViewGroup.LayoutParams.MATCH_PARENT; break; case HtmlTag.A: StyleHelper.setUnderLine(textView); paramsLazyCreator.width = ViewGroup.LayoutParams.WRAP_CONTENT; break; } } @Override public Object getStyle(View v, String styleName) { final TextView textView = (TextView) v; switch (styleName) { case COLOR: return "#ff0000"; } //TODO return null; } }