diff --git a/README.md b/README.md
index dcd3b2a..dc51f0d 100644
--- a/README.md
+++ b/README.md
@@ -1,18 +1,18 @@
-SyMAT
-=====
-
-SyMAT is a programmable symbolic math system written in Java.
-
-This repository is extremely bleeding-edge.
-We test new features before committing (usually), but there are bugs.
-If you want a more stable release, download the latest one from our website.
-
-Get SyMAT
-------
-
-To get SyMAT for your platform, go to:
-http://symatapp.com/
-
-Report a Bug
-------
-To report bugs, go to: http://bugs.aplabs.us/thebuggenie/symat/issues/new
\ No newline at end of file
+SyMAT
+=====
+
+SyMAT is a programmable symbolic math system written in Java.
+
+This repository is extremely bleeding-edge.
+We test new features before committing (usually), but there are bugs.
+If you want a more stable release, download the latest one from our website.
+
+Get SyMAT
+------
+
+To get SyMAT for your platform, go to:
+http://symatapp.com/
+
+Report a Bug
+------
+To report bugs, go to: https://github.com/ApocalypseLaboratories/SyMAT/issues
\ No newline at end of file
diff --git a/nbproject/project.properties b/nbproject/project.properties
index 8c18150..cc25f5a 100644
--- a/nbproject/project.properties
+++ b/nbproject/project.properties
@@ -39,6 +39,7 @@ file.reference.flamingo-6.3.jar=lib/flamingo-6.3.jar
file.reference.htmlcleaner-2.10.jar=lib/htmlcleaner-2.10.jar
file.reference.iText-4.2.0-com.itextpdf.jar=lib/iText-4.2.0-com.itextpdf.jar
file.reference.JavaPrettify-1.2.1.jar=lib\\JavaPrettify-1.2.1.jar
+file.reference.JGoogleAnalytics_0.4.jar=lib\\JGoogleAnalytics_0.4.jar
file.reference.jmathplot.jar=lib/jmathplot.jar
file.reference.js-engine.jar=lib/js-engine.jar
file.reference.js.jar=lib/js.jar
@@ -70,7 +71,8 @@ javac.classpath=\
${file.reference.seaglasslookandfeel-0.2.jar}:\
${file.reference.symja-2014-11-01.jar}:\
${file.reference.trident-6.3.jar}:\
- ${file.reference.JavaPrettify-1.2.1.jar}
+ ${file.reference.JavaPrettify-1.2.1.jar}:\
+ ${file.reference.JGoogleAnalytics_0.4.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false
diff --git a/src/net/apocalypselabs/symat/Main.java b/src/net/apocalypselabs/symat/Main.java
index baed86e..6510a7b 100644
--- a/src/net/apocalypselabs/symat/Main.java
+++ b/src/net/apocalypselabs/symat/Main.java
@@ -56,17 +56,12 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
-import java.io.BufferedReader;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
-import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
@@ -104,7 +99,7 @@ public class Main extends JRibbonFrame {
/**
* Version name, as it should be displayed.
*/
- public static final String VERSION_NAME = "2.0";
+ public static final String VERSION_NAME = "2.0.1";
/**
* The word "SyMAT".
@@ -117,7 +112,7 @@ public class Main extends JRibbonFrame {
/**
* Version number, for updates and //needs in scripts
*/
- public static final double APP_CODE = 21;
+ public static final double APP_CODE = 22;
/**
* Base URL for building API calls
*/
@@ -139,6 +134,7 @@ public class Main extends JRibbonFrame {
public static boolean updateAvailable = false; // Update available?
public static String updateString = "";
+ public static boolean licValid = false; // License valid?
/**
* Application icon, for setting frame icons. Has different sizes.
@@ -205,47 +201,18 @@ public class Main extends JRibbonFrame {
}
loaded = true;
}
- boolean licValid = false;
- if (PrefStorage.getSetting("license").equals("")
- || PrefStorage.getSetting("licensetype").equals("demo")) {
- if (PrefStorage.getSetting("licensetype").equals("demo")) {
- Calendar c = Calendar.getInstance();
- c.setTime(new Date());
- try {
- long expire = Long.parseLong(PrefStorage.getSetting("license"));
- if (expire > c.getTimeInMillis()) {
- licValid = true;
- }
- } catch (NumberFormatException e) {
- }
- }
- } else {
- try {
- Debug.println("Checking license...");
- URL url = new URL(API_URL + "liccheck.php?email="
- + PrefStorage.getSetting("license")
- + "&quick=1");
- String line;
- try (InputStream is = url.openStream();
- BufferedReader br
- = new BufferedReader(new InputStreamReader(is))) {
- line = br.readLine();
- }
- if (line.equals("ok")) {
- licValid = true;
- }
- } catch (Exception ex) {
- // Assume valid
- licValid = true;
- }
- }
if (!licValid) {
licenseRestrict(true);
- loadFrame(new License());
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ loadFrame(new License());
+ }
+ });
loaded = true;
}
// Only load shell if nothing else is going on
+
if (argfile.equals("") && !loaded) {
loadFrame(new Interpreter());
}
diff --git a/src/net/apocalypselabs/symat/SplashScreen.form b/src/net/apocalypselabs/symat/SplashScreen.form
index 7f27875..8c262cc 100644
--- a/src/net/apocalypselabs/symat/SplashScreen.form
+++ b/src/net/apocalypselabs/symat/SplashScreen.form
@@ -7,16 +7,10 @@
-
-
-
-
-
-
diff --git a/src/net/apocalypselabs/symat/SplashScreen.java b/src/net/apocalypselabs/symat/SplashScreen.java
index 54bb5e3..7f4c890 100644
--- a/src/net/apocalypselabs/symat/SplashScreen.java
+++ b/src/net/apocalypselabs/symat/SplashScreen.java
@@ -54,6 +54,8 @@ import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
+import java.util.Calendar;
+import java.util.Date;
import javax.swing.SwingUtilities;
import static net.apocalypselabs.symat.Main.API_URL;
import static net.apocalypselabs.symat.Main.APP_CODE;
@@ -202,13 +204,16 @@ public class SplashScreen extends javax.swing.JFrame {
Debug.stacktrace(ex);
}
+ setProgress("Checking license...");
+ checkLicense();
+
if (!PrefStorage.getSetting("skipupdates").equals("yes")) {
setProgress("Checking for updates...");
checkUpdates();
}
setProgress("Loading main interface...");
- Main main = new Main();
+ new Main();
setProgress("Done!");
dispose();
}
@@ -221,6 +226,43 @@ public class SplashScreen extends javax.swing.JFrame {
Debug.println("Loaded toolkit " + file.getName());
}
+ private void checkLicense() {
+ if (PrefStorage.getSetting("license").equals("")
+ || PrefStorage.getSetting("licensetype").equals("demo")) {
+ if (PrefStorage.getSetting("licensetype").equals("demo")) {
+ Calendar c = Calendar.getInstance();
+ c.setTime(new Date());
+ try {
+ long expire = Long.parseLong(PrefStorage.getSetting("license"));
+ if (expire > c.getTimeInMillis()) {
+ Main.licValid = true;
+ }
+ } catch (NumberFormatException e) {
+
+ }
+ }
+ } else {
+ try {
+ Debug.println("Checking license...");
+ URL url = new URL(API_URL + "liccheck.php?email="
+ + PrefStorage.getSetting("license")
+ + "&quick=1");
+ String line;
+ try (InputStream is = url.openStream();
+ BufferedReader br
+ = new BufferedReader(new InputStreamReader(is))) {
+ line = br.readLine();
+ }
+ if (line.equals("ok")) {
+ Main.licValid = true;
+ }
+ } catch (Exception ex) {
+ // Assume valid
+ Main.licValid = true;
+ }
+ }
+ }
+
private void checkUpdates() {
// Check for updates.
try {
diff --git a/src/net/apocalypselabs/symat/WebBrowser.form b/src/net/apocalypselabs/symat/WebBrowser.form
index ef1969e..269846b 100644
--- a/src/net/apocalypselabs/symat/WebBrowser.form
+++ b/src/net/apocalypselabs/symat/WebBrowser.form
@@ -120,5 +120,14 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/net/apocalypselabs/symat/WebBrowser.java b/src/net/apocalypselabs/symat/WebBrowser.java
index 13fd6d5..696047a 100644
--- a/src/net/apocalypselabs/symat/WebBrowser.java
+++ b/src/net/apocalypselabs/symat/WebBrowser.java
@@ -1,360 +1,371 @@
-/*
- * CODE LICENSE =====================
- * Copyright (c) 2015, Apocalypse Laboratories
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation and/or
- * other materials provided with the distribution.
- *
- * 3. Neither the name of the copyright holder nor the names of its contributors
- * may be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * 4. You adhere to the Media License detailed below. If you do not, this license
- * is automatically revoked and you must purge all copies of the software you
- * possess, in source or binary form.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * MEDIA LICENSE ====================
- * All images and other graphical files (the "graphics") included with this
- * software are copyright (c) 2015 Apocalypse Laboratories. You may not distribute
- * the graphics or any program, source code repository, or other digital storage
- * media containing them without written permission from Apocalypse Laboratories.
- * This ban on distribution only applies to publicly available systems.
- * A password-protected network file share, USB drive, or other storage scheme that
- * cannot be easily accessed by the public is generally allowed. If in doubt,
- * contact Apocalypse Laboratories. If Apocalypse Laboratories allows or denies
- * you permission, that decision is considered final and binding.
- */
-package net.apocalypselabs.symat;
-
-import java.awt.BorderLayout;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import javafx.application.Platform;
-import javafx.beans.value.ChangeListener;
-import javafx.beans.value.ObservableValue;
-import javafx.collections.ObservableList;
-import javafx.concurrent.Worker;
-import javafx.concurrent.Worker.State;
-import javafx.embed.swing.JFXPanel;
-import javafx.scene.Group;
-import javafx.scene.Node;
-import javafx.scene.Scene;
-import javafx.scene.web.WebEngine;
-import javafx.scene.web.WebView;
-import javax.swing.ImageIcon;
-
-/**
- *
- * @author Skylar
- */
-public class WebBrowser extends javax.swing.JInternalFrame {
-
- private WebView browser;
- private WebEngine webEngine;
- private JFXPanel jfxPanel;
- private Group root;
- private Scene scene;
-
- public static final int DEFAULT_LOGO = 0;
- public static final int WIKI_LOGO = 1;
- public static final int FORUM_LOGO = 2;
- public static final int PAD_LOGO = 3;
-
- /**
- * Creates new form WebBrowser
- */
- public WebBrowser() {
- initComponents();
- jfxPanel = new JFXPanel();
- Platform.runLater(new Runnable() {
- @Override
- public void run() {
- browser = new WebView();
- browser.setPrefSize(getWidth(), getHeight());
- root = new Group();
- scene = new Scene(root);
- ObservableList children = root.getChildren();
- children.add(browser);
- jfxPanel.setScene(scene);
- webEngine = browser.getEngine();
- webEngine.getLoadWorker().stateProperty().addListener(
- new ChangeListener() {
- @Override
- public void changed(ObservableValue ov, State oldState, State newState) {
- if (newState == Worker.State.SUCCEEDED) {
- urlBox.setText(webEngine.getLocation());
- }
- }
- });
- webEngine.setUserAgent("Mozilla/5.0 SyMAT/" + Main.VERSION_NAME);
- webEngine.loadContent(homepage());
- }
- });
- getContentPane().add(jfxPanel, BorderLayout.CENTER);
- }
-
- public WebBrowser(String title) {
- this();
- setTitle(title);
- loadURL("http://wiki.symatapp.com/");
- }
-
- public String homepage() {
- try {
- String text = "";
- BufferedReader reader = new BufferedReader(
- new InputStreamReader(
- WebBrowser.class
- .getResourceAsStream("resources/homepage.html")));
- String line;
- while ((line = reader.readLine()) != null) {
- text += line;
- }
- return text;
- } catch (IOException ex) {
- return "Error: " + ex.getMessage();
- }
- }
-
- public WebBrowser(String title, String url) {
- this();
- setTitle(title);
- loadURL(url);
- }
-
- public WebBrowser(String title, String url, int icon) {
- this(title, url);
- switch (icon) {
- case WIKI_LOGO:
- setFrameIcon(new ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/wiki.png")));
- break;
- case FORUM_LOGO:
- setFrameIcon(new ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/forum.png")));
- break;
- case PAD_LOGO:
- navBar.setVisible(false);
- goBtn.setEnabled(false);
- backBtn.setEnabled(false);
- setFrameIcon(new ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/editor.png")));
- break;
- default:
- setFrameIcon(new ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/browser.png")));
- }
-
- }
-
- public WebBrowser(String url, boolean isurl) {
- this();
- loadURL(url);
- }
-
- public void loadURL(final String url) {
- Platform.runLater(new Runnable() {
- @Override
- public void run() {
- webEngine.load(url);
- resizeAll();
- }
- });
- urlBox.setText(url);
- }
-
- public void open() {
- Main.loadFrame(this, true);
- }
-
- public void loadString(final String content) {
- Platform.runLater(new Runnable() {
- @Override
- public void run() {
- webEngine.loadContent(content);
- resizeAll();
- }
- });
- urlBox.setText("");
- }
-
- /**
- * This method is called from within the constructor to initialize the form.
- * WARNING: Do NOT modify this code. The content of this method is always
- * regenerated by the Form Editor.
- */
- @SuppressWarnings("unchecked")
- // //GEN-BEGIN:initComponents
- private void initComponents() {
-
- navBar = new javax.swing.JToolBar();
- backBtn = new javax.swing.JButton();
- urlBox = new javax.swing.JTextField();
- goBtn = new javax.swing.JButton();
-
- setClosable(true);
- setIconifiable(true);
- setMaximizable(true);
- setResizable(true);
- setTitle("Browser");
- setFrameIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/browser.png"))); // NOI18N
- setMinimumSize(new java.awt.Dimension(300, 300));
- setPreferredSize(new java.awt.Dimension(480, 400));
- addInternalFrameListener(new javax.swing.event.InternalFrameListener() {
- public void internalFrameActivated(javax.swing.event.InternalFrameEvent evt) {
- }
- public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt) {
- }
- public void internalFrameClosing(javax.swing.event.InternalFrameEvent evt) {
- }
- public void internalFrameDeactivated(javax.swing.event.InternalFrameEvent evt) {
- }
- public void internalFrameDeiconified(javax.swing.event.InternalFrameEvent evt) {
- }
- public void internalFrameIconified(javax.swing.event.InternalFrameEvent evt) {
- }
- public void internalFrameOpened(javax.swing.event.InternalFrameEvent evt) {
- formInternalFrameOpened(evt);
- }
- });
- addComponentListener(new java.awt.event.ComponentAdapter() {
- public void componentResized(java.awt.event.ComponentEvent evt) {
- formComponentResized(evt);
- }
- public void componentShown(java.awt.event.ComponentEvent evt) {
- formComponentShown(evt);
- }
- });
-
- navBar.setFloatable(false);
- navBar.setRollover(true);
- navBar.setLayout(new java.awt.BorderLayout());
-
- backBtn.setFont(Main.ubuntuRegular.deriveFont(16.0f));
- backBtn.setText("<");
- backBtn.setFocusable(false);
- backBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
- backBtn.setMaximumSize(new java.awt.Dimension(30, 21));
- backBtn.setMinimumSize(new java.awt.Dimension(30, 21));
- backBtn.setPreferredSize(new java.awt.Dimension(30, 21));
- backBtn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- navBar.add(backBtn, java.awt.BorderLayout.WEST);
- backBtn.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- backBtnActionPerformed(evt);
- }
- });
- /*
- navBar.add(backBtn);
- */
-
- urlBox.addKeyListener(new java.awt.event.KeyAdapter() {
- public void keyTyped(java.awt.event.KeyEvent evt) {
- urlBoxKeyTyped(evt);
- }
- });
- navBar.add(urlBox, java.awt.BorderLayout.CENTER);
- /*
- navBar.add(urlBox);
- */
-
- goBtn.setText("Go");
- goBtn.setFocusable(false);
- goBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
- goBtn.setMaximumSize(new java.awt.Dimension(30, 21));
- goBtn.setMinimumSize(new java.awt.Dimension(30, 21));
- goBtn.setPreferredSize(new java.awt.Dimension(30, 21));
- goBtn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
- navBar.add(goBtn, java.awt.BorderLayout.EAST);
- goBtn.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- goBtnActionPerformed(evt);
- }
- });
- /*
- navBar.add(goBtn);
- */
-
- getContentPane().add(navBar, java.awt.BorderLayout.PAGE_START);
-
- pack();
- }// //GEN-END:initComponents
-
- private void formInternalFrameOpened(javax.swing.event.InternalFrameEvent evt) {//GEN-FIRST:event_formInternalFrameOpened
-// resizeAll();
-// // Ensure scrollbars show up correctly.
-// setSize(getWidth() + 1, getHeight());
-// setSize(getWidth() - 1, getHeight());
- }//GEN-LAST:event_formInternalFrameOpened
-
- private void formComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentResized
- resizeAll();
- }//GEN-LAST:event_formComponentResized
-
- private void formComponentShown(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentShown
- resizeAll();
- }//GEN-LAST:event_formComponentShown
-
- private void urlBoxKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_urlBoxKeyTyped
- if (evt.getKeyChar() == '\n') {
- goBtn.doClick();
- }
- }//GEN-LAST:event_urlBoxKeyTyped
-
- private void goBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_goBtnActionPerformed
- if (urlBox.getText().equals("about:home")) {
- loadString(homepage());
- } else {
- if (!urlBox.getText().startsWith("http")) {
- urlBox.setText("http://" + urlBox.getText());
- }
- loadURL(urlBox.getText());
- }
- }//GEN-LAST:event_goBtnActionPerformed
-
- private void backBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_backBtnActionPerformed
- Platform.runLater(new Runnable() {
- @Override
- public void run() {
- try {
- browser.getEngine().getHistory().go(-1);
- } catch (Exception ex) {
- }
- }
- });
- }//GEN-LAST:event_backBtnActionPerformed
-
- private void resizeAll() {
- Platform.runLater(new Runnable() {
- @Override
- public void run() {
- jfxPanel.setSize(getWidth(), getHeight());
- browser.setPrefSize(getWidth() - 12, getHeight() - 32);
- browser.resize(getWidth() - 12, getHeight() - 32);
- }
- });
- }
-
- // Variables declaration - do not modify//GEN-BEGIN:variables
- private javax.swing.JButton backBtn;
- private javax.swing.JButton goBtn;
- private javax.swing.JToolBar navBar;
- private javax.swing.JTextField urlBox;
- // End of variables declaration//GEN-END:variables
-}
+/*
+ * CODE LICENSE =====================
+ * Copyright (c) 2015, Apocalypse Laboratories
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its contributors
+ * may be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * 4. You adhere to the Media License detailed below. If you do not, this license
+ * is automatically revoked and you must purge all copies of the software you
+ * possess, in source or binary form.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * MEDIA LICENSE ====================
+ * All images and other graphical files (the "graphics") included with this
+ * software are copyright (c) 2015 Apocalypse Laboratories. You may not distribute
+ * the graphics or any program, source code repository, or other digital storage
+ * media containing them without written permission from Apocalypse Laboratories.
+ * This ban on distribution only applies to publicly available systems.
+ * A password-protected network file share, USB drive, or other storage scheme that
+ * cannot be easily accessed by the public is generally allowed. If in doubt,
+ * contact Apocalypse Laboratories. If Apocalypse Laboratories allows or denies
+ * you permission, that decision is considered final and binding.
+ */
+package net.apocalypselabs.symat;
+
+import java.awt.BorderLayout;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import javafx.application.Platform;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.collections.ObservableList;
+import javafx.concurrent.Worker;
+import javafx.concurrent.Worker.State;
+import javafx.embed.swing.JFXPanel;
+import javafx.scene.Group;
+import javafx.scene.Node;
+import javafx.scene.Scene;
+import javafx.scene.web.WebEngine;
+import javafx.scene.web.WebView;
+import javax.swing.ImageIcon;
+
+/**
+ *
+ * @author Skylar
+ */
+public class WebBrowser extends javax.swing.JInternalFrame {
+
+ private WebView browser;
+ private WebEngine webEngine;
+ private JFXPanel jfxPanel;
+ private Group root;
+ private Scene scene;
+
+ public static final int DEFAULT_LOGO = 0;
+ public static final int WIKI_LOGO = 1;
+ public static final int FORUM_LOGO = 2;
+ public static final int PAD_LOGO = 3;
+
+ /**
+ * Creates new form WebBrowser
+ */
+ public WebBrowser() {
+ initComponents();
+ jfxPanel = new JFXPanel();
+ Platform.runLater(new Runnable() {
+ @Override
+ public void run() {
+ browser = new WebView();
+ browser.setPrefSize(getWidth(), getHeight());
+ root = new Group();
+ scene = new Scene(root);
+ ObservableList children = root.getChildren();
+ children.add(browser);
+ jfxPanel.setScene(scene);
+ webEngine = browser.getEngine();
+ webEngine.getLoadWorker().stateProperty().addListener(
+ new ChangeListener() {
+ @Override
+ public void changed(ObservableValue ov, State oldState, State newState) {
+ if (newState == Worker.State.SUCCEEDED) {
+ urlBox.setText(webEngine.getLocation());
+ }
+ }
+ });
+ webEngine.setUserAgent("Mozilla/5.0 SyMAT/" + Main.VERSION_NAME);
+ webEngine.loadContent(homepage());
+ }
+ });
+ browserBox.add(jfxPanel, BorderLayout.CENTER);
+ }
+
+ public WebBrowser(String title) {
+ this();
+ setTitle(title);
+ loadURL("http://wiki.symatapp.com/");
+ }
+
+ public String homepage() {
+ try {
+ String text = "";
+ BufferedReader reader = new BufferedReader(
+ new InputStreamReader(
+ WebBrowser.class
+ .getResourceAsStream("resources/homepage.html")));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ text += line;
+ }
+ return text;
+ } catch (IOException ex) {
+ return "Error: " + ex.getMessage();
+ }
+ }
+
+ public WebBrowser(String title, String url) {
+ this();
+ setTitle(title);
+ loadURL(url);
+ }
+
+ public WebBrowser(String title, String url, int icon) {
+ this(title, url);
+ switch (icon) {
+ case WIKI_LOGO:
+ setFrameIcon(new ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/wiki.png")));
+ break;
+ case FORUM_LOGO:
+ setFrameIcon(new ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/forum.png")));
+ break;
+ case PAD_LOGO:
+ navBar.setVisible(false);
+ goBtn.setEnabled(false);
+ backBtn.setEnabled(false);
+ setFrameIcon(new ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/editor.png")));
+ break;
+ default:
+ setFrameIcon(new ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/browser.png")));
+ }
+
+ }
+
+ public WebBrowser(String url, boolean isurl) {
+ this();
+ loadURL(url);
+ }
+
+ public void showNavbar(boolean yesno) {
+ navBar.setVisible(yesno);
+ goBtn.setEnabled(yesno);
+ backBtn.setEnabled(yesno);
+ }
+
+ public void loadURL(final String url) {
+ Platform.runLater(new Runnable() {
+ @Override
+ public void run() {
+ webEngine.load(url);
+ resizeAll();
+ }
+ });
+ urlBox.setText(url);
+ }
+
+ public void open() {
+ Main.loadFrame(this, true);
+ }
+
+ public void loadString(final String content) {
+ Platform.runLater(new Runnable() {
+ @Override
+ public void run() {
+ webEngine.loadContent(content);
+ resizeAll();
+ }
+ });
+ urlBox.setText("");
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ navBar = new javax.swing.JToolBar();
+ backBtn = new javax.swing.JButton();
+ urlBox = new javax.swing.JTextField();
+ goBtn = new javax.swing.JButton();
+ browserBox = new javax.swing.JPanel();
+
+ setClosable(true);
+ setIconifiable(true);
+ setMaximizable(true);
+ setResizable(true);
+ setTitle("Browser");
+ setFrameIcon(new javax.swing.ImageIcon(getClass().getResource("/net/apocalypselabs/symat/icons/browser.png"))); // NOI18N
+ setMinimumSize(new java.awt.Dimension(300, 300));
+ setPreferredSize(new java.awt.Dimension(480, 400));
+ addInternalFrameListener(new javax.swing.event.InternalFrameListener() {
+ public void internalFrameActivated(javax.swing.event.InternalFrameEvent evt) {
+ }
+ public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt) {
+ }
+ public void internalFrameClosing(javax.swing.event.InternalFrameEvent evt) {
+ }
+ public void internalFrameDeactivated(javax.swing.event.InternalFrameEvent evt) {
+ }
+ public void internalFrameDeiconified(javax.swing.event.InternalFrameEvent evt) {
+ }
+ public void internalFrameIconified(javax.swing.event.InternalFrameEvent evt) {
+ }
+ public void internalFrameOpened(javax.swing.event.InternalFrameEvent evt) {
+ formInternalFrameOpened(evt);
+ }
+ });
+ addComponentListener(new java.awt.event.ComponentAdapter() {
+ public void componentResized(java.awt.event.ComponentEvent evt) {
+ formComponentResized(evt);
+ }
+ public void componentShown(java.awt.event.ComponentEvent evt) {
+ formComponentShown(evt);
+ }
+ });
+
+ navBar.setFloatable(false);
+ navBar.setRollover(true);
+ navBar.setLayout(new java.awt.BorderLayout());
+
+ backBtn.setFont(Main.ubuntuRegular.deriveFont(16.0f));
+ backBtn.setText("<");
+ backBtn.setFocusable(false);
+ backBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+ backBtn.setMaximumSize(new java.awt.Dimension(30, 21));
+ backBtn.setMinimumSize(new java.awt.Dimension(30, 21));
+ backBtn.setPreferredSize(new java.awt.Dimension(30, 21));
+ backBtn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
+ navBar.add(backBtn, java.awt.BorderLayout.WEST);
+ backBtn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ backBtnActionPerformed(evt);
+ }
+ });
+ /*
+ navBar.add(backBtn);
+ */
+
+ urlBox.addKeyListener(new java.awt.event.KeyAdapter() {
+ public void keyTyped(java.awt.event.KeyEvent evt) {
+ urlBoxKeyTyped(evt);
+ }
+ });
+ navBar.add(urlBox, java.awt.BorderLayout.CENTER);
+ /*
+ navBar.add(urlBox);
+ */
+
+ goBtn.setText("Go");
+ goBtn.setFocusable(false);
+ goBtn.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+ goBtn.setMaximumSize(new java.awt.Dimension(30, 21));
+ goBtn.setMinimumSize(new java.awt.Dimension(30, 21));
+ goBtn.setPreferredSize(new java.awt.Dimension(30, 21));
+ goBtn.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
+ navBar.add(goBtn, java.awt.BorderLayout.EAST);
+ goBtn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ goBtnActionPerformed(evt);
+ }
+ });
+ /*
+ navBar.add(goBtn);
+ */
+
+ getContentPane().add(navBar, java.awt.BorderLayout.PAGE_START);
+
+ browserBox.setLayout(new java.awt.BorderLayout());
+ getContentPane().add(browserBox, java.awt.BorderLayout.CENTER);
+
+ pack();
+ }// //GEN-END:initComponents
+
+ private void formInternalFrameOpened(javax.swing.event.InternalFrameEvent evt) {//GEN-FIRST:event_formInternalFrameOpened
+// resizeAll();
+// // Ensure scrollbars show up correctly.
+// setSize(getWidth() + 1, getHeight());
+// setSize(getWidth() - 1, getHeight());
+ }//GEN-LAST:event_formInternalFrameOpened
+
+ private void formComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentResized
+ resizeAll();
+ }//GEN-LAST:event_formComponentResized
+
+ private void formComponentShown(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentShown
+ resizeAll();
+ }//GEN-LAST:event_formComponentShown
+
+ private void urlBoxKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_urlBoxKeyTyped
+ if (evt.getKeyChar() == '\n') {
+ goBtn.doClick();
+ }
+ }//GEN-LAST:event_urlBoxKeyTyped
+
+ private void goBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_goBtnActionPerformed
+ if (urlBox.getText().equals("about:home")) {
+ loadString(homepage());
+ } else {
+ if (!urlBox.getText().startsWith("http")) {
+ urlBox.setText("http://" + urlBox.getText());
+ }
+ loadURL(urlBox.getText());
+ }
+ }//GEN-LAST:event_goBtnActionPerformed
+
+ private void backBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_backBtnActionPerformed
+ Platform.runLater(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ browser.getEngine().getHistory().go(-1);
+ } catch (Exception ex) {
+ }
+ }
+ });
+ }//GEN-LAST:event_backBtnActionPerformed
+
+ private void resizeAll() {
+ Platform.runLater(new Runnable() {
+ @Override
+ public void run() {
+ jfxPanel.setSize(browserBox.getWidth(), browserBox.getHeight());
+ browser.setPrefSize(browserBox.getWidth(), browserBox.getHeight());
+ browser.resize(browserBox.getWidth(), browserBox.getHeight());
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton backBtn;
+ private javax.swing.JPanel browserBox;
+ private javax.swing.JButton goBtn;
+ private javax.swing.JToolBar navBar;
+ private javax.swing.JTextField urlBox;
+ // End of variables declaration//GEN-END:variables
+}