LeadingMarginSpan.java revision 4037d51b132a85dcfe37a95f9d2d91ad23d162fd
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.text.style;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
204037d51b132a85dcfe37a95f9d2d91ad23d162fdAurimas Liutikasimport android.graphics.Paint;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.Layout;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.ParcelableSpan;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2671b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt/**
2771b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt * A paragraph style affecting the leading margin. There can be multiple leading
2871b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt * margin spans on a single paragraph; they will be rendered in order, each
2971b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt * adding its margin to the ones before it. The leading margin is on the right
3071b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt * for lines in a right-to-left paragraph.
31ab08c6d38ab2e575f809ca8ce4c7f095e49d258cAnish Athalye * <p>
32ab08c6d38ab2e575f809ca8ce4c7f095e49d258cAnish Athalye * LeadingMarginSpans should be attached from the first character to the last
33ab08c6d38ab2e575f809ca8ce4c7f095e49d258cAnish Athalye * character of a single paragraph.
3471b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic interface LeadingMarginSpan
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextends ParagraphStyle
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3871b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt    /**
3971b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * Returns the amount by which to adjust the leading margin. Positive values
4071b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * move away from the leading edge of the paragraph, negative values move
4171b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * towards it.
424037d51b132a85dcfe37a95f9d2d91ad23d162fdAurimas Liutikas     *
4371b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * @param first true if the request is for the first line of a paragraph,
4471b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * false for subsequent lines
4571b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * @return the offset for the margin.
4671b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     */
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getLeadingMargin(boolean first);
4871b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt
4971b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt    /**
5071b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * Renders the leading margin.  This is called before the margin has been
517951eaa92a962e39ebba0366fdcafc4a0a78cc98Kenny Root     * adjusted by the value returned by {@link #getLeadingMargin(boolean)}.
524037d51b132a85dcfe37a95f9d2d91ad23d162fdAurimas Liutikas     *
5371b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * @param c the canvas
5471b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * @param p the paint. The this should be left unchanged on exit.
5571b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * @param x the current position of the margin
5671b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * @param dir the base direction of the paragraph; if negative, the margin
5771b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * is to the right of the text, otherwise it is to the left.
5871b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * @param top the top of the line
5971b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * @param baseline the baseline of the line
6071b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * @param bottom the bottom of the line
6171b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * @param text the text
6271b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * @param start the start of the line
6371b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * @param end the end of the line
6471b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * @param first true if this is the first line of its paragraph
6571b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * @param layout the layout containing this line
6671b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     */
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void drawLeadingMargin(Canvas c, Paint p,
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  int x, int dir,
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  int top, int baseline, int bottom,
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  CharSequence text, int start, int end,
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  boolean first, Layout layout);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
737b5676e4d40a09ccdbc8b6f691a3d8be23e480d3Mark Wagner
74ec8b1021906f77c47a772da5ca5641836361513dEric Fischer    /**
75ab08c6d38ab2e575f809ca8ce4c7f095e49d258cAnish Athalye     * An extended version of {@link LeadingMarginSpan}, which allows the
76ab08c6d38ab2e575f809ca8ce4c7f095e49d258cAnish Athalye     * implementor to specify the number of lines of the paragraph to which
77ab08c6d38ab2e575f809ca8ce4c7f095e49d258cAnish Athalye     * this object is attached that the "first line of paragraph" margin width
78ab08c6d38ab2e575f809ca8ce4c7f095e49d258cAnish Athalye     * will be applied to.
79ab08c6d38ab2e575f809ca8ce4c7f095e49d258cAnish Athalye     * <p>
80ab08c6d38ab2e575f809ca8ce4c7f095e49d258cAnish Athalye     * There should only be one LeadingMarginSpan2 per paragraph. The leading
81ab08c6d38ab2e575f809ca8ce4c7f095e49d258cAnish Athalye     * margin line count affects all LeadingMarginSpans in the paragraph,
82ab08c6d38ab2e575f809ca8ce4c7f095e49d258cAnish Athalye     * adjusting the number of lines to which the first line margin is applied.
83ab08c6d38ab2e575f809ca8ce4c7f095e49d258cAnish Athalye     * <p>
84ab08c6d38ab2e575f809ca8ce4c7f095e49d258cAnish Athalye     * As with LeadingMarginSpans, LeadingMarginSpan2s should be attached from
85ab08c6d38ab2e575f809ca8ce4c7f095e49d258cAnish Athalye     * the beginning to the end of a paragraph.
86ec8b1021906f77c47a772da5ca5641836361513dEric Fischer     */
877b5676e4d40a09ccdbc8b6f691a3d8be23e480d3Mark Wagner    public interface LeadingMarginSpan2 extends LeadingMarginSpan, WrapTogetherSpan {
88ec8b1021906f77c47a772da5ca5641836361513dEric Fischer        /**
89ab08c6d38ab2e575f809ca8ce4c7f095e49d258cAnish Athalye         * Returns the number of lines of the paragraph to which this object is
90ec8b1021906f77c47a772da5ca5641836361513dEric Fischer         * attached that the "first line" margin will apply to.
91ec8b1021906f77c47a772da5ca5641836361513dEric Fischer         */
927b5676e4d40a09ccdbc8b6f691a3d8be23e480d3Mark Wagner        public int getLeadingMarginLineCount();
937b5676e4d40a09ccdbc8b6f691a3d8be23e480d3Mark Wagner    };
947b5676e4d40a09ccdbc8b6f691a3d8be23e480d3Mark Wagner
9571b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt    /**
9671b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * The standard implementation of LeadingMarginSpan, which adjusts the
9771b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     * margin but does not do any rendering.
9871b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt     */
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Standard implements LeadingMarginSpan, ParcelableSpan {
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final int mFirst, mRest;
1014037d51b132a85dcfe37a95f9d2d91ad23d162fdAurimas Liutikas
10271b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt        /**
10371b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt         * Constructor taking separate indents for the first and subsequent
10471b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt         * lines.
1054037d51b132a85dcfe37a95f9d2d91ad23d162fdAurimas Liutikas         *
10671b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt         * @param first the indent for the first line of the paragraph
10771b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt         * @param rest the indent for the remaining lines of the paragraph
10871b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt         */
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Standard(int first, int rest) {
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFirst = first;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRest = rest;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11471b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt        /**
11571b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt         * Constructor taking an indent for all lines.
11671b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt         * @param every the indent of each line
11771b8dd71e49016e057c46a257f79162d186a3c3aDoug Felt         */
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Standard(int every) {
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this(every, every);
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Standard(Parcel src) {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFirst = src.readInt();
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRest = src.readInt();
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1264037d51b132a85dcfe37a95f9d2d91ad23d162fdAurimas Liutikas
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getSpanTypeId() {
128a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette        return getSpanTypeIdInternal();
129a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette    }
130a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette
131a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette    /** @hide */
132a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette    public int getSpanTypeIdInternal() {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return TextUtils.LEADING_MARGIN_SPAN;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1354037d51b132a85dcfe37a95f9d2d91ad23d162fdAurimas Liutikas
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int describeContents() {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel dest, int flags) {
141a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette            writeToParcelInternal(dest, flags);
142a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette        }
143a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette
144a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette        /** @hide */
145a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette        public void writeToParcelInternal(Parcel dest, int flags) {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(mFirst);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(mRest);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getLeadingMargin(boolean first) {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return first ? mFirst : mRest;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void drawLeadingMargin(Canvas c, Paint p,
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      int x, int dir,
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      int top, int baseline, int bottom,
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      CharSequence text, int start, int end,
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                      boolean first, Layout layout) {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
163