package org.drugis.common.gui;
import java.awt.Color;
import java.awt.Window;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import org.apache.commons.lang.StringEscapeUtils;
import org.drugis.common.ImageLoader;
import org.drugis.common.threading.ThreadHandler;
import org.drugis.common.threading.event.TaskFailedEvent;
import com.jgoodies.looks.plastic.PlasticLookAndFeel;
import com.jgoodies.looks.windows.WindowsLookAndFeel;
public class GUIHelper {
public static class ErrorDialogExceptionHandler {
public void handle(Throwable e) {
e.printStackTrace();
ErrorDialog.showDialog(e, "Unexpected error.");
}
}
public static final ImageLoader IMAGELOADER = new ImageLoader("/org/drugis/common/gui/");
public static final Color COLOR_WARNING = new Color(255, 214, 159);
public static void initializeLookAndFeel() {
try {
String osName = System.getProperty("os.name");
if (osName.startsWith("Windows")) {
UIManager.setLookAndFeel(new WindowsLookAndFeel());
} else if (osName.startsWith("Mac")) {
// do nothing, use the Mac Aqua L&f
} else {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
} catch (Exception e) {
UIManager.setLookAndFeel(new PlasticLookAndFeel());
}
}
} catch (Exception e) {
// Likely the Looks library is not in the class path; ignore.
}
}
private static final Pattern wrapRE = Pattern.compile(".{0,79}(?:\\S(?:-| |$)|$)");
private static String[] makeParts(String str) {
if (str != null && str != "") {
List<String> list = new LinkedList<String>();
Matcher m = wrapRE.matcher(str);
while (m.find()) list.add(m.group());
return list.toArray(new String[]{});
}
return new String[] {};
}
public static String wordWrap(String input, boolean surround) {
String[] arr = makeParts(StringEscapeUtils.escapeHtml(input));
String resStr = "";
for (String s : arr) {
if (s.length() < 1) {
continue;
}
if(!resStr.equals("")) {
resStr = resStr + "<br>";
}
resStr += s;
}
if (surround) {
return "<html>" + resStr + "</html>";
}
return resStr;
}
/**
* Center window on another window.
* @param window to center
* @deprecated Should use {@link Window#setLocationByPlatform(boolean)}
*/
@Deprecated
public static void centerWindow(Window window, Window parent) {
window.setLocationByPlatform(true);
}
public static String createToolTip(String text) {
if (text != null && text.trim().length() > 0) {
return wordWrap(text, true);
}
return null;
}
/**
* @param String to be transformed into human readable format
* @return human-readable string
* @see <a href="http://stackoverflow.com/questions/2559759/how-do-i-convert-camelcase-into-human-readable-names-in-java">How do I convert CamelCase into human-readable names in Java</a>
*/
public static String humanize(String s) {
return s.replaceAll(
String.format("%s|%s|%s",
"(?<=[A-Z])(?=[A-Z][a-z])",
"(?<=[^A-Z])(?=[A-Z])",
"(?<=[A-Za-z])(?=[^A-Za-z])"
),
" "
);
}
private static void addTaskFailureListener() {
ThreadHandler.getInstance().addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (event.getPropertyName().equals(ThreadHandler.PROPERTY_FAILED_TASK)) {
final TaskFailedEvent taskEvent = (TaskFailedEvent) event.getNewValue();
Runnable r = new Runnable() {
public void run() {
Throwable cause = taskEvent.getCause();
ErrorDialog.showDialog(cause, taskEvent.getSource() + " failed");
}
};
SwingUtilities.invokeLater(r);
}
}
});
}
public static void startApplicationWithErrorHandler(Runnable main, String helpText) {
System.setProperty("sun.awt.exception.handler", ErrorDialogExceptionHandler.class.getName());
ErrorDialog.setHelpText(helpText);
ThreadGroup threadGroup = new ThreadGroup("ExceptionGroup") {
public void uncaughtException(Thread t, Throwable e) {
e.printStackTrace();
ErrorDialog.showDialog(e, "Unexpected error.");
}
};
addTaskFailureListener();
Thread mainThread = new Thread(threadGroup, main, "Main thread");
mainThread.start();
}
}