Hallo Zusammen,
ich bin gerade dabei, den Content Assist meines Editors auf Java Editor Niveau anzupassen, dazu habe ich folgendes Problem:
Wird der Content Assist betätigt, wird dem Nutzer eine Reihe von Methoden angezeigt, die via Classloader aus .class Dateien geladen werden. Der Benutzer wählt z.B. die Methode indexOf(<STRING>,<STRING>), daraufhin wird ein LikedModeModel um die Parameter "gelegt", dass dem Benutzer erlaubt, via Tab weiterzuschalten. Funktioniert soweit ganz gut. Nun möchte ich zu jedem Parameter weitere Proposals anzeigen, das funktioniert soweit auch. Jetzt fängt das eigentliche Problem an..
Man muss anfangs den Offset und die Länge der Parameter bestimmen, welche in obigem Beispiel Offset:8, Länge:8 und Offset:17, Länge:8 wären. Wählt man jetzt z.B. für den ersten Parameter erneut die Methode indexOf(...), wird <STRING> erwartungsgemäß ersetzt, bearbeitet man aber den zweiten Parameter z.B. mit "test", entsteht folgendes:
indexOf(indexOf(<"test".... -> d.h. der neue Offset bzw. die neue Länge des Parameters werden nicht beachtet.
Code wie folgt:
In der CompletionProposal:
Es muss doch eine Möglichkeit geben, nach jedem apply der CompletionProposals das Linked Model anzupassen, damit das Problem nicht auftritt
Hoffe ich konnte mein Problem deutlich machen.
Danke
StefanTmp
ich bin gerade dabei, den Content Assist meines Editors auf Java Editor Niveau anzupassen, dazu habe ich folgendes Problem:
Wird der Content Assist betätigt, wird dem Nutzer eine Reihe von Methoden angezeigt, die via Classloader aus .class Dateien geladen werden. Der Benutzer wählt z.B. die Methode indexOf(<STRING>,<STRING>), daraufhin wird ein LikedModeModel um die Parameter "gelegt", dass dem Benutzer erlaubt, via Tab weiterzuschalten. Funktioniert soweit ganz gut. Nun möchte ich zu jedem Parameter weitere Proposals anzeigen, das funktioniert soweit auch. Jetzt fängt das eigentliche Problem an..
Man muss anfangs den Offset und die Länge der Parameter bestimmen, welche in obigem Beispiel Offset:8, Länge:8 und Offset:17, Länge:8 wären. Wählt man jetzt z.B. für den ersten Parameter erneut die Methode indexOf(...), wird <STRING> erwartungsgemäß ersetzt, bearbeitet man aber den zweiten Parameter z.B. mit "test", entsteht folgendes:
indexOf(indexOf(<"test".... -> d.h. der neue Offset bzw. die neue Länge des Parameters werden nicht beachtet.
Code wie folgt:
In der CompletionProposal:
Java:
public void apply(IDocument document) {
try {
document.replace(mReplacementOffset, mReplacementLength,
mReplacementString);
int lBaseOffset = this.mReplacementOffset; //der offset innerhalb des docs
extractMethodLength(); //methodenlänge festlegen
countParameterAndSetPositions(); //wie viele parameter hat das Proposal? Bestimme und setz die Positionen der Parameter (siehe Problembeschreibung)
if (this.mPositions.length > 0) {
LinkedModeModel lModel = new LinkedModeModel();
// Laufvariable
int i = 0;
for (String lParameter : this.mParameterList) {
LinkedPositionGroup lGroup = new LinkedPositionGroup();
int lPositionOffset = lBaseOffset
+ this.mPositions[i].getOffset();
int lPositionLength = this.mPositions[i].getLength();
ensurePositionCategoryInstalled(document, lModel);
document.addPosition(getCategory(), this.mPositions[i]);
lGroup.addPosition(new ProposalPosition(document,
lPositionOffset, lPositionLength,
LinkedPositionGroup.NO_STOP,
getProposalListForParameter(lParameter,
lPositionOffset, lPositionLength)));
lModel.addGroup(lGroup);
i++;
}
lModel.tryInstall();
LinkedModeUI ui = new EditorLinkedModeUI(lModel, mViewer);
ui.setExitPosition(mViewer, lBaseOffset
+ this.mReplacementString.length(), 0,
Integer.MAX_VALUE);
ui.setExitPolicy(new ExitPolicy(')', document));
ui.setCyclingMode(LinkedModeUI.CYCLE_WHEN_NO_PARENT);
ui.setDoContextInfo(false);
ui.enter();
mSelectedRegion = ui.getSelectedRegion();
}
} catch (BadLocationException e) {
e.printStackTrace();
} catch (BadPositionCategoryException e) {
e.printStackTrace();
}
}
Java:
private ICompletionProposal[] getProposalListForParameter(
String pParameter, int pPositionOffset, int pReplacementLength) {
ArrayList<ICompletionProposal> lResult = new ArrayList<ICompletionProposal>();
// Without brackets
String lPlainParameter = pParameter.substring(1,
pParameter.length() - 1);
//Proposals anhand des Parameters bestimmen
for(A4LMethodInformationForContentAssist lObject : A4LModulList.getInstance().getMethodsForContentAssist()){
if(lObject.getmReturnType().equals(lPlainParameter)){
lResult.add(new CompletionProposal(lObject.getmReplacementString(), pPositionOffset,
pReplacementLength, lObject.getmReplacementString().length(), null, lObject.getmDisplayString(),
null, ""));
}
}
Es muss doch eine Möglichkeit geben, nach jedem apply der CompletionProposals das Linked Model anzupassen, damit das Problem nicht auftritt
Hoffe ich konnte mein Problem deutlich machen.
Danke
StefanTmp