Fix Request #1431769: Support Context assistance when entering functions arguments
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / ui / text / template / IdentifierProposal.java
1 package net.sourceforge.phpdt.internal.ui.text.template;
2
3 import net.sourceforge.phpdt.internal.corext.template.TemplateMessages;
4 import net.sourceforge.phpdt.internal.corext.template.php.JavaContext;
5 import net.sourceforge.phpdt.internal.ui.text.link.LinkedPositionManager;
6 import net.sourceforge.phpdt.internal.ui.text.link.LinkedPositionUI;
7 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
8
9 import org.eclipse.jface.text.BadLocationException;
10 import org.eclipse.jface.text.IDocument;
11 import org.eclipse.jface.text.IRegion;
12 import org.eclipse.jface.text.ITextViewer;
13 import org.eclipse.jface.text.contentassist.ContextInformation;
14 import org.eclipse.jface.text.contentassist.IContextInformation;
15 import org.eclipse.jface.text.templates.TemplateContext;
16 import org.eclipse.swt.graphics.Image;
17
18 /**
19  * A PHP identifier proposal.
20  */
21 public class IdentifierProposal extends AbstractProposal {
22   private final TemplateContext fContext;
23
24   private final Image fImage_fun;
25   private final Image fImage_var;
26   //private TemplateBuffer fTemplateBuffer;
27   private String fOldText;
28   private final IRegion fRegion;
29   //  private IRegion fSelectedRegion; // initialized by apply()
30   private final String fTemplate;
31
32   public IdentifierProposal(String template, TemplateContext context,
33       IRegion region, ITextViewer viewer, Image image_fun, Image image_var) {
34     super(viewer);
35     fTemplate = template;
36     fContext = context;
37
38     //    fViewer = viewer;
39     fImage_fun = image_fun;
40     fImage_var = image_var;
41     fRegion = region;
42   }
43
44   public void apply(IDocument document) {
45     try {
46       int start = fRegion.getOffset();
47       int end = fRegion.getOffset() + fRegion.getLength();
48       document.replace(start, end - start, fTemplate);
49       // translate positions
50       LinkedPositionManager manager = new LinkedPositionManager(document);
51
52       LinkedPositionUI editor = new LinkedPositionUI(fViewer, manager);
53       editor.setFinalCaretOffset(fTemplate.length() + start);
54       //   editor.setFinalCaretOffset(getCaretOffset(fTemplateBuffer) + start);
55       editor.enter();
56       fSelectedRegion = editor.getSelectedRegion();
57     } catch (BadLocationException e) {
58       PHPeclipsePlugin.log(e);
59       openErrorDialog(e);
60     }
61   }
62
63   public String getAdditionalProposalInfo() {
64     return textToHTML(fTemplate); // fTemplateBuffer.getString());
65   }
66
67   public String getDisplayString() {
68     return fTemplate + TemplateMessages.getString("TemplateProposal.delimiter") + fTemplate; // $NON-NLS-1$
69   }
70
71   public Image getImage() {
72     if (fTemplate.charAt(0) == '$') {
73       return fImage_var;
74     }
75     return fImage_fun;
76   }
77
78   public int getRelevance() {
79     if (fContext instanceof JavaContext) {
80       JavaContext context = (JavaContext) fContext;
81       switch (context.getCharacterBeforeStart()) {
82         // high relevance after whitespace
83         case ' ' :
84         case '\r' :
85         case '\n' :
86         case '\t' :
87           return 50;
88         default :
89           return 0;
90       }
91     } else {
92       return 50;
93     }
94   }
95 }