syntax highlighting

This commit is contained in:
serso 2011-09-25 13:30:25 +04:00
parent 7921c09f45
commit 633aaf877d
2 changed files with 73 additions and 25 deletions

View File

@ -7,9 +7,13 @@ package org.solovyev.android.calculator;
import android.content.Context; import android.content.Context;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.graphics.Color;
import android.text.Html;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.Log;
import android.widget.EditText; import android.widget.EditText;
import org.solovyev.common.exceptions.SersoException; import org.jetbrains.annotations.NotNull;
import org.solovyev.android.calculator.math.MathEntityType;
/** /**
* User: serso * User: serso
@ -36,36 +40,76 @@ public class CalculatorEditText extends EditText {
super.setTextColor(colors); //To change body of overridden methods use File | Settings | File Templates. super.setTextColor(colors); //To change body of overridden methods use File | Settings | File Templates.
} }
@Override public void redraw() {
public void setText(CharSequence text, BufferType type) { String text = getText().toString();
/*try { int selectionStart = getSelectionStart();
final List<Pair<Integer, Integer>> groupSymbols = new ArrayList<Pair<Integer, Integer>>(); int selectionEnd = getSelectionEnd();
final Stack<Pair<Integer, Integer>> groupSymbolsStack = new Stack<Pair<Integer, Integer>>(); int maxNumberOfOpenGroupSymbols = 0;
for (int i = 0; i < text.length(); i++) { int numberOfOpenGroupSymbols = 0;
char ch = text.charAt(i); for (int i = 0; i < text.length(); i++) {
if (MathEntityType.openGroupSymbols.contains(ch)) { char ch = text.charAt(i);
groupSymbolsStack.push(new Pair<Integer, Integer>(i, null)); if (MathEntityType.openGroupSymbols.contains(ch)) {
} else if (MathEntityType.closeGroupSymbols.contains(ch)) { numberOfOpenGroupSymbols++;
final Pair<Integer, Integer> pair = groupSymbolsStack.pop(); maxNumberOfOpenGroupSymbols = Math.max(maxNumberOfOpenGroupSymbols, numberOfOpenGroupSymbols);
if (pair != null) { } else if (MathEntityType.closeGroupSymbols.contains(ch)) {
pair.setSecond(i); numberOfOpenGroupSymbols--;
groupSymbols.add(0, pair);
} else {
throw new NoPairGroupSymbolException();
}
}
} }
}
text = insertHtml(text, groupSymbols); if (maxNumberOfOpenGroupSymbols > 0) {
} catch (NoPairGroupSymbolException e) {
// do nothing
}*/
super.setText(text, type); final StringBuilder sb = new StringBuilder();
processGroup(sb, text, 0, 0, maxNumberOfOpenGroupSymbols);
Log.d(CalculatorEditText.class.getName(), sb.toString());
super.setText(Html.fromHtml(sb.toString()), BufferType.EDITABLE);
} else {
super.setText(text, BufferType.EDITABLE);
}
setSelection(selectionStart, selectionEnd);
} }
private class NoPairGroupSymbolException extends SersoException { private int processGroup(@NotNull StringBuilder result, @NotNull String s, int i, int numberOfOpenings, int maxNumberOfGroups) {
result.append("<font color=\"").append(getColor(maxNumberOfGroups, numberOfOpenings)).append("\">");
for (; i < s.length(); i++) {
char ch = s.charAt(i);
if (MathEntityType.openGroupSymbols.contains(ch)) {
result.append(ch);
result.append("</font>");
i = processGroup(result, s, i + 1, numberOfOpenings + 1, maxNumberOfGroups);
result.append("<font color=\"").append(getColor(maxNumberOfGroups, numberOfOpenings)).append("\">");
if (i < s.length() && MathEntityType.closeGroupSymbols.contains(s.charAt(i))) {
result.append(s.charAt(i));
}
} else if (MathEntityType.closeGroupSymbols.contains(ch)) {
break;
} else {
result.append(ch);
}
}
result.append("</font>");
return i;
}
private String getColor(int numberOfOpenGroupSymbols, int numberOfOpenings) {
final int baseColor = Color.WHITE;
double c = 1;
int i = ((int)(255 * c)) * numberOfOpenings / (numberOfOpenGroupSymbols + 1);
int result = Color.rgb( Color.red(baseColor) - i, Color.green(baseColor) - i, Color.blue(baseColor) - i);
return "#" + Integer.toHexString(result).substring(2);
} }
} }

View File

@ -118,6 +118,8 @@ public class CalculatorView implements CursorControl, HistoryControl<CalculatorH
final String editorStateAfter = this.editor.getText().toString(); final String editorStateAfter = this.editor.getText().toString();
if (!editorStateBefore.equals(editorStateAfter)) { if (!editorStateBefore.equals(editorStateAfter)) {
editor.redraw();
currentRunner.setObject(new Runnable() { currentRunner.setObject(new Runnable() {
@Override @Override
public void run() { public void run() {
@ -240,6 +242,8 @@ public class CalculatorView implements CursorControl, HistoryControl<CalculatorH
synchronized (history) { synchronized (history) {
setValuesFromHistory(this.editor, editorHistoryState.getEditorState()); setValuesFromHistory(this.editor, editorHistoryState.getEditorState());
setValuesFromHistory(this.display, editorHistoryState.getDisplayState()); setValuesFromHistory(this.display, editorHistoryState.getDisplayState());
editor.redraw();
} }
} }