# Custom Editor Content Assist



## StefanTmp (10. Nov 2009)

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:


```
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();
		}
	}
```


```
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


----------



## Wildcard (10. Nov 2009)

Hast du dir schon XText angeschaut? Damit wird dir der komplette Editor aus der Grammatik generiert und Code Completion ist inklusive. Mit dem Helios release gibt es auch build-in support um Java Klassen/Methoden/Typen in der eigenen Sprache zu referenzieren, aber auch im Galileo Release lässt sich das relativ einfach (wenn auch nicht ganz so mächtig) händisch nachrüsten. Habe ich auch schon gemacht.


----------



## StefanTmp (13. Nov 2009)

Hallo Wildcard, 

leider wurde von oben festgelegt, dass der Editor mit JFace gebaut werden soll.. Mir bleibt also nichts anderes übrig


----------



## Wildcard (13. Nov 2009)

JFace sind nur Utility Klassen auf SWT. Guess What, XText generiert dir einen JFace basierten Editor mit JFace Autocompletion


----------

