X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/template/contentassist/TemplateProposal.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/template/contentassist/TemplateProposal.java index 4ca7d17..bb98859 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/template/contentassist/TemplateProposal.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/template/contentassist/TemplateProposal.java @@ -1,10 +1,10 @@ /******************************************************************************* * 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 *******************************************************************************/ @@ -58,37 +58,48 @@ import org.eclipse.ui.texteditor.link.EditorLinkedModeUI; /** * A template proposal. */ -public class TemplateProposal implements IPHPCompletionProposal, ICompletionProposalExtension2, ICompletionProposalExtension3 { +public class TemplateProposal implements IPHPCompletionProposal, + ICompletionProposalExtension2, ICompletionProposalExtension3 { private final Template fTemplate; + private final TemplateContext fContext; + private final Image fImage; + private IRegion fRegion; + private int fRelevance; 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) { + * @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; - + + fTemplate = template; + fContext = context; + fImage = image; + fRegion = region; + + fDisplayString = null; + if (context instanceof JavaContext) { switch (((JavaContext) context).getCharacterBeforeStart()) { // high relevance after whitespace @@ -96,14 +107,14 @@ public class TemplateProposal implements IPHPCompletionProposal, ICompletionProp case '\r': case '\n': case '\t': - fRelevance= 90; + fRelevance = 90; break; default: - fRelevance= 0; + fRelevance = 0; } } else { - fRelevance= 90; - } + fRelevance = 90; + } } /* @@ -112,115 +123,128 @@ public class TemplateProposal implements IPHPCompletionProposal, ICompletionProp 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) + * @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) { + public void apply(ITextViewer viewer, char trigger, int stateMask, + int offset) { try { - + fContext.setReadOnly(false); TemplateBuffer templateBuffer; try { - templateBuffer= fContext.evaluate(fTemplate); + templateBuffer = fContext.evaluate(fTemplate); } catch (TemplateException e1) { - fSelectedRegion= fRegion; + fSelectedRegion = fRegion; return; } - - int start= getReplaceOffset(); - int end= getReplaceEndOffset(); - end= Math.max(end, offset); - + + 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); - + IDocument document = viewer.getDocument(); + 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]; + 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(); - + + 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); + first = new VariablePosition(document, offsets[0] + start, + length, guess, (MultiVariable) variable); guess.addSlave((VariablePosition) first); } else { - String[] values= variable.getValues(); - ICompletionProposal[] proposals= new ICompletionProposal[values.length]; - for (int j= 0; j < values.length; j++) { + String[] values = variable.getValues(); + ICompletionProposal[] proposals = new ICompletionProposal[values.length]; + for (int j = 0; j < values.length; j++) { ensurePositionCategoryInstalled(document, model); - Position pos= new Position(offsets[0] + start, length); + Position pos = new Position(offsets[0] + start, length); document.addPosition(getCategory(), pos); - proposals[j]= new PositionBasedCompletionProposal(values[j], pos, length); + proposals[j] = new PositionBasedCompletionProposal( + values[j], pos, length); } - + if (proposals.length > 1) - first= new ProposalPosition(document, offsets[0] + start, length, proposals); + first = new ProposalPosition(document, offsets[0] + + start, length, proposals); else - first= new LinkedPosition(document, offsets[0] + start, length); + first = new LinkedPosition(document, + offsets[0] + start, length); } - - for (int j= 0; j != offsets.length; j++) + + for (int j = 0; j != offsets.length; j++) if (j == 0) group.addPosition(first); else - group.addPosition(new LinkedPosition(document, offsets[j] + start, length)); - + group.addPosition(new LinkedPosition(document, + offsets[j] + start, length)); + model.addGroup(group); - hasPositions= true; + hasPositions = true; } - + if (hasPositions) { model.forceInstall(); - PHPEditor editor= getJavaEditor(); + PHPEditor editor = getJavaEditor(); if (editor != null) { - model.addLinkingListener(new EditorHighlightingSynchronizer(editor)); + model + .addLinkingListener(new EditorHighlightingSynchronizer( + editor)); } - - LinkedModeUI ui= new EditorLinkedModeUI(model, viewer); - ui.setExitPosition(viewer, getCaretOffset(templateBuffer) + start, 0, Integer.MAX_VALUE); + + LinkedModeUI ui = new EditorLinkedModeUI(model, viewer); + ui.setExitPosition(viewer, getCaretOffset(templateBuffer) + + start, 0, Integer.MAX_VALUE); ui.enter(); - - fSelectedRegion= ui.getSelectedRegion(); + + fSelectedRegion = ui.getSelectedRegion(); } else - fSelectedRegion= new Region(getCaretOffset(templateBuffer) + start, 0); - + fSelectedRegion = new Region(getCaretOffset(templateBuffer) + + start, 0); + } catch (BadLocationException e) { - PHPeclipsePlugin.log(e); - openErrorDialog(viewer.getTextWidget().getShell(), e); - fSelectedRegion= fRegion; + PHPeclipsePlugin.log(e); + openErrorDialog(viewer.getTextWidget().getShell(), e); + fSelectedRegion = fRegion; } catch (BadPositionCategoryException e) { - PHPeclipsePlugin.log(e); - openErrorDialog(viewer.getTextWidget().getShell(), e); - fSelectedRegion= fRegion; + PHPeclipsePlugin.log(e); + openErrorDialog(viewer.getTextWidget().getShell(), e); + fSelectedRegion = fRegion; } - } - + } + /** - * Returns the currently active java editor, or null if it + * Returns the currently active java editor, or null if it * cannot be determined. * - * @return the currently active java editor, or null + * @return the currently active java editor, or null */ private PHPEditor getJavaEditor() { - IEditorPart part= PHPeclipsePlugin.getActivePage().getActiveEditor(); + IEditorPart part = PHPeclipsePlugin.getActivePage().getActiveEditor(); if (part instanceof PHPEditor) return (PHPEditor) part; else @@ -237,10 +261,10 @@ public class TemplateProposal implements IPHPCompletionProposal, ICompletionProp private int getReplaceOffset() { int start; if (fContext instanceof DocumentTemplateContext) { - DocumentTemplateContext docContext = (DocumentTemplateContext)fContext; - start= docContext.getStart(); + DocumentTemplateContext docContext = (DocumentTemplateContext) fContext; + start = docContext.getStart(); } else { - start= fRegion.getOffset(); + start = fRegion.getOffset(); } return start; } @@ -255,24 +279,27 @@ public class TemplateProposal implements IPHPCompletionProposal, ICompletionProp private int getReplaceEndOffset() { int end; if (fContext instanceof DocumentTemplateContext) { - DocumentTemplateContext docContext = (DocumentTemplateContext)fContext; - end= docContext.getEnd(); + DocumentTemplateContext docContext = (DocumentTemplateContext) fContext; + end = docContext.getEnd(); } else { - end= fRegion.getOffset() + fRegion.getLength(); + end = fRegion.getOffset() + fRegion.getLength(); } return end; } - private void ensurePositionCategoryInstalled(final IDocument document, LinkedModeModel model) { + private void ensurePositionCategoryInstalled(final IDocument document, + LinkedModeModel model) { if (!document.containsPositionCategory(getCategory())) { document.addPositionCategory(getCategory()); - final InclusivePositionUpdater updater= new InclusivePositionUpdater(getCategory()); + final InclusivePositionUpdater updater = new InclusivePositionUpdater( + getCategory()); document.addPositionUpdater(updater); - + model.addLinkingListener(new ILinkedModeListener() { /* - * @see org.eclipse.jface.text.link.ILinkedModeListener#left(org.eclipse.jface.text.link.LinkedModeModel, int) + * @see org.eclipse.jface.text.link.ILinkedModeListener#left(org.eclipse.jface.text.link.LinkedModeModel, + * int) */ public void left(LinkedModeModel environment, int flags) { try { @@ -283,8 +310,11 @@ public class TemplateProposal implements IPHPCompletionProposal, ICompletionProp document.removePositionUpdater(updater); } - public void suspend(LinkedModeModel environment) {} - public void resume(LinkedModeModel environment, int flags) {} + public void suspend(LinkedModeModel environment) { + } + + public void resume(LinkedModeModel environment, int flags) { + } }); } } @@ -294,41 +324,44 @@ public class TemplateProposal implements IPHPCompletionProposal, ICompletionProp } private int getCaretOffset(TemplateBuffer buffer) { - - TemplateVariable[] variables= buffer.getVariables(); - for (int i= 0; i != variables.length; i++) { - TemplateVariable variable= variables[i]; + + TemplateVariable[] variables = buffer.getVariables(); + for (int i = 0; i != variables.length; i++) { + TemplateVariable variable = variables[i]; if (variable.getType().equals(GlobalTemplateVariables.Cursor.NAME)) return variable.getOffsets()[0]; } return buffer.getString().length(); } - + /* * @see ICompletionProposal#getSelection(IDocument) */ public Point getSelection(IDocument document) { - return new Point(fSelectedRegion.getOffset(), fSelectedRegion.getLength()); + return new Point(fSelectedRegion.getOffset(), fSelectedRegion + .getLength()); } /* * @see ICompletionProposal#getAdditionalProposalInfo() */ public String getAdditionalProposalInfo() { - try { - fContext.setReadOnly(true); + try { + fContext.setReadOnly(true); TemplateBuffer templateBuffer; try { - templateBuffer= fContext.evaluate(fTemplate); + templateBuffer = fContext.evaluate(fTemplate); } catch (TemplateException e1) { return null; } return templateBuffer.getString(); - } catch (BadLocationException e) { - handleException(PHPeclipsePlugin.getActiveWorkbenchShell(), new CoreException(new Status(IStatus.ERROR, PHPeclipsePlugin.getPluginId(), IStatus.OK, "", e))); //$NON-NLS-1$ + } catch (BadLocationException e) { + handleException(PHPeclipsePlugin.getActiveWorkbenchShell(), + new CoreException(new Status(IStatus.ERROR, + PHPeclipsePlugin.getPluginId(), IStatus.OK, "", e))); //$NON-NLS-1$ return null; } } @@ -338,14 +371,16 @@ public class TemplateProposal implements IPHPCompletionProposal, ICompletionProp */ public String getDisplayString() { if (fDisplayString == null) { - fDisplayString= fTemplate.getName() + TemplateContentAssistMessages.getString("TemplateProposal.delimiter") + fTemplate.getDescription(); //$NON-NLS-1$ + fDisplayString = fTemplate.getName() + + TemplateContentAssistMessages + .getString("TemplateProposal.delimiter") + fTemplate.getDescription(); //$NON-NLS-1$ } return fDisplayString; } - + public void setDisplayString(String displayString) { - fDisplayString= displayString; - } + fDisplayString = displayString; + } /* * @see ICompletionProposal#getImage() @@ -362,11 +397,13 @@ public class TemplateProposal implements IPHPCompletionProposal, ICompletionProp } private void openErrorDialog(Shell shell, Exception e) { - MessageDialog.openError(shell, TemplateContentAssistMessages.getString("TemplateEvaluator.error.title"), e.getMessage()); //$NON-NLS-1$ + MessageDialog.openError(shell, TemplateContentAssistMessages + .getString("TemplateEvaluator.error.title"), e.getMessage()); //$NON-NLS-1$ } private void handleException(Shell shell, CoreException e) { - ExceptionHandler.handle(e, shell, TemplateContentAssistMessages.getString("TemplateEvaluator.error.title"), null); //$NON-NLS-1$ + ExceptionHandler.handle(e, shell, TemplateContentAssistMessages + .getString("TemplateEvaluator.error.title"), null); //$NON-NLS-1$ } /* @@ -377,9 +414,9 @@ public class TemplateProposal implements IPHPCompletionProposal, ICompletionProp } public void setRelevance(int relevance) { - fRelevance= relevance; + fRelevance = relevance; } - + public Template getTemplate() { return fTemplate; } @@ -392,7 +429,8 @@ public class TemplateProposal implements IPHPCompletionProposal, ICompletionProp } /* - * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#selected(org.eclipse.jface.text.ITextViewer, boolean) + * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#selected(org.eclipse.jface.text.ITextViewer, + * boolean) */ public void selected(ITextViewer viewer, boolean smartToggle) { } @@ -404,13 +442,15 @@ public class TemplateProposal implements IPHPCompletionProposal, ICompletionProp } /* - * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#validate(org.eclipse.jface.text.IDocument, int, org.eclipse.jface.text.DocumentEvent) + * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension2#validate(org.eclipse.jface.text.IDocument, + * int, org.eclipse.jface.text.DocumentEvent) */ public boolean validate(IDocument document, int offset, DocumentEvent event) { try { - int replaceOffset= getReplaceOffset(); + int replaceOffset = getReplaceOffset(); if (offset >= replaceOffset) { - String content= document.get(replaceOffset, offset - replaceOffset); + String content = document.get(replaceOffset, offset + - replaceOffset); return fTemplate.getName().startsWith(content); } } catch (BadLocationException e) { @@ -422,7 +462,8 @@ public class TemplateProposal implements IPHPCompletionProposal, ICompletionProp /* * @see org.eclipse.jface.text.contentassist.ICompletionProposalExtension3#getReplacementString() */ - public CharSequence getPrefixCompletionText(IDocument document, int completionOffset) { + public CharSequence getPrefixCompletionText(IDocument document, + int completionOffset) { return fTemplate.getName(); }