/* * Copyright (C) 2010- Peer internet solutions * * This file is part of mixare. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/> */ package org.mixare.lib.gui; import java.text.BreakIterator; import java.util.ArrayList; import java.util.Arrays; import android.graphics.Color; import android.os.Parcel; import android.os.Parcelable; /** * This class stores the properties of the displayed text and uses the * PaintScreen class to actually draw the text. */ public class TextObj implements ScreenObj, Parcelable{ String txt; float fontSize; float width, height; float areaWidth, areaHeight; String lines[]; float lineWidths[]; float lineHeight; float maxLineWidth; float pad; int borderColor, bgColor, textColor, textShadowColor; boolean underline; public TextObj(String txtInit, float fontSizeInit, float maxWidth, PaintScreen dw, boolean underline) { this(txtInit, fontSizeInit, maxWidth, Color.rgb(255, 255, 255), Color .argb(128, 0, 0, 0), Color.rgb(255, 255, 255), Color.argb(64, 0, 0, 0), dw.getTextAsc() / 2, dw, underline); } public TextObj(String txtInit, float fontSizeInit, float maxWidth, int borderColor, int bgColor, int textColor, int textShadowColor, float pad, PaintScreen dw, boolean underline) { this.borderColor = borderColor; this.bgColor = bgColor; this.textColor = textColor; this.textShadowColor = textShadowColor; this.pad = pad; this.underline = underline; try { prepTxt(txtInit, fontSizeInit, maxWidth, dw); } catch (Exception ex) { ex.printStackTrace(); prepTxt("TEXT PARSE ERROR", 12, 200, dw); } } public static final Parcelable.Creator<TextObj> CREATOR = new Parcelable.Creator<TextObj>() { public TextObj createFromParcel(Parcel in) { return new TextObj(in); } public TextObj[] newArray(int size) { return new TextObj[size]; } }; public TextObj(Parcel in){ readParcel(in); } private void prepTxt(String txtInit, float fontSizeInit, float maxWidth, PaintScreen dw) { dw.setFontSize(fontSizeInit); txt = txtInit; fontSize = fontSizeInit; areaWidth = maxWidth - pad * 2; lineHeight = dw.getTextAsc() + dw.getTextDesc() + dw.getTextLead(); ArrayList<String> lineList = new ArrayList<String>(); BreakIterator boundary = BreakIterator.getWordInstance(); boundary.setText(txt); int start = boundary.first(); int end = boundary.next(); int prevEnd = start; while (end != BreakIterator.DONE) { String line = txt.substring(start, end); String prevLine = txt.substring(start, prevEnd); float lineWidth = dw.getTextWidth(line); if (lineWidth > areaWidth) { // If the first word is longer than lineWidth // prevLine is empty and should be ignored if(prevLine.length()>0) lineList.add(prevLine); start = prevEnd; } prevEnd = end; end = boundary.next(); } String line = txt.substring(start, prevEnd); lineList.add(line); lines = new String[lineList.size()]; lineWidths = new float[lineList.size()]; lineList.toArray(lines); maxLineWidth = 0; for (int i = 0; i < lines.length; i++) { lineWidths[i] = dw.getTextWidth(lines[i]); if (maxLineWidth < lineWidths[i]) maxLineWidth = lineWidths[i]; } areaWidth = maxLineWidth; areaHeight = lineHeight * lines.length; width = areaWidth + pad * 2; height = areaHeight + pad * 2; } public void paint(PaintScreen dw) { dw.setFontSize(fontSize); dw.setFill(true); dw.setColor(bgColor); dw.paintRect(0, 0, width, height); dw.setFill(false); dw.setColor(borderColor); dw.paintRect(0, 0, width, height); for (int i = 0; i < lines.length; i++) { String line = lines[i]; // stroke /* dw.setFill(false); dw.setStrokeWidth(4); dw.setColor(textShadowColor); dw.paintText(pad, pad + lineHeight * i + dw.getTextAsc(), line); */ // actual text dw.setFill(true); dw.setStrokeWidth(0); dw.setColor(textColor); dw.paintText(pad, pad + lineHeight * i + dw.getTextAsc(), line, underline); } } public float getWidth() { return width; } public float getHeight() { return height; } public void setBorderColor(int c){ this.borderColor=c; } public void setBgColor(int c){ this.bgColor=c; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(txt); dest.writeFloat(fontSize); dest.writeFloat(width); dest.writeFloat(height); dest.writeFloat(areaWidth); dest.writeFloat(areaHeight); dest.writeList(Arrays.asList(lines)); dest.writeList(Arrays.asList(lineWidths)); dest.writeFloat(lineHeight); dest.writeFloat(maxLineWidth); dest.writeFloat(pad); dest.writeInt(borderColor); dest.writeInt(bgColor); dest.writeInt(textColor); dest.writeInt(textShadowColor); dest.writeString(String.valueOf(underline)); } public void readParcel(Parcel in){ txt = in.readString(); fontSize = in.readFloat(); width = in.readFloat(); height = in.readFloat(); areaWidth = in.readFloat(); areaHeight = in.readFloat(); lines = in.createStringArray(); lineWidths = in.createFloatArray(); lineHeight = in.readFloat(); maxLineWidth = in.readFloat(); pad = in.readFloat(); borderColor = in.readInt(); bgColor = in.readInt(); textColor = in.readInt(); textShadowColor = in.readInt(); underline = Boolean.getBoolean(in.readString()); } }