#186979 - Custom extensions for Smarty files, corrected cc offering outside delimiters
authorMartin Fousek <marfous@netbeans.org>
Mon, 14 Jun 2010 14:35:44 +0200
changeset 1633170139922d303
parent 16330 bc8c48bb4e5b
child 16332 70e5740dacc6
#186979 - Custom extensions for Smarty files, corrected cc offering outside delimiters
php.smarty/manifest.mf
php.smarty/src/org/netbeans/modules/php/smarty/editor/TplEditorSupport.java
php.smarty/src/org/netbeans/modules/php/smarty/editor/completion/CodeCompletionUtils.java
php.smarty/src/org/netbeans/modules/php/smarty/editor/completion/TplCompletionProvider.java
php.smarty/src/org/netbeans/modules/php/smarty/editor/embedding/TplEmbeddingProvider.java
php.smarty/src/org/netbeans/modules/php/smarty/editor/lexer/TplTopTokenId.java
     1.1 --- a/php.smarty/manifest.mf	Mon Jun 14 10:39:20 2010 +0200
     1.2 +++ b/php.smarty/manifest.mf	Mon Jun 14 14:35:44 2010 +0200
     1.3 @@ -2,5 +2,5 @@
     1.4  OpenIDE-Module: org.netbeans.modules.php.smarty
     1.5  OpenIDE-Module-Layer: org/netbeans/modules/php/smarty/resources/layer.xml
     1.6  OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/php/smarty/resources/Bundle.properties
     1.7 -OpenIDE-Module-Specification-Version: 1.30
     1.8 +OpenIDE-Module-Specification-Version: 1.31
     1.9  
     2.1 --- a/php.smarty/src/org/netbeans/modules/php/smarty/editor/TplEditorSupport.java	Mon Jun 14 10:39:20 2010 +0200
     2.2 +++ b/php.smarty/src/org/netbeans/modules/php/smarty/editor/TplEditorSupport.java	Mon Jun 14 14:35:44 2010 +0200
     2.3 @@ -90,7 +90,7 @@
     2.4  
     2.5      @Override
     2.6      protected boolean asynchronousOpen() {
     2.7 -	return true;
     2.8 +        return true;
     2.9      }
    2.10  
    2.11      @Override
    2.12 @@ -104,8 +104,8 @@
    2.13          StyledDocument doc = super.createStyledDocument(kit);
    2.14  
    2.15          // see TplKit.createDefaultDocument;
    2.16 -        Runnable postInitRunnable = (Runnable)doc.getProperty("postInitRunnable"); //NOI18N
    2.17 -        if(postInitRunnable != null) {
    2.18 +        Runnable postInitRunnable = (Runnable) doc.getProperty("postInitRunnable"); //NOI18N
    2.19 +        if (postInitRunnable != null) {
    2.20              postInitRunnable.run();
    2.21          }
    2.22  
     3.1 --- a/php.smarty/src/org/netbeans/modules/php/smarty/editor/completion/CodeCompletionUtils.java	Mon Jun 14 10:39:20 2010 +0200
     3.2 +++ b/php.smarty/src/org/netbeans/modules/php/smarty/editor/completion/CodeCompletionUtils.java	Mon Jun 14 14:35:44 2010 +0200
     3.3 @@ -36,18 +36,17 @@
     3.4   *
     3.5   * Portions Copyrighted 2010 Sun Microsystems, Inc.
     3.6   */
     3.7 -
     3.8  package org.netbeans.modules.php.smarty.editor.completion;
     3.9  
    3.10  import java.util.Locale;
    3.11  import javax.swing.text.BadLocationException;
    3.12  import javax.swing.text.Document;
    3.13 -import org.netbeans.modules.editor.NbEditorDocument;
    3.14 +import org.netbeans.api.lexer.TokenHierarchy;
    3.15 +import org.netbeans.api.lexer.TokenSequence;
    3.16  import org.netbeans.modules.editor.NbEditorUtilities;
    3.17  import org.netbeans.modules.php.smarty.SmartyFramework;
    3.18 -import org.netbeans.modules.php.smarty.SmartyPhpModuleCustomizerExtender;
    3.19 +import org.netbeans.modules.php.smarty.editor.lexer.TplTopTokenId;
    3.20  import org.netbeans.modules.php.smarty.editor.utlis.LexerUtils;
    3.21 -import org.netbeans.modules.php.smarty.ui.options.SmartyOptions;
    3.22  import org.openide.util.Exceptions;
    3.23  
    3.24  /**
    3.25 @@ -61,11 +60,7 @@
    3.26      public static String getTextPrefix(Document doc, int offset) {
    3.27          int readLength = (COMPLETION_MAX_FILTER_LENGHT > offset) ? offset : COMPLETION_MAX_FILTER_LENGHT;
    3.28          try {
    3.29 -            int lastWS = getLastWS(doc.getText(offset - readLength, readLength));
    3.30 -            String preWord = doc.getText(offset - lastWS, lastWS);
    3.31 -            if (preWord.startsWith(SmartyFramework.getOpenDelimiter(NbEditorUtilities.getFileObject(doc)))) {
    3.32 -                return preWord.substring(SmartyFramework.getOpenDelimiter(NbEditorUtilities.getFileObject(doc)).length());
    3.33 -            }
    3.34 +            int lastWS = getLastWS(doc.getText(offset - readLength, readLength), SmartyFramework.getOpenDelimiter(NbEditorUtilities.getFileObject(doc)));
    3.35              return doc.getText(offset - lastWS, lastWS);
    3.36          } catch (BadLocationException ex) {
    3.37              Exceptions.printStackTrace(ex);
    3.38 @@ -77,10 +72,12 @@
    3.39          return getTextPrefix(doc, offset).length();
    3.40      }
    3.41  
    3.42 -    public static int getLastWS(String area) {
    3.43 -        for (int i = area.length()-1; i >= 0; i--) {
    3.44 +    public static int getLastWS(String area, String openDelimiter) {
    3.45 +        for (int i = area.length() - 1; i >= 0; i--) {
    3.46              if (LexerUtils.isWS(area.charAt(i))) {
    3.47 -                return area.length()-i-1;
    3.48 +                return area.length() - i - 1;
    3.49 +            } else if (area.substring(i).startsWith(openDelimiter)) {
    3.50 +                return area.length() - i - openDelimiter.length();
    3.51              }
    3.52          }
    3.53          return area.length();
    3.54 @@ -90,4 +87,18 @@
    3.55          return text.toLowerCase(Locale.ENGLISH).startsWith(prefix.toLowerCase(Locale.ENGLISH));
    3.56      }
    3.57  
    3.58 +    public static boolean insideSmartyCode(Document doc, int offset) {
    3.59 +        TokenHierarchy tokenHierarchy = TokenHierarchy.get(doc);
    3.60 +        TokenSequence tokenSequence = tokenHierarchy.tokenSequence();
    3.61 +
    3.62 +        tokenSequence.move(offset);
    3.63 +        if (tokenSequence.moveNext() || tokenSequence.movePrevious()) {
    3.64 +            Object tokenID = tokenSequence.token().id();
    3.65 +            if (tokenID == TplTopTokenId.T_HTML || tokenID == TplTopTokenId.T_SMARTY_CLOSE_DELIMITER) {
    3.66 +                return false;
    3.67 +            }
    3.68 +        }
    3.69 +        return true;
    3.70 +    }
    3.71 +
    3.72  }
     4.1 --- a/php.smarty/src/org/netbeans/modules/php/smarty/editor/completion/TplCompletionProvider.java	Mon Jun 14 10:39:20 2010 +0200
     4.2 +++ b/php.smarty/src/org/netbeans/modules/php/smarty/editor/completion/TplCompletionProvider.java	Mon Jun 14 14:35:44 2010 +0200
     4.3 @@ -88,7 +88,7 @@
     4.4  
     4.5      private static class Query extends AbstractQuery {
     4.6  
     4.7 -        private volatile Collection<? extends CompletionItem> items =  Collections.<CompletionItem>emptyList();
     4.8 +        private volatile Collection<? extends CompletionItem> items = Collections.<CompletionItem>emptyList();
     4.9          private JTextComponent component;
    4.10  
    4.11          @Override
    4.12 @@ -100,7 +100,7 @@
    4.13          protected void doQuery(CompletionResultSet resultSet, Document doc, int caretOffset) {
    4.14              try {
    4.15                  TplCompletionQuery.CompletionResult result = new TplCompletionQuery(doc, caretOffset).query();
    4.16 -                if(result != null) {
    4.17 +                if (result != null && CodeCompletionUtils.insideSmartyCode(doc, caretOffset)) {
    4.18                      items = result.getItems();
    4.19                  } else {
    4.20                      items = Collections.emptyList();
    4.21 @@ -117,9 +117,9 @@
    4.22              String prefix = CodeCompletionUtils.getTextPrefix(component.getDocument(), component.getCaretPosition());
    4.23  
    4.24              //check the items
    4.25 -            for(CompletionItem item : items) {
    4.26 -                if(item instanceof TplCompletionItem) {
    4.27 -                    if(CodeCompletionUtils.startsWithIgnoreCase( ((TplCompletionItem)item).getItemText(), prefix)) {
    4.28 +            for (CompletionItem item : items) {
    4.29 +                if (item instanceof TplCompletionItem) {
    4.30 +                    if (CodeCompletionUtils.startsWithIgnoreCase(((TplCompletionItem) item).getItemText(), prefix)) {
    4.31                          return true; //at least one item will remain
    4.32                      }
    4.33                  }
    4.34 @@ -133,15 +133,16 @@
    4.35              String prefix = CodeCompletionUtils.getTextPrefix(component.getDocument(), component.getCaretPosition());
    4.36  
    4.37              //check the items
    4.38 -            for(CompletionItem item : items) {
    4.39 -                if(item instanceof TplCompletionItem) {
    4.40 -                    if(CodeCompletionUtils.startsWithIgnoreCase(((TplCompletionItem)item).getItemText(), prefix)) {
    4.41 +            for (CompletionItem item : items) {
    4.42 +                if (item instanceof TplCompletionItem) {
    4.43 +                    if (CodeCompletionUtils.startsWithIgnoreCase(((TplCompletionItem) item).getItemText(), prefix)) {
    4.44                          resultSet.addItem(item);
    4.45                      }
    4.46                  }
    4.47              }
    4.48              resultSet.finish();
    4.49          }
    4.50 +
    4.51      }
    4.52  
    4.53      public static class DocQuery extends AbstractQuery {
     5.1 --- a/php.smarty/src/org/netbeans/modules/php/smarty/editor/embedding/TplEmbeddingProvider.java	Mon Jun 14 10:39:20 2010 +0200
     5.2 +++ b/php.smarty/src/org/netbeans/modules/php/smarty/editor/embedding/TplEmbeddingProvider.java	Mon Jun 14 14:35:44 2010 +0200
     5.3 @@ -60,6 +60,7 @@
     5.4  public class TplEmbeddingProvider extends EmbeddingProvider {
     5.5  
     5.6      public static final String GENERATED_CODE = "@@@"; //NOI18N
     5.7 +    private boolean isPhpEnabled;
     5.8  
     5.9      @Override
    5.10      public List<Embedding> getEmbeddings(Snapshot snapshot) {
    5.11 @@ -86,10 +87,10 @@
    5.12          while (sequence.moveNext()) {
    5.13              Token t = sequence.token();
    5.14              if (t.id().getClass() == TplTopTokenId.class && isSmartyToken((TplTopTokenId) t.id())) {
    5.15 -//                if (isPhpEnabled) {
    5.16 -//                    isPhpEnabled = false;
    5.17 -//                    embeddings.add(snapshot.create(";?>", "text/x-php5"));
    5.18 -//                }
    5.19 +                if (isPhpEnabled) {
    5.20 +                    isPhpEnabled = false;
    5.21 +                    embeddings.add(snapshot.create(";?>", "text/x-php5"));
    5.22 +                }
    5.23                  if (from < 0) {
    5.24                      from = sequence.offset();
    5.25                  }
    5.26 @@ -104,21 +105,21 @@
    5.27                  }
    5.28                  len += t.length();
    5.29                  if (from >= 0) {
    5.30 -//                    if (t.id() == TplTopTokenId.T_PHP) {
    5.31 -//                        if (!isPhpEnabled) {
    5.32 -//                            isPhpEnabled = true;
    5.33 -//                            embeddings.add(snapshot.create("<?", "text/x-php5"));
    5.34 -//                        }
    5.35 -//                        embeddings.add(snapshot.create(from, len, "text/x-php5")); //NOI18N
    5.36 -//                    } else {
    5.37 -//                        if (isPhpEnabled) {
    5.38 -//                            isPhpEnabled = false;
    5.39 -//                            embeddings.add(snapshot.create(";?>", "text/x-php5"));
    5.40 -//                        }
    5.41 -                        embeddings.add(snapshot.create(GENERATED_CODE, "text/x-php5"));
    5.42 +                    if (t.id() == TplTopTokenId.T_PHP) {
    5.43 +                        if (!isPhpEnabled) {
    5.44 +                            isPhpEnabled = true;
    5.45 +                            embeddings.add(snapshot.create("<?", "text/x-php5"));
    5.46 +                        }
    5.47                          embeddings.add(snapshot.create(from, len, "text/x-php5")); //NOI18N
    5.48 -                        embeddings.add(snapshot.create(GENERATED_CODE, "text/x-php5"));
    5.49 -//                    }
    5.50 +                    } else {
    5.51 +                        if (isPhpEnabled) {
    5.52 +                            isPhpEnabled = false;
    5.53 +                            embeddings.add(snapshot.create(";?>", "text/x-php5"));
    5.54 +                        }
    5.55 +//                        embeddings.add(snapshot.create(GENERATED_CODE, "text/x-php5"));
    5.56 +                        embeddings.add(snapshot.create(from, len, "text/x-php5")); //NOI18N
    5.57 +//                        embeddings.add(snapshot.create(GENERATED_CODE, "text/x-php5"));
    5.58 +                    }
    5.59                  }
    5.60  
    5.61                  from = -1;
    5.62 @@ -126,9 +127,9 @@
    5.63              }
    5.64          }
    5.65          if (from >= 0) {
    5.66 -            embeddings.add(snapshot.create(GENERATED_CODE, "text/x-php5"));
    5.67 +//            embeddings.add(snapshot.create(GENERATED_CODE, "text/x-php5"));
    5.68              embeddings.add(snapshot.create(from, len, "text/x-php5")); //NOI18N
    5.69 -            embeddings.add(snapshot.create(GENERATED_CODE, "text/x-php5"));
    5.70 +//            embeddings.add(snapshot.create(GENERATED_CODE, "text/x-php5"));
    5.71          }
    5.72          if (embeddings.isEmpty()) {
    5.73              return Collections.emptyList();
     6.1 --- a/php.smarty/src/org/netbeans/modules/php/smarty/editor/lexer/TplTopTokenId.java	Mon Jun 14 10:39:20 2010 +0200
     6.2 +++ b/php.smarty/src/org/netbeans/modules/php/smarty/editor/lexer/TplTopTokenId.java	Mon Jun 14 14:35:44 2010 +0200
     6.3 @@ -36,7 +36,6 @@
     6.4   *
     6.5   * Portions Copyrighted 2008 Sun Microsystems, Inc.
     6.6   */
     6.7 -
     6.8  package org.netbeans.modules.php.smarty.editor.lexer;
     6.9  
    6.10  import java.util.Collection;
    6.11 @@ -61,16 +60,15 @@
    6.12   */
    6.13  public enum TplTopTokenId implements TokenId {
    6.14  
    6.15 -    T_HTML (null, "smartytop"),
    6.16 -    T_SMARTY (null, "smarty"),
    6.17 -    T_SMARTY_CLOSE_DELIMITER (null, "smarty_delimiter"),
    6.18 -    T_SMARTY_OPEN_DELIMITER (null, "smarty_delimiter"),
    6.19 +    T_HTML(null, "smartytop"),
    6.20 +    T_SMARTY(null, "smarty"),
    6.21 +    T_SMARTY_CLOSE_DELIMITER(null, "smarty_delimiter"),
    6.22 +    T_SMARTY_OPEN_DELIMITER(null, "smarty_delimiter"),
    6.23      T_COMMENT(null, "comment"),
    6.24      T_LITERAL_DEL(null, "literal"),
    6.25      T_ERROR(null, "error"),
    6.26      T_PHP(null, "php_embedding"),
    6.27      T_PHP_DEL(null, "php_del");
    6.28 -
    6.29      private final String fixedText;
    6.30      private final String primaryCategory;
    6.31  
    6.32 @@ -78,15 +76,14 @@
    6.33          this.fixedText = fixedText;
    6.34          this.primaryCategory = primaryCategory;
    6.35      }
    6.36 -    
    6.37 +
    6.38      public String fixedText() {
    6.39          return fixedText;
    6.40      }
    6.41 -    
    6.42 +
    6.43      public String primaryCategory() {
    6.44          return primaryCategory;
    6.45      }
    6.46 -
    6.47      private static final Language<TplTopTokenId> language =
    6.48              new LanguageHierarchy<TplTopTokenId>() {
    6.49  
    6.50 @@ -110,15 +107,14 @@
    6.51                  protected String mimeType() {
    6.52                      return "text/x-tpl";
    6.53                  }
    6.54 -                
    6.55 +
    6.56                  @Override
    6.57                  protected LanguageEmbedding<?> embedding(Token<TplTopTokenId> token,
    6.58 -                    LanguagePath languagePath, InputAttributes inputAttributes) {
    6.59 +                        LanguagePath languagePath, InputAttributes inputAttributes) {
    6.60                      TplTopTokenId id = token.id();
    6.61                      if (id == T_HTML) {
    6.62 -                        return LanguageEmbedding.create(HTMLTokenId.language(), 0, 0, true);
    6.63 -                    } 
    6.64 -                    else if (id == T_SMARTY) {
    6.65 +                        return LanguageEmbedding.create(PHPTokenId.language(), 0, 0, true);
    6.66 +                    } else if (id == T_SMARTY) {
    6.67                          return LanguageEmbedding.create(TplTokenId.language(), 0, 0, false);
    6.68                      } else if (id == T_PHP) {
    6.69                          return LanguageEmbedding.create(PHPTokenId.languageInPHP(), 0, 0, true);
    6.70 @@ -126,15 +122,13 @@
    6.71  
    6.72                      return null; // No embedding
    6.73                  }
    6.74 -                
    6.75              }.language();
    6.76  
    6.77 -            /**
    6.78 -             * Is returning top level language.
    6.79 -             * @return top level Language
    6.80 -             */
    6.81 -            public static Language<TplTopTokenId> language() {
    6.82 +    /**
    6.83 +     * Is returning top level language.
    6.84 +     * @return top level Language
    6.85 +     */
    6.86 +    public static Language<TplTopTokenId> language() {
    6.87          return language;
    6.88      }
    6.89 -
    6.90  }