package thaw.gui;
import java.awt.Graphics;
import java.awt.geom.*;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractButton;
import javax.swing.text.JTextComponent;
import thaw.core.Logger;
import thaw.core.I18n;
public class GUIHelper {
private final static String unknownStr = I18n.getMessage("thaw.common.unknown");
public GUIHelper() {
}
/**
* when actionPerformed() is called, it will fill in the specified
* text component with what is in the clipboard
*/
public static class PasteHelper implements ActionListener {
JTextComponent txtComp;
public PasteHelper(final AbstractButton src, final JTextComponent txtComp) {
if (src != null)
src.addActionListener(this);
this.txtComp = txtComp;
}
public void actionPerformed(final ActionEvent evt) {
GUIHelper.pasteToComponent(txtComp);
}
}
public static void pasteToComponent(final JTextComponent txtComp) {
final Toolkit tk = Toolkit.getDefaultToolkit();
final Clipboard cp = tk.getSystemClipboard();
String result;
final Transferable contents = cp.getContents(null);
final boolean hasTransferableText = ((contents != null) &&
contents.isDataFlavorSupported(DataFlavor.stringFlavor));
try {
if ( hasTransferableText ) {
result = (String)contents.getTransferData(DataFlavor.stringFlavor);
txtComp.setText(txtComp.getText() + result);
} else {
Logger.notice(new GUIHelper(), "Nothing to get from clipboard");
}
} catch(final java.awt.datatransfer.UnsupportedFlavorException e) {
Logger.error(new GUIHelper(), "Error while pasting: UnsupportedFlavorException: "+e.toString());
} catch(final java.io.IOException e) {
Logger.error(new GUIHelper(), "Error while pasting: IOException: "+e.toString());
}
}
public static void copyToClipboard(final String str) {
final Toolkit tk = Toolkit.getDefaultToolkit();
final StringSelection st = new StringSelection(str);
final Clipboard cp = tk.getSystemClipboard();
cp.setContents(st, null);
}
public static String getPrintableTime(final long seconds) {
if (seconds == 0)
return unknownStr;
if (seconds < 60)
return (new Long(seconds)).toString() + " s";
if (seconds < 3600) {
final long min = seconds / 60;
return ((new Long(min)).toString() + " m");
}
if (seconds < 86400) {
final long hour = seconds / 3600;
return ((new Long(hour)).toString() + " h");
}
final long day = seconds / 86400;
return ((new Long(day)).toString()) + " day(s)";
}
public static String getPrintableSize(final long size) {
if(size == 0)
return unknownStr;
if(size < 1024) /* < 1KB */
return ((new Long(size)).toString() + " B");
if(size < 1048576) { /* < 1MB */
final long kb = size / 1024;
return ((new Long(kb)).toString() + " KB");
}
if(size < 1073741824) { /* < 1GB */
final long mb = size / 1048576;
return ((new Long(mb)).toString() + " MB");
}
final long gb = size / 1073741824;
return ((new Long(gb)).toString() +" GB");
}
public final static int ARROW_SIZE = 15;
public final static double ARROW_ANGLE = Math.PI / 6; /* 30° */
private static void paintLine(Graphics g, int headX, int headY, int lng, double angle) {
int endX = (int)(headX + (Math.cos(angle)*lng));
int endY = (int)(headY + (Math.sin(angle)*lng));
g.drawLine(headX, headY, endX, endY);
}
/* paint an arrow */
public static void paintArrow(Graphics g, int headX, int headY, int endX, int endY) {
g.drawLine(headX, headY, endX, endY);
double dist = new Point2D.Double(headX, headY).distance(endX, endY);
double theta = Math.acos((endX-headX) / dist);
if ((endY-headY) < 0)
theta = -1 * theta;
paintLine(g, headX, headY, ARROW_SIZE, theta+ARROW_ANGLE);
paintLine(g, headX, headY, ARROW_SIZE, theta-ARROW_ANGLE);
}
}