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);
+ }
+
+}