performance improvements
authorEugene Kudelevsky <Eugene.Kudelevsky@jetbrains.com>
Fri, 19 Feb 2010 18:33:42 +0000 (21:33 +0300)
committerEugene Kudelevsky <Eugene.Kudelevsky@jetbrains.com>
Fri, 19 Feb 2010 18:33:42 +0000 (21:33 +0300)
platform/lang-impl/src/com/intellij/codeInsight/template/CustomTemplateCallback.java
platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateManagerImpl.java
xml/impl/src/com/intellij/codeInsight/template/XmlCustomLiveTemplate.java

index 08906aebd5afec1a30238cc925b7d4621db24f5b..bc7f6008b0a3e62bbf6452bda27b57de5a67eb0e 100644 (file)
@@ -21,6 +21,7 @@ import com.intellij.codeInsight.template.impl.TemplateSettings;
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.editor.RangeMarker;
+import com.intellij.openapi.editor.ScrollType;
 import com.intellij.openapi.project.Project;
 import com.intellij.psi.PsiFile;
 import com.intellij.psi.codeStyle.CodeStyleManager;
@@ -43,6 +44,7 @@ public class CustomTemplateCallback {
   private int myStartOffset;
   private Project myProject;
   private RangeMarker myGlobalMarker;
+  private RangeMarker myEndOffsetMarker;
 
   //private final Map<Object, MyCheckpoint> myCheckpoints = new HashMap<Object, MyCheckpoint>();
   private final Map<Object, RangeMarker> myCheckpoints = new HashMap<Object, RangeMarker>();
@@ -66,6 +68,13 @@ public class CustomTemplateCallback {
     myGlobalMarker.setGreedyToRight(true);
   }
 
+  public void fixEndOffset() {
+    if (myEndOffsetMarker == null) {
+      int offset = myEditor.getCaretModel().getOffset();
+      myEndOffsetMarker = myEditor.getDocument().createRangeMarker(offset, offset);
+    }
+  }
+
   public boolean isLiveTemplateApplicable(@NotNull String key) {
     return findApplicableTemplate(key) != null;
   }
@@ -131,12 +140,13 @@ public class CustomTemplateCallback {
     final boolean[] templateFinished = new boolean[]{false};
     myTemplateManager.startTemplate(myEditor, template, false, predefinedVarValues, new TemplateEditingAdapter() {
       @Override
-      public void templateFinished(Template template, boolean brokenOff) {
-        final CodeStyleManager style = CodeStyleManager.getInstance(myProject);
+      public void templateFinished(Template template, final boolean brokenOff) {
         ApplicationManager.getApplication().runWriteAction(new Runnable() {
           public void run() {
-            //style.reformatText(myFile, myStartOffset, myStartOffset + lengthAfter - myStartLength);
-            style.reformatText(myFile, myGlobalMarker.getStartOffset(), myGlobalMarker.getEndOffset());
+            if (brokenOff) {
+              CodeStyleManager style = CodeStyleManager.getInstance(myProject);
+              style.reformatText(myFile, myGlobalMarker.getStartOffset(), myGlobalMarker.getEndOffset());
+            }
           }
         });
         if (brokenOff) return;
@@ -181,6 +191,19 @@ public class CustomTemplateCallback {
     return marker.getStartOffset();
   }
 
+  public void gotoEndOffset() {
+    if (myEndOffsetMarker != null) {
+      myEditor.getCaretModel().moveToOffset(myEndOffsetMarker.getStartOffset());
+    }
+  }
+
+  public void finish() {
+    myEditor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE);
+    final CodeStyleManager style = CodeStyleManager.getInstance(myProject);
+    style.reformatText(myFile, myGlobalMarker.getStartOffset(), myGlobalMarker.getEndOffset());
+    gotoEndOffset();
+  }
+
   private static List<TemplateImpl> getMatchingTemplates(@NotNull String templateKey) {
     TemplateSettings settings = TemplateSettings.getInstance();
     return settings.collectMatchingCandidates(templateKey, settings.getDefaultShortcutChar(), false);
index 6bfda59e3a57c395fa7693f58d4ac631d46d615c..aff173c2b22433993241e2aab51a0eead452878b 100644 (file)
@@ -232,7 +232,11 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo
           int offset = callback.getEditor().getCaretModel().getOffset();
           callback.getEditor().getDocument().deleteString(offset - key.length(), offset);
           callback.fixInitialEditorState();
-          customLiveTemplate.execute(key, callback, null);
+          customLiveTemplate.execute(key, callback, new TemplateInvokationListener() {
+            public void finished(boolean inSeparateEvent) {
+              callback.finish();
+            }
+          });
           return true;
         }
       }
index 1230ecaf200c11d986d5ddc9017c09320b3ff0a5..ad278de1351f2a192a826d94d5db52f5878fd181 100644 (file)
@@ -20,8 +20,6 @@ import com.intellij.lang.xml.XMLLanguage;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.editor.Editor;
-import com.intellij.openapi.editor.RangeMarker;
-import com.intellij.openapi.editor.ScrollType;
 import com.intellij.openapi.util.Pair;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiFile;
@@ -466,7 +464,6 @@ public class XmlCustomLiveTemplate implements CustomLiveTemplate {
     private final CustomTemplateCallback myCallback;
     private final TemplateInvokationListener myListener;
     private MyState myState;
-    private RangeMarker myEndOffsetMarker = null;
 
     private MyInterpreter(List<MyToken> tokens,
                           CustomTemplateCallback callback,
@@ -478,19 +475,8 @@ public class XmlCustomLiveTemplate implements CustomLiveTemplate {
       myState = initialState;
     }
 
-    private void fixEndOffset() {
-      if (myEndOffsetMarker == null) {
-        int offset = myCallback.getOffset();
-        myEndOffsetMarker = myCallback.getEditor().getDocument().createRangeMarker(offset, offset);
-      }
-    }
-
     private void finish(boolean inSeparateEvent) {
-      Editor editor = myCallback.getEditor();
-      if (myEndOffsetMarker != null) {
-        editor.getCaretModel().moveToOffset(myEndOffsetMarker.getStartOffset());
-      }
-      editor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE);
+      myCallback.gotoEndOffset();
       if (myListener != null) {
         myListener.finished(inSeparateEvent);
       }
@@ -538,7 +524,7 @@ public class XmlCustomLiveTemplate implements CustomLiveTemplate {
                     public void finished(boolean inSeparateEvent) {
                       myState = MyState.WORD;
                       if (myCallback.getOffset() != myCallback.getEndOfTemplate(key)) {
-                        fixEndOffset();
+                        myCallback.fixEndOffset();
                       }
                       if (sign == '+') {
                         myCallback.gotoEndOfTemplate(key);
@@ -647,7 +633,7 @@ public class XmlCustomLiveTemplate implements CustomLiveTemplate {
           public void finished(boolean inSeparateEvent) {
             myState = MyState.WORD;
             if (myCallback.getOffset() != myCallback.getEndOfTemplate(key)) {
-              fixEndOffset();
+              myCallback.fixEndOffset();
             }
             myCallback.gotoEndOfTemplate(key);
             if (inSeparateEvent) {
@@ -682,7 +668,7 @@ public class XmlCustomLiveTemplate implements CustomLiveTemplate {
             MyInterpreter interpreter = new MyInterpreter(myTokens, myCallback, MyState.WORD, new TemplateInvokationListener() {
               public void finished(boolean inSeparateEvent) {
                 if (myCallback.getOffset() != myCallback.getEndOfTemplate(key)) {
-                  fixEndOffset();
+                  myCallback.fixEndOffset();
                 }
                 myCallback.gotoEndOfTemplate(key);
                 if (inSeparateEvent) {