package jetbrains.mps.ide.tooltips;
/*Generated by MPS */
import com.intellij.openapi.components.ApplicationComponent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import com.intellij.ide.IdeTooltip;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.awt.Component;
import javax.swing.JComponent;
import java.awt.Point;
import java.awt.Frame;
import javax.swing.SwingUtilities;
import jetbrains.mps.util.HtmlCharsUtil;
import javax.swing.JLabel;
import com.intellij.ide.TooltipEvent;
import com.intellij.ide.IdeTooltipManager;
import com.intellij.openapi.application.ApplicationManager;
public class MPSToolTipManager implements ApplicationComponent {
private MouseAdapter myMouseListener = new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent p0) {
MPSToolTipManager.this.mouseMoved(p0, false);
}
};
private MouseAdapter myRightAlignedMouseListener;
private ToolTip myToolTip;
private IdeTooltip myIdeTooltip;
private String myText = null;
public MPSToolTipManager() {
}
@NonNls
@NotNull
@Override
public String getComponentName() {
return "MPSTooltipManager";
}
@Override
public void disposeComponent() {
}
@Override
public void initComponent() {
}
public void registerComponent(Component component) {
component.addMouseListener(myMouseListener);
component.addMouseMotionListener(myMouseListener);
}
public void unregisterComponent(Component component) {
component.removeMouseListener(myMouseListener);
component.removeMouseMotionListener(myMouseListener);
}
public void registerComponentRightAligned(Component component) {
component.addMouseListener(getRightAlignedMouseListener());
component.addMouseMotionListener(getRightAlignedMouseListener());
}
public void unregisterComponentRightAligned(Component component) {
component.removeMouseListener(getRightAlignedMouseListener());
component.removeMouseMotionListener(getRightAlignedMouseListener());
}
private MouseAdapter getRightAlignedMouseListener() {
if (myRightAlignedMouseListener == null) {
myRightAlignedMouseListener = new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent event) {
MPSToolTipManager.this.mouseMoved(event, true);
}
};
}
return myRightAlignedMouseListener;
}
private void mouseMoved(MouseEvent event, boolean rightAlined) {
Component c = event.getComponent();
if (!((c instanceof JComponent && c instanceof TooltipComponent))) {
return;
}
JComponent component = (JComponent) c;
Point point = component.getToolTipLocation(event);
if (point == null) {
point = event.getPoint();
}
String text = ((TooltipComponent) component).getMPSTooltipText(event);
if (text != null && text.length() > 0) {
showToolTip(text, component, point, rightAlined);
} else {
hideToolTip();
}
}
private Frame getContainingFrame(Component component) {
while (component.getParent() != null) {
component = component.getParent();
}
return (Frame) component;
}
public void showToolTip(ToolTipData data, JComponent component, Point point) {
showToolTip(data, component, point, false);
}
private void showToolTip(ToolTipData data, JComponent component, Point point, boolean rightAligned) {
if (myToolTip != null) {
if (eq_k25xh9_a0a0a0r(myToolTip.getText(), data.getText())) {
return;
}
hideToolTip();
}
myToolTip = new ToolTip(rightAligned);
Frame frame = getContainingFrame(component);
SwingUtilities.convertPointToScreen(point, component);
myToolTip.show(frame, point, data);
}
public void showToolTip(String text, JComponent component, Point point) {
showToolTip(text, component, point, false);
}
private void showToolTip(String text, JComponent component, Point point, boolean rightAligned) {
if (text == null) {
return;
}
if (text.contains("\n")) {
text = "<html>" + HtmlCharsUtil.asHtml(text, false) + "</html>";
}
if (eq_k25xh9_a0c0t(myText, text)) {
return;
}
myText = text;
JLabel label = new JLabel(text);
label.setOpaque(false);
myIdeTooltip = new IdeTooltip(component, point, label) {
@Override
protected boolean canAutohideOn(TooltipEvent event) {
// masking mouse events to prevent tooltip from hiding using default IDEA tooltips logic
// event will be hidden as a result of notification received by myMouseListener
if (event.getInputEvent() instanceof MouseEvent) {
return false;
}
return !(event.isIsEventInsideBalloon());
}
};
IdeTooltipManager.getInstance().show(myIdeTooltip, true);
}
public void hideToolTip() {
if (myToolTip != null) {
myToolTip.hide();
myToolTip = null;
}
if (myIdeTooltip != null) {
myIdeTooltip.hide();
myIdeTooltip = null;
}
myText = null;
}
public static MPSToolTipManager getInstance() {
return (ApplicationManager.getApplication() == null ? null : ApplicationManager.getApplication().getComponent(MPSToolTipManager.class));
}
private static boolean eq_k25xh9_a0a0a0r(Object a, Object b) {
return (a != null ? a.equals(b) : a == b);
}
private static boolean eq_k25xh9_a0c0t(Object a, Object b) {
return (a != null ? a.equals(b) : a == b);
}
}