hallo,
ich verzweifel langsam echt, da ich den Fehler nicht finden kann, ich vermute mir fehlt da Verständnis über die interne Verarbeitung, aber ich will nich ausschließen das mein Algo falsch ist
Also das Problem ist, dass das Highlighting nicht ganz funktioniert. Korrekt wäre, wenn im afterRemove.png der komplette String unterstrichen ist. Ich entferne den einen Buchstaben per Backspace und dann wird durch meine Klasse bisher das komplette Highlighten des gesamten Textes im Document erzwungen, damit ich falsche Indexangaben als Fehler erstmal ausschliessen kann.
Die Methode zum Highlighten ist wie folgt:
Die Aufruf von
ist das was unten im Editor zu sehen ist, wo ich auch markiert habe. Das sind sozusagen die Tokentypen samt Inhalt aus dem Scanner. Der Scanner arbeitet 100% korrekt, das heisst die Tokentypen werden immer korrekt erkannt und der Inhalt ist auch entsprechend korrekt, da fehlen keine Zeichen oder dergleichen. Der Fehler muss also im Frontend liegen.
Die Ausgabe:
bedeutet also, der Scanner hat genau eine Zeichenkette gefunden, welche keinem gültigen Typ zugeordnet werden konnte, daher UNKNOWN. Alle diese unbekannten Token sollen im Frontend rot unterstrichen werden, damit der User gleich die optische Rückmeldung vom Backend hat, das definitiv an einer Formel was nicht stimmt. Die Manipulation von Zeichen wird nur in der obigen Methode vorgenommen, sie allein bestimmt den Style der Zeichen im Editor.
die 2 wesentlichen AttributSets sind wie folgt definiert:
das ERROR-Attribute legt fest ob das Zeichen unterstrichen wird oder nicht.
code dafür dankenderweise vor ewiger zeit von Ebenius erhalten
ich vermute mal es liegt nicht daran, gebe ihn aber doch mal mit an.
Tja ich weiss echt nicht warum der eine Buchstabe, welcher direkt hinter dem entfernten steht IMMER wieder den roten Strich verliert. Zu 100% reproduzierbar. Wenn ich dann weiterschreibe, wird der komplette String wieder komplett unterstrichen.
Hat vielleicht jemand eine Idee?
ich verzweifel langsam echt, da ich den Fehler nicht finden kann, ich vermute mir fehlt da Verständnis über die interne Verarbeitung, aber ich will nich ausschließen das mein Algo falsch ist
Also das Problem ist, dass das Highlighting nicht ganz funktioniert. Korrekt wäre, wenn im afterRemove.png der komplette String unterstrichen ist. Ich entferne den einen Buchstaben per Backspace und dann wird durch meine Klasse bisher das komplette Highlighten des gesamten Textes im Document erzwungen, damit ich falsche Indexangaben als Fehler erstmal ausschliessen kann.
Die Methode zum Highlighten ist wie folgt:
Java:
private void highlightString(int startOffset, int endOffset) throws BadLocationException {
String str = this.getText(startOffset, endOffset-startOffset);
List<Token> tokenList = GfeAccessor.getInstance().getScanner().scan(str);
HashSet<String> toHighlight;
int suboffs = 0;
int begin = 0;
//TODO: remove
SimpleLog.print(tokenList);
//highlight each token data
for(Token t: tokenList) {
begin = str.indexOf(t.data,suboffs);
switch (t.type) {
case LINECOMMENT: //fall through
case MULTILINECOMMENT: {
super.setCharacterAttributes(begin+startOffset,
t.data.length(),
context.getStyle(tokenToStyle.get(t.type.name()).getLabel()).copyAttributes(),
true);
multilineCommentOffset.put(begin+startOffset, begin+startOffset+t.data.length());
break;
}
case UNKNOWN:
if (showErrors)
super.setCharacterAttributes(begin+startOffset, t.data.length(), errorAttributeSet.copyAttributes(), true);
break;
case INT: //fall through
case FLOAT: //fall through
case MACRO: //fall through
super.setCharacterAttributes(begin+startOffset,
t.data.length(),
context.getStyle(tokenToStyle.get(t.type.name()).getLabel()).copyAttributes(), true);
break;
case TERMINAL: //fall through
case PLACE:
if ((toHighlight = table.get(tokenToStyle.get(t.type.name()))) != null) {
if (toHighlight.contains(t.data)) {
super.setCharacterAttributes(begin+startOffset,
t.data.length(),
context.getStyle(tokenToStyle.get(t.type.name()).getLabel()).copyAttributes(),
true);
break;
}//if
}//if
default:
super.setCharacterAttributes(begin+startOffset, t.data.length(), defaultAttributeSet.copyAttributes(), true);
}//switch
suboffs = begin + t.data.length();
}//for
}//highlightString
Die Aufruf von
Code:
SimpleLog.print
Die Ausgabe:
Code:
UNKNOWN: aaaaaaa
die 2 wesentlichen AttributSets sind wie folgt definiert:
Java:
defaultAttributeSet = (MutableAttributeSet) context.getStyle(EditorStyleModel.StyleName.DEFAULT.getLabel()).copyAttributes();
defaultAttributeSet.addAttribute(ErrorUnderlinedEditorKit.ERROR, false);
errorAttributeSet = (MutableAttributeSet) defaultAttributeSet.copyAttributes();
errorAttributeSet.addAttribute(ErrorUnderlinedEditorKit.ERROR, true);
code dafür dankenderweise vor ewiger zeit von Ebenius erhalten
Java:
public class ErrorUnderlinedEditorKit extends StyledEditorKit {
<..>
@Override
public ViewFactory getViewFactory() {
final ViewFactory viewFactory = super.getViewFactory();
return new ViewFactory() {
public View create(Element elem) {
final String kind = elem.getName();
if (AbstractDocument.ContentElementName.equals(kind)) {
return new LabelView(elem) {
private boolean error = false;
public void changedUpdate(DocumentEvent e, Shape a, ViewFactory f) {
super.changedUpdate(e, a, f);
if (this.getAttributes().containsAttribute(ERROR, true)) {
error = true;
} else {
error = false;
}//if
}//if
@Override
public void paint(Graphics g, Shape a) {
super.paint(g, a);
if (error) {
Rectangle alloc = (a instanceof Rectangle) ? (Rectangle) a : a.getBounds();
g.setColor(Color.RED);
g.drawLine(alloc.x, alloc.y + alloc.height - 2, alloc.x + alloc.width, alloc.y + alloc.height - 2);
}//if
}//paint
};
}//if
return viewFactory.create(elem);
}//create
};
}//getViewFactory
Tja ich weiss echt nicht warum der eine Buchstabe, welcher direkt hinter dem entfernten steht IMMER wieder den roten Strich verliert. Zu 100% reproduzierbar. Wenn ich dann weiterschreibe, wird der komplette String wieder komplett unterstrichen.
Hat vielleicht jemand eine Idee?