diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 2af1c5086..a0b76d4dd 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -57,11 +57,15 @@ import processing.app.tools.MenuScroller; import processing.app.tools.ZipDeflater; import javax.swing.*; + import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import java.util.List; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; import static processing.app.I18n._; @@ -137,6 +141,8 @@ public class Base { BaseNoGui.initLogger(); + initLogger(); + BaseNoGui.notifier = new GUIUserNotifier(); initPlatform(); @@ -215,6 +221,34 @@ public class Base { INSTANCE = new Base(args); } + + static public void initLogger() { + Handler consoleHandler = new ConsoleLogger(); + consoleHandler.setLevel(Level.ALL); + consoleHandler.setFormatter(new LogFormatter("%1$tl:%1$tM:%1$tS [%4$7s] %2$s: %5$s%n")); + + Logger globalLogger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + globalLogger.setLevel(consoleHandler.getLevel()); + + // Remove default + Handler[] handlers = globalLogger.getHandlers(); + for(Handler handler : handlers) { + globalLogger.removeHandler(handler); + } + Logger root = Logger.getLogger(""); + handlers = root.getHandlers(); + for(Handler handler : handlers) { + root.removeHandler(handler); + } + + globalLogger.addHandler(consoleHandler); + + Logger.getLogger("cc.arduino.packages.autocomplete").setParent(globalLogger); + Logger.getLogger("br.com.criativasoft.cpluslibparser").setParent(globalLogger); + Logger.getLogger(Base.class.getPackage().getName()).setParent(globalLogger); + + } + static protected void setCommandLine() { commandLine = true; @@ -2098,6 +2132,14 @@ public class Base { // don't use the low-res icon on Mac OS X; the window should // already have the right icon from the .app file. if (OSUtils.isMacOS()) return; + + // don't use the low-res icon on Linux + if (OSUtils.isLinux()){ + String current = System.getProperty("user.dir"); + Image image = Toolkit.getDefaultToolkit().createImage(current + "/lib/arduino.png"); + frame.setIconImage(image); + return; + } Image image = Toolkit.getDefaultToolkit().createImage(PApplet.ICON_IMAGE); frame.setIconImage(image); @@ -2152,7 +2194,12 @@ public class Base { File referenceFile = new File(referenceFolder, filename); if (!referenceFile.exists()) referenceFile = new File(referenceFolder, filename + ".html"); - openURL(referenceFile.getAbsolutePath()); + + if(referenceFile.exists()){ + openURL(referenceFile.getAbsolutePath()); + }else{ + showWarning(_("Problem Opening URL"), I18n.format(_("Could not open the URL\n{0}"), referenceFile), null); + } } public static void showEdisonGettingStarted() { diff --git a/app/src/processing/app/helpers/ConsoleLogger.java b/app/src/processing/app/helpers/ConsoleLogger.java new file mode 100644 index 000000000..ef7697a48 --- /dev/null +++ b/app/src/processing/app/helpers/ConsoleLogger.java @@ -0,0 +1,30 @@ +package processing.app.helpers; + +import java.io.FileDescriptor; +import java.io.FileOutputStream; +import java.io.PrintStream; +import java.util.logging.LogRecord; +import java.util.logging.StreamHandler; + +public class ConsoleLogger extends StreamHandler { + + public ConsoleLogger() { + setOutputStream(new PrintStream(new FileOutputStream(FileDescriptor.out))); + } + + + public void publish(LogRecord record) { + super.publish(record); + flush(); + } + + /** + * Override StreamHandler.close to do a flush but not + * to close the output stream. That is, we do not + * close FileDescriptor.out. + */ + public void close() { + flush(); + } + +} diff --git a/app/src/processing/app/helpers/LogFormatter.java b/app/src/processing/app/helpers/LogFormatter.java new file mode 100644 index 000000000..f1bd59a36 --- /dev/null +++ b/app/src/processing/app/helpers/LogFormatter.java @@ -0,0 +1,49 @@ +package processing.app.helpers; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Date; +import java.util.logging.Formatter; +import java.util.logging.LogRecord; + +public class LogFormatter extends Formatter { + + public String format; + private final Date dat = new Date(); + + public LogFormatter(String logformat) { + format = logformat; + } + + @Override + public String format(LogRecord record) { + dat.setTime(record.getMillis()); + String source; + if (record.getSourceClassName() != null) { + source = record.getSourceClassName().substring(record.getSourceClassName().lastIndexOf('.') + 1); + if (record.getSourceMethodName() != null) { + source += "." + record.getSourceMethodName(); + } + } else { + source = record.getLoggerName(); + } + String message = formatMessage(record); + String throwable = ""; + if (record.getThrown() != null) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + pw.println(); + record.getThrown().printStackTrace(pw); + pw.close(); + throwable = sw.toString(); + } + return String.format(format, + dat, + source, + record.getLoggerName(), + record.getLevel(), + message, + throwable); + } + +}