import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.SmartList;
+import com.intellij.util.ui.UIUtil;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
});
final HighlightInfoComposite composite = new HighlightInfoComposite(infos);
if (bigRenderer == null) {
- bigRenderer = new MyRenderer(composite.toolTip);
+ bigRenderer = new MyRenderer(UIUtil.convertSpace2Nbsp(composite.toolTip));
}
else {
- final LineTooltipRenderer renderer = new MyRenderer(composite.toolTip);
+ final LineTooltipRenderer renderer = new MyRenderer(UIUtil.convertSpace2Nbsp(composite.toolTip));
renderer.addBelow(bigRenderer.getText());
bigRenderer = renderer;
}
import com.intellij.util.ArrayUtil;
import com.intellij.util.Processor;
import com.intellij.util.ui.EmptyIcon;
+import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
text += getMessageByRoots(status.noInspectionRoots, status.rootsNumber, "no.inspections.performed");
text += HTML_FOOTER;
- text = text.replaceAll(" ", " ");
+ text = UIUtil.convertSpace2Nbsp(text);
return text;
}
private void showDescription(final String shortName, final Editor editor, final JEditorPane tooltip) {
final String description = getDescription(shortName, editor);
if (description == null) return;
- final JEditorPane pane = LineTooltipRenderer.initPane(description, new HintHint(tooltip, new Point(0, 0)));
+ final JEditorPane pane = LineTooltipRenderer.initPane(description, new HintHint(tooltip, new Point(0, 0)), editor.getComponent().getRootPane().getLayeredPane());
pane.select(0, 0);
pane.setPreferredSize(new Dimension(3 * tooltip.getPreferredSize().width /2, 200));
final JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(pane);
myText = myText.replaceAll(String.valueOf(UIUtil.MNEMONIC), "");
final boolean expanded = myCurrentWidth > 0 && dressDescription(editor);
- //pane
- final JEditorPane pane = initPane(myText, hintHint);
- pane.setCaretPosition(0);
final HintManagerImpl hintManager = HintManagerImpl.getInstanceImpl();
final JComponent contentComponent = editor.getContentComponent();
final JComponent editorComponent = editor.getComponent();
final JLayeredPane layeredPane = editorComponent.getRootPane().getLayeredPane();
+ //pane
+ final JEditorPane pane = initPane(myText, hintHint, layeredPane);
+ pane.setCaretPosition(0);
+
int widthLimit = layeredPane.getWidth() - 10;
int heightLimit = layeredPane.getHeight() - 5;
- final JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(pane);
- scrollPane.setBorder(null);
int width = expanded ? 3 * myCurrentWidth / 2 : pane.getPreferredSize().width;
int height = expanded ? Math.max(pane.getPreferredSize().height, 150) : pane.getPreferredSize().height;
p.y = 3;
}
- locateOutsideMouseCursor(editor, layeredPane, p, width, height, heightLimit);
+ if (!hintHint.isAwtTooltip()) {
+ locateOutsideMouseCursor(editor, layeredPane, p, width, height, heightLimit);
+
+ // in order to restrict tooltip size
+ pane.setSize(width, height);
+ pane.setMaximumSize(new Dimension(width, height));
+ pane.setMinimumSize(new Dimension(width, height));
+ pane.setPreferredSize(new Dimension(width, height));
+ }
+
- // in order to restrict tooltip size
- pane.setSize(width, height);
- pane.setMaximumSize(new Dimension(width, height));
- pane.setMinimumSize(new Dimension(width, height));
- pane.setPreferredSize(new Dimension(width, height));
+ final JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(pane);
+ scrollPane.setBorder(null);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
protected boolean dressDescription(Editor editor) { return false; }
protected void stripDescription() {}
- static JEditorPane initPane(@NonNls String text, HintHint hintHint) {
+ static JEditorPane initPane(@NonNls String text, HintHint hintHint, JLayeredPane layeredPane) {
+ final Ref<Dimension> prefSize = new Ref<Dimension>(null);
text = "<html><head>" + UIUtil.getCssFontDeclaration(hintHint.getTextFont(), hintHint.getTextForeground()) + "</head><body>" + getHtmlBody(text) + "</body></html>";
- final JEditorPane pane = new JEditorPane(UIUtil.HTML_MIME, text);
+ final JEditorPane pane = new JEditorPane(UIUtil.HTML_MIME, text) {
+ @Override
+ public Dimension getPreferredSize() {
+ return prefSize.get() != null ? prefSize.get() : super.getPreferredSize();
+ }
+ };
pane.setEditable(false);
if (hintHint.isOwnBorderAllowed()) {
pane.setBorder(null);
}
+ if (hintHint.isAwtTooltip()) {
+ Dimension size = layeredPane.getSize();
+ int fitWidth = (int)(size.width * 0.8);
+ Dimension prefSizeOriginal = pane.getPreferredSize();
+ if (prefSizeOriginal.width > fitWidth) {
+ pane.setSize(new Dimension(fitWidth, Integer.MAX_VALUE));
+ Dimension fixedWidthSize = pane.getPreferredSize();
+ prefSize.set(new Dimension(fitWidth, fixedWidthSize.height));
+ } else {
+ prefSize.set(prefSizeOriginal);
+ }
+ }
+
+
pane.setOpaque(hintHint.isOpaqueAllowed());
pane.setBackground(hintHint.getTextBackground());
public boolean shouldSurvive(final MouseEvent e) {
if (myCurrentTooltip != null) {
+ if (myCurrentTooltip.canControlAutoHide()) return true;
final Point pointOnComponent = new RelativePoint(e).getPointOn(myCurrentTooltip.getComponent()).getPoint();
final Rectangle bounds = myCurrentTooltip.getBounds();
if (bounds.x - 10 < pointOnComponent.x && bounds.width + bounds.x + 10 > pointOnComponent.x) {//do not hide hovered tooltip
return myToCenter;
}
- protected boolean canAutohideOn(MouseEvent me) {
+ protected boolean canAutohideOn(MouseEvent me, boolean isInsideBalloon) {
return true;
}
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ApplicationComponent;
-import com.intellij.openapi.ui.popup.Balloon;
import com.intellij.openapi.ui.popup.BalloonBuilder;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.registry.RegistryValue;
import com.intellij.openapi.util.registry.RegistryValueListener;
+import com.intellij.ui.BalloonImpl;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.util.Alarm;
import com.intellij.util.ui.UIUtil;
private RegistryValue myIsEnabled;
private Component myCurrentComponent;
- private Balloon myCurrentTipUi;
+ private BalloonImpl myCurrentTipUi;
private MouseEvent myCurrentEvent;
private boolean myCurrentTipIsCentered;
beforeShow.run();
}
- myCurrentTipUi = builder.createBalloon();
+ myCurrentTipUi = (BalloonImpl)builder.createBalloon();
myCurrentComponent = tooltip.getComponent();
myX = effectivePoint.x;
myY = effectivePoint.y;
}
private boolean hideCurrent(@Nullable MouseEvent me) {
- if (me != null && myCurrentTooltip != null && !myCurrentTooltip.canAutohideOn(me)) return false;
+ if (me != null && myCurrentTooltip != null && myCurrentTipUi != null) {
+ if (!myCurrentTooltip.canAutohideOn(me, myCurrentTipUi.isInsideBalloon(me))) return false;
+ }
if (myCurrentTipUi != null) {
myCurrentTipUi.hide();
if (highlighters.isEmpty()) return false;
TooltipRenderer bigRenderer = myTooltipRendererProvider.calcTooltipRenderer(highlighters);
if (bigRenderer != null) {
- showTooltip(e, bigRenderer, new HintHint(e));
+ showTooltip(e, bigRenderer, new HintHint(e).setAwtTooltip(true).setPreferredPosition(Balloon.Position.atLeft));
return true;
}
return false;
private boolean myFadedOut;
private int myCalloutshift;
- private boolean isInsideBalloon(MouseEvent me) {
+ public boolean isInsideBalloon(MouseEvent me) {
if (!me.getComponent().isShowing()) return true;
if (SwingUtilities.isDescendingFrom(me.getComponent(), myComp) || me.getComponent() == myComp) return true;
if (hintInfo.isAwtTooltip()) {
- myCurrentIdeTooltip = IdeTooltipManager.getInstance().showTipNow(new IdeTooltip(hintInfo.getOriginalComponent(), hintInfo.getOriginalPoint(), myComponent) {
+ IdeTooltip tooltip = new IdeTooltip(hintInfo.getOriginalComponent(), hintInfo.getOriginalPoint(), myComponent) {
@Override
- protected boolean canAutohideOn(MouseEvent me) {
- return me.getComponent() != hintInfo.getOriginalComponent();
+ protected boolean canAutohideOn(MouseEvent me, boolean isInsideBalloon) {
+ return me.getComponent() != hintInfo.getOriginalComponent() && !isInsideBalloon;
}
@Override
protected void onHidden() {
fireHintHidden();
}
- });
+ };
+ tooltip.setPreferredPosition(hintInfo.getPreferredPosition());
+ myComponent.validate();
+ myCurrentIdeTooltip = IdeTooltipManager.getInstance().showTipNow(tooltip);
} else {
final Point layeredPanePoint = SwingUtilities.convertPoint(parentComponent, x, y, layeredPane);
myComponent.setBounds(layeredPanePoint.x, layeredPanePoint.y, preferredSize.width, preferredSize.height);
public String toString() {
return getComponent().toString();
}
+
+ public boolean canControlAutoHide() {
+ return myCurrentIdeTooltip != null;
+ }
}
return String.format("<p style=\"margin: 0 %dpx 0 %dpx;\">%s</p>", hPadding, hPadding, html);
}
+ public static String convertSpace2Nbsp(String html) {
+ StringBuffer result = new StringBuffer();
+ int currentPos = 0;
+ int braces = 0;
+ while (currentPos < html.length()) {
+ String each = html.substring(currentPos, currentPos + 1);
+ if ("<".equals(each)) {
+ braces++;
+ } else if (">".equals(each)) {
+ braces--;
+ }
+
+ if (" ".equals(each) && braces == 0) {
+ result.append(" ");
+ } else {
+ result.append(each);
+ }
+ currentPos++;
+ }
+
+ String text = result.toString();
+ int htmlTag = text.toLowerCase().lastIndexOf("</html>");
+
+ if (htmlTag >= 0) {
+ text = text.substring(0, htmlTag) + "<br><br>" + text.substring(htmlTag);
+ }
+
+ return result.toString();
+ }
+
public static void invokeLaterIfNeeded(@NotNull Runnable runnable) {
if (SwingUtilities.isEventDispatchThread()) {
runnable.run();