Java Examples for android.text.style.LeadingMarginSpan

The following java examples will help you to understand the usage of android.text.style.LeadingMarginSpan. These source code samples are taken from different open source projects.

Example 1
Project: BioWiki-master  File: BWHtmlTagHandler.java View source code
private void handleListTag(Editable output) {
    if (mListParents.lastElement().equals("ul")) {
        output.append("\n");
        String[] split = output.toString().split("\n");
        int start = 0;
        if (split.length != 1) {
            int lastIndex = split.length - 1;
            start = output.length() - split[lastIndex].length() - 1;
        }
        output.setSpan(new BulletSpan(15 * mListParents.size()), start, output.length(), 0);
    } else if (mListParents.lastElement().equals("ol")) {
        mListItemCount++;
        output.append("\n");
        String[] split = output.toString().split("\n");
        int start = 0;
        if (split.length != 1) {
            int lastIndex = split.length - 1;
            start = output.length() - split[lastIndex].length() - 1;
        }
        output.insert(start, mListItemCount + ". ");
        output.setSpan(new LeadingMarginSpan.Standard(15 * mListParents.size()), start, output.length(), 0);
    }
}
Example 2
Project: hpbpad-Android-master  File: WPHtmlTagHandler.java View source code
private void handleListTag(Editable output) {
    if (mListParents.lastElement().equals("ul")) {
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.setSpan(new BulletSpan(15 * mListParents.size()), start, output.length(), 0);
    } else if (mListParents.lastElement().equals("ol")) {
        mListItemCount++;
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.insert(start, mListItemCount + ". ");
        output.setSpan(new LeadingMarginSpan.Standard(15 * mListParents.size()), start, output.length(), 0);
    }
}
Example 3
Project: WordPress-Android-master  File: WPHtmlTagHandler.java View source code
private void handleListTag(Editable output) {
    int size = mListParents.size();
    if (size > 0 && output != null) {
        if ("ul".equals(mListParents.get(size - 1))) {
            output.append("\n");
            String[] split = output.toString().split("\n");
            int start = 0;
            if (split.length != 1) {
                int lastIndex = split.length - 1;
                start = output.length() - split[lastIndex].length() - 1;
            }
            output.setSpan(new BulletSpan(SPAN_INDENT_WIDTH * mListParents.size()), start, output.length(), 0);
        } else if ("ol".equals(mListParents.get(size - 1))) {
            mListItemCount++;
            output.append("\n");
            String[] split = output.toString().split("\n");
            int start = 0;
            if (split.length != 1) {
                int lastIndex = split.length - 1;
                start = output.length() - split[lastIndex].length() - 1;
            }
            output.insert(start, mListItemCount + ". ");
            output.setSpan(new LeadingMarginSpan.Standard(SPAN_INDENT_WIDTH * mListParents.size()), start, output.length(), 0);
        }
    }
}
Example 4
Project: WordPress-Networking-Android-master  File: WPHtmlTagHandler.java View source code
private void handleListTag(Editable output) {
    if (mListParents.lastElement().equals("ul")) {
        output.append("\n");
        String[] split = output.toString().split("\n");
        int start = 0;
        if (split.length != 1) {
            int lastIndex = split.length - 1;
            start = output.length() - split[lastIndex].length() - 1;
        }
        output.setSpan(new BulletSpan(15 * mListParents.size()), start, output.length(), 0);
    } else if (mListParents.lastElement().equals("ol")) {
        mListItemCount++;
        output.append("\n");
        String[] split = output.toString().split("\n");
        int start = 0;
        if (split.length != 1) {
            int lastIndex = split.length - 1;
            start = output.length() - split[lastIndex].length() - 1;
        }
        output.insert(start, mListItemCount + ". ");
        output.setSpan(new LeadingMarginSpan.Standard(15 * mListParents.size()), start, output.length(), 0);
    }
}
Example 5
Project: training-content-master  File: HtmlTagHandler.java View source code
private void handleListTag(Editable output) {
    if (mListParents.lastElement().equals("ul")) {
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.setSpan(new BulletSpan(15 * mListParents.size()), start, output.length(), 0);
    } else if (mListParents.lastElement().equals("ol")) {
        mListItemCount++;
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.insert(start, mListItemCount + ". ");
        output.setSpan(new LeadingMarginSpan.Standard(15 * mListParents.size()), start, output.length(), 0);
    }
}
Example 6
Project: android-discourse-master  File: HtmlTagHandler.java View source code
@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
    if (tag.equalsIgnoreCase("ul")) {
        if (opening) {
            lists.push(tag);
        } else {
            lists.pop();
        }
    } else if (tag.equalsIgnoreCase("ol")) {
        if (opening) {
            lists.push(tag);
            // TODO: add support for lists starting other index than 1
            olNextIndex.push(Integer.valueOf(1)).toString();
        } else {
            lists.pop();
            olNextIndex.pop().toString();
        }
    } else if (tag.equalsIgnoreCase("li")) {
        if (opening) {
            if (output.length() > 0 && output.charAt(output.length() - 1) != '\n') {
                output.append("\n");
            }
            String parentList = lists.peek();
            if (parentList.equalsIgnoreCase("ol")) {
                start(output, new Ol());
                output.append(olNextIndex.peek().toString() + ". ");
                olNextIndex.push(Integer.valueOf(olNextIndex.pop().intValue() + 1));
            } else if (parentList.equalsIgnoreCase("ul")) {
                start(output, new Ul());
            }
        } else {
            if (lists.peek().equalsIgnoreCase("ul")) {
                if (output.charAt(output.length() - 1) != '\n') {
                    output.append("\n");
                }
                // Nested BulletSpans increases distance between bullet and text, so we must prevent it.
                int bulletMargin = indent;
                if (lists.size() > 1) {
                    bulletMargin = indent - bullet.getLeadingMargin(true);
                    if (lists.size() > 2) {
                        // This get's more complicated when we add a LeadingMarginSpan into the same line:
                        // we have also counter it's effect to BulletSpan
                        bulletMargin -= (lists.size() - 2) * listItemIndent;
                    }
                }
                BulletSpan newBullet = new BulletSpan(bulletMargin);
                end(output, Ul.class, new LeadingMarginSpan.Standard(listItemIndent * (lists.size() - 1)), newBullet);
            } else if (lists.peek().equalsIgnoreCase("ol")) {
                if (output.charAt(output.length() - 1) != '\n') {
                    output.append("\n");
                }
                int numberMargin = listItemIndent * (lists.size() - 1);
                if (lists.size() > 2) {
                    // Same as in ordered lists: counter the effect of nested Spans
                    numberMargin -= (lists.size() - 2) * listItemIndent;
                }
                end(output, Ol.class, new LeadingMarginSpan.Standard(numberMargin));
            }
        }
    } else if (tag.equalsIgnoreCase("code")) {
        if (opening) {
            output.setSpan(new TypefaceSpan("monospace"), output.length(), output.length(), Spannable.SPAN_MARK_MARK);
        } else {
            L.d("Code tag encountered");
            Object obj = getLast(output, TypefaceSpan.class);
            int where = output.getSpanStart(obj);
            output.setSpan(new TypefaceSpan("monospace"), where, output.length(), 0);
            output.setSpan(new BackgroundColorSpan(Color.parseColor("#f1f1ff")), where, output.length(), 0);
        }
    } else {
        if (opening)
            L.d("Found an unsupported tag " + tag);
    }
}
Example 7
Project: JNote-master  File: MDFormatter.java View source code
protected void format(MDLine line) {
    int start = mBuilder.length();
    for (MDWord word : line.mMDWords) {
        int index = mBuilder.length();
        mBuilder.append(word.mRawContent);
        mBuilder.setSpan(getSpan(word.mFormat), index, mBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
    mBuilder.append("\n");
    if (line.mFormat == Markdown.MD_FMT_ORDER_LIST || line.mFormat == Markdown.MD_FMT_UNORDER_LIST || line.mFormat == Markdown.MD_FMT_QUOTE) {
        mBuilder.setSpan(new LeadingMarginSpan.Standard(40), start, mBuilder.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    }
    if (line.mFormat != Markdown.MD_FMT_TEXT) {
        mBuilder.setSpan(getSpan(line.mFormat), start, mBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
}
Example 8
Project: iven-feed-reader-master  File: ArticleFragment.java View source code
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    //set the view
    rootView = (ViewGroup) inflater.inflate(R.layout.article_fragment, container, false);
    //article title and subtitle
    //title
    title = (TextView) rootView.findViewById(R.id.title);
    //subtitle
    subtitle = (TextView) rootView.findViewById(R.id.subtitle);
    //action Buttons
    //read more button
    button_continue_reading = (ImageButton) rootView.findViewById(R.id.button_continue);
    //this is the method to handle the continue reading button click
    View.OnClickListener listener_forward = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (Preferences.WebViewEnabled(getContext())) {
                ArticleUtils.openFeedPage(getActivity(), feedLink);
            } else {
                ArticleUtils.continueReading(getActivity(), feedLink);
            }
        }
    };
    //set Read more listener
    button_continue_reading.setOnClickListener(listener_forward);
    if (Preferences.WebViewEnabled(getContext())) {
        //this is the method to handle the continue reading long button click
        View.OnLongClickListener listener_external = new View.OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                //open the url using external browser if webview is enabled
                ArticleUtils.continueReading(getActivity(), feedLink);
                return true;
            }
        };
        //set the long click listener
        button_continue_reading.setOnLongClickListener(listener_external);
    }
    //share button
    button_share = (ImageButton) rootView.findViewById(R.id.button_share);
    //this is the method to handle the share button click
    View.OnClickListener listener_share = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            ArticleUtils.share(getActivity(), feedLink, feedTitle);
        }
    };
    //set Share listener
    button_share.setOnClickListener(listener_share);
    //back button
    button_back = (ImageButton) rootView.findViewById(R.id.button_back);
    //this is the click listener to provide back navigation
    View.OnClickListener listener_back = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            AppCompatActivity appCompatActivity = (AppCompatActivity) getActivity();
            ArticleUtils.goBack(appCompatActivity);
        }
    };
    //set back button on click listener
    button_back.setOnClickListener(listener_back);
    titleSpan = new SpannableString(feedTitle.toUpperCase());
    titleSpan.setSpan(new StyleSpan(Typeface.BOLD), 0, titleSpan.length(), 0);
    //dynamically set title and subtitle according to the feed data
    //set title of the article
    title.setText(titleSpan);
    subtitleSpan = new SpannableString(feedDate);
    subtitleSpan.setSpan(new StyleSpan(Typeface.BOLD), 0, subtitleSpan.length(), 0);
    //set the date of the article to subtitle
    subtitle.setText(subtitleSpan);
    //set the articles text size from preferences
    //get the chosen article's text size from preferences
    size = Preferences.resolveTextSizeResId(getContext());
    //set it in SP unit
    title.setTextSize(TypedValue.COMPLEX_UNIT_SP, size + 4);
    subtitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, size - 5);
    //if the preference is enabled remove the imageview from the linear layout
    //ImageView
    imageView = (ImageView) rootView.findViewById(R.id.img);
    //initialize the article view linear layout
    article_default_linearLayout = (LinearLayout) rootView.findViewById(R.id.article_linearlayout);
    if (Preferences.imagesRemoved(getContext())) {
        article_default_linearLayout.removeView(imageView);
    } else //if getImage() method fails (i.e when img is in content:encoded) load image2
    if (imageLink.isEmpty()) {
        GlideUtils.loadImage(getActivity(), imageLink2, imageView);
    //else use image
    } else {
        GlideUtils.loadImage(getActivity(), imageLink, imageView);
    }
    //we can open the image on web browser on long click on the image
    imageView.setOnLongClickListener(new View.OnLongClickListener() {

        public boolean onLongClick(View v) {
            final Intent intent;
            //open imageview links
            if (imageLink.isEmpty()) {
                intent = new Intent(Intent.ACTION_VIEW, Uri.parse(imageLink2));
            } else //else use image
            {
                intent = new Intent(Intent.ACTION_VIEW, Uri.parse(imageLink));
            }
            //open the image
            ArticleUtils.openImageLink(getActivity(), intent);
            return true;
        }
    });
    //use complete description by default, but sometimes the method returns null
    if (feedCompleteDescription.contains("no desc")) {
        datDescription = Jsoup.parse(feedDescription).text().replace("Continua a leggere...", "");
    // else, use complete description
    } else {
        datDescription = Jsoup.parse(feedCompleteDescription).text().replace("Continua a leggere...", "");
    }
    //replace some items since this is a simple TextView
    datDescriptionFirstformat = datDescription.replace("Continue reading...", "");
    datDescriptionSecondformat = datDescriptionFirstformat.replace("Read More", "");
    datDescriptionThirdformat = datDescriptionSecondformat.replace("(read more)", "");
    //load the article inside a TextView
    articletext = (TextView) rootView.findViewById(R.id.webv);
    storySpan = new SpannableString(datDescriptionThirdformat);
    storySpan.setSpan(new StyleSpan(Typeface.ITALIC), 0, storySpan.length(), 0);
    leadingMarginSpan = new android.text.style.LeadingMarginSpan.Standard(10);
    quoteSpan = new QuoteSpan();
    storySpan.setSpan(quoteSpan, 0, 0, 0);
    storySpan.setSpan(leadingMarginSpan, 0, storySpan.length(), 0);
    //set the articles text
    articletext.setText(storySpan);
    //set the article text size according to preferences
    articletext.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
    return rootView;
}
Example 9
Project: Android-RTEditor-master  File: RTEditorMovementMethod.java View source code
// TODO finding links doesn't work with right alignment and potentially other formatting options
private int getCharIndexAt(TextView textView, MotionEvent event) {
    // get coordinates
    int x = (int) event.getX();
    int y = (int) event.getY();
    x -= textView.getTotalPaddingLeft();
    y -= textView.getTotalPaddingTop();
    x += textView.getScrollX();
    y += textView.getScrollY();
    /*
         * Fail-fast check of the line bound.
         * If we're not within the line bound no character was touched
         */
    Layout layout = textView.getLayout();
    int line = layout.getLineForVertical(y);
    synchronized (sLineBounds) {
        layout.getLineBounds(line, sLineBounds);
        if (!sLineBounds.contains(x, y)) {
            return -1;
        }
    }
    // retrieve line text
    Spanned text = (Spanned) textView.getText();
    int lineStart = layout.getLineStart(line);
    int lineEnd = layout.getLineEnd(line);
    int lineLength = lineEnd - lineStart;
    if (lineLength == 0) {
        return -1;
    }
    Spanned lineText = (Spanned) text.subSequence(lineStart, lineEnd);
    // compute leading margin and subtract it from the x coordinate
    int margin = 0;
    LeadingMarginSpan[] marginSpans = lineText.getSpans(0, lineLength, LeadingMarginSpan.class);
    if (marginSpans != null) {
        for (LeadingMarginSpan span : marginSpans) {
            margin += span.getLeadingMargin(true);
        }
    }
    x -= margin;
    // retrieve text widths
    float[] widths = new float[lineLength];
    TextPaint paint = textView.getPaint();
    paint.getTextWidths(lineText, 0, lineLength, widths);
    // scale text widths by relative font size (absolute size / default size)
    final float defaultSize = textView.getTextSize();
    float scaleFactor = 1f;
    AbsoluteSizeSpan[] absSpans = lineText.getSpans(0, lineLength, AbsoluteSizeSpan.class);
    if (absSpans != null) {
        for (AbsoluteSizeSpan span : absSpans) {
            int spanStart = lineText.getSpanStart(span);
            int spanEnd = lineText.getSpanEnd(span);
            scaleFactor = span.getSize() / defaultSize;
            int start = Math.max(lineStart, spanStart);
            int end = Math.min(lineEnd, spanEnd);
            for (int i = start; i < end; i++) {
                widths[i] *= scaleFactor;
            }
        }
    }
    // find index of touched character
    float startChar = 0;
    float endChar = 0;
    for (int i = 0; i < lineLength; i++) {
        startChar = endChar;
        endChar += widths[i];
        if (endChar >= x) {
            // which "end" is closer to x, the start or the end of the character?
            int index = lineStart + (x - startChar < endChar - x ? i : i + 1);
            //Logger.e(Logger.LOG_TAG, "Found character: " + (text.length()>index ? text.charAt(index) : ""));
            return index;
        }
    }
    return -1;
}
Example 10
Project: androidbible-master  File: SyncLogActivity.java View source code
@Override
public void bindView(final View view, final int position, final ViewGroup parent) {
    final SyncLog log = logs.get(position);
    final SpannableStringBuilder sb = new SpannableStringBuilder();
    sb.append(dateFormat.get().format(log.createTime));
    sb.append("\n");
    {
        final SyncRecorder.EventKind kind = SyncRecorder.EventKind.fromCode(log.kind_code);
        final int sb_len = sb.length();
        if (kind == null) {
            sb.append(String.valueOf(log.kind_code));
            sb.setSpan(new BackgroundColorSpan(0xff222222), sb_len, sb.length(), 0);
        } else {
            sb.append(kind.toString());
            sb.setSpan(new BackgroundColorSpan(kind.backgroundColor), sb_len, sb.length(), 0);
        }
        if (log.syncSetName != null) {
            sb.append(" ");
            sb.append(log.syncSetName);
        }
    }
    if (log.params != null) {
        final int sb_len0 = sb.length();
        for (final Map.Entry<String, Object> entry : log.params.entrySet()) {
            sb.append("\n");
            final int sb_len = sb.length();
            sb.append(entry.getKey());
            sb.setSpan(new StyleSpan(Typeface.BOLD), sb_len, sb.length(), 0);
            sb.append(" ");
            final Object value = entry.getValue();
            if (value instanceof Number) {
                final double doubleValue = ((Number) value).doubleValue();
                final double floored = Math.floor(doubleValue);
                if (floored == doubleValue) {
                    sb.append(String.valueOf((long) floored));
                } else {
                    sb.append(String.valueOf(doubleValue));
                }
            } else {
                sb.append(String.valueOf(value));
            }
        }
        sb.setSpan(new RelativeSizeSpan(0.8f), sb_len0, sb.length(), 0);
        sb.setSpan(new LeadingMarginSpan.Standard(((int) (8 * density))), sb_len0, sb.length(), 0);
    }
    final TextView text = (TextView) view;
    text.setTextSize(14.f);
    text.setText(sb);
    text.setPadding((int) (4 * density), (int) (4 * density), (int) (4 * density), (int) (4 * density));
}
Example 11
Project: armatus-master  File: ConsoleInputEditText.java View source code
@Override
public void afterTextChanged(Editable s) {
    int cursorPos = getSelectionStart();
    removeTextChangedListener(this);
    //Remove additional spans that might be introduced through pasting
    for (LeadingMarginSpan span : s.getSpans(0, s.length(), LeadingMarginSpan.class)) {
        s.removeSpan(span);
    }
    s.setSpan(mIndent, 0, 0, 0);
    for (; mChangedStartIndex < mChangedEndIndex; mChangedStartIndex++) {
        switch(s.charAt(mChangedStartIndex)) {
            case ' ':
                //Prevent TextView's default word-wrapping behavior (wrap by character instead)
                s.replace(mChangedStartIndex, mChangedStartIndex + 1, StringUtils.NBSP);
                break;
            case '\n':
                /* A strange bug exists where pasting multiple lines will seemingly indent all
						 * newlines--until the text is changed via typing. Therefore, this will initiate
						 * the typing on each newline to prevent weirdness. */
                setSelection(mChangedStartIndex);
                dispatchKeyEvent(Q);
                dispatchKeyEvent(DEL);
                break;
        }
    }
    addTextChangedListener(this);
    setSelection(cursorPos);
}
Example 12
Project: boardgamegeek4android-master  File: ListTagHandler.java View source code
@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
    if (tagIsTypeOf(tag, UL)) {
        if (opening) {
            lists.push(tag);
        } else {
            lists.pop();
        }
    } else if (tagIsTypeOf(tag, OL)) {
        if (opening) {
            lists.push(tag);
            nextOrderedIndex.push(1);
        } else {
            lists.pop();
            nextOrderedIndex.pop();
        }
    } else if (tagIsTypeOf(tag, LI)) {
        String currentListTag = lists.peek();
        ensureTrailingNewLine(output);
        if (opening) {
            if (tagIsTypeOf(currentListTag, UL)) {
                startListItem(output, new Ul());
            } else if (tagIsTypeOf(currentListTag, OL)) {
                startListItem(output, new Ol());
                output.append(nextOrderedIndex.peek().toString()).append(". ");
                nextOrderedIndex.push(nextOrderedIndex.pop() + 1);
            }
        } else {
            if (tagIsTypeOf(currentListTag, UL)) {
                // Nested BulletSpans increases distance between bullet and text, so we must prevent it.
                int margin = INDENTATION_IN_PIXELS;
                if (lists.size() > 1) {
                    margin = INDENTATION_IN_PIXELS - BULLET_SPAN.getLeadingMargin(true);
                    if (lists.size() > 2) {
                        // This gets more complicated when we add a LeadingMarginSpan into the same line:
                        // we have also counter it's effect to BulletSpan
                        margin -= (lists.size() - 2) * LIST_ITEM_INDENTATION_IN_PIXELS;
                    }
                }
                BulletSpan newBullet = new BulletSpan(margin);
                endListItem(output, Ul.class, new LeadingMarginSpan.Standard(LIST_ITEM_INDENTATION_IN_PIXELS * (lists.size() - 1)), newBullet);
            } else if (tagIsTypeOf(currentListTag, OL)) {
                int margin = LIST_ITEM_INDENTATION_IN_PIXELS * (lists.size() - 1);
                if (lists.size() > 2) {
                    // Same as in ordered lists: counter the effect of nested Spans
                    margin -= (lists.size() - 2) * LIST_ITEM_INDENTATION_IN_PIXELS;
                }
                endListItem(output, Ol.class, new LeadingMarginSpan.Standard(margin));
            }
        }
    } else {
        if (opening) {
            Timber.d("Found an unsupported tag: %s", tag);
        }
    }
}
Example 13
Project: GSoC-master  File: HtmlTagHandler.java View source code
private void handleListTag(Editable output) {
    if (mListParents.lastElement().equals("ul")) {
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.setSpan(new BulletSpan(15 * mListParents.size()), start, output.length(), 0);
    } else if (mListParents.lastElement().equals("ol")) {
        mListItemCount++;
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.insert(start, mListItemCount + ". ");
        output.setSpan(new LeadingMarginSpan.Standard(15 * mListParents.size()), start, output.length(), 0);
    }
}
Example 14
Project: i2p.i2p-bote.android-master  File: HtmlTagHandler.java View source code
private void handleListTag(Editable output) {
    if (mListParents.lastElement().equals("ul")) {
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.setSpan(new BulletSpan(15 * mListParents.size()), start, output.length(), 0);
    } else if (mListParents.lastElement().equals("ol")) {
        mListItemCount++;
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.insert(start, mListItemCount + ". ");
        output.setSpan(new LeadingMarginSpan.Standard(15 * mListParents.size()), start, output.length(), 0);
    }
}
Example 15
Project: MozuAndroidInStoreAssistant-master  File: HTMLTagHandler.java View source code
@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
    if (tag.equalsIgnoreCase("ul")) {
        if (opening) {
            lists.push(tag);
        } else {
            lists.pop();
        }
    } else if (tag.equalsIgnoreCase("ol")) {
        if (opening) {
            lists.push(tag);
            //TODO: add support for lists starting other index than 1
            olNextIndex.push(Integer.valueOf(1)).toString();
        } else {
            lists.pop();
            olNextIndex.pop().toString();
        }
    } else if (tag.equalsIgnoreCase("li")) {
        if (opening) {
            if (output.length() > 0 && output.charAt(output.length() - 1) != '\n') {
                output.append("\n");
            }
            String parentList = lists.peek();
            if (parentList.equalsIgnoreCase("ol")) {
                start(output, new Ol());
                output.append(olNextIndex.peek().toString() + ". ");
                olNextIndex.push(Integer.valueOf(olNextIndex.pop().intValue() + 1));
            } else if (parentList.equalsIgnoreCase("ul")) {
                start(output, new Ul());
            }
        } else {
            if (lists.peek().equalsIgnoreCase("ul")) {
                if (output.charAt(output.length() - 1) != '\n') {
                    output.append("\n");
                }
                // Nested BulletSpans increases distance between bullet and text, so we must prevent it.
                int bulletMargin = indent;
                if (lists.size() > 1) {
                    bulletMargin = indent - bullet.getLeadingMargin(true);
                    if (lists.size() > 2) {
                        // This get's more complicated when we add a LeadingMarginSpan into the same line:
                        // we have also counter it's effect to BulletSpan
                        bulletMargin -= (lists.size() - 2) * listItemIndent;
                    }
                }
                BulletSpan newBullet = new BulletSpan(bulletMargin);
                end(output, Ul.class, new LeadingMarginSpan.Standard(listItemIndent * (lists.size() - 1)), newBullet);
            } else if (lists.peek().equalsIgnoreCase("ol")) {
                if (output.charAt(output.length() - 1) != '\n') {
                    output.append("\n");
                }
                int numberMargin = listItemIndent * (lists.size() - 1);
                if (lists.size() > 2) {
                    // Same as in ordered lists: counter the effect of nested Spans
                    numberMargin -= (lists.size() - 2) * listItemIndent;
                }
                end(output, Ol.class, new LeadingMarginSpan.Standard(numberMargin));
            }
        }
    } else {
        if (opening)
            Log.d("TagHandler", "Found an unsupported tag " + tag);
    }
}
Example 16
Project: PanicButton-master  File: MyTagHandler.java View source code
@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
    if (tag.equalsIgnoreCase("ul")) {
        if (opening) {
            lists.push(tag);
        } else {
            lists.pop();
        }
    } else if (tag.equalsIgnoreCase("ol")) {
        if (opening) {
            lists.push(tag);
            //TODO: add support for lists starting other index than 1
            olNextIndex.push(Integer.valueOf(1)).toString();
        } else {
            lists.pop();
            olNextIndex.pop().toString();
        }
    } else if (tag.equalsIgnoreCase("li")) {
        if (opening) {
            if (output.length() > 0 && output.charAt(output.length() - 1) != '\n') {
                output.append("\n");
            }
            String parentList = lists.peek();
            if (parentList.equalsIgnoreCase("ol")) {
                start(output, new Ol());
                output.append(olNextIndex.peek().toString() + ". ");
                olNextIndex.push(Integer.valueOf(olNextIndex.pop().intValue() + 1));
            } else if (parentList.equalsIgnoreCase("ul")) {
                start(output, new Ul());
            }
        } else {
            if (lists.peek().equalsIgnoreCase("ul")) {
                if (output.charAt(output.length() - 1) != '\n') {
                    output.append("\n");
                }
                // Nested BulletSpans increases distance between bullet and text, so we must prevent it.
                int bulletMargin = indent;
                if (lists.size() > 1) {
                    bulletMargin = indent - bullet.getLeadingMargin(true);
                    if (lists.size() > 2) {
                        // This get's more complicated when we add a LeadingMarginSpan into the same line:
                        // we have also counter it's effect to BulletSpan
                        bulletMargin -= (lists.size() - 2) * listItemIndent;
                    }
                }
                BulletSpan newBullet = new BulletSpan(bulletMargin);
                end(output, Ul.class, new LeadingMarginSpan.Standard(listItemIndent * (lists.size() - 1)), newBullet);
            } else if (lists.peek().equalsIgnoreCase("ol")) {
                if (output.charAt(output.length() - 1) != '\n') {
                    output.append("\n");
                }
                int numberMargin = listItemIndent * (lists.size() - 1);
                if (lists.size() > 2) {
                    // Same as in ordered lists: counter the effect of nested Spans
                    numberMargin -= (lists.size() - 2) * listItemIndent;
                }
                end(output, Ol.class, new LeadingMarginSpan.Standard(numberMargin));
            }
        }
    } else {
        if (opening)
            Log.d("TagHandler", "Found an unsupported tag " + tag);
    }
}
Example 17
Project: PrepayCredit-master  File: CustomTagHandler.java View source code
private void handleListTag(Editable output) {
    if (mListParents.get(mListParents.size() - 1).equals("ul")) {
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.setSpan(new BulletSpan(15 * mListParents.size()), start, output.length(), 0);
    } else if (mListParents.get(mListParents.size() - 1).equals("ol")) {
        mListItemCount++;
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.insert(start, mListItemCount + ". ");
        output.setSpan(new LeadingMarginSpan.Standard(15 * mListParents.size()), start, output.length(), 0);
    }
}
Example 18
Project: project_open-master  File: HtmlTagHandler.java View source code
private void handleListTag(Editable output) {
    if (mListParents.lastElement().equals("ul")) {
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.setSpan(new BulletSpan(15 * mListParents.size()), start, output.length(), 0);
    } else if (mListParents.lastElement().equals("ol")) {
        mListItemCount++;
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.insert(start, mListItemCount + ". ");
        output.setSpan(new LeadingMarginSpan.Standard(15 * mListParents.size()), start, output.length(), 0);
    }
}
Example 19
Project: QuickNews-master  File: HtmlTagHandler.java View source code
private void handleListTag(Editable output) {
    if (mListParents.lastElement().equals("ul")) {
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.setSpan(new BulletSpan(15 * mListParents.size()), start, output.length(), 0);
    } else if (mListParents.lastElement().equals("ol")) {
        mListItemCount++;
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.insert(start, mListItemCount + ". ");
        output.setSpan(new LeadingMarginSpan.Standard(15 * mListParents.size()), start, output.length(), 0);
    }
}
Example 20
Project: RealTextView-master  File: HtmlTagHandler.java View source code
private void handleListTag(Editable output) {
    if (mListParents.lastElement().equals("ul")) {
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.setSpan(new BulletSpan(15 * mListParents.size()), start, output.length(), 0);
    } else if (mListParents.lastElement().equals("ol")) {
        mListItemCount++;
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.insert(start, mListItemCount + ". ");
        output.setSpan(new LeadingMarginSpan.Standard(15 * mListParents.size()), start, output.length(), 0);
    }
}
Example 21
Project: ts-android-master  File: HtmlTagHandler.java View source code
private void handleListTag(Editable output) {
    if (mListParents.lastElement().equals("ul")) {
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.setSpan(new BulletSpan(15 * mListParents.size()), start, output.length(), 0);
    } else if (mListParents.lastElement().equals("ol")) {
        mListItemCount++;
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.insert(start, mListItemCount + ". ");
        output.setSpan(new LeadingMarginSpan.Standard(15 * mListParents.size()), start, output.length(), 0);
    }
}
Example 22
Project: v2ex-master  File: HtmlTagHandler.java View source code
private void handleListTag(Editable output) {
    if (mListParents.lastElement().equals("ul")) {
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.setSpan(new BulletSpan(15 * mListParents.size()), start, output.length(), 0);
    } else if (mListParents.lastElement().equals("ol")) {
        mListItemCount++;
        output.append("\n");
        String[] split = output.toString().split("\n");
        int lastIndex = split.length - 1;
        int start = output.length() - split[lastIndex].length() - 1;
        output.insert(start, mListItemCount + ". ");
        output.setSpan(new LeadingMarginSpan.Standard(15 * mListParents.size()), start, output.length(), 0);
    }
}
Example 23
Project: WhatAndroid-master  File: HTMLListTagHandler.java View source code
@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
    if (tag.equalsIgnoreCase("ul")) {
        if (opening) {
            lists.push(tag);
        } else {
            lists.pop();
        }
    } else if (tag.equalsIgnoreCase("ol")) {
        if (opening) {
            lists.push(tag);
            olNextIndex.push(1);
        } else {
            lists.pop();
            olNextIndex.pop();
        }
    } else if (tag.equalsIgnoreCase("li")) {
        if (opening) {
            if (output.length() > 0 && output.charAt(output.length() - 1) != '\n') {
                output.append("\n");
            }
            String parentList = lists.peek();
            if (parentList.equalsIgnoreCase("ol")) {
                start(output, new Ol());
                output.append(olNextIndex.peek().toString()).append(". ");
                olNextIndex.push(olNextIndex.pop() + 1);
            } else if (parentList.equalsIgnoreCase("ul")) {
                start(output, new Ul());
            }
        } else {
            if (lists.peek().equalsIgnoreCase("ul")) {
                if (output.charAt(output.length() - 1) != '\n') {
                    output.append("\n");
                }
                // Nested BulletSpans increases distance between bullet and text, so we must prevent it.
                int bulletMargin = indent;
                if (lists.size() > 1) {
                    bulletMargin = indent - bullet.getLeadingMargin(true);
                    if (lists.size() > 2) {
                        // This gets more complicated when we add a LeadingMarginSpan into the same line:
                        // we have also counter it's effect to BulletSpan
                        bulletMargin -= (lists.size() - 2) * listItemIndent;
                    }
                }
                BulletSpan newBullet = new BulletSpan(bulletMargin);
                end(output, Ul.class, new LeadingMarginSpan.Standard(listItemIndent * (lists.size() - 1)), newBullet);
            } else if (lists.peek().equalsIgnoreCase("ol")) {
                if (output.charAt(output.length() - 1) != '\n') {
                    output.append("\n");
                }
                int numberMargin = listItemIndent * (lists.size() - 1);
                if (lists.size() > 2) {
                    // Same as in ordered lists: counter the effect of nested Spans
                    numberMargin -= (lists.size() - 2) * listItemIndent;
                }
                end(output, Ol.class, new LeadingMarginSpan.Standard(numberMargin));
            }
        }
    } else {
        if (opening) {
            Log.d("TagHandler", "Found an unsupported tag " + tag);
        }
    }
}
Example 24
Project: zulip-android-master  File: ListTagHandler.java View source code
@Override
protected Object[] getReplaces(final Editable text, final int indentation) {
    // Nested BulletSpans increases distance between BULLET_SPAN and text, so we must prevent it.
    int bulletMargin = INDENT_PX;
    if (indentation > 1) {
        bulletMargin = INDENT_PX - BULLET_SPAN.getLeadingMargin(true);
        if (indentation > 2) {
            // This get's more complicated when we add a LeadingMarginSpan into the same line:
            // we have also counter it's effect to BulletSpan
            bulletMargin -= (indentation - 2) * LIST_ITEM_INDENT_PX;
        }
    }
    return new Object[] { new LeadingMarginSpan.Standard(LIST_ITEM_INDENT_PX * (indentation - 1)), new BulletSpan(bulletMargin) };
}
Example 25
Project: AndroidCommon-master  File: SpannableStringUtils.java View source code
private void setSpan() {
    int start = mBuilder.length();
    mBuilder.append(this.text);
    int end = mBuilder.length();
    if (foregroundColor != defaultValue) {
        mBuilder.setSpan(new ForegroundColorSpan(foregroundColor), start, end, flag);
        foregroundColor = defaultValue;
    }
    if (backgroundColor != defaultValue) {
        mBuilder.setSpan(new BackgroundColorSpan(backgroundColor), start, end, flag);
        backgroundColor = defaultValue;
    }
    if (isLeadingMargin) {
        mBuilder.setSpan(new LeadingMarginSpan.Standard(first, rest), start, end, flag);
        isLeadingMargin = false;
    }
    if (quoteColor != defaultValue) {
        mBuilder.setSpan(new QuoteSpan(quoteColor), start, end, 0);
        quoteColor = defaultValue;
    }
    if (isBullet) {
        mBuilder.setSpan(new BulletSpan(gapWidth, bulletColor), start, end, 0);
        isBullet = false;
    }
    if (proportion != -1) {
        mBuilder.setSpan(new RelativeSizeSpan(proportion), start, end, flag);
        proportion = -1;
    }
    if (xProportion != -1) {
        mBuilder.setSpan(new ScaleXSpan(xProportion), start, end, flag);
        xProportion = -1;
    }
    if (isStrikethrough) {
        mBuilder.setSpan(new StrikethroughSpan(), start, end, flag);
        isStrikethrough = false;
    }
    if (isUnderline) {
        mBuilder.setSpan(new UnderlineSpan(), start, end, flag);
        isUnderline = false;
    }
    if (isSuperscript) {
        mBuilder.setSpan(new SuperscriptSpan(), start, end, flag);
        isSuperscript = false;
    }
    if (isSubscript) {
        mBuilder.setSpan(new SubscriptSpan(), start, end, flag);
        isSubscript = false;
    }
    if (isBold) {
        mBuilder.setSpan(new StyleSpan(Typeface.BOLD), start, end, flag);
        isBold = false;
    }
    if (isItalic) {
        mBuilder.setSpan(new StyleSpan(Typeface.ITALIC), start, end, flag);
        isItalic = false;
    }
    if (isBoldItalic) {
        mBuilder.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, end, flag);
        isBoldItalic = false;
    }
    if (fontFamily != null) {
        mBuilder.setSpan(new TypefaceSpan(fontFamily), start, end, flag);
        fontFamily = null;
    }
    if (align != null) {
        mBuilder.setSpan(new AlignmentSpan.Standard(align), start, end, flag);
        align = null;
    }
    if (imageIsBitmap || imageIsDrawable || imageIsUri || imageIsResourceId) {
        if (imageIsBitmap) {
            mBuilder.setSpan(new ImageSpan(mContext, bitmap), start, end, flag);
            bitmap = null;
            imageIsBitmap = false;
        } else if (imageIsDrawable) {
            mBuilder.setSpan(new ImageSpan(drawable), start, end, flag);
            drawable = null;
            imageIsDrawable = false;
        } else if (imageIsUri) {
            mBuilder.setSpan(new ImageSpan(mContext, uri), start, end, flag);
            uri = null;
            imageIsUri = false;
        } else {
            mBuilder.setSpan(new ImageSpan(mContext, resourceId), start, end, flag);
            resourceId = 0;
            imageIsResourceId = false;
        }
    }
    if (clickSpan != null) {
        mBuilder.setSpan(clickSpan, start, end, flag);
        clickSpan = null;
    }
    if (url != null) {
        mBuilder.setSpan(new URLSpan(url), start, end, flag);
        url = null;
    }
    if (isBlur) {
        mBuilder.setSpan(new MaskFilterSpan(new BlurMaskFilter(radius, style)), start, end, flag);
        isBlur = false;
    }
    flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
}
Example 26
Project: kaif-android-master  File: DefaultDecorator.java View source code
@Override
public void closeOrderedListItem(SpannableStringBuilder out) {
    OrderedList orderedList = getLast(out, OrderedList.class);
    if (orderedList != null) {
        int number = orderedList.getAndIncrement();
        int where = out.getSpanStart(getLast(out, OrderedListItem.class));
        out.insert(where, Integer.toString(number) + ". ");
    }
    //check BulletSpan2
    end(out, OrderedListItem.class, new LeadingMarginSpan.LeadingMarginSpan2.Standard(leading));
}
Example 27
Project: POI-Android-master  File: TextPainter.java View source code
public SpannableStringBuilder getAttributedString(TextRun txrun) {
    String text = txrun.getText();
    //TODO: properly process tabs
    text = text.replace('\t', ' ');
    text = text.replace((char) 160, ' ');
    System.out.println("text: " + text);
    SpannableStringBuilder at = new SpannableStringBuilder(text);
    RichTextRun[] rt = txrun.getRichTextRuns();
    for (int i = 0; i < rt.length; i++) {
        int start = rt[i].getStartIndex();
        int end = rt[i].getEndIndex();
        if (start == end) {
            logger.log(POILogger.INFO, "Skipping RichTextRun with zero length");
            continue;
        }
        if (end > at.length() || start > at.length()) {
            continue;
        }
        int style = Typeface.NORMAL;
        if (rt[i].isBold() && rt[i].isItalic()) {
            style = Typeface.BOLD_ITALIC;
        } else if (rt[i].isItalic()) {
            style = Typeface.ITALIC;
        } else if (rt[i].isBold()) {
            style = Typeface.BOLD;
        }
        ColorStateList color = ColorStateList.valueOf(rt[i].getFontColor().getRGB());
        at.setSpan(new TextAppearanceSpan(rt[i].getFontName(), style, rt[i].getFontSize(), color, color), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        if (rt[i].isUnderlined()) {
            at.setSpan(new UnderlineSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        if (rt[i].isStrikethrough()) {
            at.setSpan(new StrikethroughSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        int superScript = rt[i].getSuperscript();
        if (superScript > 0) {
            at.setSpan(new SuperscriptSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else if (superScript < 0) {
            at.setSpan(new SubscriptSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        Alignment alignment;
        switch(rt[i].getAlignment()) {
            case TextShape.AlignLeft:
                alignment = Alignment.ALIGN_NORMAL;
                break;
            case TextShape.AlignRight:
                alignment = Alignment.ALIGN_OPPOSITE;
                break;
            case TextShape.AlignCenter:
                alignment = Alignment.ALIGN_CENTER;
                break;
            default:
                alignment = Alignment.ALIGN_NORMAL;
                break;
        }
        at.setSpan(new AlignmentSpan.Standard(alignment), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        System.out.println("start: " + start + ", end: " + end + ", offset: " + rt[i].getTextOffset() + ", getBulletOffset: " + rt[i].getBulletOffset() + ", getSpaceBefore: " + rt[i].getSpaceBefore() + ", getSpaceAfter: " + rt[i].getSpaceAfter() + ", getIndentLevel: " + rt[i].getIndentLevel() + ", getIndentLevel: " + rt[i].getAlignment() + ", text: " + rt[i].getText());
        at.setSpan(new LeadingMarginSpan.Standard(rt[i].getTextOffset()), start, end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
    }
    return at;
}
Example 28
Project: weechat-android-master  File: Line.java View source code
/**
     * process the message and create a spannable object according to settings
     * * TODO: reuse span objects (how? would that do any good?)
     * * the problem is that one has to use distinct spans on the same string
     * * TODO: allow variable width font (should be simple enough
     */
public void processMessage() {
    if (DEBUG)
        logger.debug("processMessage()");
    String timestamp = (P.dateFormat == null) ? null : P.dateFormat.format(date);
    boolean encloseNick = P.encloseNick && privmsg && !action;
    Color.parse(timestamp, prefix, message, encloseNick, highlighted, P.maxWidth, P.align);
    Spannable spannable = new SpannableString(Color.cleanMessage);
    if (this.type == LINE_OTHER && P.dimDownNonHumanLines) {
        spannable.setSpan(new ForegroundColorSpan(ColorScheme.get().chat_inactive_buffer[0] | 0xFF000000), 0, spannable.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    } else {
        CharacterStyle droidSpan;
        for (Color.Span span : Color.finalSpanList) {
            switch(span.type) {
                case Color.Span.FGCOLOR:
                    droidSpan = new ForegroundColorSpan(span.color | 0xFF000000);
                    break;
                case Color.Span.BGCOLOR:
                    droidSpan = new BackgroundColorSpan(span.color | 0xFF000000);
                    break;
                case Color.Span.ITALIC:
                    droidSpan = new StyleSpan(Typeface.ITALIC);
                    break;
                case Color.Span.BOLD:
                    droidSpan = new StyleSpan(Typeface.BOLD);
                    break;
                case Color.Span.UNDERLINE:
                    droidSpan = new UnderlineSpan();
                    break;
                default:
                    continue;
            }
            spannable.setSpan(droidSpan, span.start, span.end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
    if (P.align != Color.ALIGN_NONE) {
        LeadingMarginSpan margin_span = new LeadingMarginSpan.Standard(0, (int) (P.letterWidth * Color.margin));
        spannable.setSpan(margin_span, 0, spannable.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
    }
    // what a nice little custom linkifier we've got us here
    Linkify.linkify(spannable);
    this.spannable = spannable;
}
Example 29
Project: Eng-Chi-Dictionary-master  File: DictionaryFragment.java View source code
private void buildHtmlFromDictionary(String query, Word word) {
    mWord = word;
    updateFavFab(word);
    if (word != null) {
        Analytics.trackFoundWord(getActivity(), word.mWord);
        mWordTextView.setText(word.mWord);
        if (!TextUtils.isEmpty(mWord.mPhoneticString)) {
            mPhoneticTextView.setText(mWord.mPhoneticString);
        }
        if (mWord.mDifficulty > 0) {
            mCommonnessBar.setVisibility(View.VISIBLE);
            mCommonnessBar.setLevel((5 - mWord.mDifficulty));
        } else {
            mCommonnessBar.setVisibility(View.GONE);
        }
        List<Word.TypeEntry> typeEntries = word.mTypeEntry;
        SpannableStringBuilder builder = new SpannableStringBuilder();
        int prevType = -1;
        boolean firstEntry = true;
        for (Word.TypeEntry typeEntry : typeEntries) {
            if (prevType != typeEntry.mType) {
                if (!firstEntry) {
                    builder.append("\n");
                }
                firstEntry = false;
                appendStyled(builder, typeEntry.getTypeDescription() + "\n", new ForegroundColorSpan(mAccentColor));
                prevType = typeEntry.mType;
            }
            appendStyled(builder, "• " + typeEntry.mMeaning + "\n", new LeadingMarginSpan.Standard(INDENTATION_MEANING_LEFT, INDENTATION_EXAMPLE_LEFT));
            if (!TextUtils.isEmpty(typeEntry.mEngExample)) {
                appendStyled(builder, typeEntry.mEngExample + "\n", new LeadingMarginSpan.Standard(INDENTATION_EXAMPLE_LEFT));
                boldKeyWord(builder, typeEntry.mEngExample + "\n", word.mWord);
            }
            if (!TextUtils.isEmpty(typeEntry.mChiExample)) {
                appendStyled(builder, typeEntry.mChiExample + "\n", new LeadingMarginSpan.Standard(INDENTATION_EXAMPLE_LEFT));
            }
        }
        mDetailTextView.setText(builder);
        mPronounceButton.setVisibility(View.VISIBLE);
        mPhoneticTextView.setVisibility(View.VISIBLE);
        AppPreference.saveLastWord(mContext, word.mWord);
    } else {
        Analytics.trackNotFoundWord(getActivity(), query);
        mWordTextView.setText("No such word :(");
        mCommonnessBar.setVisibility(View.GONE);
        mDetailTextView.setText("");
        mPronounceButton.setVisibility(View.GONE);
        mPhoneticTextView.setVisibility(View.GONE);
    }
}
Example 30
Project: matrix-android-sdk-master  File: ConsoleHtmlTagHandler.java View source code
@Override
public void handleTag(final boolean opening, final String tag, Editable output, final XMLReader xmlReader) {
    if (opening) {
        if (tag.equalsIgnoreCase("ul")) {
            lists.push(tag);
        } else if (tag.equalsIgnoreCase("ol")) {
            lists.push(tag);
            olNextIndex.push(1);
        } else if (tag.equalsIgnoreCase("li")) {
            if (output.length() > 0 && output.charAt(output.length() - 1) != '\n') {
                output.append("\n");
            }
            String parentList = lists.peek();
            if (parentList.equalsIgnoreCase("ol")) {
                start(output, new Ol());
                output.append(olNextIndex.peek().toString()).append(". ");
                olNextIndex.push(olNextIndex.pop() + 1);
            } else if (parentList.equalsIgnoreCase("ul")) {
                start(output, new Ul());
            }
        } else if (tag.equalsIgnoreCase("code")) {
            start(output, new Code());
        } else if (tag.equalsIgnoreCase("center")) {
            start(output, new Center());
        } else if (tag.equalsIgnoreCase("s") || tag.equalsIgnoreCase("strike")) {
            start(output, new Strike());
        } else if (tag.equalsIgnoreCase("table")) {
            start(output, new Table());
            if (tableTagLevel == 0) {
                tableHtmlBuilder = new StringBuilder();
                // We need some text for the table to be replaced by the span because
                // the other tags will remove their text when their text is extracted
                output.append("table placeholder");
            }
            tableTagLevel++;
        } else if (tag.equalsIgnoreCase("tr")) {
            start(output, new Tr());
        } else if (tag.equalsIgnoreCase("th")) {
            start(output, new Th());
        } else if (tag.equalsIgnoreCase("td")) {
            start(output, new Td());
        }
    } else {
        if (tag.equalsIgnoreCase("ul")) {
            lists.pop();
        } else if (tag.equalsIgnoreCase("ol")) {
            lists.pop();
            olNextIndex.pop();
        } else if (tag.equalsIgnoreCase("li")) {
            if (lists.peek().equalsIgnoreCase("ul")) {
                if (output.length() > 0 && output.charAt(output.length() - 1) != '\n') {
                    output.append("\n");
                }
                // Nested BulletSpans increases distance between bullet and text, so we must prevent it.
                int bulletMargin = indent;
                if (lists.size() > 1) {
                    bulletMargin = indent - bullet.getLeadingMargin(true);
                    if (lists.size() > 2) {
                        // This get's more complicated when we add a LeadingMarginSpan into the same line:
                        // we have also counter it's effect to BulletSpan
                        bulletMargin -= (lists.size() - 2) * listItemIndent;
                    }
                }
                BulletSpan newBullet = new BulletSpan(bulletMargin);
                end(output, Ul.class, false, new LeadingMarginSpan.Standard(listItemIndent * (lists.size() - 1)), newBullet);
            } else if (lists.peek().equalsIgnoreCase("ol")) {
                if (output.length() > 0 && output.charAt(output.length() - 1) != '\n') {
                    output.append("\n");
                }
                int numberMargin = listItemIndent * (lists.size() - 1);
                if (lists.size() > 2) {
                    // Same as in ordered lists: counter the effect of nested Spans
                    numberMargin -= (lists.size() - 2) * listItemIndent;
                }
                end(output, Ol.class, false, new LeadingMarginSpan.Standard(numberMargin));
            }
        } else if (tag.equalsIgnoreCase("code")) {
            end(output, Code.class, false, new BackgroundColorSpan(mContext.getResources().getColor(R.color.markdown_code_background)), new TypefaceSpan("monospace"));
        } else if (tag.equalsIgnoreCase("center")) {
            end(output, Center.class, true, new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER));
        } else if (tag.equalsIgnoreCase("s") || tag.equalsIgnoreCase("strike")) {
            end(output, Strike.class, false, new StrikethroughSpan());
        } else if (tag.equalsIgnoreCase("table")) {
            tableTagLevel--;
            // When we're back at the root-level table
            end(output, Table.class, false);
        } else if (tag.equalsIgnoreCase("tr")) {
            end(output, Tr.class, false);
        } else if (tag.equalsIgnoreCase("th")) {
            end(output, Th.class, false);
        } else if (tag.equalsIgnoreCase("td")) {
            end(output, Td.class, false);
        }
    }
    storeTableTags(opening, tag);
}
Example 31
Project: android-proguards-master  File: Bypass.java View source code
// The 'numberOfSiblings' parameters refers to the number of siblings within the parent, including
// the 'element' parameter, as in "How many siblings are you?" rather than "How many siblings do
// you have?".
private CharSequence recurseElement(Element element, int indexWithinParent, int numberOfSiblings, TextView textView, LoadImageCallback loadImageCallback) {
    Type type = element.getType();
    boolean isOrderedList = false;
    if (type == Type.LIST) {
        String flagsStr = element.getAttribute("flags");
        if (flagsStr != null) {
            int flags = Integer.parseInt(flagsStr);
            isOrderedList = (flags & Element.F_LIST_ORDERED) != 0;
            if (isOrderedList) {
                mOrderedListNumber.put(element, 1);
            }
        }
    }
    int size = element.size();
    CharSequence[] spans = new CharSequence[size];
    for (int i = 0; i < size; i++) {
        spans[i] = recurseElement(element.children[i], i, size, textView, loadImageCallback);
    }
    // Clean up after we're done
    if (isOrderedList) {
        mOrderedListNumber.remove(this);
    }
    CharSequence concat = TextUtils.concat(spans);
    SpannableStringBuilder builder = new ReverseSpannableStringBuilder();
    String text = element.getText();
    if (element.size() == 0 && element.getParent() != null && element.getParent().getType() != Type.BLOCK_CODE) {
        text = text.replace('\n', ' ');
    }
    switch(type) {
        case LIST:
            if (element.getParent() != null && element.getParent().getType() == Type.LIST_ITEM) {
                builder.append("\n");
            }
            break;
        case LINEBREAK:
            builder.append("\n");
            break;
        case LIST_ITEM:
            builder.append(" ");
            if (mOrderedListNumber.containsKey(element.getParent())) {
                int number = mOrderedListNumber.get(element.getParent());
                builder.append(Integer.toString(number) + ".");
                mOrderedListNumber.put(element.getParent(), number + 1);
            } else {
                builder.append(mOptions.mUnorderedListItem);
            }
            builder.append("  ");
            break;
        case AUTOLINK:
            builder.append(element.getAttribute("link"));
            break;
        case HRULE:
            // This ultimately gets drawn over by the line span, but
            // we need something here or the span isn't even drawn.
            builder.append("-");
            break;
        case IMAGE:
            if (loadImageCallback != null && !TextUtils.isEmpty(element.getAttribute("link"))) {
                // prepend a new line so that images are always on a new line
                builder.append("\n");
                // Display alt text (or title text) if there is no image
                String alt = element.getAttribute("alt");
                if (TextUtils.isEmpty(alt)) {
                    alt = element.getAttribute("title");
                }
                if (!TextUtils.isEmpty(alt)) {
                    alt = "[" + alt + "]";
                    builder.append(alt);
                } else {
                    // Character to be replaced
                    builder.append("");
                }
            } else {
                // Character to be replaced
                builder.append("");
            }
            break;
    }
    builder.append(text);
    builder.append(concat);
    // of the last child within the parent.
    if (element.getParent() != null || indexWithinParent < (numberOfSiblings - 1)) {
        if (type == Type.LIST_ITEM) {
            if (element.size() == 0 || !element.children[element.size() - 1].isBlockElement()) {
                builder.append("\n");
            }
        } else if (element.isBlockElement() && type != Type.BLOCK_QUOTE) {
            if (type == Type.LIST) {
                // If this is a nested list, don't include newlines
                if (element.getParent() == null || element.getParent().getType() != Type.LIST_ITEM) {
                    builder.append("\n");
                }
            } else if (element.getParent() != null && element.getParent().getType() == Type.LIST_ITEM) {
                // List items should never double-space their entries
                builder.append("\n");
            } else {
                builder.append("\n\n");
            }
        }
    }
    switch(type) {
        case HEADER:
            String levelStr = element.getAttribute("level");
            int level = Integer.parseInt(levelStr);
            setSpan(builder, new RelativeSizeSpan(mOptions.mHeaderSizes[level - 1]));
            setSpan(builder, new StyleSpan(Typeface.BOLD));
            break;
        case LIST:
            setBlockSpan(builder, new LeadingMarginSpan.Standard(mListItemIndent));
            break;
        case EMPHASIS:
            setSpan(builder, new StyleSpan(Typeface.ITALIC));
            break;
        case DOUBLE_EMPHASIS:
            setSpan(builder, new StyleSpan(Typeface.BOLD));
            break;
        case TRIPLE_EMPHASIS:
            setSpan(builder, new StyleSpan(Typeface.BOLD_ITALIC));
            break;
        case BLOCK_CODE:
            setSpan(builder, new LeadingMarginSpan.Standard(mCodeBlockIndent));
            setSpan(builder, new TypefaceSpan("monospace"));
            break;
        case CODE_SPAN:
            setSpan(builder, new TypefaceSpan("monospace"));
            break;
        case LINK:
        case AUTOLINK:
            String link = element.getAttribute("link");
            if (!TextUtils.isEmpty(link) && Patterns.EMAIL_ADDRESS.matcher(link).matches()) {
                link = "mailto:" + link;
            }
            setSpan(builder, new TouchableUrlSpan(link, textView.getLinkTextColors(), textView.getHighlightColor()));
            break;
        case BLOCK_QUOTE:
            // We add two leading margin spans so that when the order is reversed,
            // the QuoteSpan will always be in the same spot.
            setBlockSpan(builder, new LeadingMarginSpan.Standard(mBlockQuoteIndent));
            //setBlockSpan(builder, new QuoteSpan(mOptions.mBlockQuoteLineColor));
            setBlockSpan(builder, new FancyQuoteSpan(mBlockQuoteLineWidth, mBlockQuoteLineIndent, mOptions.mBlockQuoteLineColor));
            setBlockSpan(builder, new ForegroundColorSpan(mOptions.mBlockQuoteTextColor));
            setBlockSpan(builder, new LeadingMarginSpan.Standard(mBlockQuoteIndent));
            setBlockSpan(builder, new StyleSpan(Typeface.ITALIC));
            break;
        case STRIKETHROUGH:
            setSpan(builder, new StrikethroughSpan());
            break;
        case HRULE:
            setSpan(builder, new HorizontalLineSpan(mOptions.mHruleColor, mHruleSize, mHruleTopBottomPadding));
            break;
        case IMAGE:
            String url = element.getAttribute("link");
            if (loadImageCallback != null && !TextUtils.isEmpty(url)) {
                setPrependedNewlineSpan(builder, mOptions.mPreImageLinebreakHeight);
                ImageLoadingSpan loadingSpan = new ImageLoadingSpan();
                setSpanWithPrependedNewline(builder, loadingSpan);
                // make the (eventually loaded) image span clickable to open in browser
                setSpanWithPrependedNewline(builder, new TouchableUrlSpan(url, textView.getLinkTextColors(), textView.getHighlightColor()));
                loadImageCallback.loadImage(url, loadingSpan);
            }
            break;
    }
    return builder;
}
Example 32
Project: BaseRecyclerViewAdapterHelper-master  File: SpannableStringUtils.java View source code
/**
         * 设置样�
         */
private void setSpan() {
    int start = mBuilder.length();
    mBuilder.append(this.text);
    int end = mBuilder.length();
    if (foregroundColor != defaultValue) {
        mBuilder.setSpan(new ForegroundColorSpan(foregroundColor), start, end, flag);
        foregroundColor = defaultValue;
    }
    if (backgroundColor != defaultValue) {
        mBuilder.setSpan(new BackgroundColorSpan(backgroundColor), start, end, flag);
        backgroundColor = defaultValue;
    }
    if (isLeadingMargin) {
        mBuilder.setSpan(new LeadingMarginSpan.Standard(first, rest), start, end, flag);
        isLeadingMargin = false;
    }
    if (quoteColor != defaultValue) {
        mBuilder.setSpan(new QuoteSpan(quoteColor), start, end, 0);
        quoteColor = defaultValue;
    }
    if (isBullet) {
        mBuilder.setSpan(new BulletSpan(gapWidth, bulletColor), start, end, 0);
        isBullet = false;
    }
    if (proportion != -1) {
        mBuilder.setSpan(new RelativeSizeSpan(proportion), start, end, flag);
        proportion = -1;
    }
    if (xProportion != -1) {
        mBuilder.setSpan(new ScaleXSpan(xProportion), start, end, flag);
        xProportion = -1;
    }
    if (isStrikethrough) {
        mBuilder.setSpan(new StrikethroughSpan(), start, end, flag);
        isStrikethrough = false;
    }
    if (isUnderline) {
        mBuilder.setSpan(new UnderlineSpan(), start, end, flag);
        isUnderline = false;
    }
    if (isSuperscript) {
        mBuilder.setSpan(new SuperscriptSpan(), start, end, flag);
        isSuperscript = false;
    }
    if (isSubscript) {
        mBuilder.setSpan(new SubscriptSpan(), start, end, flag);
        isSubscript = false;
    }
    if (isBold) {
        mBuilder.setSpan(new StyleSpan(Typeface.BOLD), start, end, flag);
        isBold = false;
    }
    if (isItalic) {
        mBuilder.setSpan(new StyleSpan(Typeface.ITALIC), start, end, flag);
        isItalic = false;
    }
    if (isBoldItalic) {
        mBuilder.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, end, flag);
        isBoldItalic = false;
    }
    if (fontFamily != null) {
        mBuilder.setSpan(new TypefaceSpan(fontFamily), start, end, flag);
        fontFamily = null;
    }
    if (align != null) {
        mBuilder.setSpan(new AlignmentSpan.Standard(align), start, end, flag);
        align = null;
    }
    if (imageIsBitmap || imageIsDrawable || imageIsUri || imageIsResourceId) {
        if (imageIsBitmap) {
            mBuilder.setSpan(new ImageSpan(Utils.getContext(), bitmap), start, end, flag);
            bitmap = null;
            imageIsBitmap = false;
        } else if (imageIsDrawable) {
            mBuilder.setSpan(new ImageSpan(drawable), start, end, flag);
            drawable = null;
            imageIsDrawable = false;
        } else if (imageIsUri) {
            mBuilder.setSpan(new ImageSpan(Utils.getContext(), uri), start, end, flag);
            uri = null;
            imageIsUri = false;
        } else {
            mBuilder.setSpan(new ImageSpan(Utils.getContext(), resourceId), start, end, flag);
            resourceId = 0;
            imageIsResourceId = false;
        }
    }
    if (clickSpan != null) {
        mBuilder.setSpan(clickSpan, start, end, flag);
        clickSpan = null;
    }
    if (url != null) {
        mBuilder.setSpan(new URLSpan(url), start, end, flag);
        url = null;
    }
    if (isBlur) {
        mBuilder.setSpan(new MaskFilterSpan(new BlurMaskFilter(radius, style)), start, end, flag);
        isBlur = false;
    }
    flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
}
Example 33
Project: bypasses-master  File: Bypass.java View source code
// The 'numberOfSiblings' parameters refers to the number of siblings within the parent, including
// the 'element' parameter, as in "How many siblings are you?" rather than "How many siblings do
// you have?".
private CharSequence recurseElement(Element element, int indexWithinParent, int numberOfSiblings, ImageGetter imageGetter) {
    Type type = element.getType();
    boolean isOrderedList = false;
    if (type == Type.LIST) {
        String flagsStr = element.getAttribute("flags");
        if (flagsStr != null) {
            int flags = Integer.parseInt(flagsStr);
            isOrderedList = (flags & Element.F_LIST_ORDERED) != 0;
            if (isOrderedList) {
                mOrderedListNumber.put(element, 1);
            }
        }
    }
    int size = element.size();
    CharSequence[] spans = new CharSequence[size];
    for (int i = 0; i < size; i++) {
        spans[i] = recurseElement(element.children[i], i, size, imageGetter);
    }
    // Clean up after we're done
    if (isOrderedList) {
        mOrderedListNumber.remove(this);
    }
    CharSequence concat = TextUtils.concat(spans);
    SpannableStringBuilder builder = new ReverseSpannableStringBuilder();
    String text = element.getText();
    if (element.size() == 0 && element.getParent() != null && element.getParent().getType() != Type.BLOCK_CODE) {
        text = text.replace('\n', ' ');
    }
    // Retrieve the image now so we know whether we're going to have something to display later
    // If we don't, then show the alt text instead (if available).
    Drawable imageDrawable = null;
    String imageLink = element.getAttribute("link");
    if (type == Type.IMAGE && imageGetter != null && !TextUtils.isEmpty(imageLink)) {
        imageDrawable = imageGetter.getDrawable(imageLink);
    }
    switch(type) {
        case LIST:
            if (element.getParent() != null && element.getParent().getType() == Type.LIST_ITEM) {
                builder.append("\n");
            }
            break;
        case LINEBREAK:
            builder.append("\n");
            break;
        case LIST_ITEM:
            builder.append(" ");
            if (mOrderedListNumber.containsKey(element.getParent())) {
                int number = mOrderedListNumber.get(element.getParent());
                builder.append(Integer.toString(number) + ".");
                mOrderedListNumber.put(element.getParent(), number + 1);
            } else {
                builder.append(mOptions.mUnorderedListItem);
            }
            builder.append("  ");
            break;
        case AUTOLINK:
            builder.append(element.getAttribute("link"));
            break;
        case HRULE:
            // This ultimately gets drawn over by the line span, but
            // we need something here or the span isn't even drawn.
            builder.append("-");
            break;
        case IMAGE:
            // Display alt text (or title text) if there is no image
            if (imageDrawable == null) {
                String show = element.getAttribute("alt");
                if (TextUtils.isEmpty(show)) {
                    show = element.getAttribute("title");
                }
                if (!TextUtils.isEmpty(show)) {
                    show = "[" + show + "]";
                    builder.append(show);
                }
            } else {
                // Character to be replaced
                builder.append("");
            }
            break;
    }
    builder.append(text);
    builder.append(concat);
    // of the last child within the parent.
    if (element.getParent() != null || indexWithinParent < (numberOfSiblings - 1)) {
        if (type == Type.LIST_ITEM) {
            if (element.size() == 0 || !element.children[element.size() - 1].isBlockElement()) {
                builder.append("\n");
            }
        } else if (element.isBlockElement() && type != Type.BLOCK_QUOTE) {
            if (type == Type.LIST) {
                // If this is a nested list, don't include newlines
                if (element.getParent() == null || element.getParent().getType() != Type.LIST_ITEM) {
                    builder.append("\n");
                }
            } else if (element.getParent() != null && element.getParent().getType() == Type.LIST_ITEM) {
                // List items should never double-space their entries
                builder.append("\n");
            } else {
                builder.append("\n\n");
            }
        }
    }
    switch(type) {
        case HEADER:
            String levelStr = element.getAttribute("level");
            int level = Integer.parseInt(levelStr);
            setSpan(builder, new RelativeSizeSpan(mOptions.mHeaderSizes[level - 1]));
            setSpan(builder, new StyleSpan(Typeface.BOLD));
            break;
        case LIST:
            setBlockSpan(builder, new LeadingMarginSpan.Standard(mListItemIndent));
            break;
        case EMPHASIS:
            setSpan(builder, new StyleSpan(Typeface.ITALIC));
            break;
        case DOUBLE_EMPHASIS:
            setSpan(builder, new StyleSpan(Typeface.BOLD));
            break;
        case TRIPLE_EMPHASIS:
            setSpan(builder, new StyleSpan(Typeface.BOLD_ITALIC));
            break;
        case BLOCK_CODE:
            setSpan(builder, new LeadingMarginSpan.Standard(mCodeBlockIndent));
            setSpan(builder, new TypefaceSpan("monospace"));
            break;
        case CODE_SPAN:
            setSpan(builder, new TypefaceSpan("monospace"));
            break;
        case LINK:
        case AUTOLINK:
            String link = element.getAttribute("link");
            if (!TextUtils.isEmpty(link) && Patterns.EMAIL_ADDRESS.matcher(link).matches()) {
                link = "mailto:" + link;
            }
            setSpan(builder, new URLSpan(link));
            break;
        case BLOCK_QUOTE:
            // We add two leading margin spans so that when the order is reversed,
            // the QuoteSpan will always be in the same spot.
            setBlockSpan(builder, new LeadingMarginSpan.Standard(mBlockQuoteIndent));
            setBlockSpan(builder, new QuoteSpan(mOptions.mBlockQuoteColor));
            setBlockSpan(builder, new LeadingMarginSpan.Standard(mBlockQuoteIndent));
            setBlockSpan(builder, new StyleSpan(Typeface.ITALIC));
            break;
        case STRIKETHROUGH:
            setSpan(builder, new StrikethroughSpan());
            break;
        case HRULE:
            setSpan(builder, new HorizontalLineSpan(mOptions.mHruleColor, mHruleSize, mHruleTopBottomPadding));
            break;
        case IMAGE:
            if (imageDrawable != null) {
                setClickableImageSpan(builder, new ImageSpan(imageDrawable), imageLink);
            }
            break;
    }
    return builder;
}
Example 34
Project: html-textview-master  File: HtmlTagHandler.java View source code
@Override
public void handleTag(final boolean opening, final String tag, Editable output, final XMLReader xmlReader) {
    if (opening) {
        // opening tag
        if (HtmlTextView.DEBUG) {
            Log.d(HtmlTextView.TAG, "opening, output: " + output.toString());
        }
        if (tag.equalsIgnoreCase(UNORDERED_LIST)) {
            lists.push(tag);
        } else if (tag.equalsIgnoreCase(ORDERED_LIST)) {
            lists.push(tag);
            olNextIndex.push(1);
        } else if (tag.equalsIgnoreCase(LIST_ITEM)) {
            if (output.length() > 0 && output.charAt(output.length() - 1) != '\n') {
                output.append("\n");
            }
            if (!lists.isEmpty()) {
                String parentList = lists.peek();
                if (parentList.equalsIgnoreCase(ORDERED_LIST)) {
                    start(output, new Ol());
                    olNextIndex.push(olNextIndex.pop() + 1);
                } else if (parentList.equalsIgnoreCase(UNORDERED_LIST)) {
                    start(output, new Ul());
                }
            }
        } else if (tag.equalsIgnoreCase("code")) {
            start(output, new Code());
        } else if (tag.equalsIgnoreCase("center")) {
            start(output, new Center());
        } else if (tag.equalsIgnoreCase("s") || tag.equalsIgnoreCase("strike")) {
            start(output, new Strike());
        } else if (tag.equalsIgnoreCase("table")) {
            start(output, new Table());
            if (tableTagLevel == 0) {
                tableHtmlBuilder = new StringBuilder();
                // We need some text for the table to be replaced by the span because
                // the other tags will remove their text when their text is extracted
                output.append("table placeholder");
            }
            tableTagLevel++;
        } else if (tag.equalsIgnoreCase("tr")) {
            start(output, new Tr());
        } else if (tag.equalsIgnoreCase("th")) {
            start(output, new Th());
        } else if (tag.equalsIgnoreCase("td")) {
            start(output, new Td());
        }
    } else {
        // closing tag
        if (HtmlTextView.DEBUG) {
            Log.d(HtmlTextView.TAG, "closing, output: " + output.toString());
        }
        if (tag.equalsIgnoreCase(UNORDERED_LIST)) {
            lists.pop();
        } else if (tag.equalsIgnoreCase(ORDERED_LIST)) {
            lists.pop();
            olNextIndex.pop();
        } else if (tag.equalsIgnoreCase(LIST_ITEM)) {
            if (!lists.isEmpty()) {
                if (lists.peek().equalsIgnoreCase(UNORDERED_LIST)) {
                    if (output.length() > 0 && output.charAt(output.length() - 1) != '\n') {
                        output.append("\n");
                    }
                    // Nested BulletSpans increases distance between bullet and text, so we must prevent it.
                    int bulletMargin = indent;
                    if (lists.size() > 1) {
                        bulletMargin = indent - bullet.getLeadingMargin(true);
                        if (lists.size() > 2) {
                            // This get's more complicated when we add a LeadingMarginSpan into the same line:
                            // we have also counter it's effect to BulletSpan
                            bulletMargin -= (lists.size() - 2) * listItemIndent;
                        }
                    }
                    BulletSpan newBullet = new BulletSpan(bulletMargin);
                    end(output, Ul.class, false, new LeadingMarginSpan.Standard(listItemIndent * (lists.size() - 1)), newBullet);
                } else if (lists.peek().equalsIgnoreCase(ORDERED_LIST)) {
                    if (output.length() > 0 && output.charAt(output.length() - 1) != '\n') {
                        output.append("\n");
                    }
                    int numberMargin = listItemIndent * (lists.size() - 1);
                    if (lists.size() > 2) {
                        // Same as in ordered lists: counter the effect of nested Spans
                        numberMargin -= (lists.size() - 2) * listItemIndent;
                    }
                    NumberSpan numberSpan = new NumberSpan(mTextPaint, olNextIndex.lastElement() - 1);
                    end(output, Ol.class, false, new LeadingMarginSpan.Standard(numberMargin), numberSpan);
                }
            }
        } else if (tag.equalsIgnoreCase("code")) {
            end(output, Code.class, false, new TypefaceSpan("monospace"));
        } else if (tag.equalsIgnoreCase("center")) {
            end(output, Center.class, true, new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER));
        } else if (tag.equalsIgnoreCase("s") || tag.equalsIgnoreCase("strike")) {
            end(output, Strike.class, false, new StrikethroughSpan());
        } else if (tag.equalsIgnoreCase("table")) {
            tableTagLevel--;
            // When we're back at the root-level table
            if (tableTagLevel == 0) {
                final String tableHtml = tableHtmlBuilder.toString();
                ClickableTableSpan myClickableTableSpan = null;
                if (clickableTableSpan != null) {
                    myClickableTableSpan = clickableTableSpan.newInstance();
                    myClickableTableSpan.setTableHtml(tableHtml);
                }
                DrawTableLinkSpan myDrawTableLinkSpan = null;
                if (drawTableLinkSpan != null) {
                    myDrawTableLinkSpan = drawTableLinkSpan.newInstance();
                }
                end(output, Table.class, false, myDrawTableLinkSpan, myClickableTableSpan);
            } else {
                end(output, Table.class, false);
            }
        } else if (tag.equalsIgnoreCase("tr")) {
            end(output, Tr.class, false);
        } else if (tag.equalsIgnoreCase("th")) {
            end(output, Th.class, false);
        } else if (tag.equalsIgnoreCase("td")) {
            end(output, Td.class, false);
        }
    }
    storeTableTags(opening, tag);
}
Example 35
Project: life-master  File: SpanRecyclerAdapter.java View source code
@SuppressLint("SetTextI18n")
public void setSpanContent(TextView labelTV, TextView contentTV, String content, int position) {
    SpannableStringBuilder ssb = new SpannableStringBuilder(content);
    String sub = "Save";
    int start = content.indexOf("Save");
    switch(position) {
        case URL_SPAN:
            {
                labelTV.setText("URLSpan");
                ssb.setSpan(new URLSpan("https://github.com/CaMnter"), start, sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                contentTV.setText(ssb);
                // 在�击链接时凡是有�执行的动作,都必须设置MovementMethod对象
                contentTV.setMovementMethod(LinkMovementMethod.getInstance());
                // 设置点击�的颜色,这里涉�到ClickableSpan的点击背景
                contentTV.setHighlightColor(0xff8FABCC);
                break;
            }
        case UNDERLINE_SPAN:
            {
                labelTV.setText("UnderlineSpan");
                ssb.setSpan(new UnderlineSpan(), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case TYPEFACE_SPAN:
            {
                labelTV.setText("TypefaceSpan ( Examples include \"monospace\", \"serif\", and \"sans-serif\". )");
                ssb.setSpan(new TypefaceSpan("serif"), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case TEXT_APPERARANCE_SPAN:
            {
                labelTV.setText("TextAppearanceSpan");
                ColorStateList colorStateList;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    colorStateList = this.activity.getColorStateList(R.color.selector_apperarance_span);
                } else {
                    colorStateList = this.activity.getResources().getColorStateList(R.color.selector_apperarance_span);
                }
                ssb.setSpan(new TextAppearanceSpan("serif", Typeface.BOLD_ITALIC, this.activity.getResources().getDimensionPixelSize(R.dimen.text_appearance_span), colorStateList, colorStateList), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case TAB_STOP_SPAN:
            {
                labelTV.setText("TabStopSpan.Standard");
                String[] subs = content.split(" ");
                ssb = new SpannableStringBuilder();
                /**
                 * TabStopSpan. Standard related to \t and \n
                 * TabStopSpan.Standard 跟 \t 和 \n 有关系
                 */
                for (String sub1 : subs) {
                    ssb.append("\t").append(sub1).append(" ");
                    ssb.append("\n");
                }
                ssb.setSpan(new TabStopSpan.Standard(126), 0, ssb.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case SUPERS_SCRIPT_SPAN:
            {
                labelTV.setText("SuperscriptSpan");
                ssb.replace(start, start + sub.length(), "Save6");
                Parcel parcel = Parcel.obtain();
                parcel.writeInt(6);
                int sixPosition = ssb.toString().indexOf("6");
                ssb.setSpan(new SuperscriptSpan(parcel), sixPosition, sixPosition + 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                parcel.recycle();
                contentTV.setText(ssb);
                break;
            }
        case SUB_SCRIPT_SPAN:
            {
                labelTV.setText("SubscriptSpan");
                ssb.replace(start, start + sub.length(), "Save6");
                Parcel parcel = Parcel.obtain();
                parcel.writeInt(6);
                int sixPosition = ssb.toString().indexOf("6");
                ssb.setSpan(new SubscriptSpan(parcel), sixPosition, sixPosition + 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                parcel.recycle();
                contentTV.setText(ssb);
                break;
            }
        case STRIKE_THROUGH_SPAN:
            {
                labelTV.setText("StrikethroughSpan");
                ssb.setSpan(new StrikethroughSpan(), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case SCALE_X_SPAN:
            {
                labelTV.setText("ScaleXSpan");
                ssb.setSpan(new ScaleXSpan(2.0f), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case STYLE_SPAN:
            {
                labelTV.setText("StyleSpan ( Typeface.NORMAL,Typeface.BOLD,Typeface.ITALIC,Typeface.BOLD_ITALIC ) ");
                ssb.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case RELATIVE_SIZE_SPAN:
            {
                labelTV.setText("RelativeSizeSpan");
                ssb.setSpan(new RelativeSizeSpan(6.0f), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case QUOTO_SPAN:
            {
                labelTV.setText("QuoteSpan");
                ssb.setSpan(new QuoteSpan(0xff000000), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case MASK_FILTER_SPAN:
            {
                labelTV.setText("MaskFilterSpan ( BlurMaskFilter EmbossMaskFilter ) \n Activity: android:hardwareAccelerated=\"false\"\n ");
                MaskFilterSpan embossMaskFilterSpan = new MaskFilterSpan(new EmbossMaskFilter(new float[] { 3, 3, 9 }, 3.0f, 12, 16));
                ssb.setSpan(embossMaskFilterSpan, start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                contentTV.setText(ssb);
                String you = "you";
                int indexYou = content.indexOf(you);
                MaskFilterSpan blurMaskFilterSpan = new MaskFilterSpan(new BlurMaskFilter(3, BlurMaskFilter.Blur.OUTER));
                ssb.setSpan(blurMaskFilterSpan, indexYou, indexYou + you.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case LEADING_MARGIN_SPAN:
            {
                labelTV.setText("LeadingMarginSpan");
                ssb.append(" ").append(ssb.toString()).append(ssb.toString()).append(ssb.toString());
                ssb.setSpan(new LeadingMarginSpan.Standard(96, 36), 0, ssb.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case IMAGE_SPAN:
            {
                labelTV.setText("ImageSpan");
                ssb.replace(start, start + sub.length(), " Save");
                ssb.setSpan(new ImageSpan(this.activity, R.drawable.ic_mm_normal, ImageSpan.ALIGN_BASELINE), 0, 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case ICON_MARGIN_SPAN:
            {
                labelTV.setText("IconMarginSpan");
                Bitmap bitmap = BitmapFactory.decodeResource(this.activity.getResources(), R.drawable.ic_mm_normal);
                ssb.setSpan(new IconMarginSpan(bitmap, 60), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                //bitmap.recycle();
                contentTV.setText(ssb);
                break;
            }
        case FOREGROUND_COLOR_SPAN:
            {
                labelTV.setText("ForegroundColorSpan");
                ssb.setSpan(new ForegroundColorSpan(0xff303F9F), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case DRAWABLE_MARGIN_SPAN:
            {
                labelTV.setText("DrawableMarginSpan");
                ssb.setSpan(new DrawableMarginSpan(ResourcesUtils.getDrawable(this.activity, R.drawable.ic_mm_normal), 6), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case BULLET_SPAN:
            {
                labelTV.setText("BulletSpan");
                ssb.setSpan(new BulletSpan(66, 0xff303F9F), start, start + sub.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case BACKGROUND_COLOR_SPAN:
            {
                labelTV.setText("BackgroundColorSpan");
                String you = "you";
                int indexYou = content.indexOf(you);
                ssb.setSpan(new BackgroundColorSpan(0x2f303F9F), start, start + sub.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                ssb.setSpan(new BackgroundColorSpan(0x2fFF4081), indexYou, indexYou + you.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case ALIGNMENT_SPAN_STANDARD:
            {
                labelTV.setText("AlignmentSpan.Standard");
                ssb.setSpan(new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER), 0, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case ABSOLUTE_SIZE_SPAN:
            {
                labelTV.setText("AbsoluteSizeSpan");
                ssb.setSpan(new AbsoluteSizeSpan(26, true), start, start + sub.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                contentTV.setText(ssb);
                break;
            }
        case CLICKABLE_SPAN:
            {
                labelTV.setText("ClickableSpan ( Please click \"Save\" )");
                SpanClickableSpan spanClickableSpan = new SpanClickableSpan(0xffFF4081, new ClickableSpanNoUnderline.OnClickListener<SpanClickableSpan>() {

                    /**
                         * ClickableSpan被点击
                         *
                         * @param widget widget
                         * @param span   span
                         */
                    @Override
                    public void onClick(View widget, SpanClickableSpan span) {
                        String urlString = span.getUrlString();
                        if (TextUtils.isEmpty(urlString))
                            return;
                        Uri uri = Uri.parse(urlString);
                        Context context = widget.getContext();
                        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                        intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
                        try {
                            context.startActivity(intent);
                        } catch (ActivityNotFoundException e) {
                            Log.w("URLSpan", "Activity was not found for intent, " + intent.toString());
                        }
                    }
                });
                spanClickableSpan.setUrlString("https://github.com/CaMnter");
                ssb.setSpan(spanClickableSpan, start, start + sub.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                contentTV.setText(ssb);
                // 在�击链接时凡是有�执行的动作,都必须设置MovementMethod对象
                contentTV.setMovementMethod(LinkMovementMethod.getInstance());
                // 设置点击�的颜色,这里涉�到ClickableSpan的点击背景
                contentTV.setHighlightColor(0x00000000);
                break;
            }
    }
}
Example 36
Project: nusic-master  File: TextUtil.java View source code
@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
    if (tag.equalsIgnoreCase("ul")) {
        if (opening) {
            lists.push(tag);
        } else {
            lists.pop();
        }
    } else if (tag.equalsIgnoreCase("ol")) {
        if (opening) {
            lists.push(tag);
            // TODO: add support for lists starting other index than 1
            olNextIndex.push(Integer.valueOf(1)).toString();
        } else {
            lists.pop();
            olNextIndex.pop().toString();
        }
    } else if (tag.equalsIgnoreCase("li")) {
        if (opening) {
            if (output.length() > 0 && output.charAt(output.length() - 1) != '\n') {
                output.append("\n");
            }
            String parentList = lists.peek();
            if (parentList.equalsIgnoreCase("ol")) {
                start(output, new Ol());
                output.append(olNextIndex.peek().toString() + ". ");
                olNextIndex.push(Integer.valueOf(olNextIndex.pop().intValue() + 1));
            } else if (parentList.equalsIgnoreCase("ul")) {
                start(output, new Ul());
            }
        } else {
            if (lists.peek().equalsIgnoreCase("ul")) {
                if (output.charAt(output.length() - 1) != '\n') {
                    output.append("\n");
                }
                // Nested BulletSpans increases distance between bullet
                // and text, so we must prevent it.
                int bulletMargin = indent;
                if (lists.size() > 1) {
                    bulletMargin = indent - bullet.getLeadingMargin(true);
                    if (lists.size() > 2) {
                        // This get's more complicated when we add a
                        // LeadingMarginSpan into the same line:
                        // we have also counter it's effect to
                        // BulletSpan
                        bulletMargin -= (lists.size() - 2) * listItemIndent;
                    }
                }
                BulletSpan newBullet = new BulletSpan(bulletMargin);
                end(output, Ul.class, new LeadingMarginSpan.Standard(listItemIndent * (lists.size() - 1)), newBullet);
            } else if (lists.peek().equalsIgnoreCase("ol")) {
                if (output.charAt(output.length() - 1) != '\n') {
                    output.append("\n");
                }
                int numberMargin = listItemIndent * (lists.size() - 1);
                if (lists.size() > 2) {
                    // Same as in ordered lists: counter the effect of
                    // nested Spans
                    numberMargin -= (lists.size() - 2) * listItemIndent;
                }
                end(output, Ol.class, new LeadingMarginSpan.Standard(numberMargin));
            }
        }
    } else {
        if (opening) {
            // Log unknown tags
            if (!IGNORED_TAGS.contains(tag))
                Log.d("TagHandler", "Found an unsupported tag " + tag);
        }
    }
}
Example 37
Project: OdyAndroidStore-master  File: SpannableStringUtils.java View source code
/**
         * 设置样�
         */
private void setSpan() {
    int start = mBuilder.length();
    mBuilder.append(this.text);
    int end = mBuilder.length();
    if (foregroundColor != defaultValue) {
        mBuilder.setSpan(new ForegroundColorSpan(foregroundColor), start, end, flag);
        foregroundColor = defaultValue;
    }
    if (backgroundColor != defaultValue) {
        mBuilder.setSpan(new BackgroundColorSpan(backgroundColor), start, end, flag);
        backgroundColor = defaultValue;
    }
    if (isLeadingMargin) {
        mBuilder.setSpan(new LeadingMarginSpan.Standard(first, rest), start, end, flag);
        isLeadingMargin = false;
    }
    if (quoteColor != defaultValue) {
        mBuilder.setSpan(new QuoteSpan(quoteColor), start, end, 0);
        quoteColor = defaultValue;
    }
    if (isBullet) {
        mBuilder.setSpan(new BulletSpan(gapWidth, bulletColor), start, end, 0);
        isBullet = false;
    }
    if (proportion != -1) {
        mBuilder.setSpan(new RelativeSizeSpan(proportion), start, end, flag);
        proportion = -1;
    }
    if (xProportion != -1) {
        mBuilder.setSpan(new ScaleXSpan(xProportion), start, end, flag);
        xProportion = -1;
    }
    if (isStrikethrough) {
        mBuilder.setSpan(new StrikethroughSpan(), start, end, flag);
        isStrikethrough = false;
    }
    if (isUnderline) {
        mBuilder.setSpan(new UnderlineSpan(), start, end, flag);
        isUnderline = false;
    }
    if (isSuperscript) {
        mBuilder.setSpan(new SuperscriptSpan(), start, end, flag);
        isSuperscript = false;
    }
    if (isSubscript) {
        mBuilder.setSpan(new SubscriptSpan(), start, end, flag);
        isSubscript = false;
    }
    if (isBold) {
        mBuilder.setSpan(new StyleSpan(Typeface.BOLD), start, end, flag);
        isBold = false;
    }
    if (isItalic) {
        mBuilder.setSpan(new StyleSpan(Typeface.ITALIC), start, end, flag);
        isItalic = false;
    }
    if (isBoldItalic) {
        mBuilder.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, end, flag);
        isBoldItalic = false;
    }
    if (fontFamily != null) {
        mBuilder.setSpan(new TypefaceSpan(fontFamily), start, end, flag);
        fontFamily = null;
    }
    if (align != null) {
        mBuilder.setSpan(new AlignmentSpan.Standard(align), start, end, flag);
        align = null;
    }
    if (imageIsBitmap || imageIsDrawable || imageIsUri || imageIsResourceId) {
        if (imageIsBitmap) {
            mBuilder.setSpan(new ImageSpan(Utils.getContext(), bitmap), start, end, flag);
            bitmap = null;
            imageIsBitmap = false;
        } else if (imageIsDrawable) {
            mBuilder.setSpan(new ImageSpan(drawable), start, end, flag);
            drawable = null;
            imageIsDrawable = false;
        } else if (imageIsUri) {
            mBuilder.setSpan(new ImageSpan(Utils.getContext(), uri), start, end, flag);
            uri = null;
            imageIsUri = false;
        } else {
            mBuilder.setSpan(new ImageSpan(Utils.getContext(), resourceId), start, end, flag);
            resourceId = 0;
            imageIsResourceId = false;
        }
    }
    if (clickSpan != null) {
        mBuilder.setSpan(clickSpan, start, end, flag);
        clickSpan = null;
    }
    if (url != null) {
        mBuilder.setSpan(new URLSpan(url), start, end, flag);
        url = null;
    }
    if (isBlur) {
        mBuilder.setSpan(new MaskFilterSpan(new BlurMaskFilter(radius, style)), start, end, flag);
        isBlur = false;
    }
    flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
}
Example 38
Project: plaid-master  File: Bypass.java View source code
// The 'numberOfSiblings' parameters refers to the number of siblings within the parent, including
// the 'element' parameter, as in "How many siblings are you?" rather than "How many siblings do
// you have?".
private CharSequence recurseElement(Element element, int indexWithinParent, int numberOfSiblings, TextView textView, LoadImageCallback loadImageCallback) {
    Type type = element.getType();
    boolean isOrderedList = false;
    if (type == Type.LIST) {
        String flagsStr = element.getAttribute("flags");
        if (flagsStr != null) {
            int flags = Integer.parseInt(flagsStr);
            isOrderedList = (flags & Element.F_LIST_ORDERED) != 0;
            if (isOrderedList) {
                mOrderedListNumber.put(element, 1);
            }
        }
    }
    int size = element.size();
    CharSequence[] spans = new CharSequence[size];
    for (int i = 0; i < size; i++) {
        spans[i] = recurseElement(element.children[i], i, size, textView, loadImageCallback);
    }
    // Clean up after we're done
    if (isOrderedList) {
        mOrderedListNumber.remove(this);
    }
    CharSequence concat = TextUtils.concat(spans);
    SpannableStringBuilder builder = new ReverseSpannableStringBuilder();
    String text = element.getText();
    if (element.size() == 0 && element.getParent() != null && element.getParent().getType() != Type.BLOCK_CODE) {
        text = text.replace('\n', ' ');
    }
    switch(type) {
        case LIST:
            if (element.getParent() != null && element.getParent().getType() == Type.LIST_ITEM) {
                builder.append("\n");
            }
            break;
        case LINEBREAK:
            builder.append("\n");
            break;
        case LIST_ITEM:
            builder.append(" ");
            if (mOrderedListNumber.containsKey(element.getParent())) {
                int number = mOrderedListNumber.get(element.getParent());
                builder.append(Integer.toString(number) + ".");
                mOrderedListNumber.put(element.getParent(), number + 1);
            } else {
                builder.append(mOptions.mUnorderedListItem);
            }
            builder.append("  ");
            break;
        case AUTOLINK:
            builder.append(element.getAttribute("link"));
            break;
        case HRULE:
            // This ultimately gets drawn over by the line span, but
            // we need something here or the span isn't even drawn.
            builder.append("-");
            break;
        case IMAGE:
            if (loadImageCallback != null && !TextUtils.isEmpty(element.getAttribute("link"))) {
                // prepend a new line so that images are always on a new line
                builder.append("\n");
                // Display alt text (or title text) if there is no image
                String alt = element.getAttribute("alt");
                if (TextUtils.isEmpty(alt)) {
                    alt = element.getAttribute("title");
                }
                if (!TextUtils.isEmpty(alt)) {
                    alt = "[" + alt + "]";
                    builder.append(alt);
                } else {
                    // Character to be replaced
                    builder.append("");
                }
            } else {
                // Character to be replaced
                builder.append("");
            }
            break;
    }
    builder.append(text);
    builder.append(concat);
    // of the last child within the parent.
    if (element.getParent() != null || indexWithinParent < (numberOfSiblings - 1)) {
        if (type == Type.LIST_ITEM) {
            if (element.size() == 0 || !element.children[element.size() - 1].isBlockElement()) {
                builder.append("\n");
            }
        } else if (element.isBlockElement() && type != Type.BLOCK_QUOTE) {
            if (type == Type.LIST) {
                // If this is a nested list, don't include newlines
                if (element.getParent() == null || element.getParent().getType() != Type.LIST_ITEM) {
                    builder.append("\n");
                }
            } else if (element.getParent() != null && element.getParent().getType() == Type.LIST_ITEM) {
                // List items should never double-space their entries
                builder.append("\n");
            } else {
                builder.append("\n\n");
            }
        }
    }
    switch(type) {
        case HEADER:
            String levelStr = element.getAttribute("level");
            int level = Integer.parseInt(levelStr);
            setSpan(builder, new RelativeSizeSpan(mOptions.mHeaderSizes[level - 1]));
            setSpan(builder, new StyleSpan(Typeface.BOLD));
            break;
        case LIST:
            setBlockSpan(builder, new LeadingMarginSpan.Standard(mListItemIndent));
            break;
        case EMPHASIS:
            setSpan(builder, new StyleSpan(Typeface.ITALIC));
            break;
        case DOUBLE_EMPHASIS:
            setSpan(builder, new StyleSpan(Typeface.BOLD));
            break;
        case TRIPLE_EMPHASIS:
            setSpan(builder, new StyleSpan(Typeface.BOLD_ITALIC));
            break;
        case BLOCK_CODE:
            setSpan(builder, new LeadingMarginSpan.Standard(mCodeBlockIndent));
            setSpan(builder, new TypefaceSpan("monospace"));
            break;
        case CODE_SPAN:
            setSpan(builder, new TypefaceSpan("monospace"));
            break;
        case LINK:
        case AUTOLINK:
            String link = element.getAttribute("link");
            if (!TextUtils.isEmpty(link) && Patterns.EMAIL_ADDRESS.matcher(link).matches()) {
                link = "mailto:" + link;
            }
            setSpan(builder, new TouchableUrlSpan(link, textView.getLinkTextColors(), textView.getHighlightColor()));
            break;
        case BLOCK_QUOTE:
            // We add two leading margin spans so that when the order is reversed,
            // the QuoteSpan will always be in the same spot.
            setBlockSpan(builder, new LeadingMarginSpan.Standard(mBlockQuoteIndent));
            //setBlockSpan(builder, new QuoteSpan(mOptions.mBlockQuoteLineColor));
            setBlockSpan(builder, new FancyQuoteSpan(mBlockQuoteLineWidth, mBlockQuoteLineIndent, mOptions.mBlockQuoteLineColor));
            setBlockSpan(builder, new ForegroundColorSpan(mOptions.mBlockQuoteTextColor));
            setBlockSpan(builder, new LeadingMarginSpan.Standard(mBlockQuoteIndent));
            setBlockSpan(builder, new StyleSpan(Typeface.ITALIC));
            break;
        case STRIKETHROUGH:
            setSpan(builder, new StrikethroughSpan());
            break;
        case HRULE:
            setSpan(builder, new HorizontalLineSpan(mOptions.mHruleColor, mHruleSize, mHruleTopBottomPadding));
            break;
        case IMAGE:
            String url = element.getAttribute("link");
            if (loadImageCallback != null && !TextUtils.isEmpty(url)) {
                setPrependedNewlineSpan(builder, mOptions.mPreImageLinebreakHeight);
                ImageLoadingSpan loadingSpan = new ImageLoadingSpan();
                setSpanWithPrependedNewline(builder, loadingSpan);
                // make the (eventually loaded) image span clickable to open in browser
                setSpanWithPrependedNewline(builder, new TouchableUrlSpan(url, textView.getLinkTextColors(), textView.getHighlightColor()));
                loadImageCallback.loadImage(url, loadingSpan);
            }
            break;
    }
    return builder;
}
Example 39
Project: sbt-android-master  File: Bypass.java View source code
// The 'numberOfSiblings' parameters refers to the number of siblings within the parent, including
// the 'element' parameter, as in "How many siblings are you?" rather than "How many siblings do
// you have?".
private CharSequence recurseElement(Element element, int indexWithinParent, int numberOfSiblings, TextView textView, LoadImageCallback loadImageCallback) {
    Type type = element.getType();
    boolean isOrderedList = false;
    if (type == Type.LIST) {
        String flagsStr = element.getAttribute("flags");
        if (flagsStr != null) {
            int flags = Integer.parseInt(flagsStr);
            isOrderedList = (flags & Element.F_LIST_ORDERED) != 0;
            if (isOrderedList) {
                mOrderedListNumber.put(element, 1);
            }
        }
    }
    int size = element.size();
    CharSequence[] spans = new CharSequence[size];
    for (int i = 0; i < size; i++) {
        spans[i] = recurseElement(element.children[i], i, size, textView, loadImageCallback);
    }
    // Clean up after we're done
    if (isOrderedList) {
        mOrderedListNumber.remove(this);
    }
    CharSequence concat = TextUtils.concat(spans);
    SpannableStringBuilder builder = new ReverseSpannableStringBuilder();
    String text = element.getText();
    if (element.size() == 0 && element.getParent() != null && element.getParent().getType() != Type.BLOCK_CODE) {
        text = text.replace('\n', ' ');
    }
    switch(type) {
        case LIST:
            if (element.getParent() != null && element.getParent().getType() == Type.LIST_ITEM) {
                builder.append("\n");
            }
            break;
        case LINEBREAK:
            builder.append("\n");
            break;
        case LIST_ITEM:
            builder.append(" ");
            if (mOrderedListNumber.containsKey(element.getParent())) {
                int number = mOrderedListNumber.get(element.getParent());
                builder.append(Integer.toString(number) + ".");
                mOrderedListNumber.put(element.getParent(), number + 1);
            } else {
                builder.append(mOptions.mUnorderedListItem);
            }
            builder.append("  ");
            break;
        case AUTOLINK:
            builder.append(element.getAttribute("link"));
            break;
        case HRULE:
            // This ultimately gets drawn over by the line span, but
            // we need something here or the span isn't even drawn.
            builder.append("-");
            break;
        case IMAGE:
            if (loadImageCallback != null && !TextUtils.isEmpty(element.getAttribute("link"))) {
                // prepend a new line so that images are always on a new line
                builder.append("\n");
                // Display alt text (or title text) if there is no image
                String alt = element.getAttribute("alt");
                if (TextUtils.isEmpty(alt)) {
                    alt = element.getAttribute("title");
                }
                if (!TextUtils.isEmpty(alt)) {
                    alt = "[" + alt + "]";
                    builder.append(alt);
                } else {
                    // Character to be replaced
                    builder.append("");
                }
            } else {
                // Character to be replaced
                builder.append("");
            }
            break;
    }
    builder.append(text);
    builder.append(concat);
    // of the last child within the parent.
    if (element.getParent() != null || indexWithinParent < (numberOfSiblings - 1)) {
        if (type == Type.LIST_ITEM) {
            if (element.size() == 0 || !element.children[element.size() - 1].isBlockElement()) {
                builder.append("\n");
            }
        } else if (element.isBlockElement() && type != Type.BLOCK_QUOTE) {
            if (type == Type.LIST) {
                // If this is a nested list, don't include newlines
                if (element.getParent() == null || element.getParent().getType() != Type.LIST_ITEM) {
                    builder.append("\n");
                }
            } else if (element.getParent() != null && element.getParent().getType() == Type.LIST_ITEM) {
                // List items should never double-space their entries
                builder.append("\n");
            } else {
                builder.append("\n\n");
            }
        }
    }
    switch(type) {
        case HEADER:
            String levelStr = element.getAttribute("level");
            int level = Integer.parseInt(levelStr);
            setSpan(builder, new RelativeSizeSpan(mOptions.mHeaderSizes[level - 1]));
            setSpan(builder, new StyleSpan(Typeface.BOLD));
            break;
        case LIST:
            setBlockSpan(builder, new LeadingMarginSpan.Standard(mListItemIndent));
            break;
        case EMPHASIS:
            setSpan(builder, new StyleSpan(Typeface.ITALIC));
            break;
        case DOUBLE_EMPHASIS:
            setSpan(builder, new StyleSpan(Typeface.BOLD));
            break;
        case TRIPLE_EMPHASIS:
            setSpan(builder, new StyleSpan(Typeface.BOLD_ITALIC));
            break;
        case BLOCK_CODE:
            setSpan(builder, new LeadingMarginSpan.Standard(mCodeBlockIndent));
            setSpan(builder, new TypefaceSpan("monospace"));
            break;
        case CODE_SPAN:
            setSpan(builder, new TypefaceSpan("monospace"));
            break;
        case LINK:
        case AUTOLINK:
            String link = element.getAttribute("link");
            if (!TextUtils.isEmpty(link) && Patterns.EMAIL_ADDRESS.matcher(link).matches()) {
                link = "mailto:" + link;
            }
            setSpan(builder, new TouchableUrlSpan(link, textView.getLinkTextColors(), textView.getHighlightColor()));
            break;
        case BLOCK_QUOTE:
            // We add two leading margin spans so that when the order is reversed,
            // the QuoteSpan will always be in the same spot.
            setBlockSpan(builder, new LeadingMarginSpan.Standard(mBlockQuoteIndent));
            //setBlockSpan(builder, new QuoteSpan(mOptions.mBlockQuoteLineColor));
            setBlockSpan(builder, new FancyQuoteSpan(mBlockQuoteLineWidth, mBlockQuoteLineIndent, mOptions.mBlockQuoteLineColor));
            setBlockSpan(builder, new ForegroundColorSpan(mOptions.mBlockQuoteTextColor));
            setBlockSpan(builder, new LeadingMarginSpan.Standard(mBlockQuoteIndent));
            setBlockSpan(builder, new StyleSpan(Typeface.ITALIC));
            break;
        case STRIKETHROUGH:
            setSpan(builder, new StrikethroughSpan());
            break;
        case HRULE:
            setSpan(builder, new HorizontalLineSpan(mOptions.mHruleColor, mHruleSize, mHruleTopBottomPadding));
            break;
        case IMAGE:
            String url = element.getAttribute("link");
            if (loadImageCallback != null && !TextUtils.isEmpty(url)) {
                setPrependedNewlineSpan(builder, mOptions.mPreImageLinebreakHeight);
                ImageLoadingSpan loadingSpan = new ImageLoadingSpan();
                setSpanWithPrependedNewline(builder, loadingSpan);
                // make the (eventually loaded) image span clickable to open in browser
                setSpanWithPrependedNewline(builder, new TouchableUrlSpan(url, textView.getLinkTextColors(), textView.getHighlightColor()));
                loadImageCallback.loadImage(url, loadingSpan);
            }
            break;
    }
    return builder;
}
Example 40
Project: TL-android-app-master  File: RenderUBB.java View source code
private void renderTagNode(TagNode node) throws IOException {
    String nodeString = node.toString();
    if (nodeString.equals("br")) {
        curEditable.append("\n");
        renderChildren(node);
    } else if (nodeString.equals("b") || nodeString.equals("strong")) {
        int start = curEditable.length();
        renderChildren(node);
        int end = curEditable.length();
        ((Spannable) curEditable).setSpan(new StyleSpan(android.graphics.Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        curEditable.append(" ");
    } else if (nodeString.equals("i")) {
        int start = curEditable.length();
        renderChildren(node);
        int end = curEditable.length();
        ((Spannable) curEditable).setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        curEditable.append(" ");
    } else if (nodeString.equals("font")) {
        int start = curEditable.length();
        renderChildren(node);
        int end = curEditable.length();
        int size;
        if (node.hasAttribute("size")) {
            size = Integer.parseInt(node.getAttributeByName("size"));
            if (size == 4) {
                ((Spannable) curEditable).setSpan(new TextAppearanceSpan(null, 0, 20, null, null), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
        if (node.hasAttribute("style")) {
            String style = node.getAttributeByName("style");
            renderStyleAttribute(style, start, end);
        }
    } else if (nodeString.equals("div") && node.hasAttribute("id") && (node.getAttributeByName("id").contains("spoiler") || node.getAttributeByName("id").contains("Quote"))) {
        TextView temp = curTextView;
        Editable tempEditable = curEditable;
        makeTextView();
        curEditable.append("\n");
        SpoilerSpan tempSpoilerSpan = curSpoilerSpan;
        // In retrospect perhaps I should have just gone with an actually recursive implementation
        SpoilerSpan tempParentSpoilerSpan = parentSpoilerSpan;
        parentSpoilerSpan = curSpoilerSpan;
        renderChildren(node);
        curSpoilerSpan = tempSpoilerSpan;
        parentSpoilerSpan = tempParentSpoilerSpan;
        curSpoilerSpan.setTagNode(node);
        curSpoilerSpan.setCharSequence((CharSequence) curTextView.getText());
        curTextView = temp;
        curEditable = tempEditable;
    } else if (nodeString.equals("div") && node.hasAttribute("class") && node.getAttributeByName("class").equals("quote")) {
        int start = curEditable.length();
        renderChildren(node);
        int end = curEditable.length();
        ((Spannable) curEditable).setSpan(new QuoteSpan(R.color.TLBlueBlack), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        ((Spannable) curEditable).setSpan(new LeadingMarginSpan.Standard(10), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        ((Spannable) curEditable).setSpan(new TextAppearanceSpan(null, 0, 12, null, null), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    } else if (nodeString.equals("div")) {
        curEditable.append("\n");
        int start = curEditable.length();
        renderChildren(node);
        int end = curEditable.length();
        if (node.hasAttribute("style")) {
            String style = node.getAttributeByName("style");
            renderStyleAttribute(style, start, end);
        }
    } else if (nodeString.equals("a")) {
        if (// spoiler tag
        node.hasAttribute("onclick")) {
            String txt = "";
            //the spoiler 'a' tag contains two span like this <span>+ Show </span> Spoiler<span> + </span>
            if (node.getAttributeByName("onclick").contains("ShowSpoiler")) {
                Iterator itTagNode = node.getChildren().iterator();
                TagNode firstSpan = (TagNode) itTagNode.next();
                String middleString = HtmlTools.unescapeHtml(itTagNode.next().toString().trim());
                TagNode thirdSpan = (TagNode) itTagNode.next();
                txt = HtmlTools.unescapeHtml(firstSpan.getChildren().iterator().next().toString().trim()) + " " + middleString + " " + HtmlTools.unescapeHtml(thirdSpan.getChildren().iterator().next().toString().trim());
            } else //this is for the nested quotes
            {
                txt = HtmlTools.unescapeHtml(node.getChildren().iterator().next().toString().trim());
            }
            int start = curEditable.length();
            curTextView.append(txt);
            int end = curEditable.length();
            curSpoilerSpan = new SpoilerSpan(end, globalTextView);
            if (parentSpoilerSpan != null) {
                parentSpoilerSpan.spoilerSpanList.add(curSpoilerSpan);
            }
            ((Spannable) curEditable).setSpan(curSpoilerSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else if (node.hasAttribute("href")) {
            int start = curEditable.length();
            renderChildren(node);
            int end = curEditable.length();
            String link = node.getAttributeByName("href");
            if (DisplayableLinkSpan.isDisplayable(link)) {
                ((Spannable) curEditable).setSpan(new DisplayableLinkSpan(link, context), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            } else {
                if (link.charAt(0) == '/') {
                    link = TLLib.getAbsoluteURL(link);
                }
                ((Spannable) curEditable).setSpan(new URLSpan(link), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            curTextView.append(" ");
        }
    } else if (nodeString.equals("img")) {
        if (Config.showImages) {
            if (node.getAttributeByName("src").charAt(0) == '/' || node.getAttributeByName("src").startsWith("http://www.teamliquid.net")) {
                curTextView.append(Html.fromHtml(serializer.getXmlAsString(node), imageGetter, null));
            } else {
                String imageLink = "<a href=\"" + node.getAttributeByName("src") + "\">View Image</a><br/>";
                curTextView.append(Html.fromHtml(imageLink));
            }
        }
    } else if (nodeString.equals("center")) {
        int start = curEditable.length();
        renderChildren(node);
        int end = curEditable.length();
        Spannable span = (Spannable) curEditable;
        span.setSpan(new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    } else if (nodeString.equals("hr")) {
        curTextView.append("\n----------------\n");
    } else if (nodeString.equals("p")) {
        curTextView.append("\n");
        renderChildren(node);
        curTextView.append("\n");
    } else if (nodeString.equals("object")) {
        String youtubeURL = node.getAttributeByName("data");
        String imageLink = String.format("<a href=\"%s\">Watch Video</a>", youtubeURL);
        curTextView.append(Html.fromHtml(imageLink));
    } else if (nodeString.equals("table") || nodeString.equals("tbody") || nodeString.equals("tr") || nodeString.equals("td")) {
        renderChildren(node);
    } else if (nodeString.equals("ul")) {
        curTextView.append("\n");
        renderChildren(node);
        curTextView.append("\n");
    } else if (nodeString.equals("li")) {
        int start = curEditable.length();
        renderChildren(node);
        int end = curEditable.length();
        Spannable span = (Spannable) curEditable;
        span.setSpan(new BulletSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    } else if (nodeString.equals("s")) {
        int start = curEditable.length();
        renderChildren(node);
        int end = curEditable.length();
        ((Spannable) curEditable).setSpan(new StrikethroughSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        curTextView.append(" ");
    } else if (nodeString.equals("u")) {
        int start = curEditable.length();
        renderChildren(node);
        int end = curEditable.length();
        ((Spannable) curEditable).setSpan(new UnderlineSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        curTextView.append(" ");
    } else if (nodeString.equals("span")) {
        int start = curEditable.length();
        renderChildren(node);
        int end = curEditable.length();
        if (node.hasAttribute("style")) {
            renderStyleAttribute(node.getAttributeByName("style"), start, end);
        }
    } else {
        Spanned span = Html.fromHtml(node.toString(), null, null);
        curTextView.append(span);
        renderChildren(node);
    }
}
Example 41
Project: XFrame-master  File: XSpannableStringUtils.java View source code
/**
         * 设置样�
         */
private void setSpan() {
    int start = mBuilder.length();
    mBuilder.append(this.text);
    int end = mBuilder.length();
    if (foregroundColor != defaultValue) {
        mBuilder.setSpan(new ForegroundColorSpan(foregroundColor), start, end, flag);
        foregroundColor = defaultValue;
    }
    if (backgroundColor != defaultValue) {
        mBuilder.setSpan(new BackgroundColorSpan(backgroundColor), start, end, flag);
        backgroundColor = defaultValue;
    }
    if (isLeadingMargin) {
        mBuilder.setSpan(new LeadingMarginSpan.Standard(first, rest), start, end, flag);
        isLeadingMargin = false;
    }
    if (quoteColor != defaultValue) {
        mBuilder.setSpan(new QuoteSpan(quoteColor), start, end, 0);
        quoteColor = defaultValue;
    }
    if (isBullet) {
        mBuilder.setSpan(new BulletSpan(gapWidth, bulletColor), start, end, 0);
        isBullet = false;
    }
    if (proportion != -1) {
        mBuilder.setSpan(new RelativeSizeSpan(proportion), start, end, flag);
        proportion = -1;
    }
    if (xProportion != -1) {
        mBuilder.setSpan(new ScaleXSpan(xProportion), start, end, flag);
        xProportion = -1;
    }
    if (isStrikethrough) {
        mBuilder.setSpan(new StrikethroughSpan(), start, end, flag);
        isStrikethrough = false;
    }
    if (isUnderline) {
        mBuilder.setSpan(new UnderlineSpan(), start, end, flag);
        isUnderline = false;
    }
    if (isSuperscript) {
        mBuilder.setSpan(new SuperscriptSpan(), start, end, flag);
        isSuperscript = false;
    }
    if (isSubscript) {
        mBuilder.setSpan(new SubscriptSpan(), start, end, flag);
        isSubscript = false;
    }
    if (isBold) {
        mBuilder.setSpan(new StyleSpan(Typeface.BOLD), start, end, flag);
        isBold = false;
    }
    if (isItalic) {
        mBuilder.setSpan(new StyleSpan(Typeface.ITALIC), start, end, flag);
        isItalic = false;
    }
    if (isBoldItalic) {
        mBuilder.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, end, flag);
        isBoldItalic = false;
    }
    if (fontFamily != null) {
        mBuilder.setSpan(new TypefaceSpan(fontFamily), start, end, flag);
        fontFamily = null;
    }
    if (align != null) {
        mBuilder.setSpan(new AlignmentSpan.Standard(align), start, end, flag);
        align = null;
    }
    if (imageIsBitmap || imageIsDrawable || imageIsUri || imageIsResourceId) {
        if (imageIsBitmap) {
            mBuilder.setSpan(new ImageSpan(XFrame.getContext(), bitmap), start, end, flag);
            bitmap = null;
            imageIsBitmap = false;
        } else if (imageIsDrawable) {
            mBuilder.setSpan(new ImageSpan(drawable), start, end, flag);
            drawable = null;
            imageIsDrawable = false;
        } else if (imageIsUri) {
            mBuilder.setSpan(new ImageSpan(XFrame.getContext(), uri), start, end, flag);
            uri = null;
            imageIsUri = false;
        } else {
            mBuilder.setSpan(new ImageSpan(XFrame.getContext(), resourceId), start, end, flag);
            resourceId = 0;
            imageIsResourceId = false;
        }
    }
    if (clickSpan != null) {
        mBuilder.setSpan(clickSpan, start, end, flag);
        clickSpan = null;
    }
    if (url != null) {
        mBuilder.setSpan(new URLSpan(url), start, end, flag);
        url = null;
    }
    if (isBlur) {
        mBuilder.setSpan(new MaskFilterSpan(new BlurMaskFilter(radius, style)), start, end, flag);
        isBlur = false;
    }
    flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
}
Example 42
Project: android-15-master  File: TextUtils.java View source code
/**
         * Read and return a new CharSequence, possibly with styles,
         * from the parcel.
         */
public CharSequence createFromParcel(Parcel p) {
    int kind = p.readInt();
    String string = p.readString();
    if (string == null) {
        return null;
    }
    if (kind == 1) {
        return string;
    }
    SpannableString sp = new SpannableString(string);
    while (true) {
        kind = p.readInt();
        if (kind == 0)
            break;
        switch(kind) {
            case ALIGNMENT_SPAN:
                readSpan(p, sp, new AlignmentSpan.Standard(p));
                break;
            case FOREGROUND_COLOR_SPAN:
                readSpan(p, sp, new ForegroundColorSpan(p));
                break;
            case RELATIVE_SIZE_SPAN:
                readSpan(p, sp, new RelativeSizeSpan(p));
                break;
            case SCALE_X_SPAN:
                readSpan(p, sp, new ScaleXSpan(p));
                break;
            case STRIKETHROUGH_SPAN:
                readSpan(p, sp, new StrikethroughSpan(p));
                break;
            case UNDERLINE_SPAN:
                readSpan(p, sp, new UnderlineSpan(p));
                break;
            case STYLE_SPAN:
                readSpan(p, sp, new StyleSpan(p));
                break;
            case BULLET_SPAN:
                readSpan(p, sp, new BulletSpan(p));
                break;
            case QUOTE_SPAN:
                readSpan(p, sp, new QuoteSpan(p));
                break;
            case LEADING_MARGIN_SPAN:
                readSpan(p, sp, new LeadingMarginSpan.Standard(p));
                break;
            case URL_SPAN:
                readSpan(p, sp, new URLSpan(p));
                break;
            case BACKGROUND_COLOR_SPAN:
                readSpan(p, sp, new BackgroundColorSpan(p));
                break;
            case TYPEFACE_SPAN:
                readSpan(p, sp, new TypefaceSpan(p));
                break;
            case SUPERSCRIPT_SPAN:
                readSpan(p, sp, new SuperscriptSpan(p));
                break;
            case SUBSCRIPT_SPAN:
                readSpan(p, sp, new SubscriptSpan(p));
                break;
            case ABSOLUTE_SIZE_SPAN:
                readSpan(p, sp, new AbsoluteSizeSpan(p));
                break;
            case TEXT_APPEARANCE_SPAN:
                readSpan(p, sp, new TextAppearanceSpan(p));
                break;
            case ANNOTATION:
                readSpan(p, sp, new Annotation(p));
                break;
            case SUGGESTION_SPAN:
                readSpan(p, sp, new SuggestionSpan(p));
                break;
            case SPELL_CHECK_SPAN:
                readSpan(p, sp, new SpellCheckSpan(p));
                break;
            case SUGGESTION_RANGE_SPAN:
                readSpan(p, sp, new SuggestionRangeSpan(p));
                break;
            case EASY_EDIT_SPAN:
                readSpan(p, sp, new EasyEditSpan());
                break;
            default:
                throw new RuntimeException("bogus span encoding " + kind);
        }
    }
    return sp;
}
Example 43
Project: cnAndroidDocs-master  File: TextUtils.java View source code
/**
         * Read and return a new CharSequence, possibly with styles,
         * from the parcel.
         */
public CharSequence createFromParcel(Parcel p) {
    int kind = p.readInt();
    String string = p.readString();
    if (string == null) {
        return null;
    }
    if (kind == 1) {
        return string;
    }
    SpannableString sp = new SpannableString(string);
    while (true) {
        kind = p.readInt();
        if (kind == 0)
            break;
        switch(kind) {
            case ALIGNMENT_SPAN:
                readSpan(p, sp, new AlignmentSpan.Standard(p));
                break;
            case FOREGROUND_COLOR_SPAN:
                readSpan(p, sp, new ForegroundColorSpan(p));
                break;
            case RELATIVE_SIZE_SPAN:
                readSpan(p, sp, new RelativeSizeSpan(p));
                break;
            case SCALE_X_SPAN:
                readSpan(p, sp, new ScaleXSpan(p));
                break;
            case STRIKETHROUGH_SPAN:
                readSpan(p, sp, new StrikethroughSpan(p));
                break;
            case UNDERLINE_SPAN:
                readSpan(p, sp, new UnderlineSpan(p));
                break;
            case STYLE_SPAN:
                readSpan(p, sp, new StyleSpan(p));
                break;
            case BULLET_SPAN:
                readSpan(p, sp, new BulletSpan(p));
                break;
            case QUOTE_SPAN:
                readSpan(p, sp, new QuoteSpan(p));
                break;
            case LEADING_MARGIN_SPAN:
                readSpan(p, sp, new LeadingMarginSpan.Standard(p));
                break;
            case URL_SPAN:
                readSpan(p, sp, new URLSpan(p));
                break;
            case BACKGROUND_COLOR_SPAN:
                readSpan(p, sp, new BackgroundColorSpan(p));
                break;
            case TYPEFACE_SPAN:
                readSpan(p, sp, new TypefaceSpan(p));
                break;
            case SUPERSCRIPT_SPAN:
                readSpan(p, sp, new SuperscriptSpan(p));
                break;
            case SUBSCRIPT_SPAN:
                readSpan(p, sp, new SubscriptSpan(p));
                break;
            case ABSOLUTE_SIZE_SPAN:
                readSpan(p, sp, new AbsoluteSizeSpan(p));
                break;
            case TEXT_APPEARANCE_SPAN:
                readSpan(p, sp, new TextAppearanceSpan(p));
                break;
            case ANNOTATION:
                readSpan(p, sp, new Annotation(p));
                break;
            case SUGGESTION_SPAN:
                readSpan(p, sp, new SuggestionSpan(p));
                break;
            case SPELL_CHECK_SPAN:
                readSpan(p, sp, new SpellCheckSpan(p));
                break;
            case SUGGESTION_RANGE_SPAN:
                readSpan(p, sp, new SuggestionRangeSpan(p));
                break;
            case EASY_EDIT_SPAN:
                readSpan(p, sp, new EasyEditSpan());
                break;
            case LOCALE_SPAN:
                readSpan(p, sp, new LocaleSpan(p));
                break;
            default:
                throw new RuntimeException("bogus span encoding " + kind);
        }
    }
    return sp;
}
Example 44
Project: frameworks_base_disabled-master  File: TextUtils.java View source code
/**
         * Read and return a new CharSequence, possibly with styles,
         * from the parcel.
         */
public CharSequence createFromParcel(Parcel p) {
    int kind = p.readInt();
    String string = p.readString();
    if (string == null) {
        return null;
    }
    if (kind == 1) {
        return string;
    }
    SpannableString sp = new SpannableString(string);
    while (true) {
        kind = p.readInt();
        if (kind == 0)
            break;
        switch(kind) {
            case ALIGNMENT_SPAN:
                readSpan(p, sp, new AlignmentSpan.Standard(p));
                break;
            case FOREGROUND_COLOR_SPAN:
                readSpan(p, sp, new ForegroundColorSpan(p));
                break;
            case RELATIVE_SIZE_SPAN:
                readSpan(p, sp, new RelativeSizeSpan(p));
                break;
            case SCALE_X_SPAN:
                readSpan(p, sp, new ScaleXSpan(p));
                break;
            case STRIKETHROUGH_SPAN:
                readSpan(p, sp, new StrikethroughSpan(p));
                break;
            case UNDERLINE_SPAN:
                readSpan(p, sp, new UnderlineSpan(p));
                break;
            case STYLE_SPAN:
                readSpan(p, sp, new StyleSpan(p));
                break;
            case BULLET_SPAN:
                readSpan(p, sp, new BulletSpan(p));
                break;
            case QUOTE_SPAN:
                readSpan(p, sp, new QuoteSpan(p));
                break;
            case LEADING_MARGIN_SPAN:
                readSpan(p, sp, new LeadingMarginSpan.Standard(p));
                break;
            case URL_SPAN:
                readSpan(p, sp, new URLSpan(p));
                break;
            case BACKGROUND_COLOR_SPAN:
                readSpan(p, sp, new BackgroundColorSpan(p));
                break;
            case TYPEFACE_SPAN:
                readSpan(p, sp, new TypefaceSpan(p));
                break;
            case SUPERSCRIPT_SPAN:
                readSpan(p, sp, new SuperscriptSpan(p));
                break;
            case SUBSCRIPT_SPAN:
                readSpan(p, sp, new SubscriptSpan(p));
                break;
            case ABSOLUTE_SIZE_SPAN:
                readSpan(p, sp, new AbsoluteSizeSpan(p));
                break;
            case TEXT_APPEARANCE_SPAN:
                readSpan(p, sp, new TextAppearanceSpan(p));
                break;
            case ANNOTATION:
                readSpan(p, sp, new Annotation(p));
                break;
            case SUGGESTION_SPAN:
                readSpan(p, sp, new SuggestionSpan(p));
                break;
            case SPELL_CHECK_SPAN:
                readSpan(p, sp, new SpellCheckSpan(p));
                break;
            case SUGGESTION_RANGE_SPAN:
                readSpan(p, sp, new SuggestionRangeSpan(p));
                break;
            case EASY_EDIT_SPAN:
                readSpan(p, sp, new EasyEditSpan());
                break;
            default:
                throw new RuntimeException("bogus span encoding " + kind);
        }
    }
    return sp;
}
Example 45
Project: property-db-master  File: TextUtils.java View source code
/**
         * Read and return a new CharSequence, possibly with styles,
         * from the parcel.
         */
public CharSequence createFromParcel(Parcel p) {
    int kind = p.readInt();
    String string = p.readString();
    if (string == null) {
        return null;
    }
    if (kind == 1) {
        return string;
    }
    SpannableString sp = new SpannableString(string);
    while (true) {
        kind = p.readInt();
        if (kind == 0)
            break;
        switch(kind) {
            case ALIGNMENT_SPAN:
                readSpan(p, sp, new AlignmentSpan.Standard(p));
                break;
            case FOREGROUND_COLOR_SPAN:
                readSpan(p, sp, new ForegroundColorSpan(p));
                break;
            case RELATIVE_SIZE_SPAN:
                readSpan(p, sp, new RelativeSizeSpan(p));
                break;
            case SCALE_X_SPAN:
                readSpan(p, sp, new ScaleXSpan(p));
                break;
            case STRIKETHROUGH_SPAN:
                readSpan(p, sp, new StrikethroughSpan(p));
                break;
            case UNDERLINE_SPAN:
                readSpan(p, sp, new UnderlineSpan(p));
                break;
            case STYLE_SPAN:
                readSpan(p, sp, new StyleSpan(p));
                break;
            case BULLET_SPAN:
                readSpan(p, sp, new BulletSpan(p));
                break;
            case QUOTE_SPAN:
                readSpan(p, sp, new QuoteSpan(p));
                break;
            case LEADING_MARGIN_SPAN:
                readSpan(p, sp, new LeadingMarginSpan.Standard(p));
                break;
            case URL_SPAN:
                readSpan(p, sp, new URLSpan(p));
                break;
            case BACKGROUND_COLOR_SPAN:
                readSpan(p, sp, new BackgroundColorSpan(p));
                break;
            case TYPEFACE_SPAN:
                readSpan(p, sp, new TypefaceSpan(p));
                break;
            case SUPERSCRIPT_SPAN:
                readSpan(p, sp, new SuperscriptSpan(p));
                break;
            case SUBSCRIPT_SPAN:
                readSpan(p, sp, new SubscriptSpan(p));
                break;
            case ABSOLUTE_SIZE_SPAN:
                readSpan(p, sp, new AbsoluteSizeSpan(p));
                break;
            case TEXT_APPEARANCE_SPAN:
                readSpan(p, sp, new TextAppearanceSpan(p));
                break;
            case ANNOTATION:
                readSpan(p, sp, new Annotation(p));
                break;
            case SUGGESTION_SPAN:
                readSpan(p, sp, new SuggestionSpan(p));
                break;
            case SPELL_CHECK_SPAN:
                readSpan(p, sp, new SpellCheckSpan(p));
                break;
            case SUGGESTION_RANGE_SPAN:
                readSpan(p, sp, new SuggestionRangeSpan(p));
                break;
            case EASY_EDIT_SPAN:
                readSpan(p, sp, new EasyEditSpan());
                break;
            case LOCALE_SPAN:
                readSpan(p, sp, new LocaleSpan(p));
                break;
            default:
                throw new RuntimeException("bogus span encoding " + kind);
        }
    }
    return sp;
}
Example 46
Project: XobotOS-master  File: TextUtils.java View source code
/**
         * Read and return a new CharSequence, possibly with styles,
         * from the parcel.
         */
public CharSequence createFromParcel(Parcel p) {
    int kind = p.readInt();
    String string = p.readString();
    if (string == null) {
        return null;
    }
    if (kind == 1) {
        return string;
    }
    SpannableString sp = new SpannableString(string);
    while (true) {
        kind = p.readInt();
        if (kind == 0)
            break;
        switch(kind) {
            case ALIGNMENT_SPAN:
                readSpan(p, sp, new AlignmentSpan.Standard(p));
                break;
            case FOREGROUND_COLOR_SPAN:
                readSpan(p, sp, new ForegroundColorSpan(p));
                break;
            case RELATIVE_SIZE_SPAN:
                readSpan(p, sp, new RelativeSizeSpan(p));
                break;
            case SCALE_X_SPAN:
                readSpan(p, sp, new ScaleXSpan(p));
                break;
            case STRIKETHROUGH_SPAN:
                readSpan(p, sp, new StrikethroughSpan(p));
                break;
            case UNDERLINE_SPAN:
                readSpan(p, sp, new UnderlineSpan(p));
                break;
            case STYLE_SPAN:
                readSpan(p, sp, new StyleSpan(p));
                break;
            case BULLET_SPAN:
                readSpan(p, sp, new BulletSpan(p));
                break;
            case QUOTE_SPAN:
                readSpan(p, sp, new QuoteSpan(p));
                break;
            case LEADING_MARGIN_SPAN:
                readSpan(p, sp, new LeadingMarginSpan.Standard(p));
                break;
            case URL_SPAN:
                readSpan(p, sp, new URLSpan(p));
                break;
            case BACKGROUND_COLOR_SPAN:
                readSpan(p, sp, new BackgroundColorSpan(p));
                break;
            case TYPEFACE_SPAN:
                readSpan(p, sp, new TypefaceSpan(p));
                break;
            case SUPERSCRIPT_SPAN:
                readSpan(p, sp, new SuperscriptSpan(p));
                break;
            case SUBSCRIPT_SPAN:
                readSpan(p, sp, new SubscriptSpan(p));
                break;
            case ABSOLUTE_SIZE_SPAN:
                readSpan(p, sp, new AbsoluteSizeSpan(p));
                break;
            case TEXT_APPEARANCE_SPAN:
                readSpan(p, sp, new TextAppearanceSpan(p));
                break;
            case ANNOTATION:
                readSpan(p, sp, new Annotation(p));
                break;
            case SUGGESTION_SPAN:
                readSpan(p, sp, new SuggestionSpan(p));
                break;
            case SPELL_CHECK_SPAN:
                readSpan(p, sp, new SpellCheckSpan(p));
                break;
            case SUGGESTION_RANGE_SPAN:
                readSpan(p, sp, new SuggestionRangeSpan(p));
                break;
            case EASY_EDIT_SPAN:
                readSpan(p, sp, new EasyEditSpan());
                break;
            default:
                throw new RuntimeException("bogus span encoding " + kind);
        }
    }
    return sp;
}
Example 47
Project: TextJustify-Android-master  File: SpannableDocumentLayout.java View source code
@SuppressWarnings("ConstantConditions")
@Override
public boolean onMeasure(IProgress<Float> progress, ICancel<Boolean> cancelled) {
    boolean done = true;
    float parentWidth = params.getParentWidth();
    float boundWidth = params.getParentWidth() - params.getInsetPaddingLeft() - params.getInsetPaddingRight();
    mLeadMarginSpanDrawEvents = new LinkedList<>();
    StaticLayout staticLayout = new StaticLayout(getText(), (TextPaint) getPaint(), (int) boundWidth, Layout.Alignment.ALIGN_NORMAL, 1, 0, false);
    int[] newTokens = new int[TOKEN_LENGTH * 1000];
    LeadingMarginSpan[] activeLeadSpans = new LeadingMarginSpan[0];
    HashMap<LeadingMarginSpan, Integer> leadSpans = new HashMap<>();
    TextAlignment defAlign = params.textAlignment;
    Spannable textCpy = (Spannable) this.text;
    Paint.FontMetricsInt fmi = paint.getFontMetricsInt();
    int maxTextIndex = textCpy.length() - 1;
    int lines = staticLayout.getLineCount();
    int enableLineBreak = 0;
    int index = 0;
    int lineNumber;
    float x;
    float y = params.insetPaddingTop;
    float left = params.insetPaddingLeft;
    float right = params.insetPaddingRight;
    float lineHeightAdd = params.lineHeightMultiplier;
    float lastAscent;
    float lastDescent;
    boolean isParaStart = true;
    boolean isReverse = params.reverse;
    for (lineNumber = 0; lineNumber < lines; lineNumber++) {
        if (cancelled.isCancelled()) {
            done = false;
            break;
        }
        progress.onUpdate((float) lineNumber / (float) lines);
        newTokens = ammortizeArray(newTokens, index);
        int start = staticLayout.getLineStart(lineNumber);
        int end = staticLayout.getLineEnd(lineNumber);
        float realWidth = boundWidth;
        if (params.debugging) {
            Console.log(start + " => " + end + " :: " + " " + -staticLayout.getLineAscent(lineNumber) + " " + staticLayout.getLineDescent(lineNumber) + " " + textCpy.subSequence(start, end).toString());
        }
        // start == end => end of textCpy
        if (start == end || lineNumber >= params.maxLines) {
            break;
        }
        // Get textCpy alignment for the line
        TextAlignmentSpan[] textAlignmentSpans = textCpy.getSpans(start, end, TextAlignmentSpan.class);
        TextAlignment lineTextAlignment = textAlignmentSpans.length == 0 ? defAlign : textAlignmentSpans[0].getTextAlignment();
        // Calculate components of line height
        lastAscent = -staticLayout.getLineAscent(lineNumber);
        lastDescent = staticLayout.getLineDescent(lineNumber) + lineHeightAdd;
        // Handle reverse
        DirectionSpan[] directionSpans = textCpy.getSpans(start, end, DirectionSpan.class);
        isReverse = directionSpans.length > 0 ? directionSpans[0].isReverse() : params.reverse;
        // Line is ONLY a <br/> or \n
        if (start + 1 == end && (Character.getNumericValue(textCpy.charAt(start)) == -1 || textCpy.charAt(start) == '\n')) {
            // Line break indicates a new paragraph
            // is next
            isParaStart = true;
            // Use the line-height of the next line
            if (lineNumber + 1 < lines) {
                y += enableLineBreak * (-staticLayout.getLineAscent(lineNumber + 1) + staticLayout.getLineDescent(lineNumber + 1));
            }
            // Don't ignore the next line breaks
            enableLineBreak = 1;
            continue;
        } else {
            // Ignore the next line break
            enableLineBreak = 0;
        }
        x = lineTextAlignment == TextAlignment.RIGHT ? right : left;
        y += lastAscent;
        // Line CONTAINS a \n
        boolean isParaEnd = end == maxTextIndex || textCpy.charAt(Math.min(end, maxTextIndex)) == '\n' || textCpy.charAt(end - 1) == '\n';
        if (isParaEnd) {
            enableLineBreak = 1;
        }
        // LeadingMarginSpan block
        if (isParaStart) {
            // Process LeadingMarginSpan
            activeLeadSpans = textCpy.getSpans(start, end, LeadingMarginSpan.class);
            // Set up all the spans
            if (activeLeadSpans.length > 0) {
                for (LeadingMarginSpan leadSpan : activeLeadSpans) {
                    if (!leadSpans.containsKey(leadSpan)) {
                        // Default margin is everything
                        int marginLineCount = -1;
                        if (leadSpan instanceof LeadingMarginSpan.LeadingMarginSpan2) {
                            LeadingMarginSpan.LeadingMarginSpan2 leadSpan2 = ((LeadingMarginSpan.LeadingMarginSpan2) leadSpan);
                            marginLineCount = leadSpan2.getLeadingMarginLineCount();
                        }
                        leadSpans.put(leadSpan, marginLineCount);
                    }
                }
            }
        }
        float totalMargin = 0.0f;
        int top = (int) (y - lastAscent);
        int baseline = (int) (y);
        int bottom = (int) (y + lastDescent);
        for (LeadingMarginSpan leadSpan : activeLeadSpans) {
            // TOKEN_X based on alignment
            float calcX = x;
            // LineAlignment
            int lineAlignmentVal = 1;
            if (lineTextAlignment == TextAlignment.RIGHT) {
                lineAlignmentVal = -1;
                calcX = parentWidth - x;
            }
            // Get current line count
            int spanLines = leadSpans.get(leadSpan);
            // Update only if the valid next valid
            if (spanLines > 0 || spanLines == -1) {
                leadSpans.put(leadSpan, spanLines == -1 ? -1 : spanLines - 1);
                mLeadMarginSpanDrawEvents.add(new LeadingMarginSpanDrawParameters(leadSpan, (int) calcX, lineAlignmentVal, top, baseline, bottom, start, end, isParaStart));
                // Is margin required?
                totalMargin += leadSpan.getLeadingMargin(isParaStart);
            }
        }
        x += totalMargin;
        realWidth -= totalMargin;
        // Disable/enable new paragraph
        isParaStart = isParaEnd;
        // TextAlignmentSpan block
        if (isParaEnd && lineTextAlignment == TextAlignment.JUSTIFIED) {
            lineTextAlignment = isReverse ? TextAlignment.RIGHT : TextAlignment.LEFT;
        }
        if (params.debugging) {
            Console.log(String.format("Align: %s, X: %fpx, Y: %fpx, PWidth: %fpx", lineTextAlignment, x, y, parentWidth));
        }
        switch(lineTextAlignment) {
            case RIGHT:
                {
                    float lineWidth = Styled.measureText(paint, workPaint, textCpy, start, end, fmi);
                    index = pushToken(newTokens, index, start, end, parentWidth - x - lineWidth, y, lastAscent, lastDescent, lineNumber);
                    y += lastDescent;
                    continue;
                }
            case CENTER:
                {
                    float lineWidth = Styled.measureText(paint, workPaint, textCpy, start, end, fmi);
                    index = pushToken(newTokens, index, start, end, x + (realWidth - lineWidth) / 2, y, lastAscent, lastDescent, lineNumber);
                    y += lastDescent;
                    continue;
                }
            case LEFT:
                {
                    index = pushToken(newTokens, index, start, end, x, y, lastAscent, lastDescent, lineNumber);
                    y += lastDescent;
                    continue;
                }
        }
        // FIXME: Space at the end of each line, possibly due to scrollbar offset
        //            LinkedList<Integer> tokenized = tokenize(textCpy, start, end - 1);
        // FIXME: 2016/4/16 Issue #105 bug
        LinkedList<Integer> tokenized = tokenize(textCpy, start, end);
        // If one long word without any spaces
        if (tokenized.size() == 1) {
            int stop = tokenized.get(0);
            // characters individually
            if (getTrimmedLength(textCpy, start, stop) != 0) {
                float[] textWidths = new float[stop - start];
                float sum = 0.0f, textsOffset = 0.0f, offset;
                int m = 0;
                Styled.getTextWidths(paint, workPaint, textCpy, start, stop, textWidths, fmi);
                for (float tw : textWidths) {
                    sum += tw;
                }
                offset = (realWidth - sum) / (textWidths.length - 1);
                for (int k = start; k < stop; k++) {
                    index = pushToken(newTokens, index, k, k + 1, x + textsOffset + (offset * m), y, lastAscent, lastDescent, lineNumber);
                    newTokens = ammortizeArray(newTokens, index);
                    textsOffset += textWidths[m++];
                }
            }
        } else //  Handle multiple words
        {
            int m = 1;
            int indexOffset = 0;
            int startIndex = index;
            int reqSpaces = (tokenized.size() - 1) * TOKEN_LENGTH;
            int rtlZero = 0;
            float rtlRight = 0;
            float rtlMul = 1;
            float lineWidth = 0;
            float offset;
            if (isReverse) {
                indexOffset = -2 * TOKEN_LENGTH;
                rtlRight = parentWidth;
                rtlMul = -1;
                rtlZero = 1;
                // reverse index
                index += reqSpaces;
            }
            // more space
            newTokens = ammortizeArray(newTokens, index + reqSpaces);
            for (int stop : tokenized) {
                float wordWidth = Styled.measureText(paint, workPaint, textCpy, start, stop, fmi);
                // add word
                index = pushToken(newTokens, index, start, stop, rtlRight + rtlMul * (x + lineWidth + rtlZero * wordWidth), y, lastAscent, lastDescent, lineNumber);
                lineWidth += wordWidth;
                start = stop + 1;
                // based on if rtl
                index += indexOffset;
            }
            if (isReverse) {
                index = startIndex + reqSpaces + TOKEN_LENGTH;
            }
            offset = (realWidth - lineWidth) / (float) (tokenized.size() - 1);
            if (isReverse) {
                for (int pos = index - TOKEN_LENGTH * 2; pos >= startIndex; pos -= TOKEN_LENGTH) {
                    newTokens[pos + TOKEN_X] = (int) (((float) newTokens[pos + TOKEN_X]) - (offset * (float) m++));
                }
            } else {
                for (int pos = startIndex + TOKEN_LENGTH; pos < index; pos += TOKEN_LENGTH) {
                    newTokens[pos + TOKEN_X] = (int) (((float) newTokens[pos + TOKEN_X]) + (offset * (float) m++));
                }
            }
        }
        y += lastDescent;
    }
    lineCount = lineNumber;
    tokens = newTokens;
    params.changed = false;
    textChange = !done;
    measuredHeight = (int) (y - lineHeightAdd + params.insetPaddingBottom);
    return done;
}
Example 48
Project: themes-platform-packages-apps-Mms-master  File: MessageListItem.java View source code
@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    mMsgListItem = findViewById(R.id.msg_list_item);
    mBodyTextView = (TextView) findViewById(R.id.text_view);
    mLockedIndicator = (ImageView) findViewById(R.id.locked_indicator);
    mDeliveredIndicator = (ImageView) findViewById(R.id.delivered_indicator);
    mDetailsIndicator = (ImageView) findViewById(R.id.details_indicator);
    mAvatar = (QuickContactBadge) findViewById(R.id.avatar);
    ViewGroup.MarginLayoutParams badgeParams = (MarginLayoutParams) mAvatar.getLayoutParams();
    final int badgeWidth = badgeParams.width + badgeParams.rightMargin + badgeParams.leftMargin;
    int lineHeight = mBodyTextView.getLineHeight();
    int effectiveBadgeHeight = badgeParams.height + badgeParams.topMargin - mBodyTextView.getPaddingTop();
    final int indentLineCount = (int) ((effectiveBadgeHeight - 1) / lineHeight) + 1;
    mLeadingMarginSpan = new LeadingMarginSpan.LeadingMarginSpan2() {

        public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom, CharSequence text, int start, int end, boolean first, Layout layout) {
        // no op
        }

        public int getLeadingMargin(boolean first) {
            return first ? badgeWidth : 0;
        }

        public int getLeadingMarginLineCount() {
            return indentLineCount;
        }
    };
}
Example 49
Project: ti.styledlabel-master  File: HtmlToSpannedConverter.java View source code
private void endLi(TagMarker tm) {
    int end = mSB.length();
    int start = tm.getStart();
    if (start != end) {
        mSB.append('\n');
        Object span;
        if (mListIsOrdered) {
            span = new NumberedSpan(++mListCount);
        } else {
            span = new BulletSpan();
        }
        mSB.setSpan(new LeadingMarginSpan.Standard(12, 12), start, end + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        mSB.setSpan(span, start, end + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
}
Example 50
Project: android-sdk-sources-for-api-level-23-master  File: TextUtils.java View source code
/**
         * Read and return a new CharSequence, possibly with styles,
         * from the parcel.
         */
public CharSequence createFromParcel(Parcel p) {
    int kind = p.readInt();
    String string = p.readString();
    if (string == null) {
        return null;
    }
    if (kind == 1) {
        return string;
    }
    SpannableString sp = new SpannableString(string);
    while (true) {
        kind = p.readInt();
        if (kind == 0)
            break;
        switch(kind) {
            case ALIGNMENT_SPAN:
                readSpan(p, sp, new AlignmentSpan.Standard(p));
                break;
            case FOREGROUND_COLOR_SPAN:
                readSpan(p, sp, new ForegroundColorSpan(p));
                break;
            case RELATIVE_SIZE_SPAN:
                readSpan(p, sp, new RelativeSizeSpan(p));
                break;
            case SCALE_X_SPAN:
                readSpan(p, sp, new ScaleXSpan(p));
                break;
            case STRIKETHROUGH_SPAN:
                readSpan(p, sp, new StrikethroughSpan(p));
                break;
            case UNDERLINE_SPAN:
                readSpan(p, sp, new UnderlineSpan(p));
                break;
            case STYLE_SPAN:
                readSpan(p, sp, new StyleSpan(p));
                break;
            case BULLET_SPAN:
                readSpan(p, sp, new BulletSpan(p));
                break;
            case QUOTE_SPAN:
                readSpan(p, sp, new QuoteSpan(p));
                break;
            case LEADING_MARGIN_SPAN:
                readSpan(p, sp, new LeadingMarginSpan.Standard(p));
                break;
            case URL_SPAN:
                readSpan(p, sp, new URLSpan(p));
                break;
            case BACKGROUND_COLOR_SPAN:
                readSpan(p, sp, new BackgroundColorSpan(p));
                break;
            case TYPEFACE_SPAN:
                readSpan(p, sp, new TypefaceSpan(p));
                break;
            case SUPERSCRIPT_SPAN:
                readSpan(p, sp, new SuperscriptSpan(p));
                break;
            case SUBSCRIPT_SPAN:
                readSpan(p, sp, new SubscriptSpan(p));
                break;
            case ABSOLUTE_SIZE_SPAN:
                readSpan(p, sp, new AbsoluteSizeSpan(p));
                break;
            case TEXT_APPEARANCE_SPAN:
                readSpan(p, sp, new TextAppearanceSpan(p));
                break;
            case ANNOTATION:
                readSpan(p, sp, new Annotation(p));
                break;
            case SUGGESTION_SPAN:
                readSpan(p, sp, new SuggestionSpan(p));
                break;
            case SPELL_CHECK_SPAN:
                readSpan(p, sp, new SpellCheckSpan(p));
                break;
            case SUGGESTION_RANGE_SPAN:
                readSpan(p, sp, new SuggestionRangeSpan(p));
                break;
            case EASY_EDIT_SPAN:
                readSpan(p, sp, new EasyEditSpan(p));
                break;
            case LOCALE_SPAN:
                readSpan(p, sp, new LocaleSpan(p));
                break;
            case TTS_SPAN:
                readSpan(p, sp, new TtsSpan(p));
                break;
            default:
                throw new RuntimeException("bogus span encoding " + kind);
        }
    }
    return sp;
}
Example 51
Project: android_frameworks_base-master  File: TextUtils.java View source code
/**
         * Read and return a new CharSequence, possibly with styles,
         * from the parcel.
         */
public CharSequence createFromParcel(Parcel p) {
    int kind = p.readInt();
    String string = p.readString();
    if (string == null) {
        return null;
    }
    if (kind == 1) {
        return string;
    }
    SpannableString sp = new SpannableString(string);
    while (true) {
        kind = p.readInt();
        if (kind == 0)
            break;
        switch(kind) {
            case ALIGNMENT_SPAN:
                readSpan(p, sp, new AlignmentSpan.Standard(p));
                break;
            case FOREGROUND_COLOR_SPAN:
                readSpan(p, sp, new ForegroundColorSpan(p));
                break;
            case RELATIVE_SIZE_SPAN:
                readSpan(p, sp, new RelativeSizeSpan(p));
                break;
            case SCALE_X_SPAN:
                readSpan(p, sp, new ScaleXSpan(p));
                break;
            case STRIKETHROUGH_SPAN:
                readSpan(p, sp, new StrikethroughSpan(p));
                break;
            case UNDERLINE_SPAN:
                readSpan(p, sp, new UnderlineSpan(p));
                break;
            case STYLE_SPAN:
                readSpan(p, sp, new StyleSpan(p));
                break;
            case BULLET_SPAN:
                readSpan(p, sp, new BulletSpan(p));
                break;
            case QUOTE_SPAN:
                readSpan(p, sp, new QuoteSpan(p));
                break;
            case LEADING_MARGIN_SPAN:
                readSpan(p, sp, new LeadingMarginSpan.Standard(p));
                break;
            case URL_SPAN:
                readSpan(p, sp, new URLSpan(p));
                break;
            case BACKGROUND_COLOR_SPAN:
                readSpan(p, sp, new BackgroundColorSpan(p));
                break;
            case TYPEFACE_SPAN:
                readSpan(p, sp, new TypefaceSpan(p));
                break;
            case SUPERSCRIPT_SPAN:
                readSpan(p, sp, new SuperscriptSpan(p));
                break;
            case SUBSCRIPT_SPAN:
                readSpan(p, sp, new SubscriptSpan(p));
                break;
            case ABSOLUTE_SIZE_SPAN:
                readSpan(p, sp, new AbsoluteSizeSpan(p));
                break;
            case TEXT_APPEARANCE_SPAN:
                readSpan(p, sp, new TextAppearanceSpan(p));
                break;
            case ANNOTATION:
                readSpan(p, sp, new Annotation(p));
                break;
            case SUGGESTION_SPAN:
                readSpan(p, sp, new SuggestionSpan(p));
                break;
            case SPELL_CHECK_SPAN:
                readSpan(p, sp, new SpellCheckSpan(p));
                break;
            case SUGGESTION_RANGE_SPAN:
                readSpan(p, sp, new SuggestionRangeSpan(p));
                break;
            case EASY_EDIT_SPAN:
                readSpan(p, sp, new EasyEditSpan(p));
                break;
            case LOCALE_SPAN:
                readSpan(p, sp, new LocaleSpan(p));
                break;
            case TTS_SPAN:
                readSpan(p, sp, new TtsSpan(p));
                break;
            default:
                throw new RuntimeException("bogus span encoding " + kind);
        }
    }
    return sp;
}
Example 52
Project: platform_frameworks_base-master  File: TextUtils.java View source code
/**
         * Read and return a new CharSequence, possibly with styles,
         * from the parcel.
         */
public CharSequence createFromParcel(Parcel p) {
    int kind = p.readInt();
    String string = p.readString();
    if (string == null) {
        return null;
    }
    if (kind == 1) {
        return string;
    }
    SpannableString sp = new SpannableString(string);
    while (true) {
        kind = p.readInt();
        if (kind == 0)
            break;
        switch(kind) {
            case ALIGNMENT_SPAN:
                readSpan(p, sp, new AlignmentSpan.Standard(p));
                break;
            case FOREGROUND_COLOR_SPAN:
                readSpan(p, sp, new ForegroundColorSpan(p));
                break;
            case RELATIVE_SIZE_SPAN:
                readSpan(p, sp, new RelativeSizeSpan(p));
                break;
            case SCALE_X_SPAN:
                readSpan(p, sp, new ScaleXSpan(p));
                break;
            case STRIKETHROUGH_SPAN:
                readSpan(p, sp, new StrikethroughSpan(p));
                break;
            case UNDERLINE_SPAN:
                readSpan(p, sp, new UnderlineSpan(p));
                break;
            case STYLE_SPAN:
                readSpan(p, sp, new StyleSpan(p));
                break;
            case BULLET_SPAN:
                readSpan(p, sp, new BulletSpan(p));
                break;
            case QUOTE_SPAN:
                readSpan(p, sp, new QuoteSpan(p));
                break;
            case LEADING_MARGIN_SPAN:
                readSpan(p, sp, new LeadingMarginSpan.Standard(p));
                break;
            case URL_SPAN:
                readSpan(p, sp, new URLSpan(p));
                break;
            case BACKGROUND_COLOR_SPAN:
                readSpan(p, sp, new BackgroundColorSpan(p));
                break;
            case TYPEFACE_SPAN:
                readSpan(p, sp, new TypefaceSpan(p));
                break;
            case SUPERSCRIPT_SPAN:
                readSpan(p, sp, new SuperscriptSpan(p));
                break;
            case SUBSCRIPT_SPAN:
                readSpan(p, sp, new SubscriptSpan(p));
                break;
            case ABSOLUTE_SIZE_SPAN:
                readSpan(p, sp, new AbsoluteSizeSpan(p));
                break;
            case TEXT_APPEARANCE_SPAN:
                readSpan(p, sp, new TextAppearanceSpan(p));
                break;
            case ANNOTATION:
                readSpan(p, sp, new Annotation(p));
                break;
            case SUGGESTION_SPAN:
                readSpan(p, sp, new SuggestionSpan(p));
                break;
            case SPELL_CHECK_SPAN:
                readSpan(p, sp, new SpellCheckSpan(p));
                break;
            case SUGGESTION_RANGE_SPAN:
                readSpan(p, sp, new SuggestionRangeSpan(p));
                break;
            case EASY_EDIT_SPAN:
                readSpan(p, sp, new EasyEditSpan(p));
                break;
            case LOCALE_SPAN:
                readSpan(p, sp, new LocaleSpan(p));
                break;
            case TTS_SPAN:
                readSpan(p, sp, new TtsSpan(p));
                break;
            default:
                throw new RuntimeException("bogus span encoding " + kind);
        }
    }
    return sp;
}
Example 53
Project: 920-Text-Editor-master  File: TextUtils.java View source code
/**
         * Read and return a new CharSequence, possibly with styles,
         * from the parcel.
         */
public CharSequence createFromParcel(Parcel p) {
    int kind = p.readInt();
    if (kind == 1)
        return p.readString();
    SpannableString sp = new SpannableString(p.readString());
    while (true) {
        kind = p.readInt();
        if (kind == 0)
            break;
        switch(kind) {
            case ALIGNMENT_SPAN:
                readSpan(p, sp, new AlignmentSpan.Standard(p));
                break;
            case FOREGROUND_COLOR_SPAN:
                readSpan(p, sp, new ForegroundColorSpan(p));
                break;
            case RELATIVE_SIZE_SPAN:
                readSpan(p, sp, new RelativeSizeSpan(p));
                break;
            case SCALE_X_SPAN:
                readSpan(p, sp, new ScaleXSpan(p));
                break;
            case STRIKETHROUGH_SPAN:
                readSpan(p, sp, new StrikethroughSpan(p));
                break;
            case UNDERLINE_SPAN:
                readSpan(p, sp, new UnderlineSpan(p));
                break;
            case STYLE_SPAN:
                readSpan(p, sp, new StyleSpan(p));
                break;
            case BULLET_SPAN:
                readSpan(p, sp, new BulletSpan(p));
                break;
            case QUOTE_SPAN:
                readSpan(p, sp, new QuoteSpan(p));
                break;
            case LEADING_MARGIN_SPAN:
                readSpan(p, sp, new LeadingMarginSpan.Standard(p));
                break;
            case URL_SPAN:
                readSpan(p, sp, new URLSpan(p));
                break;
            case BACKGROUND_COLOR_SPAN:
                readSpan(p, sp, new BackgroundColorSpan(p));
                break;
            case TYPEFACE_SPAN:
                readSpan(p, sp, new TypefaceSpan(p));
                break;
            case SUPERSCRIPT_SPAN:
                readSpan(p, sp, new SuperscriptSpan(p));
                break;
            case SUBSCRIPT_SPAN:
                readSpan(p, sp, new SubscriptSpan(p));
                break;
            case ABSOLUTE_SIZE_SPAN:
                readSpan(p, sp, new AbsoluteSizeSpan(p));
                break;
            case TEXT_APPEARANCE_SPAN:
                readSpan(p, sp, new TextAppearanceSpan(p));
                break;
            case ANNOTATION:
                readSpan(p, sp, new Annotation(p));
                break;
            default:
                throw new RuntimeException("bogus span encoding " + kind);
        }
    }
    return sp;
}
Example 54
Project: android-imf-ext-master  File: TextUtils.java View source code
/**
         * Read and return a new CharSequence, possibly with styles,
         * from the parcel.
         */
public CharSequence createFromParcel(Parcel p) {
    int kind = p.readInt();
    if (kind == 1)
        return p.readString();
    SpannableString sp = new SpannableString(p.readString());
    while (true) {
        kind = p.readInt();
        if (kind == 0)
            break;
        switch(kind) {
            case ALIGNMENT_SPAN:
                readSpan(p, sp, new AlignmentSpan.Standard(p));
                break;
            case FOREGROUND_COLOR_SPAN:
                readSpan(p, sp, new ForegroundColorSpan(p));
                break;
            case RELATIVE_SIZE_SPAN:
                readSpan(p, sp, new RelativeSizeSpan(p));
                break;
            case SCALE_X_SPAN:
                readSpan(p, sp, new ScaleXSpan(p));
                break;
            case STRIKETHROUGH_SPAN:
                readSpan(p, sp, new StrikethroughSpan(p));
                break;
            case UNDERLINE_SPAN:
                readSpan(p, sp, new UnderlineSpan(p));
                break;
            case STYLE_SPAN:
                readSpan(p, sp, new StyleSpan(p));
                break;
            case BULLET_SPAN:
                readSpan(p, sp, new BulletSpan(p));
                break;
            case QUOTE_SPAN:
                readSpan(p, sp, new QuoteSpan(p));
                break;
            case LEADING_MARGIN_SPAN:
                readSpan(p, sp, new LeadingMarginSpan.Standard(p));
                break;
            case URL_SPAN:
                readSpan(p, sp, new URLSpan(p));
                break;
            case BACKGROUND_COLOR_SPAN:
                readSpan(p, sp, new BackgroundColorSpan(p));
                break;
            case TYPEFACE_SPAN:
                readSpan(p, sp, new TypefaceSpan(p));
                break;
            case SUPERSCRIPT_SPAN:
                readSpan(p, sp, new SuperscriptSpan(p));
                break;
            case SUBSCRIPT_SPAN:
                readSpan(p, sp, new SubscriptSpan(p));
                break;
            case ABSOLUTE_SIZE_SPAN:
                readSpan(p, sp, new AbsoluteSizeSpan(p));
                break;
            case TEXT_APPEARANCE_SPAN:
                readSpan(p, sp, new TextAppearanceSpan(p));
                break;
            case ANNOTATION:
                readSpan(p, sp, new Annotation(p));
                break;
            default:
                throw new RuntimeException("bogus span encoding " + kind);
        }
    }
    return sp;
}
Example 55
Project: AndroidUtilCode-master  File: SpannableStringUtils.java View source code
/**
         * 设置样�
         */
private void setSpan() {
    if (text == null || text.length() == 0)
        return;
    int start = mBuilder.length();
    mBuilder.append(this.text);
    int end = mBuilder.length();
    if (backgroundColor != defaultValue) {
        mBuilder.setSpan(new BackgroundColorSpan(backgroundColor), start, end, flag);
        backgroundColor = defaultValue;
    }
    if (foregroundColor != defaultValue) {
        mBuilder.setSpan(new ForegroundColorSpan(foregroundColor), start, end, flag);
        foregroundColor = defaultValue;
    }
    if (isLeadingMargin) {
        mBuilder.setSpan(new LeadingMarginSpan.Standard(first, rest), start, end, flag);
        isLeadingMargin = false;
    }
    if (margin != -1) {
        mBuilder.setSpan(new MarginSpan(margin), start, end, flag);
        margin = -1;
    }
    if (quoteColor != defaultValue) {
        mBuilder.setSpan(new CustomQuoteSpan(quoteColor, stripeWidth, quoteGapWidth), start, end, flag);
        quoteColor = defaultValue;
    }
    if (isBullet) {
        mBuilder.setSpan(new CustomBulletSpan(bulletColor, bulletRadius, bulletGapWidth), start, end, flag);
        isBullet = false;
    }
    if (fontSize != -1) {
        mBuilder.setSpan(new AbsoluteSizeSpan(fontSize, fontSizeIsDp), start, end, flag);
        fontSize = -1;
        fontSizeIsDp = false;
    }
    if (proportion != -1) {
        mBuilder.setSpan(new RelativeSizeSpan(proportion), start, end, flag);
        proportion = -1;
    }
    if (xProportion != -1) {
        mBuilder.setSpan(new ScaleXSpan(xProportion), start, end, flag);
        xProportion = -1;
    }
    if (isStrikethrough) {
        mBuilder.setSpan(new StrikethroughSpan(), start, end, flag);
        isStrikethrough = false;
    }
    if (isUnderline) {
        mBuilder.setSpan(new UnderlineSpan(), start, end, flag);
        isUnderline = false;
    }
    if (isSuperscript) {
        mBuilder.setSpan(new SuperscriptSpan(), start, end, flag);
        isSuperscript = false;
    }
    if (isSubscript) {
        mBuilder.setSpan(new SubscriptSpan(), start, end, flag);
        isSubscript = false;
    }
    if (isBold) {
        mBuilder.setSpan(new StyleSpan(Typeface.BOLD), start, end, flag);
        isBold = false;
    }
    if (isItalic) {
        mBuilder.setSpan(new StyleSpan(Typeface.ITALIC), start, end, flag);
        isItalic = false;
    }
    if (isBoldItalic) {
        mBuilder.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, end, flag);
        isBoldItalic = false;
    }
    if (fontFamily != null) {
        mBuilder.setSpan(new TypefaceSpan(fontFamily), start, end, flag);
        fontFamily = null;
    }
    if (typeface != null) {
        mBuilder.setSpan(new CustomTypefaceSpan(typeface), start, end, flag);
        typeface = null;
    }
    if (alignment != null) {
        mBuilder.setSpan(new AlignmentSpan.Standard(alignment), start, end, flag);
        alignment = null;
    }
    if (imageIsBitmap || imageIsDrawable || imageIsUri || imageIsResourceId) {
        if (imageIsBitmap) {
            mBuilder.setSpan(new CustomImageSpan(Utils.getContext(), bitmap, align), start, end, flag);
            bitmap = null;
            imageIsBitmap = false;
        } else if (imageIsDrawable) {
            mBuilder.setSpan(new CustomImageSpan(drawable, align), start, end, flag);
            drawable = null;
            imageIsDrawable = false;
        } else if (imageIsUri) {
            mBuilder.setSpan(new CustomImageSpan(Utils.getContext(), uri, align), start, end, flag);
            uri = null;
            imageIsUri = false;
        } else {
            mBuilder.setSpan(new CustomImageSpan(Utils.getContext(), resourceId, align), start, end, flag);
            resourceId = 0;
            imageIsResourceId = false;
        }
    }
    if (clickSpan != null) {
        mBuilder.setSpan(clickSpan, start, end, flag);
        clickSpan = null;
    }
    if (url != null) {
        mBuilder.setSpan(new URLSpan(url), start, end, flag);
        url = null;
    }
    if (isBlur) {
        mBuilder.setSpan(new MaskFilterSpan(new BlurMaskFilter(blurRadius, style)), start, end, flag);
        isBlur = false;
    }
    flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
}
Example 56
Project: folio100_frameworks_base-master  File: TextUtils.java View source code
/**
         * Read and return a new CharSequence, possibly with styles,
         * from the parcel.
         */
public CharSequence createFromParcel(Parcel p) {
    int kind = p.readInt();
    if (kind == 1)
        return p.readString();
    SpannableString sp = new SpannableString(p.readString());
    while (true) {
        kind = p.readInt();
        if (kind == 0)
            break;
        switch(kind) {
            case ALIGNMENT_SPAN:
                readSpan(p, sp, new AlignmentSpan.Standard(p));
                break;
            case FOREGROUND_COLOR_SPAN:
                readSpan(p, sp, new ForegroundColorSpan(p));
                break;
            case RELATIVE_SIZE_SPAN:
                readSpan(p, sp, new RelativeSizeSpan(p));
                break;
            case SCALE_X_SPAN:
                readSpan(p, sp, new ScaleXSpan(p));
                break;
            case STRIKETHROUGH_SPAN:
                readSpan(p, sp, new StrikethroughSpan(p));
                break;
            case UNDERLINE_SPAN:
                readSpan(p, sp, new UnderlineSpan(p));
                break;
            case STYLE_SPAN:
                readSpan(p, sp, new StyleSpan(p));
                break;
            case BULLET_SPAN:
                readSpan(p, sp, new BulletSpan(p));
                break;
            case QUOTE_SPAN:
                readSpan(p, sp, new QuoteSpan(p));
                break;
            case LEADING_MARGIN_SPAN:
                readSpan(p, sp, new LeadingMarginSpan.Standard(p));
                break;
            case URL_SPAN:
                readSpan(p, sp, new URLSpan(p));
                break;
            case BACKGROUND_COLOR_SPAN:
                readSpan(p, sp, new BackgroundColorSpan(p));
                break;
            case TYPEFACE_SPAN:
                readSpan(p, sp, new TypefaceSpan(p));
                break;
            case SUPERSCRIPT_SPAN:
                readSpan(p, sp, new SuperscriptSpan(p));
                break;
            case SUBSCRIPT_SPAN:
                readSpan(p, sp, new SubscriptSpan(p));
                break;
            case ABSOLUTE_SIZE_SPAN:
                readSpan(p, sp, new AbsoluteSizeSpan(p));
                break;
            case TEXT_APPEARANCE_SPAN:
                readSpan(p, sp, new TextAppearanceSpan(p));
                break;
            case ANNOTATION:
                readSpan(p, sp, new Annotation(p));
                break;
            default:
                throw new RuntimeException("bogus span encoding " + kind);
        }
    }
    return sp;
}
Example 57
Project: gh4a-master  File: HtmlUtils.java View source code
private static void setSpanFromMark(Spannable text, Object mark, Object... spans) {
    int where = text.getSpanStart(mark);
    text.removeSpan(mark);
    int len = text.length();
    if (where != len) {
        for (Object span : spans) {
            if (span instanceof LeadingMarginSpan) {
                span = new NeedsReversingSpan(span);
            }
            text.setSpan(span, where, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
}
Example 58
Project: legacy-patchrom-master  File: StaticLayout.java View source code
/* package */
void generate(CharSequence source, int bufstart, int bufend, TextPaint paint, int outerwidth, int outerheight, Alignment align, float spacingmult, float spacingadd, boolean includepad, boolean trackpad, boolean breakOnlyAtSpaces, float ellipsizedWidth, TextUtils.TruncateAt where) {
    mLineCount = 0;
    int v = 0;
    boolean needMultiply = (spacingmult != 1 || spacingadd != 0);
    Paint.FontMetricsInt fm = mFontMetricsInt;
    int[] choosehtv = null;
    int end = TextUtils.indexOf(source, '\n', bufstart, bufend);
    int bufsiz = end >= 0 ? end - bufstart : bufend - bufstart;
    boolean first = true;
    if (mChdirs == null) {
        mChdirs = new byte[ArrayUtils.idealByteArraySize(bufsiz + 1)];
        mChs = new char[ArrayUtils.idealCharArraySize(bufsiz + 1)];
        mWidths = new float[ArrayUtils.idealIntArraySize((bufsiz + 1) * 2)];
    }
    byte[] chdirs = mChdirs;
    char[] chs = mChs;
    float[] widths = mWidths;
    AlteredCharSequence alter = null;
    Spanned spanned = null;
    if (source instanceof Spanned)
        spanned = (Spanned) source;
    // XXX
    int DEFAULT_DIR = DIR_LEFT_TO_RIGHT;
    for (int start = bufstart; start <= bufend; start = end) {
        if (first)
            first = false;
        else
            end = TextUtils.indexOf(source, '\n', start, bufend);
        if (end < 0)
            end = bufend;
        else
            end++;
        int firstWidthLineCount = 1;
        int firstwidth = outerwidth;
        int restwidth = outerwidth;
        LineHeightSpan[] chooseht = null;
        if (spanned != null) {
            LeadingMarginSpan[] sp;
            sp = spanned.getSpans(start, end, LeadingMarginSpan.class);
            for (int i = 0; i < sp.length; i++) {
                LeadingMarginSpan lms = sp[i];
                firstwidth -= sp[i].getLeadingMargin(true);
                restwidth -= sp[i].getLeadingMargin(false);
                if (lms instanceof LeadingMarginSpan.LeadingMarginSpan2) {
                    firstWidthLineCount = ((LeadingMarginSpan.LeadingMarginSpan2) lms).getLeadingMarginLineCount();
                }
            }
            chooseht = spanned.getSpans(start, end, LineHeightSpan.class);
            if (chooseht.length != 0) {
                if (choosehtv == null || choosehtv.length < chooseht.length) {
                    choosehtv = new int[ArrayUtils.idealIntArraySize(chooseht.length)];
                }
                for (int i = 0; i < chooseht.length; i++) {
                    int o = spanned.getSpanStart(chooseht[i]);
                    if (o < start) {
                        // starts in this layout, before the
                        // current paragraph
                        choosehtv[i] = getLineTop(getLineForOffset(o));
                    } else {
                        // starts in this paragraph
                        choosehtv[i] = v;
                    }
                }
            }
        }
        if (end - start > chdirs.length) {
            chdirs = new byte[ArrayUtils.idealByteArraySize(end - start)];
            mChdirs = chdirs;
        }
        if (end - start > chs.length) {
            chs = new char[ArrayUtils.idealCharArraySize(end - start)];
            mChs = chs;
        }
        if ((end - start) * 2 > widths.length) {
            widths = new float[ArrayUtils.idealIntArraySize((end - start) * 2)];
            mWidths = widths;
        }
        TextUtils.getChars(source, start, end, chs, 0);
        final int n = end - start;
        boolean easy = true;
        boolean altered = false;
        // XXX
        int dir = DEFAULT_DIR;
        for (int i = 0; i < n; i++) {
            if (chs[i] >= FIRST_RIGHT_TO_LEFT) {
                easy = false;
                break;
            }
        }
        if (source instanceof Spanned) {
            Spanned sp = (Spanned) source;
            ReplacementSpan[] spans = sp.getSpans(start, end, ReplacementSpan.class);
            for (int y = 0; y < spans.length; y++) {
                int a = sp.getSpanStart(spans[y]);
                int b = sp.getSpanEnd(spans[y]);
                for (int x = a; x < b; x++) {
                    chs[x - start] = '';
                }
            }
        }
        if (!easy) {
            // XXX put override flags, etc. into chdirs
            dir = bidi(dir, chs, chdirs, n, false);
            for (int i = 0; i < n; i++) {
                if (chdirs[i] == Character.DIRECTIONALITY_RIGHT_TO_LEFT) {
                    int j;
                    for (j = i; j < n; j++) {
                        if (chdirs[j] != Character.DIRECTIONALITY_RIGHT_TO_LEFT)
                            break;
                    }
                    if (AndroidCharacter.mirror(chs, i, j - i))
                        altered = true;
                    i = j - 1;
                }
            }
        }
        CharSequence sub;
        if (altered) {
            if (alter == null)
                alter = AlteredCharSequence.make(source, chs, start, end);
            else
                alter.update(chs, start, end);
            sub = alter;
        } else {
            sub = source;
        }
        int width = firstwidth;
        float w = 0;
        int here = start;
        int ok = start;
        float okwidth = w;
        int okascent = 0, okdescent = 0, oktop = 0, okbottom = 0;
        int fit = start;
        float fitwidth = w;
        int fitascent = 0, fitdescent = 0, fittop = 0, fitbottom = 0;
        boolean tab = false;
        int next;
        for (int i = start; i < end; i = next) {
            if (spanned == null)
                next = end;
            else
                next = spanned.nextSpanTransition(i, end, MetricAffectingSpan.class);
            if (spanned == null) {
                paint.getTextWidths(sub, i, next, widths);
                System.arraycopy(widths, 0, widths, end - start + (i - start), next - i);
                paint.getFontMetricsInt(fm);
            } else {
                mWorkPaint.baselineShift = 0;
                Styled.getTextWidths(paint, mWorkPaint, spanned, i, next, widths, fm);
                System.arraycopy(widths, 0, widths, end - start + (i - start), next - i);
                if (mWorkPaint.baselineShift < 0) {
                    fm.ascent += mWorkPaint.baselineShift;
                    fm.top += mWorkPaint.baselineShift;
                } else {
                    fm.descent += mWorkPaint.baselineShift;
                    fm.bottom += mWorkPaint.baselineShift;
                }
            }
            int fmtop = fm.top;
            int fmbottom = fm.bottom;
            int fmascent = fm.ascent;
            int fmdescent = fm.descent;
            if (false) {
                StringBuilder sb = new StringBuilder();
                for (int j = i; j < next; j++) {
                    sb.append(widths[j - start + (end - start)]);
                    sb.append(' ');
                }
                Log.e("text", sb.toString());
            }
            for (int j = i; j < next; j++) {
                char c = chs[j - start];
                float before = w;
                if (c == '\n') {
                    ;
                } else if (c == '\t') {
                    w = Layout.nextTab(sub, start, end, w, null);
                    tab = true;
                } else if (EmojiSmileys.isEmoji(c)) {
                    Paint whichPaint;
                    if (spanned == null) {
                        whichPaint = paint;
                    } else {
                        whichPaint = mWorkPaint;
                    }
                    float wid = whichPaint.descent() - whichPaint.ascent() + EMOJI_PADDING_PX * 2;
                    w += wid;
                    tab = true;
                } else {
                    w += widths[j - start + (end - start)];
                }
                if (w <= width) {
                    fitwidth = w;
                    fit = j + 1;
                    if (fmtop < fittop)
                        fittop = fmtop;
                    if (fmascent < fitascent)
                        fitascent = fmascent;
                    if (fmdescent > fitdescent)
                        fitdescent = fmdescent;
                    if (fmbottom > fitbottom)
                        fitbottom = fmbottom;
                    if (c == ' ' || c == '\t' || ((c == '.' || c == ',' || c == ':' || c == ';') && (j - 1 < here || !Character.isDigit(chs[j - 1 - start])) && (j + 1 >= next || !Character.isDigit(chs[j + 1 - start]))) || ((c == '/' || c == '-') && (j + 1 >= next || !Character.isDigit(chs[j + 1 - start]))) || (c >= FIRST_CJK && isIdeographic(c, true) && j + 1 < next && isIdeographic(chs[j + 1 - start], false))) {
                        okwidth = w;
                        ok = j + 1;
                        if (fittop < oktop)
                            oktop = fittop;
                        if (fitascent < okascent)
                            okascent = fitascent;
                        if (fitdescent > okdescent)
                            okdescent = fitdescent;
                        if (fitbottom > okbottom)
                            okbottom = fitbottom;
                    }
                } else if (breakOnlyAtSpaces && where != TextUtils.TruncateAt.END && outerheight == OUTERHEIGHT_INFINITE) {
                    if (ok != here) {
                        while (ok < next && chs[ok - start] == ' ') {
                            ok++;
                        }
                        v = out(source, here, ok, okascent, okdescent, oktop, okbottom, v, spacingmult, spacingadd, chooseht, choosehtv, fm, tab, needMultiply, start, chdirs, dir, easy, ok == bufend, includepad, trackpad, widths, start, end - start, where, ellipsizedWidth, okwidth, paint);
                        here = ok;
                    } else {
                        // Act like it fit even though it didn't.
                        fitwidth = w;
                        fit = j + 1;
                        if (fmtop < fittop)
                            fittop = fmtop;
                        if (fmascent < fitascent)
                            fitascent = fmascent;
                        if (fmdescent > fitdescent)
                            fitdescent = fmdescent;
                        if (fmbottom > fitbottom)
                            fitbottom = fmbottom;
                    }
                } else {
                    if (ok != here) {
                        while (ok < next && chs[ok - start] == ' ') {
                            ok++;
                        }
                        v = out(source, here, ok, okascent, okdescent, oktop, okbottom, v, spacingmult, spacingadd, chooseht, choosehtv, fm, tab, needMultiply, start, chdirs, dir, easy, ok == bufend, includepad, trackpad, widths, start, end - start, where, ellipsizedWidth, okwidth, paint);
                        here = ok;
                    } else if (fit != here) {
                        // Log.e("text", "output fit " + here + " to " +fit);
                        v = out(source, here, fit, fitascent, fitdescent, fittop, fitbottom, v, spacingmult, spacingadd, chooseht, choosehtv, fm, tab, needMultiply, start, chdirs, dir, easy, fit == bufend, includepad, trackpad, widths, start, end - start, where, ellipsizedWidth, fitwidth, paint);
                        here = fit;
                    } else {
                        // Log.e("text", "output one " + here + " to " +(here + 1));
                        measureText(paint, mWorkPaint, source, here, here + 1, fm, tab, null);
                        v = out(source, here, here + 1, fm.ascent, fm.descent, fm.top, fm.bottom, v, spacingmult, spacingadd, chooseht, choosehtv, fm, tab, needMultiply, start, chdirs, dir, easy, here + 1 == bufend, includepad, trackpad, widths, start, end - start, where, ellipsizedWidth, widths[here - start], paint);
                        here = here + 1;
                    }
                    if (here < i) {
                        // must remeasure
                        j = next = here;
                    } else {
                        // continue looping
                        j = here - 1;
                    }
                    ok = fit = here;
                    w = 0;
                    fitascent = fitdescent = fittop = fitbottom = 0;
                    okascent = okdescent = oktop = okbottom = 0;
                    if (--firstWidthLineCount <= 0) {
                        width = restwidth;
                    }
                }
            }
        }
        if (end != here) {
            if ((fittop | fitbottom | fitdescent | fitascent) == 0) {
                paint.getFontMetricsInt(fm);
                fittop = fm.top;
                fitbottom = fm.bottom;
                fitascent = fm.ascent;
                fitdescent = fm.descent;
            }
            // Log.e("text", "output rest " + here + " to " + end);
            v = out(source, here, end, fitascent, fitdescent, fittop, fitbottom, v, spacingmult, spacingadd, chooseht, choosehtv, fm, tab, needMultiply, start, chdirs, dir, easy, end == bufend, includepad, trackpad, widths, start, end - start, where, ellipsizedWidth, w, paint);
        }
        start = end;
        if (end == bufend)
            break;
    }
    if (bufend == bufstart || source.charAt(bufend - 1) == '\n') {
        // Log.e("text", "output last " + bufend);
        paint.getFontMetricsInt(fm);
        v = out(source, bufend, bufend, fm.ascent, fm.descent, fm.top, fm.bottom, v, spacingmult, spacingadd, null, null, fm, false, needMultiply, bufend, chdirs, DEFAULT_DIR, true, true, includepad, trackpad, widths, bufstart, 0, where, ellipsizedWidth, 0, paint);
    }
}
Example 59
Project: platform_sdk-master  File: ApiDetectorTest.java View source code
public void testInnerClassPositions() throws Exception {
    // See http://code.google.com/p/android/issues/detail?id=38113
    assertEquals("src/test/pkg/ApiCallTest8.java:8: Error: Class requires API level 8 (current min is 4): android.text.style.LeadingMarginSpan.LeadingMarginSpan2 [NewApi]\n" + "        LeadingMarginSpan.LeadingMarginSpan2 span = null;        \n" + "                          ~~~~~~~~~~~~~~~~~~\n" + "1 errors, 0 warnings\n", lintProject("apicheck/classpath=>.classpath", "apicheck/minsdk4.xml=>AndroidManifest.xml", "apicheck/ApiCallTest8.java.txt=>src/test/pkg/ApiCallTest8.java", "apicheck/ApiCallTest8.class.data=>bin/classes/test/pkg/ApiCallTest8.class"));
}
Example 60
Project: SPD8810GA-master  File: MessageListItem.java View source code
@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    //        mMsgListItem = this;
    //        = findViewById(R.id.msg_list_item);
    mBodyTextView = (TextView) findViewById(R.id.text_view);
    mDownloadLimitText = (TextView) findViewById(R.id.download_beyond_limit_warnning);
    mLockedIndicator = (ImageView) findViewById(R.id.locked_indicator);
    mDeliveredIndicator = (ImageView) findViewById(R.id.delivered_indicator);
    mDetailsIndicator = (ImageView) findViewById(R.id.details_indicator);
    mSimIndicator = (ImageView) findViewById(R.id.sim_indicator);
    mWarningDownloadIndicator = (ImageView) findViewById(R.id.not_allow_download);
    mAvatar = (QuickContactBadge) findViewById(R.id.avatar);
    mAvatar.setVisibility(View.GONE);
    ViewGroup.MarginLayoutParams badgeParams = (MarginLayoutParams) mAvatar.getLayoutParams();
    //liaobz hide the avatar
    //badgeParams.width + badgeParams.rightMargin + badgeParams.leftMargin;
    final int badgeWidth = 0;
    int lineHeight = mBodyTextView.getLineHeight();
    int effectiveBadgeHeight = badgeParams.height + badgeParams.topMargin - mBodyTextView.getPaddingTop();
    final int indentLineCount = (int) ((effectiveBadgeHeight - 1) / lineHeight) + 1;
    mLeadingMarginSpan = new LeadingMarginSpan.LeadingMarginSpan2() {

        public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom, CharSequence text, int start, int end, boolean first, Layout layout) {
        // no op
        }

        public int getLeadingMargin(boolean first) {
            return first ? badgeWidth : 0;
        }

        public int getLeadingMarginLineCount() {
            //via liaobz 图片挤压效果影�行数
            return 1;
        }
    };
}
Example 61
Project: Sun-master  File: SpannableStringUtils.java View source code
/**
         * 设置样�
         */
private void setSpan() {
    if (text == null || text.length() == 0)
        return;
    int start = mBuilder.length();
    mBuilder.append(this.text);
    int end = mBuilder.length();
    if (backgroundColor != defaultValue) {
        mBuilder.setSpan(new BackgroundColorSpan(backgroundColor), start, end, flag);
        backgroundColor = defaultValue;
    }
    if (foregroundColor != defaultValue) {
        mBuilder.setSpan(new ForegroundColorSpan(foregroundColor), start, end, flag);
        foregroundColor = defaultValue;
    }
    if (isLeadingMargin) {
        mBuilder.setSpan(new LeadingMarginSpan.Standard(first, rest), start, end, flag);
        isLeadingMargin = false;
    }
    if (margin != -1) {
        mBuilder.setSpan(new MarginSpan(margin), start, end, flag);
        margin = -1;
    }
    if (quoteColor != defaultValue) {
        mBuilder.setSpan(new CustomQuoteSpan(quoteColor, stripeWidth, quoteGapWidth), start, end, flag);
        quoteColor = defaultValue;
    }
    if (isBullet) {
        mBuilder.setSpan(new CustomBulletSpan(bulletColor, bulletRadius, bulletGapWidth), start, end, flag);
        isBullet = false;
    }
    if (fontSize != -1) {
        mBuilder.setSpan(new AbsoluteSizeSpan(fontSize, fontSizeIsDp), start, end, flag);
        fontSize = -1;
        fontSizeIsDp = false;
    }
    if (proportion != -1) {
        mBuilder.setSpan(new RelativeSizeSpan(proportion), start, end, flag);
        proportion = -1;
    }
    if (xProportion != -1) {
        mBuilder.setSpan(new ScaleXSpan(xProportion), start, end, flag);
        xProportion = -1;
    }
    if (isStrikethrough) {
        mBuilder.setSpan(new StrikethroughSpan(), start, end, flag);
        isStrikethrough = false;
    }
    if (isUnderline) {
        mBuilder.setSpan(new UnderlineSpan(), start, end, flag);
        isUnderline = false;
    }
    if (isSuperscript) {
        mBuilder.setSpan(new SuperscriptSpan(), start, end, flag);
        isSuperscript = false;
    }
    if (isSubscript) {
        mBuilder.setSpan(new SubscriptSpan(), start, end, flag);
        isSubscript = false;
    }
    if (isBold) {
        mBuilder.setSpan(new StyleSpan(Typeface.BOLD), start, end, flag);
        isBold = false;
    }
    if (isItalic) {
        mBuilder.setSpan(new StyleSpan(Typeface.ITALIC), start, end, flag);
        isItalic = false;
    }
    if (isBoldItalic) {
        mBuilder.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, end, flag);
        isBoldItalic = false;
    }
    if (fontFamily != null) {
        mBuilder.setSpan(new TypefaceSpan(fontFamily), start, end, flag);
        fontFamily = null;
    }
    if (typeface != null) {
        mBuilder.setSpan(new CustomTypefaceSpan(typeface), start, end, flag);
        typeface = null;
    }
    if (alignment != null) {
        mBuilder.setSpan(new AlignmentSpan.Standard(alignment), start, end, flag);
        alignment = null;
    }
    if (imageIsBitmap || imageIsDrawable || imageIsUri || imageIsResourceId) {
        if (imageIsBitmap) {
            mBuilder.setSpan(new CustomImageSpan(Utils.getContext(), bitmap, align), start, end, flag);
            bitmap = null;
            imageIsBitmap = false;
        } else if (imageIsDrawable) {
            mBuilder.setSpan(new CustomImageSpan(drawable, align), start, end, flag);
            drawable = null;
            imageIsDrawable = false;
        } else if (imageIsUri) {
            mBuilder.setSpan(new CustomImageSpan(Utils.getContext(), uri, align), start, end, flag);
            uri = null;
            imageIsUri = false;
        } else {
            mBuilder.setSpan(new CustomImageSpan(Utils.getContext(), resourceId, align), start, end, flag);
            resourceId = 0;
            imageIsResourceId = false;
        }
    }
    if (clickSpan != null) {
        mBuilder.setSpan(clickSpan, start, end, flag);
        clickSpan = null;
    }
    if (url != null) {
        mBuilder.setSpan(new URLSpan(url), start, end, flag);
        url = null;
    }
    if (isBlur) {
        mBuilder.setSpan(new MaskFilterSpan(new BlurMaskFilter(blurRadius, style)), start, end, flag);
        isBlur = false;
    }
    flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
}
Example 62
Project: WS171-frameworks-base-master  File: TextUtils.java View source code
/**
         * Read and return a new CharSequence, possibly with styles,
         * from the parcel.
         */
public CharSequence createFromParcel(Parcel p) {
    int kind = p.readInt();
    if (kind == 1)
        return p.readString();
    SpannableString sp = new SpannableString(p.readString());
    while (true) {
        kind = p.readInt();
        if (kind == 0)
            break;
        switch(kind) {
            case ALIGNMENT_SPAN:
                readSpan(p, sp, new AlignmentSpan.Standard(p));
                break;
            case FOREGROUND_COLOR_SPAN:
                readSpan(p, sp, new ForegroundColorSpan(p));
                break;
            case RELATIVE_SIZE_SPAN:
                readSpan(p, sp, new RelativeSizeSpan(p));
                break;
            case SCALE_X_SPAN:
                readSpan(p, sp, new ScaleXSpan(p));
                break;
            case STRIKETHROUGH_SPAN:
                readSpan(p, sp, new StrikethroughSpan(p));
                break;
            case UNDERLINE_SPAN:
                readSpan(p, sp, new UnderlineSpan(p));
                break;
            case STYLE_SPAN:
                readSpan(p, sp, new StyleSpan(p));
                break;
            case BULLET_SPAN:
                readSpan(p, sp, new BulletSpan(p));
                break;
            case QUOTE_SPAN:
                readSpan(p, sp, new QuoteSpan(p));
                break;
            case LEADING_MARGIN_SPAN:
                readSpan(p, sp, new LeadingMarginSpan.Standard(p));
                break;
            case URL_SPAN:
                readSpan(p, sp, new URLSpan(p));
                break;
            case BACKGROUND_COLOR_SPAN:
                readSpan(p, sp, new BackgroundColorSpan(p));
                break;
            case TYPEFACE_SPAN:
                readSpan(p, sp, new TypefaceSpan(p));
                break;
            case SUPERSCRIPT_SPAN:
                readSpan(p, sp, new SuperscriptSpan(p));
                break;
            case SUBSCRIPT_SPAN:
                readSpan(p, sp, new SubscriptSpan(p));
                break;
            case ABSOLUTE_SIZE_SPAN:
                readSpan(p, sp, new AbsoluteSizeSpan(p));
                break;
            case TEXT_APPEARANCE_SPAN:
                readSpan(p, sp, new TextAppearanceSpan(p));
                break;
            case ANNOTATION:
                readSpan(p, sp, new Annotation(p));
                break;
            default:
                throw new RuntimeException("bogus span encoding " + kind);
        }
    }
    return sp;
}
Example 63
Project: chessonline-master  File: DroidFish.java View source code
private final void newLine(boolean eof) {
    if (!col0) {
        if (paraIndent > 0) {
            int paraEnd = sb.length();
            int indent = paraIndent * indentStep;
            sb.setSpan(new LeadingMarginSpan.Standard(indent), paraStart, paraEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        if (paraBold) {
            int paraEnd = sb.length();
            sb.setSpan(new StyleSpan(Typeface.BOLD), paraStart, paraEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        if (!eof)
            sb.append('\n');
        paraStart = sb.length();
        paraIndent = nestLevel;
        paraBold = false;
    }
    col0 = true;
}
Example 64
Project: CuckooChess-master  File: DroidFish.java View source code
private final void newLine(boolean eof) {
    if (!col0) {
        if (paraIndent > 0) {
            int paraEnd = sb.length();
            int indent = paraIndent * indentStep;
            sb.setSpan(new LeadingMarginSpan.Standard(indent), paraStart, paraEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        if (paraBold) {
            int paraEnd = sb.length();
            sb.setSpan(new StyleSpan(Typeface.BOLD), paraStart, paraEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        if (!eof)
            sb.append('\n');
        paraStart = sb.length();
        paraIndent = nestLevel;
        paraBold = false;
    }
    col0 = true;
}
Example 65
Project: droidfish-master  File: DroidFish.java View source code
private final void newLine(boolean eof) {
    if (!col0) {
        if (paraIndent > 0) {
            int paraEnd = sb.length();
            int indent = paraIndent * indentStep;
            sb.setSpan(new LeadingMarginSpan.Standard(indent), paraStart, paraEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        if (paraBold) {
            int paraEnd = sb.length();
            sb.setSpan(new StyleSpan(Typeface.BOLD), paraStart, paraEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        if (!eof)
            sb.append('\n');
        paraStart = sb.length();
        paraIndent = nestLevel;
        paraBold = false;
    }
    col0 = true;
}
Example 66
Project: droidfishchess_android-master  File: DroidFish.java View source code
private final void newLine(boolean eof) {
    if (!col0) {
        if (paraIndent > 0) {
            int paraEnd = sb.length();
            int indent = paraIndent * indentStep;
            sb.setSpan(new LeadingMarginSpan.Standard(indent), paraStart, paraEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        if (paraBold) {
            int paraEnd = sb.length();
            sb.setSpan(new StyleSpan(Typeface.BOLD), paraStart, paraEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        if (!eof)
            sb.append('\n');
        paraStart = sb.length();
        paraIndent = nestLevel;
        paraBold = false;
    }
    col0 = true;
}
Example 67
Project: stockfishchess-android-master  File: DroidFish.java View source code
private final void newLine(boolean eof) {
    if (!col0) {
        if (paraIndent > 0) {
            int paraEnd = sb.length();
            int indent = paraIndent * indentStep;
            sb.setSpan(new LeadingMarginSpan.Standard(indent), paraStart, paraEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        if (paraBold) {
            int paraEnd = sb.length();
            sb.setSpan(new StyleSpan(Typeface.BOLD), paraStart, paraEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        if (!eof)
            sb.append('\n');
        paraStart = sb.length();
        paraIndent = nestLevel;
        paraBold = false;
    }
    col0 = true;
}
Example 68
Project: dante-master  File: LeadingMarginSpanListener.java View source code
@Override
protected Object getStyleSpan() {
    return new LeadingMarginSpan.Standard(margin, 0);
}
Example 69
Project: FastHub-master  File: MarginHandler.java View source code
public void handleTagNode(TagNode node, SpannableStringBuilder builder, int start, int end) {
    builder.setSpan(new LeadingMarginSpan.Standard(30), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    this.appendNewLine(builder);
    this.appendNewLine(builder);
}