/*
* Copyright 2010-2015 Institut Pasteur.
*
* This file is part of Icy.
*
* Icy is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Icy is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Icy. If not, see <http://www.gnu.org/licenses/>.
*/
package icy.gui.frame.progress;
import icy.gui.frame.IcyFrame;
import icy.gui.util.GuiUtil;
import icy.network.NetworkUtil;
import icy.preferences.GeneralPreferences;
import icy.system.thread.ThreadUtil;
import icy.util.StringUtil;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.Box;
import javax.swing.JCheckBox;
import javax.swing.JEditorPane;
import javax.swing.UIManager;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.text.html.HTMLDocument;
/**
* @author Stephane
*/
public class ToolTipFrame extends TaskFrame
{
Timer timer;
JEditorPane editorPane;
JCheckBox doNotDisplayCheckbox;
final int liveTime;
final String id;
/**
* Show an tool tip with specified parameters
*
* @param message
* message to display in tool tip
* @param liveTime
* life time in second (0 = infinite)
* @param id
* toolTip id, it's used to display the "Do not display in future" checkbox<br>
* and remember its value
*/
public ToolTipFrame(final String message, int liveTime, String id)
{
super();
this.liveTime = liveTime;
this.id = id;
if (!StringUtil.isEmpty(id))
{
// tool tip should not be displayed ?
if (!GeneralPreferences.getPreferencesToolTips().getBoolean(id, true) || alreadyExist(id))
{
// close and exit
close();
return;
}
}
if (liveTime != 0)
{
timer = new Timer("ToolTip timer");
timer.schedule(new TimerTask()
{
@Override
public void run()
{
// EDT safe
doClose();
}
}, liveTime * 1000);
}
ThreadUtil.invokeLater(new Runnable()
{
@Override
public void run()
{
editorPane = new JEditorPane("text/html", message);
editorPane.setMinimumSize(new Dimension(240, 60));
editorPane.setEditable(false);
editorPane.setToolTipText("Click to close the tool tip");
// set same font as JLabel for JEditorPane
final Font font = UIManager.getFont("Label.font");
final String bodyRule = "body { font-family: " + font.getFamily() + "; " + "font-size: "
+ font.getSize() + "pt; }";
((HTMLDocument) editorPane.getDocument()).getStyleSheet().addRule(bodyRule);
editorPane.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
doClose();
}
});
// support link click
editorPane.addHyperlinkListener(new HyperlinkListener()
{
@Override
public void hyperlinkUpdate(HyperlinkEvent e)
{
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
{
NetworkUtil.openBrowser(e.getURL());
}
}
});
doNotDisplayCheckbox = new JCheckBox("Do not display again", false);
doNotDisplayCheckbox.setToolTipText("Do not display this tooltip the next time");
mainPanel.setLayout(new BorderLayout());
mainPanel.add(editorPane, BorderLayout.CENTER);
if (!StringUtil.isEmpty(ToolTipFrame.this.id))
mainPanel.add(GuiUtil.createLineBoxPanel(doNotDisplayCheckbox, Box.createHorizontalGlue()),
BorderLayout.SOUTH);
pack();
}
});
}
/**
* Show an tool tip with specified message
*
* @param message
* message to display in tool tip
* @param id
* toolTip id, it's used to display the "Do not display in future" checkbox<br>
* and remember its value
*/
public ToolTipFrame(String message, String id)
{
this(message, 0, id);
}
/**
* Show an tool tip with specified message
*
* @param message
* message to display in tool tip
* @param liveTime
* life time in second (0 = infinite)
*/
public ToolTipFrame(String message, int liveTime)
{
this(message, liveTime, "");
}
/**
* Show an tool tip with specified message
*
* @param message
* message to display in tool tip
*/
public ToolTipFrame(String message)
{
this(message, 0, "");
}
/**
* Return true if a tooltip with the same is is already active
*/
private boolean alreadyExist(String id)
{
final List<IcyFrame> frames = IcyFrame.getAllFrames(ToolTipFrame.class);
for (IcyFrame f : frames)
if ((f != this) && ((ToolTipFrame) f).id.equals(id))
return true;
return false;
}
void doClose()
{
// save display flag only if set to false
if (!StringUtil.isEmpty(id) && doNotDisplayCheckbox.isSelected())
GeneralPreferences.getPreferencesToolTips().putBoolean(id, false);
close();
}
public void setText(final String text)
{
ThreadUtil.invokeLater(new Runnable()
{
@Override
public void run()
{
editorPane.setText(text);
pack();
}
});
}
@Override
public void internalClose()
{
// stop timer
if (timer != null)
timer.cancel();
super.internalClose();
}
}