/*
 * Copyright 2000-2014 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.intellij.codeInsight.documentation;

import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.popup.JBPopup;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowId;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.psi.PsiElement;
import com.intellij.ui.content.Content;
import com.intellij.ui.popup.AbstractPopup;
import com.intellij.util.Producer;
import org.jetbrains.annotations.NotNull;

import javax.swing.*;

/**
 * @author gregsh
 */
public class QuickDocUtil {

  public static void updateQuickDocAsync(@NotNull final PsiElement element, @NotNull final Producer<String> docProducer) {
    final Project project = element.getProject();
    ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
      @Override
      public void run() {
        final String documentation = docProducer.produce();
        if (StringUtil.isEmpty(documentation)) return;
        // modal dialogs with fragment editors fix: can't guess proper modality state here
        //noinspection SSBasedInspection
        SwingUtilities.invokeLater(new Runnable() {
          @Override
          public void run() {
            DocumentationManager documentationManager = DocumentationManager.getInstance(project);
            DocumentationComponent component;
            JBPopup hint = documentationManager.getDocInfoHint();
            if (hint != null) {
              component = (DocumentationComponent)((AbstractPopup)hint).getComponent();
            }
            else if (documentationManager.hasActiveDockedDocWindow()) {
              ToolWindow toolWindow = ToolWindowManager.getInstance(project).getToolWindow(ToolWindowId.DOCUMENTATION);
              Content selectedContent = toolWindow == null ? null : toolWindow.getContentManager().getSelectedContent();
              component = selectedContent == null ? null : (DocumentationComponent)selectedContent.getComponent();
            }
            else {
              component = null;
            }
            if (component != null) {
              component.replaceText(documentation, element);
            }
          }
        });
      }
    });
  }
}

@@ -1133,24 +1133,60 @@
 l.Producer;%0A
+import com.intellij.util.ui.UIUtil;%0A
 import org.j
@@ -1219,29 +1219,49 @@
 ll;%0A
-%0A
 import 
-javax.swing.*
+org.jetbrains.annotations.Nullable
 ;%0A%0A/
@@ -1620,36 +1620,40 @@
     
-final String documentation =
+updateQuickDoc(project, element,
  doc
@@ -1670,22 +1670,183 @@
 roduce()
+)
 ;%0A    
+  %7D%0A    %7D);%0A  %7D%0A%0A  public static void updateQuickDoc(@NotNull final Project project, @NotNull final PsiElement element, @Nullable final String documentation) %7B%0A
     if (
@@ -1888,20 +1888,16 @@
 return;%0A
-    
     // m
@@ -1983,67 +1983,14 @@
     
-    //noinspection SSBasedInspection%0A        SwingUtilities
+UIUtil
 .inv
@@ -1997,16 +1997,24 @@
 okeLater
+IfNeeded
 (new Run
@@ -2029,20 +2029,16 @@
 %7B%0A      
-    
 @Overrid
@@ -2039,20 +2039,16 @@
 verride%0A
-    
       pu
@@ -2065,36 +2065,32 @@
 run() %7B%0A        
-    
 DocumentationMan
@@ -2164,28 +2164,24 @@
 t);%0A        
-    
 Documentatio
@@ -2202,20 +2202,16 @@
 ponent;%0A
-    
         
@@ -2268,28 +2268,24 @@
 ();%0A        
-    
 if (hint != 
@@ -2284,36 +2284,32 @@
 hint != null) %7B%0A
-    
           compon
@@ -2380,34 +2380,26 @@
 ();%0A        
-   
- 
 %7D%0A
-    
         else
@@ -2450,28 +2450,24 @@
 Window()) %7B%0A
-    
           To
@@ -2580,20 +2580,16 @@
         
-   
- 
 Content 
@@ -2689,36 +2689,32 @@
 nt();%0A          
-    
 component = sele
@@ -2806,32 +2806,26 @@
         
- 
-   %7D%0A  
+%7D%0A
         
   else %7B
@@ -2820,21 +2820,15 @@
     
-  
 else %7B%0A
-    
     
@@ -2859,32 +2859,26 @@
         
-    %7D%0A  
+%7D%0A
         
   if (co
@@ -2865,26 +2865,24 @@
   %7D%0A        
-  
 if (componen
@@ -2890,28 +2890,24 @@
  != null) %7B%0A
-    
           co
@@ -2963,37 +2963,9 @@
     
-    %7D%0A          %7D%0A        %7D);
+%7D
 %0A   

add sync update method