package mage.client.components;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JEditorPane;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.event.HyperlinkEvent.EventType;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import mage.cards.repository.CardInfo;
import mage.cards.repository.CardRepository;
import mage.client.MageFrame;
import mage.client.dialog.PreferencesDialog;
import mage.client.util.gui.GuiDisplayUtil;
import mage.components.CardInfoPane;
import mage.utils.ThreadUtils;
import mage.view.CardView;
/**
* Enhanced {@link JTextPane} with text highlighting support.
*
* @author nantuko
*/
public class ColorPane extends JEditorPane {
final HTMLEditorKit kit = new HTMLEditorKit();
final HTMLDocument doc = new HTMLDocument();
private int tooltipDelay;
private int tooltipCounter;
private boolean hyperlinkEnabled = false;
public ColorPane() {
this.setEditorKit(kit);
this.setDocument(doc);
}
private void addHyperlinkHandlers() {
addHyperlinkListener(e -> ThreadUtils.threadPool2.submit(() -> {
tooltipDelay = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SHOW_TOOLTIPS_DELAY, 300);
if (tooltipDelay == 0) {
return;
}
String name = e.getDescription().substring(1);
CardInfo card = CardRepository.instance.findCard(name);
try {
final Component container = MageFrame.getUI().getComponent(MageComponents.POPUP_CONTAINER);
if (e.getEventType() == EventType.EXITED) {
setPopupVisibility(container, false);
}
if (e.getEventType() == EventType.ENTERED && card != null) {
CardInfoPane cardInfoPane = (CardInfoPane) MageFrame.getUI().getComponent(MageComponents.CARD_INFO_PANE);
cardInfoPane.setCard(new CardView(card.getMockCard()), container);
setPopupVisibility(container, true);
}
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}));
addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
tooltipCounter = 1; // will decrement and become effectively zero on leaving the pane
try {
setPopupVisibility(MageFrame.getUI().getComponent(MageComponents.POPUP_CONTAINER), false);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
});
}
private void setPopupVisibility(final Component container, final boolean show) throws InterruptedException {
final Component c = MageFrame.getUI().getComponent(MageComponents.DESKTOP_PANE);
SwingUtilities.invokeLater(() -> {
tooltipCounter += show ? 1 : -1;
if (tooltipCounter < 0) {
tooltipCounter = 0;
}
if (tooltipCounter > 0) {
Point location = new Point(getLocationOnScreen().x - container.getWidth(), MouseInfo.getPointerInfo().getLocation().y);
Component parentComponent = MageFrame.getInstance();
location = GuiDisplayUtil.keepComponentInsideParent(location, parentComponent.getLocationOnScreen(), container, parentComponent);
container.setLocation(location);
}
container.setVisible(tooltipCounter > 0);
c.repaint();
});
}
/**
* This method solves the known issue with Nimbus LAF background
* transparency and background color.
*
* @param color
*/
public void setExtBackgroundColor(Color color) {
setBackground(new Color(0, 0, 0, 0));
JPanel jPanel = new JPanel();
jPanel.setBackground(color);
setLayout(new BorderLayout());
add(jPanel);
}
@Override
public void setText(String string) {
super.setText(string); //To change body of generated methods, choose Tools | Templates.
}
public void append(String text) {
try {
if (hyperlinkEnabled) {
text = text.replaceAll("(<font color=[^>]*>([^<]*)) (\\[[0-9a-fA-F]*\\])</font>", "<a href=\"#$2\">$1</a> $3");
}
kit.insertHTML(doc, doc.getLength(), text, 0, 0, null);
int len = getDocument().getLength();
setCaretPosition(len);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* A little trick to paint black background under the text.
*
* @param g
*/
@Override
public void paintChildren(Graphics g) {
super.paintComponent(g);
}
/**
* A little trick to paint black background under the text.
*
* @param g
*/
@Override
public void paintComponent(Graphics g) {
super.paintChildren(g);
}
public void enableHyperlinks(){
hyperlinkEnabled = true;
addHyperlinkHandlers();
}
}