From 8a5cdb94d1682cd853f5ce75d59ae09a70547c13 Mon Sep 17 00:00:00 2001 From: Skylar Date: Tue, 2 Jun 2015 12:14:28 -0600 Subject: [PATCH] Bugfixes and startup optimizations, update README.md --- README.md | 36 +- nbproject/project.properties | 4 +- src/net/apocalypselabs/symat/Main.java | 51 +- .../apocalypselabs/symat/SplashScreen.form | 6 - .../apocalypselabs/symat/SplashScreen.java | 44 +- src/net/apocalypselabs/symat/WebBrowser.form | 9 + src/net/apocalypselabs/symat/WebBrowser.java | 731 +++++++++--------- 7 files changed, 453 insertions(+), 428 deletions(-) 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 +}