summaryrefslogtreecommitdiff
path: root/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java')
-rw-r--r--platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java96
1 files changed, 76 insertions, 20 deletions
diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java
index cf9b5ad22798..50f69088033b 100644
--- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java
+++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java
@@ -32,6 +32,7 @@ import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.impl.ActionButton;
import com.intellij.openapi.application.ApplicationBundle;
+import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
@@ -47,6 +48,7 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.SmartPointerManager;
import com.intellij.psi.SmartPsiElementPointer;
import com.intellij.ui.IdeBorderFactory;
+import com.intellij.ui.JBColor;
import com.intellij.ui.SideBorder;
import com.intellij.ui.components.JBLayeredPane;
import com.intellij.ui.components.JBScrollPane;
@@ -66,10 +68,9 @@ import javax.swing.event.HyperlinkListener;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
-import java.util.Collections;
+import java.net.URL;
+import java.util.*;
import java.util.List;
-import java.util.Map;
-import java.util.Stack;
public class DocumentationComponent extends JPanel implements Disposable, DataProvider {
@@ -92,7 +93,7 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
private final Stack<Context> myBackStack = new Stack<Context>();
private final Stack<Context> myForwardStack = new Stack<Context>();
private final ActionToolbar myToolBar;
- private boolean myIsEmpty;
+ private volatile boolean myIsEmpty;
private boolean myIsShown;
private final JLabel myElementLabel;
private Style myFontSizeStyle;
@@ -101,6 +102,13 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
private final MyShowSettingsButton myShowSettingsButton;
private boolean myIgnoreFontSizeSliderChange;
private String myEffectiveExternalUrl;
+ private final MyDictionary<String, Image> myImageProvider = new MyDictionary<String, Image>() {
+ @Override
+ public Image get(Object key) {
+ PsiElement element = getElement();
+ return element == null ? null : myManager.getElementImage(element, ((URL)key).toExternalForm());
+ }
+ };
private static class Context {
final SmartPsiElementPointer element;
@@ -178,6 +186,14 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
GraphicsUtil.setupAntialiasing(g);
super.paintComponent(g);
}
+
+ @Override
+ public void setDocument(Document doc) {
+ super.setDocument(doc);
+ if (doc instanceof StyledDocument) {
+ doc.putProperty("imageCache", myImageProvider);
+ }
+ }
};
DataProvider helpDataProvider = new DataProvider() {
@Override
@@ -308,6 +324,10 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
if (additionalActions != null) {
for (final AnAction action : additionalActions) {
actions.add(action);
+ ShortcutSet shortcutSet = action.getShortcutSet();
+ if (shortcutSet != null) {
+ action.registerCustomShortcutSet(shortcutSet, this);
+ }
}
}
@@ -378,7 +398,7 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
myFontSizeSlider.setSnapToTicks(true);
UIUtil.setSliderIsFilled(myFontSizeSlider, true);
result.add(myFontSizeSlider);
- result.setBorder(BorderFactory.createLineBorder(UIUtil.getBorderColor(), 1));
+ result.setBorder(BorderFactory.createLineBorder(JBColor.border(), 1));
myFontSizeSlider.addChangeListener(new ChangeListener() {
@Override
@@ -418,11 +438,11 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
}
}
- public synchronized boolean isEmpty() {
+ public boolean isEmpty() {
return myIsEmpty;
}
- public synchronized void startWait() {
+ public void startWait() {
myIsEmpty = true;
}
@@ -473,7 +493,8 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
}
public void replaceText(String text, PsiElement element) {
- if (element == null || getElement() != element) return;
+ PsiElement current = getElement();
+ if (current == null || !current.getManager().areElementsEquivalent(current, element)) return;
setText(text, element, false);
if (!myBackStack.empty()) myBackStack.pop();
}
@@ -530,6 +551,7 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
myText = text;
}
+ //noinspection SSBasedInspection
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
@@ -544,7 +566,7 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
return;
}
- StyledDocument styledDocument = (StyledDocument)document;
+ final StyledDocument styledDocument = (StyledDocument)document;
if (myFontSizeStyle == null) {
myFontSizeStyle = styledDocument.addStyle("active", null);
}
@@ -555,7 +577,14 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
if (Registry.is("documentation.component.editor.font")) {
StyleConstants.setFontFamily(myFontSizeStyle, scheme.getEditorFontName());
}
- styledDocument.setCharacterAttributes(0, document.getLength(), myFontSizeStyle, false);
+
+ final Style sizeStyle = myFontSizeStyle;
+ ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
+ @Override
+ public void run() {
+ styledDocument.setCharacterAttributes(0, styledDocument.getLength(), sizeStyle, false);
+ }
+ });
}
private void goBack() {
@@ -631,15 +660,10 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
private class EditDocumentationSourceAction extends BaseNavigateToSourceAction {
- protected EditDocumentationSourceAction() {
+ EditDocumentationSourceAction() {
super(true);
- }
-
- @Override
- public void update(AnActionEvent event) {
- super.update(event);
- event.getPresentation().setIcon(AllIcons.Actions.EditSource);
- event.getPresentation().setText("Edit Source");
+ getTemplatePresentation().setIcon(AllIcons.Actions.EditSource);
+ getTemplatePresentation().setText("Edit Source");
}
@Override
@@ -678,8 +702,8 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
final PsiElement originalElement = DocumentationManager.getOriginalElement(element);
boolean processed = false;
if (provider instanceof CompositeDocumentationProvider) {
- for (final DocumentationProvider documentationProvider : ((CompositeDocumentationProvider)provider).getProviders()) {
- if (documentationProvider instanceof ExternalDocumentationHandler && ((ExternalDocumentationHandler)documentationProvider).handleExternal(element, originalElement)) {
+ for (DocumentationProvider p : ((CompositeDocumentationProvider)provider).getAllProviders()) {
+ if (p instanceof ExternalDocumentationHandler && ((ExternalDocumentationHandler)p).handleExternal(element, originalElement)) {
processed = true;
break;
}
@@ -874,4 +898,36 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
mySettingsPanel.setVisible(true);
}
}
+
+ private static abstract class MyDictionary<K, V> extends Dictionary<K, V> {
+ @Override
+ public int size() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean isEmpty() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Enumeration<K> keys() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Enumeration<V> elements() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public V put(K key, V value) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public V remove(Object key) {
+ throw new UnsupportedOperationException();
+ }
+ }
}