diff --git a/src/net/apocalypselabs/symat/MainGUI.form b/src/net/apocalypselabs/symat/MainGUI.form index 9dd68b1..f081dd8 100644 --- a/src/net/apocalypselabs/symat/MainGUI.form +++ b/src/net/apocalypselabs/symat/MainGUI.form @@ -85,15 +85,15 @@ - + + - @@ -203,8 +203,9 @@ - - + + + @@ -212,7 +213,6 @@ - diff --git a/src/net/apocalypselabs/symat/MainGUI.java b/src/net/apocalypselabs/symat/MainGUI.java index 2fdc94c..291eda4 100644 --- a/src/net/apocalypselabs/symat/MainGUI.java +++ b/src/net/apocalypselabs/symat/MainGUI.java @@ -57,6 +57,7 @@ import java.io.File; import java.io.IOException; import java.util.Calendar; import java.util.Date; +import javafx.application.Platform; import javax.swing.ImageIcon; import javax.swing.JInternalFrame; import javax.swing.JOptionPane; @@ -118,10 +119,6 @@ public class MainGUI extends javax.swing.JFrame { setButtonShortcuts(); - // Disable community tab - // TODO: Make the tab useful. - tabs.remove(2); - // Open initial windows boolean loaded = false; if (!argfile.equals("")) { @@ -420,11 +417,11 @@ public class MainGUI extends javax.swing.JFrame { jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel4Layout.createSequentialGroup() .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(shellBtn, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(editorBtn, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(graphBtn, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); tabs.addTab("Home", jPanel4); @@ -506,14 +503,14 @@ public class MainGUI extends javax.swing.JFrame { ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(jPanel2Layout.createSequentialGroup() - .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(arrangeWindowsBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(displaySettingsBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(helpBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(globalsBtn, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jLabel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(arrangeWindowsBtn, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(displaySettingsBtn, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(helpBtn, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(globalsBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) - .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); tabs.addTab("Apps", jPanel2); @@ -766,7 +763,7 @@ public class MainGUI extends javax.swing.JFrame { }//GEN-LAST:event_recentItemsTitleMouseClicked private void wikiBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_wikiBtnActionPerformed - //loadFrame(new Wiki()); + loadFrame(new WebBrowser("SyMAT Wiki")); }//GEN-LAST:event_wikiBtnActionPerformed private void globalsBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_globalsBtnActionPerformed @@ -909,6 +906,8 @@ public class MainGUI extends javax.swing.JFrame { } } + Platform.setImplicitExit(false); + /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { @Override diff --git a/src/net/apocalypselabs/symat/SplashScreen.java b/src/net/apocalypselabs/symat/SplashScreen.java index 79a0aa7..3013f9c 100644 --- a/src/net/apocalypselabs/symat/SplashScreen.java +++ b/src/net/apocalypselabs/symat/SplashScreen.java @@ -154,6 +154,10 @@ public class SplashScreen extends javax.swing.JFrame { setProgress("Checking for updates..."); checkUpdates(); + + // It will throw errors, but it seems to speed up loading later. + setProgress("Loading apps..."); + try {WebBrowser wb = new WebBrowser();} catch (Exception ex) {} setProgress("Loading main interface..."); MainGUI main = new MainGUI(); diff --git a/src/net/apocalypselabs/symat/WebBrowser.form b/src/net/apocalypselabs/symat/WebBrowser.form new file mode 100644 index 0000000..cb3d26f --- /dev/null +++ b/src/net/apocalypselabs/symat/WebBrowser.form @@ -0,0 +1,39 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/net/apocalypselabs/symat/WebBrowser.java b/src/net/apocalypselabs/symat/WebBrowser.java new file mode 100644 index 0000000..1c3a6c0 --- /dev/null +++ b/src/net/apocalypselabs/symat/WebBrowser.java @@ -0,0 +1,200 @@ +/* + * 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 javafx.application.Platform; +import javafx.collections.ObservableList; +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; + +/** + * + * @author Skylar + */ +public class WebBrowser extends javax.swing.JInternalFrame { + + private WebView browser; + private WebEngine webEngine; + private JFXPanel jfxPanel; + private Group root; + private Scene scene; + + /** + * 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.loadContent("

Loading...

"); + } + }); + getContentPane().add(jfxPanel, BorderLayout.CENTER); + } + + public WebBrowser(String title) { + this(); + setTitle(title); + loadURL("https://wiki.symatapp.com/"); + } + + public WebBrowser(String title, String url) { + this(); + setTitle(title); + loadURL(url); + } + + 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); + } + }); + } + + public void loadString(final String content) { + Platform.runLater(new Runnable() { + @Override + public void run() { + webEngine.loadContent(content); + } + }); + } + + /** + * 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() { + + setClosable(true); + setIconifiable(true); + setMaximizable(true); + setResizable(true); + setTitle("Browser"); + setMinimumSize(new java.awt.Dimension(300, 300)); + setPreferredSize(new java.awt.Dimension(500, 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); + } + }); + + 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 resizeAll() { + Platform.runLater(new Runnable() { + @Override + public void run() { + jfxPanel.setSize(getWidth(), getHeight()); + browser.resize(getWidth() - 12, getHeight()); + } + }); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables +}