/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
+ * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
- *
+ *
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.texteditor.link.EditorLinkedModeUI;
-
/**
* A template proposal.
*/
private IRegion fSelectedRegion; // initialized by apply()
private String fDisplayString;
-
+
/**
* Creates a template proposal with a template and its context.
- *
+ *
* @param template the template
* @param context the context in which the template was requested
* @param region the region this proposal applies to
* @param image the icon of the proposal
- */
+ */
public TemplateProposal(Template template, TemplateContext context, IRegion region, Image image) {
Assert.isNotNull(template);
Assert.isNotNull(context);
Assert.isNotNull(region);
-
+
fTemplate= template;
fContext= context;
fImage= image;
fRegion= region;
-
+
fDisplayString= null;
-
+
if (context instanceof JavaContext) {
switch (((JavaContext) context).getCharacterBeforeStart()) {
// high relevance after whitespace
fRelevance= 0;
}
} else {
- fRelevance= 90;
- }
+ fRelevance= 90;
+ }
}
/*
public final void apply(IDocument document) {
// not called anymore
}
-
+
/*
* @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#apply(org.eclipse.jface.text.ITextViewer, char, int, int)
*/
public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) {
try {
-
+
fContext.setReadOnly(false);
TemplateBuffer templateBuffer;
try {
fSelectedRegion= fRegion;
return;
}
-
+
int start= getReplaceOffset();
int end= getReplaceEndOffset();
end= Math.max(end, offset);
-
+
// insert template string
IDocument document= viewer.getDocument();
- String templateString= templateBuffer.getString();
- document.replace(start, end - start, templateString);
-
+ String templateString= templateBuffer.getString();
+ document.replace(start, end - start, templateString);
+
// translate positions
LinkedModeModel model= new LinkedModeModel();
TemplateVariable[] variables= templateBuffer.getVariables();
-
+
MultiVariableGuess guess= fContext instanceof CompilationUnitContext ? ((CompilationUnitContext) fContext).getMultiVariableGuess() : null;
-
+
boolean hasPositions= false;
for (int i= 0; i != variables.length; i++) {
TemplateVariable variable= variables[i];
if (variable.isUnambiguous())
continue;
-
+
LinkedPositionGroup group= new LinkedPositionGroup();
-
+
int[] offsets= variable.getOffsets();
int length= variable.getLength();
-
+
LinkedPosition first;
if (guess != null && variable instanceof MultiVariable) {
first= new VariablePosition(document, offsets[0] + start, length, guess, (MultiVariable) variable);
document.addPosition(getCategory(), pos);
proposals[j]= new PositionBasedCompletionProposal(values[j], pos, length);
}
-
+
if (proposals.length > 1)
first= new ProposalPosition(document, offsets[0] + start, length, proposals);
else
first= new LinkedPosition(document, offsets[0] + start, length);
}
-
+
for (int j= 0; j != offsets.length; j++)
if (j == 0)
group.addPosition(first);
else
group.addPosition(new LinkedPosition(document, offsets[j] + start, length));
-
+
model.addGroup(group);
hasPositions= true;
}
-
+
if (hasPositions) {
model.forceInstall();
PHPEditor editor= getJavaEditor();
if (editor != null) {
model.addLinkingListener(new EditorHighlightingSynchronizer(editor));
}
-
+
LinkedModeUI ui= new EditorLinkedModeUI(model, viewer);
ui.setExitPosition(viewer, getCaretOffset(templateBuffer) + start, 0, Integer.MAX_VALUE);
ui.enter();
-
+
fSelectedRegion= ui.getSelectedRegion();
} else
fSelectedRegion= new Region(getCaretOffset(templateBuffer) + start, 0);
-
+
} catch (BadLocationException e) {
PHPeclipsePlugin.log(e);
- openErrorDialog(viewer.getTextWidget().getShell(), e);
+ openErrorDialog(viewer.getTextWidget().getShell(), e);
fSelectedRegion= fRegion;
} catch (BadPositionCategoryException e) {
PHPeclipsePlugin.log(e);
- openErrorDialog(viewer.getTextWidget().getShell(), e);
+ openErrorDialog(viewer.getTextWidget().getShell(), e);
fSelectedRegion= fRegion;
}
- }
-
+ }
+
/**
- * Returns the currently active java editor, or <code>null</code> if it
+ * Returns the currently active java editor, or <code>null</code> if it
* cannot be determined.
- *
+ *
* @return the currently active java editor, or <code>null</code>
*/
private PHPEditor getJavaEditor() {
/**
* Returns the offset of the range in the document that will be replaced by
* applying this template.
- *
+ *
* @return the offset of the range in the document that will be replaced by
* applying this template
*/
/**
* Returns the end offset of the range in the document that will be replaced
* by applying this template.
- *
+ *
* @return the end offset of the range in the document that will be replaced
* by applying this template
*/
document.addPositionCategory(getCategory());
final InclusivePositionUpdater updater= new InclusivePositionUpdater(getCategory());
document.addPositionUpdater(updater);
-
+
model.addLinkingListener(new ILinkedModeListener() {
/*
}
private int getCaretOffset(TemplateBuffer buffer) {
-
+
TemplateVariable[] variables= buffer.getVariables();
for (int i= 0; i != variables.length; i++) {
TemplateVariable variable= variables[i];
return buffer.getString().length();
}
-
+
/*
* @see ICompletionProposal#getSelection(IDocument)
*/
}
return fDisplayString;
}
-
+
public void setDisplayString(String displayString) {
fDisplayString= displayString;
- }
+ }
/*
* @see ICompletionProposal#getImage()
public void setRelevance(int relevance) {
fRelevance= relevance;
}
-
+
public Template getTemplate() {
return fTemplate;
}