fix #774 infinite loop in net.sourceforge.phpeclipse.builder.IdentifierIndexManager...
[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.templates.TemplateContext;
14 import org.eclipse.swt.graphics.Image;
15
16 /**
17  * A PHP identifier proposal.
18  */
19 public class IdentifierProposal extends AbstractProposal {
20         private final TemplateContext fContext;
21
22         private final Image fImage_fun;
23
24         private final Image fImage_var;
25
26         private final IRegion fRegion;
27
28         private final String fTemplate;
29
30         public IdentifierProposal(String template, TemplateContext context,
31                         IRegion region, ITextViewer viewer, Image image_fun, Image image_var) {
32                 super(viewer);
33                 fTemplate = template;
34                 fContext = context;
35
36                 fImage_fun = image_fun;
37                 fImage_var = image_var;
38                 fRegion = region;
39         }
40
41         public void apply(IDocument document) {
42                 try {
43                         int start = fRegion.getOffset();
44                         int end = fRegion.getOffset() + fRegion.getLength();
45                         document.replace(start, end - start, fTemplate);
46                         // translate positions
47                         LinkedPositionManager manager = new LinkedPositionManager(document);
48
49                         LinkedPositionUI editor = new LinkedPositionUI(fViewer, manager);
50                         editor.setFinalCaretOffset(fTemplate.length() + start);
51                         editor.enter();
52                         fSelectedRegion = editor.getSelectedRegion();
53                 } catch (BadLocationException e) {
54                         PHPeclipsePlugin.log(e);
55                         openErrorDialog(e);
56                 }
57         }
58
59         public String getAdditionalProposalInfo() {
60                 return textToHTML(fTemplate); 
61         }
62
63         public String getDisplayString() {
64                 return fTemplate
65                                 + TemplateMessages.getString("TemplateProposal.delimiter")
66                                 + fTemplate; // $NON-NLS-1$
67         }
68
69         public Image getImage() {
70                 if (fTemplate.charAt(0) == '$') {
71                         return fImage_var;
72                 }
73                 return fImage_fun;
74         }
75
76         public int getRelevance() {
77                 if (fContext instanceof JavaContext) {
78                         JavaContext context = (JavaContext) fContext;
79                         switch (context.getCharacterBeforeStart()) {
80                         // high relevance after whitespace
81                         case ' ':
82                         case '\r':
83                         case '\n':
84                         case '\t':
85                                 return 50;
86                         default:
87                                 return 0;
88                         }
89                 } else {
90                         return 50;
91                 }
92         }
93 }