From 18be7b6f74a94e97fe09b0ff43ce45428c59ad62 Mon Sep 17 00:00:00 2001
From: Adam Blank <blank@sneetch.local>
Date: Sun, 6 Nov 2016 15:37:57 -0800
Subject: [PATCH] Fixes some annoying uMessage UI things

---
 chatter.jar              | Bin 12106 -> 14543 bytes
 src/chat/ChatWindow.java |  86 ++++++++++++++++------------
 src/chat/MainWindow.java |  33 ++++++-----
 src/chat/uMessage.java   | 120 +++++++++++++++++++++++----------------
 4 files changed, 138 insertions(+), 101 deletions(-)

diff --git a/chatter.jar b/chatter.jar
index 5a9a0637a0a9f0ae54785c499ea9110d861903c9..28d728f27adaf80a2476d16e22c22b5cf1f556ea 100644
GIT binary patch
literal 14543
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
C?lkZK

literal 12106
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

diff --git a/src/chat/ChatWindow.java b/src/chat/ChatWindow.java
index 0b5ebf0..391f948 100644
--- a/src/chat/ChatWindow.java
+++ b/src/chat/ChatWindow.java
@@ -100,24 +100,7 @@ public class ChatWindow {
     /**
      * Initialize the contents of the frame.
      */
-    private void initialize() {
-        try {
-            String path = new java.io.File(".").getCanonicalPath();
-            this.content.append("<link rel='stylesheet' type='text/css' href='file:///"
-                    + path + "/chat.css'>");
-            this.content.append("<head>");
-            this.content.append(
-                    "   <script language=\"javascript\" type=\"text/javascript\">");
-            this.content.append("       function toBottom(){");
-            this.content
-                    .append("           window.scrollTo(0, document.body.scrollHeight);");
-            this.content.append("       }");
-            this.content.append("   </script>");
-            this.content.append("</head>");
-            this.content.append("<body onload='toBottom()'>");
-        } catch (IOException e1) {
-        }
-
+    private void initialize() { 
         this.frame = new JFrame();
         this.frame.setBounds(100, 100, 290, 390);
         this.frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
@@ -137,17 +120,28 @@ public class ChatWindow {
         gbc_msgScrollPane.gridx = 0;
         gbc_msgScrollPane.gridy = 0;
 
-        this.chatMessagesPanel = new JFXPanel();
-        this.frame.getContentPane().add(this.chatMessagesPanel, gbc_msgScrollPane);
-
-        Platform.runLater(() -> {
-            ChatWindow.this.chatMessages = new WebView();
-
-            BorderPane borderPane = new BorderPane();
-            borderPane.setCenter(ChatWindow.this.chatMessages);
-            Scene scene = new Scene(borderPane, 450, 450);
-            ChatWindow.this.chatMessagesPanel.setScene(scene);
-        });
+        show();
+
+        (new Thread() {
+            public void run() {
+                try {
+                    String path = new java.io.File(".").getCanonicalPath();
+                    content.append("<link rel='stylesheet' type='text/css' href='file:///"
+                            + path + "/chat.css'>");
+                    content.append("<head>");
+                    content.append(
+                            "   <script language=\"javascript\" type=\"text/javascript\">");
+                    content.append("       function toBottom(){");
+                    content
+                            .append("           window.scrollTo(0, document.body.scrollHeight);");
+                    content.append("       }");
+                    content.append("   </script>");
+                    content.append("</head>");
+                    content.append("<body onload='toBottom()'>");
+                } catch (IOException e1) {
+                }
+            }
+        }).start();
 
         JPanel suggestionsPanel = new JPanel();
         GridBagConstraints gbc_suggestionsPanel = new GridBagConstraints();
@@ -269,11 +263,29 @@ public class ChatWindow {
             }
         };
         this.frame.addKeyListener(giveFocus);
-        this.chatMessagesPanel.addKeyListener(giveFocus);
         suggestionsPanel.addKeyListener(giveFocus);
         myMessagePanel.addKeyListener(giveFocus);
 
+        (new Thread() {
+            public void run() {
+                chatMessagesPanel = new JFXPanel();
+                chatMessagesPanel.addKeyListener(giveFocus);
+                frame.getContentPane().add(chatMessagesPanel, gbc_msgScrollPane);
+                Platform.runLater(() -> {
+                    ChatWindow.this.chatMessages = new WebView();
+
+                    BorderPane borderPane = new BorderPane();
+                    borderPane.setCenter(ChatWindow.this.chatMessages);
+                    Scene scene = new Scene(borderPane, 450, 450);
+                    ChatWindow.this.chatMessagesPanel.setScene(scene);
+                });
+
+            }
+        }).start();
+
+
         this.frame.pack();
+        show();
         this.myMessage.requestFocusInWindow();
     }
 
@@ -322,13 +334,15 @@ public class ChatWindow {
             String text = ("SOL " + this.myMessage.getText()).trim();
             int lastSpace = text.lastIndexOf(' ');
             String allButLast = lastSpace > -1 ? text.substring(0, lastSpace) : null;
-            this.undo = this.myMessage.getText();
-            String newText = (allButLast.replaceAll("SOL", "") + " " + result).trim();
-            if (this.myMessage.getText().startsWith(newText)) {
-                return false;
+            if (allButLast != null) {
+                this.undo = this.myMessage.getText();
+                String newText = (allButLast.replaceAll("SOL", "") + " " + result).trim();
+                if (this.myMessage.getText().startsWith(newText)) {
+                    return false;
+                }
+                this.myMessage.setText(newText);
+                return true;
             }
-            this.myMessage.setText(newText);
-            return true;
         }
         return false;
     }
diff --git a/src/chat/MainWindow.java b/src/chat/MainWindow.java
index 2e53edd..1c46d27 100644
--- a/src/chat/MainWindow.java
+++ b/src/chat/MainWindow.java
@@ -15,7 +15,6 @@ import javax.swing.JList;
 import p2.wordsuggestor.WordSuggestor;
 
 public class MainWindow {
-
     private JFrame frame;
     private List<String> usernames;
     private final List<ChatWindow> chats;
@@ -51,22 +50,26 @@ public class MainWindow {
         list.addMouseListener(new MouseAdapter() {
             @Override
             public void mouseClicked(MouseEvent e) {
-                @SuppressWarnings("unchecked")
-                JList<String> list = (JList<String>) e.getSource();
-                if (e.getClickCount() == 2) {
-                    int index = list.locationToIndex(e.getPoint());
-                    for (ChatWindow client : MainWindow.this.chats) {
-                        if (client.theirUsername
-                                .equals(MainWindow.this.usernames.get(index))) {
-                            client.show();
-                            return;
+                (new Thread() {
+                    public void run() {
+                        @SuppressWarnings("unchecked")
+                        JList<String> list = (JList<String>) e.getSource();
+                        if (e.getClickCount() == 2) {
+                            int index = list.locationToIndex(e.getPoint());
+                            for (ChatWindow client : MainWindow.this.chats) {
+                                if (client.theirUsername
+                                        .equals(MainWindow.this.usernames.get(index))) {
+                                    client.show();
+                                    return;
+                                }
+                            }
+
+                            MainWindow.this.chats
+                                    .add(new ChatWindow(MainWindow.this.usernames.get(index),
+                                            MainWindow.this.markov, MainWindow.this.connection));
                         }
                     }
-
-                    MainWindow.this.chats
-                            .add(new ChatWindow(MainWindow.this.usernames.get(index),
-                                    MainWindow.this.markov, MainWindow.this.connection));
-                }
+                }).start();
             }
         });
 
diff --git a/src/chat/uMessage.java b/src/chat/uMessage.java
index 3044e45..d661112 100644
--- a/src/chat/uMessage.java
+++ b/src/chat/uMessage.java
@@ -6,16 +6,24 @@ import java.awt.EventQueue;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
+import java.awt.BorderLayout;
 import java.io.IOException;
 import java.util.function.Supplier;
 
 import javax.swing.Box;
+import javafx.embed.swing.JFXPanel;
 import javax.swing.JButton;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JTextField;
+import javax.swing.JDialog;
+import javax.swing.JProgressBar;
+import javax.swing.SwingUtilities;
+import javax.swing.SwingWorker;
 
 import cse332.interfaces.misc.Dictionary;
 import cse332.types.AlphabeticString;
@@ -62,35 +70,65 @@ public class uMessage {
         }
 
         @Override
-        public void run() {
-            int N = uMessage.N;
-            try {
-                uMessage.markov[this.i] = new WordSuggestor(uMessage.CORPUS, N - this.i,
-                        4, uMessage.NEW_OUTER, uMessage.NEW_INNER);
-                uMessage.loading[this.i] = false;
-                this.window.update();
-            } catch (IOException e) {
+            public void run() {
+                int N = uMessage.N;
+                try {
+                    uMessage.markov[this.i] = new WordSuggestor(uMessage.CORPUS, N - this.i,
+                            4, uMessage.NEW_OUTER, uMessage.NEW_INNER);
+                    this.window.update();
+                } catch (IOException e) {
+                }
             }
-        }
     }
 
     /**
      * Launch the application.
      */
     public static void main(String[] args) {
-        EventQueue.invokeLater(() -> {
-            final uMessage window = new uMessage();
-            window.frmUmessageLogin.setVisible(true);
-            window.errors.setText("Loading the Markov Data (n = " + uMessage.N + ")...");
-            uMessage.markov = new WordSuggestor[uMessage.N];
-            uMessage.loading = new boolean[uMessage.N];
-            for (int i1 = 0; i1 < uMessage.N; i1++) {
-                uMessage.loading[i1] = true;
+        (new Thread() {
+            public void run() {
+                new JFXPanel();
             }
-            for (int i2 = 0; i2 < uMessage.N; i2++) {
-                new Thread(new MarkovLoader(window, i2)).start();
+        }).start();
+
+        final uMessage window = new uMessage();
+        markov = new WordSuggestor[uMessage.N];
+
+        JDialog dialog = new JDialog((JFrame)null, "Please wait...", true);//true means that the dialog created is modal
+        JLabel lblStatus = new JLabel("<html><b>Loading Markov Data (n = " + uMessage.N + ")...</b><br>Depending on the data structures you're using<br>" + 
+            "and your computer, this might take a bit.</html>"); 
+
+        JProgressBar pbProgress = new JProgressBar(0, 100);
+        pbProgress.setIndeterminate(true); //we'll use an indeterminate progress bar
+
+        dialog.add(BorderLayout.NORTH, lblStatus);
+        dialog.add(BorderLayout.CENTER, pbProgress);
+        dialog.addWindowListener(new WindowAdapter() { 
+            @Override public void windowClosing(WindowEvent e) { 
+              System.exit(0);
             }
         });
+        dialog.setSize(300, 90);
+
+        SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>() {
+            @Override
+            protected Void doInBackground() throws Exception {
+                for (int i2 = 1; i2 < uMessage.N; i2++) {
+                    new Thread(new MarkovLoader(window, i2)).start();
+                }
+                new MarkovLoader(window, 0).run();
+                return null;
+            }
+
+            @Override
+            protected void done() {
+                dialog.dispose();//close the modal dialog
+                window.frmUmessageLogin.setVisible(true);
+            }
+        };
+
+        sw.execute(); // this will start the processing on a separate thread
+        dialog.setVisible(true); //this will block user input as long as the processing task is working
     }
 
     /**
@@ -112,7 +150,7 @@ public class uMessage {
         gridBagLayout.columnWidths = new int[] { 0, 90, 90, 90, 0, 0 };
         gridBagLayout.rowHeights = new int[] { 0, 9, 0, 0 };
         gridBagLayout.columnWeights = new double[] { 0.0, 0.0, 1.0, 0.0, 0.0,
-                Double.MIN_VALUE };
+            Double.MIN_VALUE };
         gridBagLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, Double.MIN_VALUE };
         this.frmUmessageLogin.getContentPane().setLayout(gridBagLayout);
 
@@ -143,10 +181,14 @@ public class uMessage {
         this.username.addKeyListener(new KeyAdapter() {
             @Override
             public void keyReleased(KeyEvent e) {
-                if (update() && e.getKeyCode() == KeyEvent.VK_ENTER) {
-                    uMessage.this.login.setEnabled(false);
-                    login();
-                }
+                (new Thread() {
+                    public void run() {
+                        if (update() && e.getKeyCode() == KeyEvent.VK_ENTER) {
+                            uMessage.this.login.setEnabled(false);
+                            login();
+                        }
+                    }
+                }).start();
             }
         });
 
@@ -187,14 +229,6 @@ public class uMessage {
     }
 
     public boolean update() {
-        boolean noneLoading = true;
-        for (int i = 0; i < uMessage.loading.length; i++) {
-            noneLoading &= !uMessage.loading[i];
-        }
-        if (noneLoading) {
-            this.errors.setText("");
-            this.errors.setForeground(Color.BLACK);
-        }
         if (!this.loggingIn && this.username.getText().length() > 0) {
             this.login.setEnabled(true);
             this.errors.setForeground(Color.BLACK);
@@ -210,11 +244,10 @@ public class uMessage {
         this.loggingIn = true;
         update();
         try {
-            this.connection = new UMessageServerConnection(this,
-                    this.username.getText().replaceAll(" ", ""));
-            this.connection.go();
-        } catch (IOException e1) {
-        }
+            connection = new UMessageServerConnection(uMessage.this,
+                    username.getText().replaceAll(" ", ""));
+            connection.go();
+        } catch (IOException e1) {}
     }
 
     public void badNick() {
@@ -225,19 +258,6 @@ public class uMessage {
     }
 
     public void loggedIn(String username) {
-        boolean noneLoading = false;
-        while (!noneLoading) {
-            noneLoading = true;
-            for (int i = 0; i < uMessage.loading.length; i++) {
-                noneLoading &= !uMessage.loading[i];
-            }
-
-            try {
-                Thread.sleep(200);
-            } catch (InterruptedException e) {
-            }
-        }
-
         this.frmUmessageLogin.dispose();
         this.window = new MainWindow(username, uMessage.markov, this.connection);
         this.loggingIn = false;
-- 
GitLab