/** * Ti.StyledLabel Module * Copyright (c) 2010-2013 by Appcelerator, Inc. All Rights Reserved. * Please see the LICENSE included with this distribution for details. */ package ti.styledlabel; import org.appcelerator.titanium.TiApplication; import org.appcelerator.kroll.KrollDict; import org.appcelerator.titanium.proxy.TiViewProxy; import org.appcelerator.titanium.view.TiUIView; import org.ccil.cowan.tagsoup.Parser; import org.appcelerator.kroll.common.TiMessenger; import org.appcelerator.kroll.common.AsyncResult; import ti.styledlabel.parsing.CustomImageGetter; import ti.styledlabel.parsing.CustomLinkMovementMethod; import ti.styledlabel.parsing.HtmlParser; import ti.styledlabel.parsing.HtmlToSpannedConverter; import android.graphics.Color; import android.text.InputType; import android.view.Gravity; import android.widget.TextView; import android.os.Handler; import android.os.Message; import android.text.Spanned; public class Label extends TiUIView { private String _html; private String[] _filteredTags; private int _filterTagsMode = -1; public Label(TiViewProxy proxy) { super(proxy); TextView textView = new TextView(TiApplication.getAppCurrentActivity()); textView.setMovementMethod(new CustomLinkMovementMethod(proxy)); textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); textView.setPadding(0, 0, 0, 0); textView.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE); textView.setKeyListener(null); textView.setTextColor(Color.BLACK); textView.setFocusable(false); setNativeView(textView); } @Override public void processProperties(KrollDict props) { super.processProperties(props); if (props.containsKey("html")) { setHtml(props.getString("html")); } if (props.containsKey("filteredTags")) { setFilteredTags(props.getStringArray("filteredTags")); } if (props.containsKey("filteredTagsMode")) { setFilteredTagsMode(props.getInt("filteredTagsMode")); } } private static final int MSG_UPDATE_TEXT = 50000; private final Handler handler = new Handler(TiMessenger.getMainMessenger().getLooper(), new Handler.Callback () { public boolean handleMessage(Message msg) { switch (msg.what) { case MSG_UPDATE_TEXT: { AsyncResult result = (AsyncResult) msg.obj; handleUpdateText((Spanned) result.getArg()); result.setResult(null); return true; } } return false; } }); private void updateText(final Spanned text) { if (!TiApplication.isUIThread()) { TiMessenger.sendBlockingMainMessage(handler.obtainMessage(MSG_UPDATE_TEXT), text); } else { handleUpdateText(text); } } private void handleUpdateText(final Spanned text) { TextView textView = (TextView) getNativeView(); textView.setText(text); textView.invalidate(); } public void setHtml(String html) { _html = html; Parser parser = new Parser(); try { parser.setProperty(Parser.schemaProperty, HtmlParser.schema); } catch (org.xml.sax.SAXNotRecognizedException e) { // Should not happen. throw new RuntimeException(e); } catch (org.xml.sax.SAXNotSupportedException e) { // Should not happen. throw new RuntimeException(e); } HtmlToSpannedConverter converter = new HtmlToSpannedConverter(html, new CustomImageGetter(proxy), parser); converter.setFilteredTags(_filteredTags); converter.setFilteredTagsMode(_filterTagsMode); updateText(converter.convert()); } public void setFilteredTags(String[] tags) { _filteredTags = tags; if (_filteredTags != null && _filterTagsMode != -1) { setHtml(_html); } } public void setFilteredTagsMode(int mode) { _filterTagsMode = mode; if (_filteredTags != null && _filterTagsMode != -1) { setHtml(_html); } } }