# and . zen coding selectors works even if there is no $ATTRS$ var in a template
authorEugene Kudelevsky <Eugene.Kudelevsky@jetbrains.com>
Tue, 16 Feb 2010 17:12:04 +0000 (20:12 +0300)
committerEugene Kudelevsky <Eugene.Kudelevsky@jetbrains.com>
Tue, 16 Feb 2010 17:12:04 +0000 (20:12 +0300)
xml/impl/src/com/intellij/codeInsight/template/XmlCustomLiveTemplate.java

index 4b5958f3c13e12a9a5234c43f238206fc5140578..a34969659c9815807a7dba0c7b017474ccc82528 100644 (file)
@@ -118,12 +118,7 @@ public class XmlCustomLiveTemplate implements CustomLiveTemplate {
             return null;
           }
           String prefix = getPrefix(key);
-          if (callback.isLiveTemplateApplicable(prefix)) {
-            if (!prefix.equals(key) && !callback.isTemplateContainsVars(prefix, ATTRS)) {
-              return null;
-            }
-          }
-          else if (prefix.indexOf('<') >= 0) {
+          if (!callback.isLiveTemplateApplicable(prefix) && prefix.indexOf('<') >= 0) {
             return null;
           }
           result.add(new MyTemplateToken(key));
@@ -227,7 +222,9 @@ public class XmlCustomLiveTemplate implements CustomLiveTemplate {
     return result.toString();
   }
 
-  private static boolean invokeTemplate(String key, final CustomTemplateCallback callback, final TemplateInvokationListener listener) {
+  private static boolean prepareAndInvokeTemplate(String key,
+                                                  final CustomTemplateCallback callback,
+                                                  final TemplateInvokationListener listener) {
     String templateKey = null;
     String id = null;
     final List<String> classes = new ArrayList<String>();
@@ -261,6 +258,41 @@ public class XmlCustomLiveTemplate implements CustomLiveTemplate {
     return startTemplate(templateKey, callback, listener, attributes.length() > 0 ? ' ' + attributes : null);
   }
 
+  private static int findPlaceToInsertAttrs(@NotNull TemplateImpl template) {
+    String s = template.getString();
+    if (s.length() > 0) {
+      if (s.charAt(0) != '<') {
+        return -1;
+      }
+      int i = 1;
+      while (i < s.length() && !Character.isWhitespace(s.charAt(i)) && s.charAt(i) != '>') {
+        i++;
+      }
+      if (i == 1) {
+        return -1;
+      }
+      if (s.indexOf('>', i) >= i) {
+        return i;
+      }
+    }
+    return -1;
+  }
+
+  @Nullable
+  private static TemplateImpl generateTemplateWithAttributes(String key, String attributes, CustomTemplateCallback callback) {
+    TemplateImpl template = callback.findApplicableTemplate(key);
+    assert template != null;
+    String templateString = template.getString();
+    int offset = findPlaceToInsertAttrs(template);
+    if (offset >= 0) {
+      String newTemplateString = templateString.substring(0, offset) + attributes + templateString.substring(offset);
+      TemplateImpl newTemplate = template.copy();
+      newTemplate.setString(newTemplateString);
+      return newTemplate;
+    }
+    return null;
+  }
+
   private static boolean startTemplate(String key,
                                        CustomTemplateCallback callback,
                                        TemplateInvokationListener listener,
@@ -271,6 +303,12 @@ public class XmlCustomLiveTemplate implements CustomLiveTemplate {
       predefinedValues.put(ATTRS, attributes);
     }
     if (callback.isLiveTemplateApplicable(key)) {
+      if (attributes != null && !callback.templateContainsVars(key, ATTRS)) {
+        TemplateImpl newTemplate = generateTemplateWithAttributes(key, attributes, callback);
+        if (newTemplate != null) {
+          return callback.startTemplate(newTemplate, predefinedValues, listener);
+        }
+      }
       return callback.startTemplate(key, predefinedValues, listener);
     }
     else {
@@ -415,7 +453,7 @@ public class XmlCustomLiveTemplate implements CustomLiveTemplate {
                       }
                     }
                   };
-                  if (!invokeTemplate(templateKey, myCallback, listener)) {
+                  if (!prepareAndInvokeTemplate(templateKey, myCallback, listener)) {
                     return false;
                   }
                   templateKey = null;
@@ -496,7 +534,7 @@ public class XmlCustomLiveTemplate implements CustomLiveTemplate {
           }
         }
       };
-      if (!invokeTemplate(templateKey, myCallback, listener)) {
+      if (!prepareAndInvokeTemplate(templateKey, myCallback, listener)) {
         return false;
       }
       return true;
@@ -523,7 +561,7 @@ public class XmlCustomLiveTemplate implements CustomLiveTemplate {
             }
           }
         };
-        if (!invokeTemplate(templateKey, myCallback, listener)) {
+        if (!prepareAndInvokeTemplate(templateKey, myCallback, listener)) {
           return false;
         }
       }
@@ -558,7 +596,7 @@ public class XmlCustomLiveTemplate implements CustomLiveTemplate {
             }
           }
         };
-        if (!invokeTemplate(templateKey, myCallback, listener) || flag[0]) {
+        if (!prepareAndInvokeTemplate(templateKey, myCallback, listener) || flag[0]) {
           return false;
         }
       }