/*
* Copyright (C) 2012 Sony Mobile Communications AB
*
* This file is part of ApkAnalyser.
*
* 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 analyser.gui;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import javax.swing.text.Document;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
public class LineBuilder {
ArrayList<LineEntry> lines = new ArrayList<LineEntry>();
LineEntry line = new LineEntry();
int curLine = 0;
public void newLine() {
line = new LineEntry();
lines.add(line);
curLine = lines.size() - 1;
}
public int lineCount() {
return lines.size();
}
public void gotoLine(int lineNbr) {
line = lines.get(lineNbr);
curLine = lineNbr;
}
public void gotoLastLine() {
gotoLine(lines.size() - 1);
}
public void insertLineBefore(int lineNbr) {
line = new LineEntry();
lines.add(lineNbr, line);
curLine = lineNbr;
}
public void insertLineAfter(int lineNbr) {
insertLineBefore(lineNbr + 1);
}
public void insertBefore(int lineNbr, LineBuilder lb) {
for (int i = lb.lineCount() - 1; i >= 0; i--) {
LineEntry entry = lb.lines.get(i);
lines.add(lineNbr, entry);
}
}
public void insertAfter(int lineNbr, LineBuilder lb) {
// TODO
insertBefore(lineNbr + 1, lb);
}
public void removeLine(int lineNbr) {
lines.remove(lineNbr);
if (curLine >= lineNbr) {
curLine--;
}
if (curLine == lineNbr) {
line = null;
}
}
public String currentLineString() {
return line.toString();
}
public int currentLine() {
return curLine;
}
public String toString(String EOL) {
StringBuffer res = new StringBuffer();
for (int i = 0; i < lines.size(); i++) {
res.append(lines.get(i));
res.append(EOL);
}
return res.toString();
}
@Override
public String toString() {
return toString("\n");
}
public void toDocument(Document doc) {
try {
SimpleAttributeSet set = new SimpleAttributeSet();
StyleConstants.setFontFamily(set, "Courier");
for (int i = 0; i < lines.size(); i++) {
LineEntry line = lines.get(i);
if (line.colorDefs.isEmpty()) {
doc.insertString(doc.getLength(), line.toString(), set);
} else {
int offset = 0;
for (int j = 0; j < line.colorDefs.size(); j++) {
LineEntry.ColorEntry colDef = line.colorDefs.get(j);
int nextPos;
if (j < line.colorDefs.size() - 1) {
nextPos = (line.colorDefs.get(j + 1)).pos;
} else {
nextPos = line.buffer.length();
}
int rgb = colDef.rgb;
StyleConstants.setForeground(set, new Color(rgb));
doc.insertString(doc.getLength(), line.buffer.substring(offset, nextPos), set);
offset = nextPos;
}
}
doc.insertString(doc.getLength(), "\n", set);
}
} catch (Throwable t) {
}
}
public void setReference(int lineNbr, Object reference) {
LineEntry le = lines.get(lineNbr);
le.setReference(reference);
}
public void setReferenceToCurrent(Object reference) {
setReference(curLine, reference);
}
public int getLine(Object reference) {
for (int i = 0; i < lines.size(); i++) {
LineEntry le = lines.get(i);
if (reference.equals(le.getReference())) {
return i;
}
}
return -1;
}
public Object getReference(int line) {
if (line >= lines.size()) {
return null;
}
LineEntry le = lines.get(line);
return le.getReference();
}
public void blendLines(int col, int percent) {
int a = (percent << 7) / 100;
int b = 128 - a;
for (int i = 0; i < lines.size(); i++) {
LineEntry line = lines.get(i);
if (!line.colorDefs.isEmpty()) {
for (int j = 0; j < line.colorDefs.size(); j++) {
LineEntry.ColorEntry colDef = line.colorDefs.get(j);
colDef.rgb =
(((((colDef.rgb & 0xff0000) * b) >> 7) + (((col & 0xff0000) * a) >> 7)) & 0xff0000) |
(((((colDef.rgb & 0x00ff00) * b) >> 7) + (((col & 0x00ff00) * a) >> 7)) & 0x00ff00) |
(((((colDef.rgb & 0x0000ff) * b) >> 7) + (((col & 0x0000ff) * a) >> 7)) & 0x0000ff);
}
}
}
}
// LineEntry StringBuffer wrapper
public static class LineEntry {
StringBuffer buffer = new StringBuffer();
Object ref = null;
List<LineEntry.ColorEntry> colorDefs = new ArrayList<LineEntry.ColorEntry>();
public void setReference(Object reference) {
ref = reference;
}
public Object getReference() {
return ref;
}
@Override
public String toString() {
return buffer.toString();
}
public static class ColorEntry {
int pos;
int rgb;
public ColorEntry(int pos, int rgb) {
this.pos = pos;
this.rgb = rgb;
}
}
}
private void setCurrentColor(int rgb) {
if (line.colorDefs.isEmpty()) {
line.colorDefs.add(new LineEntry.ColorEntry(line.buffer.length(), rgb));
} else {
LineEntry.ColorEntry lastColEntry = line.colorDefs.get(line.colorDefs.size() - 1);
if (lastColEntry.rgb != rgb) {
line.colorDefs.add(new LineEntry.ColorEntry(line.buffer.length(), rgb));
}
}
}
public StringBuffer append(boolean arg0) {
return line.buffer.append(arg0);
}
public StringBuffer append(boolean arg0, int color) {
setCurrentColor(color);
return line.buffer.append(arg0);
}
public StringBuffer append(char arg0) {
return line.buffer.append(arg0);
}
public StringBuffer append(char arg0, int color) {
setCurrentColor(color);
return line.buffer.append(arg0);
}
public StringBuffer append(char[] arg0, int arg1, int arg2) {
return line.buffer.append(arg0, arg1, arg2);
}
public StringBuffer append(char[] arg0, int arg1, int arg2, int color) {
setCurrentColor(color);
return line.buffer.append(arg0, arg1, arg2);
}
public StringBuffer append(char[] arg0) {
return line.buffer.append(arg0);
}
public StringBuffer append(char[] arg0, int color) {
setCurrentColor(color);
return line.buffer.append(arg0);
}
public StringBuffer append(double arg0) {
return line.buffer.append(arg0);
}
public StringBuffer append(double arg0, int color) {
setCurrentColor(color);
return line.buffer.append(arg0);
}
public StringBuffer append(float arg0) {
return line.buffer.append(arg0);
}
public StringBuffer append(float arg0, int color) {
setCurrentColor(color);
return line.buffer.append(arg0);
}
public StringBuffer append(int arg0) {
return line.buffer.append(arg0);
}
public StringBuffer append(int arg0, int color) {
setCurrentColor(color);
return line.buffer.append(arg0);
}
public StringBuffer append(long arg0) {
return line.buffer.append(arg0);
}
public StringBuffer append(long arg0, int color) {
setCurrentColor(color);
return line.buffer.append(arg0);
}
public StringBuffer append(Object arg0) {
return line.buffer.append(arg0);
}
public StringBuffer append(Object arg0, int color) {
setCurrentColor(color);
return line.buffer.append(arg0);
}
public StringBuffer append(String arg0) {
return line.buffer.append(arg0);
}
public StringBuffer append(String arg0, int color) {
setCurrentColor(color);
return line.buffer.append(arg0);
}
public StringBuffer append(StringBuffer arg0) {
return line.buffer.append(arg0);
}
public StringBuffer append(StringBuffer arg0, int color) {
setCurrentColor(color);
return line.buffer.append(arg0);
}
public int capacity() {
return line.buffer.capacity();
}
public char charAt(int arg0) {
return line.buffer.charAt(arg0);
}
public StringBuffer delete(int arg0, int arg1) {
return line.buffer.delete(arg0, arg1);
}
public StringBuffer deleteCharAt(int arg0) {
return line.buffer.deleteCharAt(arg0);
}
public void ensureCapacity(int arg0) {
line.buffer.ensureCapacity(arg0);
}
@Override
public boolean equals(Object arg0) {
return line.buffer.equals(arg0);
}
public void getChars(int arg0, int arg1, char[] arg2, int arg3) {
line.buffer.getChars(arg0, arg1, arg2, arg3);
}
@Override
public int hashCode() {
return line.buffer.hashCode();
}
public int indexOf(String arg0, int arg1) {
return line.buffer.indexOf(arg0, arg1);
}
public int indexOf(String arg0) {
return line.buffer.indexOf(arg0);
}
public StringBuffer insert(int arg0, boolean arg1) {
return line.buffer.insert(arg0, arg1);
}
public StringBuffer insert(int arg0, char arg1) {
return line.buffer.insert(arg0, arg1);
}
public StringBuffer insert(int arg0, char[] arg1, int arg2, int arg3) {
return line.buffer.insert(arg0, arg1, arg2, arg3);
}
public StringBuffer insert(int arg0, char[] arg1) {
return line.buffer.insert(arg0, arg1);
}
public StringBuffer insert(int arg0, double arg1) {
return line.buffer.insert(arg0, arg1);
}
public StringBuffer insert(int arg0, float arg1) {
return line.buffer.insert(arg0, arg1);
}
public StringBuffer insert(int arg0, int arg1) {
return line.buffer.insert(arg0, arg1);
}
public StringBuffer insert(int arg0, long arg1) {
return line.buffer.insert(arg0, arg1);
}
public StringBuffer insert(int arg0, Object arg1) {
return line.buffer.insert(arg0, arg1);
}
public StringBuffer insert(int arg0, String arg1) {
return line.buffer.insert(arg0, arg1);
}
public int lastIndexOf(String arg0, int arg1) {
return line.buffer.lastIndexOf(arg0, arg1);
}
public int lastIndexOf(String arg0) {
return line.buffer.lastIndexOf(arg0);
}
public int length() {
return line.buffer.length();
}
public StringBuffer replace(int arg0, int arg1, String arg2) {
return line.buffer.replace(arg0, arg1, arg2);
}
public StringBuffer reverse() {
return line.buffer.reverse();
}
public void setCharAt(int arg0, char arg1) {
line.buffer.setCharAt(arg0, arg1);
}
public void setLength(int arg0) {
line.buffer.setLength(arg0);
}
public CharSequence subSequence(int arg0, int arg1) {
return line.buffer.subSequence(arg0, arg1);
}
public String substring(int arg0, int arg1) {
return line.buffer.substring(arg0, arg1);
}
public String substring(int arg0) {
return line.buffer.substring(arg0);
}
}