/* * Copyright (C) 2015-2017 Emanuel Moecklin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.onegravity.rteditor.effects; import com.onegravity.rteditor.RTEditText; import com.onegravity.rteditor.fonts.RTTypeface; import com.onegravity.rteditor.spans.AbsoluteSizeSpan; import com.onegravity.rteditor.spans.BackgroundColorSpan; import com.onegravity.rteditor.spans.BoldSpan; import com.onegravity.rteditor.spans.ForegroundColorSpan; import com.onegravity.rteditor.spans.ItalicSpan; import com.onegravity.rteditor.spans.LinkSpan; import com.onegravity.rteditor.spans.StrikethroughSpan; import com.onegravity.rteditor.spans.SubscriptSpan; import com.onegravity.rteditor.spans.SuperscriptSpan; import com.onegravity.rteditor.spans.TypefaceSpan; import com.onegravity.rteditor.spans.UnderlineSpan; import java.util.ArrayList; public class Effects { // character effects public static final Effect<Boolean, BoldSpan> BOLD = new BoldEffect(); // boolean effect public static final Effect<Boolean, ItalicSpan> ITALIC = new ItalicEffect(); // boolean effect public static final Effect<Boolean, UnderlineSpan> UNDERLINE = new UnderlineEffect(); // boolean effect public static final Effect<Boolean, StrikethroughSpan> STRIKETHROUGH = new StrikethroughEffect(); // boolean effect public static final Effect<Boolean, SuperscriptSpan> SUPERSCRIPT = new SuperscriptEffect(); // boolean effect public static final Effect<Boolean, SubscriptSpan> SUBSCRIPT = new SubscriptEffect(); // boolean effect public static final Effect<Integer, AbsoluteSizeSpan> FONTSIZE = new AbsoluteSizeEffect(); // non-boolean effect public static final Effect<Integer, ForegroundColorSpan> FONTCOLOR = new ForegroundColorEffect(); // non-boolean effect public static final Effect<Integer, BackgroundColorSpan> BGCOLOR = new BackgroundColorEffect(); // non-boolean effect public static final Effect<RTTypeface, TypefaceSpan> TYPEFACE = new TypefaceEffect(); // non-boolean effect public static final Effect<String, LinkSpan> LINK = new LinkEffect(); // non-boolean effect // paragraph effects public static final BulletEffect BULLET = new BulletEffect(); // boolean effect public static final NumberEffect NUMBER = new NumberEffect(); // boolean effect public static final IndentationEffect INDENTATION = new IndentationEffect(); // non-boolean effect public static final AlignmentEffect ALIGNMENT = new AlignmentEffect(); // non-boolean effect /* * ALL_EFFECTS is a list of all defined effects, for simpler iteration over all effects. */ public static final ArrayList<Effect> ALL_EFFECTS = new ArrayList<Effect>(); static { // character effects ALL_EFFECTS.add(BOLD); ALL_EFFECTS.add(ITALIC); ALL_EFFECTS.add(UNDERLINE); ALL_EFFECTS.add(STRIKETHROUGH); ALL_EFFECTS.add(SUPERSCRIPT); ALL_EFFECTS.add(SUBSCRIPT); ALL_EFFECTS.add(FONTSIZE); ALL_EFFECTS.add(FONTCOLOR); ALL_EFFECTS.add(BGCOLOR); ALL_EFFECTS.add(TYPEFACE); ALL_EFFECTS.add(LINK); // paragraph effects ALL_EFFECTS.add(BULLET); ALL_EFFECTS.add(NUMBER); ALL_EFFECTS.add(INDENTATION); ALL_EFFECTS.add(ALIGNMENT); } /* * FORMATTING_EFFECTS is a list of all effects which will be removed when the formatting is removed from the text. */ public static final ArrayList<Effect> FORMATTING_EFFECTS = new ArrayList<Effect>(); static { // character effects FORMATTING_EFFECTS.add(BOLD); FORMATTING_EFFECTS.add(ITALIC); FORMATTING_EFFECTS.add(UNDERLINE); FORMATTING_EFFECTS.add(STRIKETHROUGH); FORMATTING_EFFECTS.add(SUPERSCRIPT); FORMATTING_EFFECTS.add(SUBSCRIPT); FORMATTING_EFFECTS.add(FONTSIZE); FORMATTING_EFFECTS.add(FONTCOLOR); FORMATTING_EFFECTS.add(BGCOLOR); FORMATTING_EFFECTS.add(TYPEFACE); FORMATTING_EFFECTS.add(LINK); // paragraph effects FORMATTING_EFFECTS.add(BULLET); FORMATTING_EFFECTS.add(NUMBER); FORMATTING_EFFECTS.add(INDENTATION); FORMATTING_EFFECTS.add(ALIGNMENT); } /** * This important method makes sure that all paragraph effects are applied to whole paragraphs. * While it's optimized for performance it's still an expensive operation so it shouldn't be * called too often. * * @param exclude if an Effect has just been applied, there's no need to cleanup that Effect. */ public static void cleanupParagraphs(RTEditText editor, Effect...exclude) { cleanupParagraphs(editor, Effects.ALIGNMENT, exclude); cleanupParagraphs(editor, Effects.INDENTATION, exclude); cleanupParagraphs(editor, Effects.BULLET, exclude); cleanupParagraphs(editor, Effects.NUMBER, exclude); } private static void cleanupParagraphs(RTEditText editor, ParagraphEffect effect, Effect...exclude) { for (Effect e : exclude) { if (effect == e) { return; } } effect.applyToSelection(editor, null, null); } }