From 6d57ec7bc1ff2ad65f9f2a87064e46617c393c4e Mon Sep 17 00:00:00 2001
From: mpriymak <mpriymak@gmail.com>
Date: Tue, 22 Oct 2019 16:59:50 +1100
Subject: [PATCH] Changed the join method to send over a reference of the
ClientUpdate Interface
---
.idea/$PRODUCT_WORKSPACE_FILE$ | 19 -
.idea/.gitignore | 2 -
.idea/misc.xml | 10 -
.idea/modules.xml | 8 -
.idea/uiDesigner.xml | 124 -----
.idea/vcs.xml | 6 -
.idea/workspace.xml | 483 ------------------
META-INF/application.xml | 7 -
comp90015-dsass2-infinitymonkeys-remaster.iml | 20 -
comp90015_assignment2.iml | 11 -
infinitymonkeys.iml | 20 -
.../infinitymonkeys/GUI/ChatScreen$1.class | Bin 1569 -> 2451 bytes
.../infinitymonkeys/GUI/ChatScreen.class | Bin 6649 -> 5858 bytes
.../infinitymonkeys/GUI/PaintGUI$1.class | Bin 4424 -> 4424 bytes
.../infinitymonkeys/GUI/PaintGUI.class | Bin 3484 -> 3441 bytes
.../infinitymonkeys/client/ChatUpdate.class | Bin 1949 -> 2040 bytes
.../infinitymonkeys/client/Client.class | Bin 3669 -> 4677 bytes
.../infinitymonkeys/client/ClientUpdate.class | Bin 1433 -> 2482 bytes
.../client/DrawingUpdate.class | Bin 1231 -> 1041 bytes
.../server/ClientController.class | Bin 3745 -> 4105 bytes
src.zip | Bin 25722 -> 0 bytes
src/GUI/ApplicationMain.java | 72 ---
src/GUI/ChatScreen.form | 200 --------
src/GUI/ChatScreen.java | 142 -----
src/GUI/DrawingArea.java | 374 --------------
src/GUI/MenuBar.java | 7 -
src/GUI/PaintGUI.java | 232 ---------
src/GUI/StartScreen.form | 114 -----
src/GUI/StartScreen.java | 70 ---
src/GUI/ToolBar.java | 100 ----
src/LICENSE | 339 ------------
src/client/ChatUpdate.java | 52 --
src/client/Client.java | 156 ------
src/client/ClientUpdate.java | 50 --
src/client/DrawingUpdate.java | 29 --
src/remote/IChatController.java | 12 -
src/remote/IChatUpdate.java | 12 -
src/remote/IClientController.java | 15 -
src/remote/IClientUpdate.java | 12 -
src/remote/IDrawingController.java | 21 -
src/remote/IDrawingUpdate.java | 10 -
src/server/ChatController.java | 90 ----
src/server/ClientController.java | 122 -----
src/server/DrawingController.java | 34 --
src/server/Server.java | 62 ---
src/server/User.java | 52 --
46 files changed, 3089 deletions(-)
delete mode 100644 .idea/$PRODUCT_WORKSPACE_FILE$
delete mode 100644 .idea/.gitignore
delete mode 100644 .idea/misc.xml
delete mode 100644 .idea/modules.xml
delete mode 100644 .idea/uiDesigner.xml
delete mode 100644 .idea/vcs.xml
delete mode 100644 .idea/workspace.xml
delete mode 100644 META-INF/application.xml
delete mode 100644 comp90015-dsass2-infinitymonkeys-remaster.iml
delete mode 100644 comp90015_assignment2.iml
delete mode 100644 infinitymonkeys.iml
delete mode 100644 src.zip
delete mode 100644 src/GUI/ApplicationMain.java
delete mode 100644 src/GUI/ChatScreen.form
delete mode 100644 src/GUI/ChatScreen.java
delete mode 100644 src/GUI/DrawingArea.java
delete mode 100644 src/GUI/MenuBar.java
delete mode 100644 src/GUI/PaintGUI.java
delete mode 100644 src/GUI/StartScreen.form
delete mode 100644 src/GUI/StartScreen.java
delete mode 100644 src/GUI/ToolBar.java
delete mode 100644 src/LICENSE
delete mode 100644 src/client/ChatUpdate.java
delete mode 100644 src/client/Client.java
delete mode 100644 src/client/ClientUpdate.java
delete mode 100644 src/client/DrawingUpdate.java
delete mode 100644 src/remote/IChatController.java
delete mode 100644 src/remote/IChatUpdate.java
delete mode 100644 src/remote/IClientController.java
delete mode 100644 src/remote/IClientUpdate.java
delete mode 100644 src/remote/IDrawingController.java
delete mode 100644 src/remote/IDrawingUpdate.java
delete mode 100644 src/server/ChatController.java
delete mode 100644 src/server/ClientController.java
delete mode 100644 src/server/DrawingController.java
delete mode 100644 src/server/Server.java
delete mode 100644 src/server/User.java
diff --git a/.idea/$PRODUCT_WORKSPACE_FILE$ b/.idea/$PRODUCT_WORKSPACE_FILE$
deleted file mode 100644
index 3733e0d..0000000
--- a/.idea/$PRODUCT_WORKSPACE_FILE$
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="masterDetails">
- <states>
- <state key="ProjectJDKs.UI">
- <settings>
- <last-edited>1.8</last-edited>
- <splitter-proportions>
- <option name="proportions">
- <list>
- <option value="0.2" />
- </list>
- </option>
- </splitter-proportions>
- </settings>
- </state>
- </states>
- </component>
-</project>
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 5c98b42..0000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# Default ignored files
-/workspace.xml
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index a07277e..0000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-<<<<<<< HEAD
- <component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="12" project-jdk-type="JavaSDK">
-=======
- <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
->>>>>>> 37a6af2e6d36ab514d01a93dbd5be6538a2572c7
- <output url="file://$PROJECT_DIR$/out" />
- </component>
-</project>
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 1fe4435..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="ProjectModuleManager">
- <modules>
- <module fileurl="file://$PROJECT_DIR$/infinitymonkeys.iml" filepath="$PROJECT_DIR$/infinitymonkeys.iml" />
- </modules>
- </component>
-</project>
\ No newline at end of file
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
deleted file mode 100644
index e96534f..0000000
--- a/.idea/uiDesigner.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="Palette2">
- <group name="Swing">
- <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
- </item>
- <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
- </item>
- <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
- </item>
- <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
- <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
- </item>
- <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
- <initial-values>
- <property name="text" value="Button" />
- </initial-values>
- </item>
- <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
- <initial-values>
- <property name="text" value="RadioButton" />
- </initial-values>
- </item>
- <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
- <initial-values>
- <property name="text" value="CheckBox" />
- </initial-values>
- </item>
- <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
- <initial-values>
- <property name="text" value="Label" />
- </initial-values>
- </item>
- <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
- <preferred-size width="150" height="-1" />
- </default-constraints>
- </item>
- <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
- <preferred-size width="150" height="-1" />
- </default-constraints>
- </item>
- <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
- <preferred-size width="150" height="-1" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
- </item>
- <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
- <preferred-size width="150" height="50" />
- </default-constraints>
- </item>
- <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
- <preferred-size width="200" height="200" />
- </default-constraints>
- </item>
- <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
- <preferred-size width="200" height="200" />
- </default-constraints>
- </item>
- <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
- </item>
- <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
- </item>
- <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
- </item>
- <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
- </item>
- <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
- <preferred-size width="-1" height="20" />
- </default-constraints>
- </item>
- <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
- <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
- </item>
- <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
- <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
- </item>
- </group>
- </component>
-</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 35eb1dd..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="VcsDirectoryMappings">
- <mapping directory="" vcs="Git" />
- </component>
-</project>
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
deleted file mode 100644
index d977b68..0000000
--- a/.idea/workspace.xml
+++ /dev/null
@@ -1,483 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
- <component name="ChangeListManager">
- <list default="true" id="688d774d-cfc7-4b0d-b00c-5ca931aba600" name="Default Changelist" comment="">
- <change beforePath="$PROJECT_DIR$/.idea/modules.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/src/GUI/ChatScreen.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/GUI/ChatScreen.java" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/src/server/User.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/server/User.java" afterDir="false" />
- </list>
- <ignored path="$PROJECT_DIR$/out/" />
- <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
- <option name="SHOW_DIALOG" value="false" />
- <option name="HIGHLIGHT_CONFLICTS" value="true" />
- <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
- <option name="LAST_RESOLUTION" value="IGNORE" />
- </component>
- <component name="DefaultGradleProjectSettings">
- <option name="testRunner" value="GRADLE" />
- <option name="delegatedBuild" value="true" />
- </component>
- <component name="FileEditorManager">
- <leaf>
- <file pinned="false" current-in-tab="true">
- <entry file="file://$PROJECT_DIR$/src/GUI/ChatScreen.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="323">
- <caret line="81" selection-start-line="81" selection-end-line="81" />
- </state>
- </provider>
- </entry>
- </file>
- </leaf>
- </component>
- <component name="FindInProjectRecents">
- <findStrings>
- <find>RMI</find>
- <find>Black</find>
- <find>colorOptions</find>
- <find>Send</find>
- <find>message</find>
- <find>userSelectComboBox</find>
- <find>updateUserList</find>
- <find>send</find>
- <find>broadcastMessage</find>
- <find>sent</find>
- </findStrings>
- </component>
- <component name="Git.Settings">
- <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
- <option name="RECENT_BRANCH_BY_REPOSITORY">
- <map>
- <entry key="$PROJECT_DIR$" value="master" />
- </map>
- </option>
- </component>
- <component name="IdeDocumentHistory">
- <option name="CHANGED_PATHS">
- <list>
- <option value="$PROJECT_DIR$/src/server/Server.java" />
- <option value="$PROJECT_DIR$/src/client/ChatUpdate.java" />
- <option value="$PROJECT_DIR$/src/client/Client.java" />
- <option value="$PROJECT_DIR$/src/server/ChatController.java" />
- <option value="$PROJECT_DIR$/src/remote/IChatController.java" />
- <option value="$PROJECT_DIR$/src/remote/IChatUpdate.java" />
- <option value="$PROJECT_DIR$/src/server/ClientController.java" />
- <option value="$PROJECT_DIR$/src/remote/IClientController.java" />
- <option value="$PROJECT_DIR$/src/client/ClientUpdate.java" />
- <option value="$PROJECT_DIR$/src/remote/IClientUpdate.java" />
- <option value="$PROJECT_DIR$/src/GUI/ChatScreen.form" />
- <option value="$PROJECT_DIR$/src/server/User.java" />
- <option value="$PROJECT_DIR$/src/GUI/ChatScreen.java" />
- </list>
- </option>
- </component>
- <component name="ProjectConfigurationFiles">
- <option name="files">
- <list>
- <option value="$PROJECT_DIR$/.idea/uiDesigner.xml" />
- </list>
- </option>
- </component>
- <component name="ProjectFrameBounds" extendedState="6">
- <option name="x" value="-3" />
- <option name="width" value="1946" />
- <option name="height" value="876" />
- </component>
- <component name="ProjectView">
- <navigator proportions="" version="1">
- <foldersAlwaysOnTop value="true" />
- </navigator>
- <panes>
- <pane id="ProjectPane">
- <subPane>
- <expand>
- <path>
- <item name="infinitymonkeys" type="b2602c69:ProjectViewProjectNode" />
- <item name="infinitymonkeys" type="462c0819:PsiDirectoryNode" />
- </path>
- <path>
- <item name="infinitymonkeys" type="b2602c69:ProjectViewProjectNode" />
- <item name="infinitymonkeys" type="462c0819:PsiDirectoryNode" />
- <item name="src" type="462c0819:PsiDirectoryNode" />
- </path>
- <path>
- <item name="infinitymonkeys" type="b2602c69:ProjectViewProjectNode" />
- <item name="infinitymonkeys" type="462c0819:PsiDirectoryNode" />
- <item name="src" type="462c0819:PsiDirectoryNode" />
- <item name="client" type="462c0819:PsiDirectoryNode" />
- </path>
- <path>
- <item name="infinitymonkeys" type="b2602c69:ProjectViewProjectNode" />
- <item name="infinitymonkeys" type="462c0819:PsiDirectoryNode" />
- <item name="src" type="462c0819:PsiDirectoryNode" />
- <item name="GUI" type="462c0819:PsiDirectoryNode" />
- </path>
- <path>
- <item name="infinitymonkeys" type="b2602c69:ProjectViewProjectNode" />
- <item name="infinitymonkeys" type="462c0819:PsiDirectoryNode" />
- <item name="src" type="462c0819:PsiDirectoryNode" />
- <item name="GUI" type="462c0819:PsiDirectoryNode" />
- <item name="ChatScreen" type="e9f4de52:FormNode" />
- </path>
- <path>
- <item name="infinitymonkeys" type="b2602c69:ProjectViewProjectNode" />
- <item name="infinitymonkeys" type="462c0819:PsiDirectoryNode" />
- <item name="src" type="462c0819:PsiDirectoryNode" />
- <item name="remote" type="462c0819:PsiDirectoryNode" />
- </path>
- <path>
- <item name="infinitymonkeys" type="b2602c69:ProjectViewProjectNode" />
- <item name="infinitymonkeys" type="462c0819:PsiDirectoryNode" />
- <item name="src" type="462c0819:PsiDirectoryNode" />
- <item name="server" type="462c0819:PsiDirectoryNode" />
- </path>
- </expand>
- <select />
- </subPane>
- </pane>
- <pane id="PackagesPane" />
- <pane id="Scope" />
- </panes>
- </component>
- <component name="PropertiesComponent">
- <property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
- <property name="WebServerToolWindowFactoryState" value="false" />
- <property name="aspect.path.notification.shown" value="true" />
- <property name="last_opened_file_path" value="$PROJECT_DIR$/../Git Projects" />
- <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
- <property name="nodejs_npm_path_reset_for_default_project" value="true" />
- <property name="project.structure.last.edited" value="Global Libraries" />
- <property name="project.structure.proportion" value="0.15" />
- <property name="project.structure.side.proportion" value="0.2" />
- </component>
- <component name="RunDashboard">
- <option name="ruleStates">
- <list>
- <RuleState>
- <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
- </RuleState>
- <RuleState>
- <option name="name" value="StatusDashboardGroupingRule" />
- </RuleState>
- </list>
- </option>
- </component>
- <component name="RunManager" selected="Application.Client2">
- <configuration name="Client 3" type="Application" factoryName="Application">
- <option name="MAIN_CLASS_NAME" value="client.Client" />
- <module name="infinitymonkeys" />
- <option name="PROGRAM_PARAMETERS" value="Eldar -Djava.rmi.server.codebase=file:"C:\infinitemonkeys\out\production\infinitemonkeys\"" />
- <method v="2">
- <option name="Make" enabled="true" />
- </method>
- </configuration>
- <configuration name="Client1" type="Application" factoryName="Application">
- <option name="MAIN_CLASS_NAME" value="client.Client" />
- <module name="infinitymonkeys" />
- <option name="PROGRAM_PARAMETERS" value="Max -Djava.rmi.server.codebase=file:"C:\infinitemonkeys\out\production\infinitemonkeys\"" />
- <method v="2">
- <option name="Make" enabled="true" />
- </method>
- </configuration>
- <configuration name="Client2" type="Application" factoryName="Application">
- <option name="MAIN_CLASS_NAME" value="client.Client" />
- <module name="infinitymonkeys" />
- <option name="PROGRAM_PARAMETERS" value="Hai -Djava.rmi.server.codebase=file:"C:\infinitemonkeys\out\production\infinitemonkeys\"" />
- <method v="2">
- <option name="Make" enabled="true" />
- </method>
- </configuration>
- <configuration name="Server" type="Application" factoryName="Application">
- <option name="MAIN_CLASS_NAME" value="server.Server" />
- <module name="infinitymonkeys" />
- <option name="PROGRAM_PARAMETERS" value="-Djava.rmi.server.codebase=file:"C:\infinitemonkeys\out\production\infinitemonkeys\"" />
- <method v="2">
- <option name="Make" enabled="true" />
- </method>
- </configuration>
- <list>
- <item itemvalue="Application.Server" />
- <item itemvalue="Application.Client1" />
- <item itemvalue="Application.Client2" />
- <item itemvalue="Application.Client 3" />
- </list>
- </component>
- <component name="SvnConfiguration">
- <configuration />
- </component>
- <component name="TaskManager">
- <task active="true" id="Default" summary="Default task">
- <changelist id="688d774d-cfc7-4b0d-b00c-5ca931aba600" name="Default Changelist" comment="" />
- <created>1571631720382</created>
- <option name="number" value="Default" />
- <option name="presentableId" value="Default" />
- <updated>1571631720382</updated>
- <workItem from="1571631723795" duration="17601000" />
- </task>
- <task id="LOCAL-00001" summary="Changed the join method to send over a reference of the ClientUpdate Interface">
- <created>1571646862883</created>
- <option name="number" value="00001" />
- <option name="presentableId" value="LOCAL-00001" />
- <option name="project" value="LOCAL" />
- <updated>1571646862883</updated>
- </task>
- <option name="localTasksCounter" value="2" />
- <servers />
- </component>
- <component name="TimeTrackingManager">
- <option name="totallyTimeSpent" value="17601000" />
- </component>
- <component name="ToolWindowManager">
- <frame x="-7" y="-7" width="1295" height="704" extended-state="6" />
- <editor active="true" />
- <layout>
- <window_info id="Designer" />
- <window_info id="Image Layers" />
- <window_info id="Capture Tool" />
- <window_info id="UI Designer" />
- <window_info id="Favorites" side_tool="true" />
- <window_info id="JavaEE:App" side_tool="true" />
- <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.24939272" />
- <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
- <window_info anchor="bottom" id="Terminal" visible="true" weight="0.26923078" />
- <window_info anchor="bottom" id="Docker" show_stripe_button="false" />
- <window_info anchor="bottom" id="Event Log" side_tool="true" />
- <window_info anchor="bottom" id="Messages" weight="0.32867134" />
- <window_info anchor="bottom" id="Database Changes" />
- <window_info anchor="bottom" id="Version Control" weight="0.32867134" />
- <window_info anchor="bottom" id="Message" order="0" />
- <window_info anchor="bottom" id="Find" order="1" />
- <window_info anchor="bottom" id="Run" order="2" weight="0.32867134" />
- <window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
- <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
- <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
- <window_info anchor="bottom" id="TODO" order="6" />
- <window_info anchor="right" id="Maven" />
- <window_info anchor="right" id="Palette" />
- <window_info anchor="right" id="Capture Analysis" />
- <window_info anchor="right" id="Database" />
- <window_info anchor="right" id="Palette	" />
- <window_info anchor="right" id="Theme Preview" />
- <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
- <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
- <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
- </layout>
- </component>
- <component name="TypeScriptGeneratedFilesManager">
- <option name="version" value="1" />
- </component>
- <component name="Vcs.Log.History.Properties">
- <option name="COLUMN_ORDER">
- <list>
- <option value="0" />
- <option value="2" />
- <option value="3" />
- <option value="1" />
- </list>
- </option>
- </component>
- <component name="VcsManagerConfiguration">
- <MESSAGE value="Changed the join method to send over a reference of the ClientUpdate Interface" />
- <option name="LAST_COMMIT_MESSAGE" value="Changed the join method to send over a reference of the ClientUpdate Interface" />
- </component>
- <component name="editorHistoryManager">
- <entry file="file://$PROJECT_DIR$/src/GUI/StartScreen.form">
- <provider selected="true" editor-type-id="ui-designer" />
- </entry>
- <entry file="file://$PROJECT_DIR$/src/client/DrawingUpdate.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="170">
- <caret line="15" column="28" selection-start-line="15" selection-start-column="28" selection-end-line="15" selection-end-column="28" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/GUI/PaintGUI.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="186">
- <caret line="218" lean-forward="true" selection-start-line="218" selection-end-line="218" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/server/DrawingController.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="187">
- <caret line="16" lean-forward="true" selection-start-line="16" selection-end-line="16" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/server/Server.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="-650">
- <caret line="10" lean-forward="true" selection-start-line="10" selection-end-line="10" />
- <folding>
- <element signature="imports" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/remote/IChatController.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="187">
- <caret line="12" lean-forward="true" selection-start-line="12" selection-end-line="12" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/remote/IChatUpdate.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="170">
- <caret line="12" lean-forward="true" selection-start-line="12" selection-end-line="12" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/GUI/ChatScreen.form">
- <provider selected="true" editor-type-id="ui-designer" />
- </entry>
- <entry file="file://$PROJECT_DIR$/src/needsDebugging/client/ChatUpdate.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="68">
- <caret line="8" column="13" selection-start-line="8" selection-start-column="13" selection-end-line="8" selection-end-column="13" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/client/ClientUpdate.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="663">
- <caret line="39" column="31" lean-forward="true" selection-start-line="39" selection-start-column="31" selection-end-line="39" selection-end-column="31" />
- <folding>
- <element signature="imports" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/server/ChatController.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="-939">
- <caret line="9" column="45" selection-start-line="9" selection-start-column="45" selection-end-line="9" selection-end-column="45" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/remote/IClientController.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="187">
- <caret line="12" selection-start-line="12" selection-end-line="12" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/remote/IClientUpdate.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="170">
- <caret line="12" selection-start-line="12" selection-end-line="12" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/client/Client.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="119">
- <caret line="133" column="104" selection-start-line="133" selection-start-column="104" selection-end-line="133" selection-end-column="104" />
- <folding>
- <element signature="e#892#893#0" expanded="true" />
- <element signature="e#923#924#0" expanded="true" />
- <element signature="e#969#970#0" expanded="true" />
- <element signature="e#1002#1003#0" expanded="true" />
- <element signature="e#1059#1060#0" expanded="true" />
- <element signature="e#1102#1103#0" expanded="true" />
- <element signature="e#1157#1158#0" expanded="true" />
- <element signature="e#1194#1195#0" expanded="true" />
- <element signature="e#1252#1253#0" expanded="true" />
- <element signature="e#1291#1292#0" expanded="true" />
- <element signature="e#1427#1428#0" expanded="true" />
- <element signature="e#1467#1468#0" expanded="true" />
- <element signature="e#1506#1507#0" expanded="true" />
- <element signature="e#1542#1543#0" expanded="true" />
- <element signature="e#1604#1605#0" expanded="true" />
- <element signature="e#1654#1655#0" expanded="true" />
- <element signature="e#3373#3374#0" expanded="true" />
- <element signature="e#3411#3412#0" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/client/ChatUpdate.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="114">
- <caret line="25" column="65" selection-start-line="25" selection-start-column="65" selection-end-line="25" selection-end-column="65" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/server/User.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="186">
- <caret line="47" lean-forward="true" selection-start-line="47" selection-end-line="47" />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/server/ClientController.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="-1602">
- <caret line="12" column="13" selection-start-line="12" selection-start-column="13" selection-end-line="12" selection-end-column="13" />
- <folding>
- <element signature="imports" expanded="true" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/GUI/ChatScreen.java">
- <provider selected="true" editor-type-id="text-editor">
- <state relative-caret-position="323">
- <caret line="81" selection-start-line="81" selection-end-line="81" />
- </state>
- </provider>
- </entry>
- </component>
- <component name="masterDetails">
- <states>
- <state key="GlobalLibrariesConfigurable.UI">
- <settings>
- <last-edited>JavaFX-11</last-edited>
- <splitter-proportions>
- <option name="proportions">
- <list>
- <option value="0.2" />
- </list>
- </option>
- </splitter-proportions>
- </settings>
- </state>
- <state key="JdkListConfigurable.UI">
- <settings>
- <last-edited>12</last-edited>
- <splitter-proportions>
- <option name="proportions">
- <list>
- <option value="0.2" />
- </list>
- </option>
- </splitter-proportions>
- </settings>
- </state>
- <state key="ProjectJDKs.UI">
- <settings>
- <last-edited>12</last-edited>
- <splitter-proportions>
- <option name="proportions">
- <list>
- <option value="0.2" />
- </list>
- </option>
- </splitter-proportions>
- </settings>
- </state>
- <state key="ProjectLibrariesConfigurable.UI">
- <settings>
- <splitter-proportions>
- <option name="proportions">
- <list>
- <option value="0.2" />
- </list>
- </option>
- </splitter-proportions>
- </settings>
- </state>
- </states>
- </component>
-</project>
\ No newline at end of file
diff --git a/META-INF/application.xml b/META-INF/application.xml
deleted file mode 100644
index 6d17810..0000000
--- a/META-INF/application.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<application xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/application_8.xsd"
- version="8">
-
-</application>
diff --git a/comp90015-dsass2-infinitymonkeys-remaster.iml b/comp90015-dsass2-infinitymonkeys-remaster.iml
deleted file mode 100644
index 7152d05..0000000
--- a/comp90015-dsass2-infinitymonkeys-remaster.iml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="javaeeApplication" name="javaEEApplication">
- <configuration>
- <descriptors>
- <deploymentDescriptor name="application.xml" url="file://$MODULE_DIR$/META-INF/application.xml" />
- </descriptors>
- </configuration>
- </facet>
- </component>
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$">
- <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- </component>
-</module>
\ No newline at end of file
diff --git a/comp90015_assignment2.iml b/comp90015_assignment2.iml
deleted file mode 100644
index c90834f..0000000
--- a/comp90015_assignment2.iml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$">
- <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- </component>
-</module>
\ No newline at end of file
diff --git a/infinitymonkeys.iml b/infinitymonkeys.iml
deleted file mode 100644
index 7152d05..0000000
--- a/infinitymonkeys.iml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="FacetManager">
- <facet type="javaeeApplication" name="javaEEApplication">
- <configuration>
- <descriptors>
- <deploymentDescriptor name="application.xml" url="file://$MODULE_DIR$/META-INF/application.xml" />
- </descriptors>
- </configuration>
- </facet>
- </component>
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$">
- <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- </component>
-</module>
\ No newline at end of file
diff --git a/out/production/infinitymonkeys/GUI/ChatScreen$1.class b/out/production/infinitymonkeys/GUI/ChatScreen$1.class
index ad070b4025d27146d6f511cc46e339e0c5c90c9d..acf30932dde719643c34b7da3333d1af154ec654 100644
GIT binary patch
literal 2451
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
delta 1132
zcmbO%ypSj9)W2Q(7#JAL8DcpZgcuA!gdrD$FoO{XgE0q#2|I%+7XurE87G4|g9R6Z
zC4&_QgEfe@;bO35umchH+zbv3j_eFhTnzjS&Rh)U3@+>puIvnMj0{|5i8(5hU$IC{
zoUW>%q~YTp>Z$LXkysL(T$GxcXYG@mlbM=VqVEi*CZ3Hm;VsY1OUW;H&dD#%%u8ov
zkk|0ZN-Rs%Pb@FdPb~wf4F@Z51+lF)!x$MDQztht%Db>67Nr|7GRWXl&d9))m{(k$
zTExh}=*h^y8(fl@ob8)f5R#ablgiHEKG})MxZZ<@L4v`Pk%7Z6wYbD1zqo{lL5xA1
zhe3ov6eQ!t$e`s|l&VmfU#d`C3T2ch=9MUv<SP`GW|k<FWTYw-rxq7y=I7ZnG6)7|
zl$I!@<d^5c1Q{8`L0+oRFD}o_OV{`EFDS{(&kIP*OXXqkX0Y>NXYl1=@MG|2X9(b7
z2xJIiWDp1}%`7R&%u9zE0TK^pX9(e82xSQ4VF+i4U}uQrVTfV~p3KQCTOZBf#lsK-
z)`=S6Du#><G9b$_!qYJ&v7iJLFj82h!NJYQz=vuaBZH6zY7~NF#F1G86fuIu8TsYT
z`FUxXMY%4Si8=Y{j0`qN(dnF@TacfZnpa{CiL;!<ymWp4q^#8BlF1X<gqb}xJtsS}
z2D7qgcxr}CKF=b>$BU9&Cf{c>=iyFIEeS17E%HmuO`W`sMRM{>X6bqsP&_a)@D~(i
z=9PdWIix5tIhB!tCAA{6gh7Eph(VZvfq_Xt02HeX3<3h6C<cizFfd3kNHQ=oNHH)l
zI5RLYFf%YP@M~#rWnk3O*~-AAwVi=^BUqs{0|Nsa10w?igEfN;0|SE?0~1IogDiu5
zJp%~vgUw`QU}R8WP=uOzhJl5Fg@J*=mQjdBh?RK<1H0`e1`e5R44g8v7_>Gqa0qd2
zW8l`>!oakRfd@kI?quL&Vpz_=;itQeL4bJ&gWyI6Mh0010|sLTeg<X+kUO*(xEL51
z>>0QioEQWdoa-4x8C)4;89W#a7<?Iw8N3)w7<?Ek82lJ)7y`hK)nZ^_FkxU}P-0L9
z`_LBTY>=ZFY#CG-R2di<xEPEX)ELwmm>4t|7#KtunEx{vGcdC=2(dG0GBPl-Gw`!8
sGq5mdfx|+ZL5G2XfrUYrL61S7fkA|Ui9we^j)8%Ji-D0r2y89`0G!?QjsO4v
diff --git a/out/production/infinitymonkeys/GUI/ChatScreen.class b/out/production/infinitymonkeys/GUI/ChatScreen.class
index d4722fd42983973ce3fd9102362ac5251df9d15d..dec99df6e06ff5da450d5861e04d1190bf4605fa 100644
GIT binary patch
literal 5858
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
literal 6649
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
asJ52`5ey6rA>c|llp&0Pfq@MyF9`r~6_K(4
diff --git a/out/production/infinitymonkeys/GUI/PaintGUI$1.class b/out/production/infinitymonkeys/GUI/PaintGUI$1.class
index 05dffb8fa1c36748b9542754e26f8c8e15359c41..9bdce2faacc2b1b843993ebf167bbe9585e5d476 100644
GIT binary patch
delta 320
zcmX@1bV7;a)W2Q(7#J8VHgeqMWDMN=j5Cn6K8%5nA)G;)A&NnhA)3LGA%?-0A&$YF
zA)X<GA(0`HA(<hWA%mfWA(NqvA&a4lA)8?;Lk`0Nh609-422B)7)lt<FqAUfVkl#H
z!%)uffuVxoH$x>O8$&IlI71zy977|c4ns4e6+<ht2tzxw976}QB10FmHbXbF9z!p)
zMLk0wvo*s6W><!Z%pMGrnS&UnFo!ZsV~%H-&YZ+BlR1ZB7IQws9Og=fxy&^T^O@Ti
z7BF`*EMlI_u$Xxo!&2r249l1oGpt}<%dnDp1H)?OT?}iO_cE+wKF+Y7`4q!O<|_=F
zn6EQzVSdQ4llc?FZWacHy(~u<_OqO0IKXm|;Sh`RZHB`v_ZW_{ykI!S@|xiU%U6bz
ZEI$}dvobN9VP$1F$I8!eX>x?X2LK3nT9N<&
delta 320
zcmX@1bV7;a)W2Q(7#JALH*(zNWDMH;j5Cn6KAeG%A%a1gA(}yxA%?+{A(p|GA)djV
zA%P);A&DW9A%!8CA(NqmA&a4nA)BF#A%|fqLoUMthC+so3`Gq47)lw=FqAReVkl>L
z!%)HSfuWM&H$xR88$%tVI72<7977YM4nqs06+;`d2tx<69789wB11Q`HbW1y9z!3q
zMLk15vo*s+W><zu%pMF=n1dLmGKVruXO3r>!JNb}i#dm3Hgi71T;@uKdCWBo3z*v&
z7BY7-EM}g}u!MOU!!qUt49l4pGpuA@%dm=h1H&5TT?}iP_cE+!KF+X#`4qz@<|_=F
znXfZ!Wq!!8i}@479u@|MeJn>94zQeKILLC5;V_HxZH6N(_ZW_`ykI!a@|xi!%U6a|
ZEI$~|ure{6Wo2bJ&&tnmd2)on2LLlpTH62s
diff --git a/out/production/infinitymonkeys/GUI/PaintGUI.class b/out/production/infinitymonkeys/GUI/PaintGUI.class
index 165d1af870b042236228c40f2dae99862c758f71..74a96160f6d4828a63f1c0cb03a68e5b070b9818 100644
GIT binary patch
delta 1151
zcmbOu{ZUHy)W2Q(7#J8V7#?ylNHf&3Gt_Y~)N?R2a4<A-Ff?&6G;=Vta54liv~n=C
zaZFU#sRwbUu`^5u(KFZ?W^yseGSq@Nvp~db5HW|HVJ;Vg62m+YXFiBnz|OFci$RTH
z5s0&xonZ+VgC;{Q$i}7Y49mC}bQqR{WLAJ!D?zMPAl7PjhBX`vYq=PV7}kLV*K;u#
zaWSmqVAufSZJc;ZK?7vOE)Is>AbJl6!(MiVeH;w?xfom_Iu3wX2e}wrCo3>YGqW?C
znC!u*vv~?*B@=TlL*--v79ZvihS16JEDf?@455q+LRpDri52?A<(YZu`d$Hvd8s)(
z45<uhlmD>DYNRt{@GxXDr13ChF{Cjv@VSS2>IWod=9RdIda4-mFyu0v<YCBW$eHZO
zDyf>wkjKN2%#gy!APO>5Ke4<--zmQ+CAG*Wu`<83gooi2!|BQOtWx5+3}<*4k{A+s
z7|t@B<6%euvCcDGn7n~iAu^ZYA`e3(Llh$evtMdC4?{GF$>Lv-n#aQs17-&&mZkDA
z#DduDAhv>IF%Lr=h|B7nlV6<5!w}C9#lvuk;W8rwt6zRmNd|~>WwIulm0CDM1P{Yi
zhHE?w*BNf`Fx+Ig#lvu$;SLYOU69y4hWk7W4;Zd(?qri=N*7{aU<hIeW&nW@hENd2
z5C)~g86v>^NQNjd9Sx;ppmZ#hj)T(iP&$Dj5v)E5N+&a<Oy=Vh*G>bAW-&nMY=#^L
z1_l-eMuuF5JO)OFd<F()P6k#6CI$v3%gGU(7Z|lS>u}{V))z1^Ff3xwU|?X7V_;$6
zXV7L4VCZ9zV3^4u$*_b$ieWv2G{Y{2K!#%s3Jj+ilo_rws4+Zc&}8_+pvCZ?L7S0}
zL5ESCL6=d9L61?NL7&lz!GO`7!H_YC!H6-Q!I&|N!Gy7#!IZIy!Hlt=!JKgxg9YPq
z21~|G3^t7W7;NhqPchgrUSn`%e8k|y_>RGu@fU*&6B~molMsUklRSeblQx4FlLdn}
zLm>kLgBZm93`GpZAm1`sf<u>)fsvtvp%mgv27Lw)pMil@YYT(S1_lNOCI*ln*%%lZ
z7#RG(#_)jItRQ1N85kHC8Oj*SvFO%7*L@9LH&}B8LnTP_<Oe*_i6EQQ7&sXi816Fg
zGTdVjWVp{D!|;$nli?AAA;V(^ONJ*5jtoy3JQ<!LndJp?2?GNIGeZ^Fz10jg(8yC_
S2xMSj;9_88Py%_FfdK$=LDjAR
delta 1220
zcmew;HAh<g)W2Q(7#JAL86I;nNHf&4Gc<58G;%OBaWFJ<Ftl(mv~n=CaWVu<)YYly
zV3@|iFrAYjfMEtZ!%Pr8i=AOM7lSNAJ%}?0M9c*d^Vk{Yb1^6}EC6v9f`~=z42!uK
z)EJh4I7`_XmT@s?GSq`?T+Yt0f{Q_iVI@dr6^OMO#99Mltz~Ce$HB0ki@}It11E!D
z0K-NQb2SIUCXkZN91L4P^i~drZ6JC(2g42!y_17s7l_^sGJX#S!(I@*kAq=9JHr7E
zhJ#!Tt{~F_CTlTD^MW`hK*ULQhEtP07<FX1k~0!Zf|H9<Q}Y-Z1bo~>J@uX8BAW{t
zYnYhx8LB6LVD@1SV+fyY&(a_p!4S^KAe5C@mRO-*T%MViuJ09)n3tNv!;sF9G5HRQ
ztVSk777s%<Lk15+4nqbb10TrLfW*wa68BI~6+<3|e1_9J47m(>lNDJdRr47Nco<R{
z(ij;;L1yYFmY3)|<rk%-7WpJr=9iZ6Fq~mHJ2{?JN<5$891lYZLoyG;d4>x-3`ro?
zMTSe0C$K6+<}+O8VTfjkVPs(TOD*SNhy^iO{0ma^co^cq?BK+*R33(S5StyuR&Xrl
zVMqXRS)Ft8i&J?R5*cE67_Kl}Wn^IW%P%U)0CBEO=47){i)4u6VYtq4gNNZJ!z~_$
z+YEPj816FM<6*cD5_`b#kcZ(B!;Q_EY;sKL!VC-yK@7nRAP~Y33ZfXo7{bAH1eA_s
zhywGY8DhY6ER>Fe((zC_0ZJ!A=_H0^u=*5+<jL<i#ErASyljRHFr5RXa~bj&7#LU>
z7#Z>z3K$p}3K<xfc^Ft3m>3wCY$h9UUSQGM!l1gDkt>(6zKDT=VG)A{0|SFR0}F!y
zgEoU8Lmz`A!%PM#h9wNr4C@(W7<MrPF&tx1WH`;B!f=a0o#6$87Q=T2ZAK;r9Y#S0
zT}CMeJw{aqeMTb&14dg0Lq;zKBgRk$W5y%~6UJNyQ^qO=Gsad1bH+&w7L0QlEE!iZ
zSTSy8uw^{RU{}w0mcgF!CW8~>QwC?oj|?u1e;HhvI2qiSL>WAplo-62^ccLEtQmY5
ziWwLf#2{W^C}AiCd6>xt9MFsmj0|NA<q(fD=re%$3=FJVTNq?EFfcGMF@XHY#=ywH
zz~B!yh6l`M1sUVXz`(%BP{B}%MYjgJ?(68f!J4ZWszI73Z{>+j1lgp<z{$YCaF2nP
z;XZ>P!vh8xhDQvV438NM8J;j$GCXB)WO&Bl$?zP>EH98t7#J9s8EU}pt!1c##-9>H
RAOiyf7Xu@M63D|03;@J6=nVh>
diff --git a/out/production/infinitymonkeys/client/ChatUpdate.class b/out/production/infinitymonkeys/client/ChatUpdate.class
index d3d43bbf0dbe0a7b388beca7ad07b42d699e904d..68eadfd4ea14a8cb64bdd7296f5f200597299421 100644
GIT binary patch
delta 832
zcmbQs|AXJ-)W2Q(7#J8V7!tS`co;M}8Mqm=gcukY^n@4~8T7aq3>XZ#7>pQ<xfo0s
zOt~1$7|ewjm>4XD7?>F>*%_?a8En`YY}py?COS`Mw4Zo=Dx<^XT*kOiK?X-227U$s
zMg{?={QQ#QlA^={-_(+f{FGvTHU=jS24@}y7Y0`j1~+yFcOC{022XYdFCGSO1|N0?
zUmgZO27h*j03L=wh9C}xV35)f4u;Ul5=?WL!x+LRZ)a+A7D`VoaV#jv$xKcx$;{95
zP0Y+=WDwWT^l=aM)JK!BW@He?B0Sle`43wJ$n==Wwk(>Aag)<owlc;~mSy#+=Vstx
zU}E59;A3E9U;_Dsfq{XAfssLw0px#S1_lN<1||k31_lN$t?dkqTH0F~m^LynFfcKQ
zFfcIiF)%YQFz_?5FbFVkG6*t=GB7ZRK~yt{F^DsO02kO)Mg|F}$&w6=3{niz3``8d
z3=CWhD;Ss<SQ!`?bSHmeRj%L0z%I$Mje&z@4FdxMGuRF>u(SjN3xgDc0D~NZB!eP@
zHiIhIE;|M`23`hc1{nrf1{RPZa9ed5<QQZb7{Oxl46<N1=`tuVC^9fJNHT~(bto|~
zFmN(33H)K;U}sQfkf=v;qY8s6#ElFA&=8Q&+QPuJje&I=1KTzRcI{mZoD2*ww?e{$
z3v7=TgBXK0*nN<&kbt{N0_rN{uuwy?rydg27#4A1x5$7&jKPpdi<lYI!O^C{5Dkh<
m21bTRhFFFu21y2O1_lNx1{MY#21XGET@b~f4<;?Zq!j>Aa%2(!
delta 719
zcmeytKbPP6)W2Q(7#JAL8KSrtxEVA!8MqiUg%}tZbcGlg8FaZA^cf7e7z`PVxEPEX
zOoSMi7|etim>JC287$ZtEZG^X*cq%RdQ4`tnRsU^qwVA(#yDRA20I=GJ_de91_7u1
z{F365qQnB<)RK(+lwy81273+$2Ob7T1}6>%XLbe`9tKwiH+BYh9tIBvPj&_`9tLj)
z9}WgzkP<%*2LH*bOmmn67y>6BVQQP)&-{xm2qY6Wxt~RoF=FygmaUADlk-`9<Ux*S
zV&GxmWng4r0@=>Mz`(-5$RNNV$iT!PH2D^*w7)O|0|OreGXnzyKLZPc00Sq3AcF`4
z1A`a?69WSS7lSB+7y}4!f%P*oh(pbgU|?jBWRL=x!@$6>l!1wXm4SglYqATQa=j$W
zHU@T<H4F?4%nTs&#lUhB3@i*%3<3;t43Z3r3>ploV0-Ks*cf;jm>HxQWEfaLCctgf
zVvuE!VPFJ{$uY=)-J``I&!E7-%pl1i2-Ts;z`(%Cz$Ea8frFhv3GBRjkRL(rQ)W<s
zy3dz^39MgKYYPL@HU`#h3~buF7&sUhU=C#hJCqBoNQ*(3K^yEiNFa#9og@l%5^^A@
zVpvj-Y6~ZJTMQV484QWEg_%K(fq{XEL7gEK94U+p!3^OHAq<iXS_}*fQVc8%+6;^g
PI$%<dfg8jz1#`>+(@00C
diff --git a/out/production/infinitymonkeys/client/Client.class b/out/production/infinitymonkeys/client/Client.class
index c77e62aac733fe7def8e84b41a6801f5ef591816..ef1be6eb4d0807a5bcca430017f302a77a2a45b3 100644
GIT binary patch
literal 4677
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
Lz{s!yOl}7NrQT>J
literal 3669
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
H4&?y=Uk*7W
diff --git a/out/production/infinitymonkeys/client/ClientUpdate.class b/out/production/infinitymonkeys/client/ClientUpdate.class
index f3d25e75dcea30aad35683b0aedc4e92e2561079..a1d023651651cabe0b23dd94329cf3cd62e669c7 100644
GIT binary patch
delta 1633
zcmbQqy-B$K)W2Q(7#J8V7@D~l#2G9&8N?VYxfrY%thpF$7;L#1>=^917)%))I2jxn
zoH!Vqxfom+T!k1I7(78NFD?c#25$}q9}vfvgTW7^)}MnRfP*2BgCPiHP%sxm2tz14
zLl`?lI6FfGJ3}NR16y)VW@=suBLn|L-%iG;iPy8)cngX$^GYUrGAb~JP0nIe5#$Xn
zNlec6O)LmWOv*`RXV9DMz^F61k5P%4ogsSiF-GNj8HN}h1}O$<c7|9UhB$_Jc7_BV
zhD3%Wc7|jgh7^WW9)>iAbasXe9)?VYEJg-t=hC90)Vz|MN`>V7yu8%plGGH1(&E&j
zVk-r9hHM^&9EMy*1_7u1{F365qQnB<)RK(+lwy81hCB|2d>)1ZhC&{OB9NV04BCtg
ztX3he!6Akqp<G4=RuIRChoP7u2FfvJWMFp8$$|1rco<3;O4%98co@nVDkjS@ZFLq(
zPc3mQD9Fi7PAtjH&+|>p%wuE_*U<EF5B1bXldxuF5XK@r`6AQAdV#FOvPAuy#JqI<
z;L75X)Lcde=KRtUMg~zIuuNvYegG(JgG-816LUc(VG(9zU<F42BZH_0L>t7wlA_GK
zbZgBpE`~~mDn<q-Mg>L&@!Z7hROkG><iwKj%o4>6=ls0llEl1{VnzlvY?>!4Fp6-n
zgN@J0o1DO$RnN{)4GPbCMg|qITflZ@=9T4Vr|JiTt%MlwmY7_UUsTD?(8$QZ=98bF
zU0T4%z~h;hms;eUlUQ7wTFl5W1KCQb8IY*+NX$#gNi9}^XtYLnYvLE-dK8r*l?ACt
z@=!NeM<cZ8`zK|kCYM-iA_+l_a8At03C=7@wPt5%Vq{Ro@DMh~Fgh{F;aA9@$RNfb
z&cMVV!63=N$iM_j=nM=DEDVecG7Pc|Obl|9-!Mzp%QG-A@G&qmFfa%*urLTQa54xp
zC@?TEh%qoRFfed2C^9H9fB+X*KO=)O)C?5{Mg~;|HIO+B3=E+ROkgvFwYD%YZDU~G
z#=x?TfmLT40~^a41_lNu29PyeU?U|M1R12jRwytqGt@IM2*d3VW>9C)U|?hbiD@!u
zFfbw6#>Ak-pv}O@AjiPKFq?sifsKKI!E6%)yAa1V22O2Xoqcx9W-OvCvWpmGbVON<
ztXMZOuuHP;V&Gz6*v7!w!os-x|C3D&?AsW)H!?6VFoPW=#lTk2z`&ruz`>x%Aj6={
zpvj=fpwFPnV9KBdccBaeFM|$)1_LX|Lby}S7<3u*7#JD!85kIN8JPYt2(U94Ff#sN
zkYiwEFk~=-gbO1l0}}%~0|P^Wmi9IV9*}c+w=wV`1yVf&t1n2He;Wgz&Nc=C5L*z$
z782UVzy{(8Z)4!o_S4;G#=>mID#|L#vWP)NSCrMricOLYVvxu-2GLmzoH~+h+Zfnd
zSQ(f9zYPv`h$qb$co`TNv>8|#^cZ*<^ckcX3>lOej2P4zOc?YT>P;C;8O#}M87vrr
z8LSwR7;G3a7%Uj_7#zR>pvAz#5X>M74ggSy7r+Cc02%<&4519h3?>Xr;GmFZVE)hG
z#=yqTAjZyMz|LR_4iyFl#UBi;NRi3RU<OVV<_xlR;8e!QP{Yu`P|G06;Ksnfz`?-C
K;LgCv-~j+_6H+_?
delta 603
zcmdlaJd@k;)W2Q(7#JAL8N9g|xEZuK8Mqj<xfpa9bh#Mx81%Uq)ENvwgdqom5lGmW
zi@}7!l%2thoxz-)!GfK^a$@mRMytu3jM<YfF=|bo%cwN@52KP8BLi=6Nn&!gZ(>16
zVp2{jJA)ECgY{%ZCS_9r1{)p*J_dev23sBmI|h4p1_vGnM+PSz24@Br9tKwi8%73Z
z$DAA<1~&$Gb_Nd~22TdB$$y!)PX5l^KiP#fLy19=0pwUF1|9}p21W)ZkZBAI49pCS
z3<3;-3``6{lmD|x*9$W+Fz_)jGcYg+GO#cRF>o>nGl(!SFo-cQF)%Q2F^DpVF@OLU
zSU)3!I0FL%3j-sA1Op?3B!d*l90mr4AO<F|83I~c7?`#(FmGdE(b>kp%Cd%mfq{tu
zWCs`6JP8Iq1}U)l3J~@Fa0>(&q#0xw7#SEC1Q=u)WEhxGtde7phgx-(fr){gfq}sT
zVU@4WHU>5wA@*$ytdsX}$klUfW8j>{z^Nn2wvB<cg_Uvn|Jz`fFoRv9#K6J8z@Wsy
z&7i`-&!EO2%AmoZ&7j3##h}CBz@Wk4#$W(;p%w!RgEoUGg93vL0~^RfxKlkC6d9Bl
z7#X-3Y#EdpR2Y~TR2di;q#2n1GsrQpv8yw1u`{T#GpMsOs4+4!Fev_DU`6qa1~^nS
E0ga4AjQ{`u
diff --git a/out/production/infinitymonkeys/client/DrawingUpdate.class b/out/production/infinitymonkeys/client/DrawingUpdate.class
index 0d069f263b5239d56e9d5cbba428006c12a08e44..bab63ecfc480e691445e42f0b4c0716e7374c791 100644
GIT binary patch
delta 449
zcmX@lIg!Ki)W2Q(7#J8V7;L#1I2q(Q88{dexEK@}l(-m_8C19!R2kH`7}OawK!hec
zgBCl3Hamk3JA>{-w`q)e6Yo||u3%Ks<zvw2Vc=olWoIzpVK8JcVrMYsVK8AZWoIzs
zVK8T~U}v!8VX$Jb=3%g5(4YL6alW%qdTNPdK|xMta$-qlex7e)W*#GhxQ3>Wd#I;A
znuIkYgD@81$qh`AlP@z0O}@#bZO5R<z`?-Dz{J4Cz|FwOzyxv)0|NsS10w?;13v>3
zg8%~qgBt@A0}}%S1DDoz21YIItqe>X!D<92KV%lJ7h+&w5QE4w2s4N<fB+ZR97YCF
z1_lNe21W)k21W*P1_`KnnG8$}%nS?+%350(n6@!6Z)0HD#=xqxje!kCU>gHF^BRan
z3=9l>U@c+{f(+seiVV^WAZryEm>CQi7?k1mDl<qjNHH*i%w~{gkYQj#ae*w@FgXDI
Czd%0#
delta 654
zcmbQpah}ud)W2Q(7#JAL89ccdco<YT8Mql#xfs+K)VUZm7&N&UxEQoRgf>V_hl@d%
zL63_;pTU5g!H}K7h@HWhoxy~i!E~bKG)A+D7b@ksQ;HJHGxO3Ni&7IA83cXYLp}9f
z5JHpP7*)*$8O(VY_!$J)87z1hEE%lW8LW92Y#3~L80;AAc^Di((vA#H><rF43@!|=
z><n%^4DJjblP@xfOrFI!cXAC=_~fTd+VzYKyy>YW&KZd%!O2Cbsd<bHLK>Q28xdmG
zj0}7rHy}h98TivvOQ3EFNX$#kVPp`~(DcblEK97=F9tbY-wP~m&B!2xDay#e1F|(g
zx4s}hFEy`(kwIL;6QW%|vAjgzIX@R7Va=e(z|FwJz{J4Iz{kMIzy$I$0|NsS10#bV
zgAfA~gD?XFgBt@A0}}%S1DDoz21YIItqe>X!D>Vp7#R2%m>C!t1Q=Kt1Q|FPgcw8_
z7#PGLsu{!>>ctsAfD3FaBZCA30|N^KBZDLZBZCx!G}QPh3``6x3=9kwT3Z;HwlOeo
zV_?zQ#=wf;ZDU}AaM-soaIkD+;5@*<<);f$qq~iPjd=~+F;Wa{VC(r9#2KU+Bp7u4
z7$g~t7^E1?7^J~2(}GyUAjSZ3m<59jgDe9h$Z`fb26+Z123-bj1_cI124)n;DuJy~
F1^`r8ZvFrO
diff --git a/out/production/infinitymonkeys/server/ClientController.class b/out/production/infinitymonkeys/server/ClientController.class
index fe0b87bb2045cdd4eb764eff6cfed1a0ac766134..b7095b80ed7d6e9586534ffe95c385745b258c00 100644
GIT binary patch
delta 2224
zcmZ1|+o@20>ff$?3=9kw4EwnlR2afJ8I&0!xEPcfA~_kN7^1ltVi;oC8REDY*cjqL
zA_-g!i3~{~A{nGAg_9wbAx(&Zfgy{FA)6rwB$f-3%>(Jo2XPBH7z#mhMIhl~ZU#4o
z5)e@eGO~=zk|CR+93)c#;#Y!*DlP^&hH7?(8X*Qokg;qGb=(Z~3=JF%jqD6f><rE9
z3@z*otrKU?WNTw&V9Cm#oWmN$7&TdwNoMj?#%YsXne3%`3yL!HN<xcMi+nPROBflL
zH8jH*85m318QLc|F>Rmh%&g8BJUNe9y<U^Sg@-|%L4$|Em%)#np@WB^lc9^9p__-H
zhrxr9fx9@hs4TTeA7m5{gC;{S4?`bAKRd$&9)^hwlXw^=Gfd%OaA)vfXPC;vFpXh4
zBZGibett=DNl{{fZ)!<Keo8Sv8^a6^hM7DJvlwQxGtA*(n9Jb6!w?9vcOFCid>)1c
z3?4iT&I~S$4ARb}MMbH3B{`J}$@zJCsmUd&DGH^<sYS(B3Oo!8LHZUkEaqWY!myNw
zVHv}69)=YRD?tXj@Gz`mn9swonqdtO!&;E+I)+J%3<6n+Wr_MZiFxVz!6ikRdFdPs
z>v<S9Fl=OJ*u=xInPCefCj+~lo}P=ppX=sWma~kLqu30Yw=!&-+{e~6*?>)AvIM&<
z8!I?4Cl|6CurO<AMopg2t}xk^UDbv;J+*|9fulIJ#4#l|GmnvhMI#Cn%<P%PPyx2o
z!qUW?Vnzl5Munu*%)E4ky!?{Pw9M3$$$Qxg*|vkiWcOqf4o$|rljAtHvg~7IP@Qbg
zDL2`aQ(In{L4|>dL6t#`fsug;6h#aS3>*wB44MpD3``8#lj}L9>vb3y82A{N85kIZ
z7+4sD88{h47<3sJ7{nNu7#JA181xwQ89;ywte=s=fPsO5g@KX5kb#lGh`|_S4g&+j
z3kEg@HU<WUa4qd^49s&F0<^X;Fl}LA(cZ?u8orx>EmB)YSCVBr1G^O~M216>bsGa`
zxK=$_9mh5XE|vuhoFLuY;hPwEw0AM^GB9jo;M3a1z|XRVc?|;t12Y52ty&CR3=9mC
z3>*wH3?dA23`z_N4EhX847Lm^49*Pd4E_w748aWA451AAV1L*#urVkx7&DkKm@=?}
zTnP73ID;93c|8LoSkQvO671n{1}g?@aBze(*f7{KurSy$Ffed4F#Tb0W@ljg#UO|h
z0`?3J&=BZlU;=B?2Kj;6R%SMXJk+N$+ZY7GA#6~12!@0Fq_vGfXd?pyLp{V-at!PY
z3=C!rYz$TmTnsi0VhnZ+N(>GRY7EW{S`02=pC~}ghr3@J<bDQ51~vv&21f=b1}3mm
z*%%oAFsLEN6B8(BFfcM`GcYhrhPu*f69bQs@HPgKdWgd~wlRqMXzyeYV`P}gAf>&N
zL7b7{00W!vCI%jzZ446I7(|x;f4qr-XB&eg$kh->OM#=@lYxW5i$RUShrxism%*69
zkHM0`AM9XI5>jK}VsK?J1&6H_)amdL6=r9scl*U4&%nsw&fozJ$SSB472p9W4t1l<
zHU_B!3~Vgh7^G2>gcvwtLm1c?!Wg(1A{b;CVi@EY;=yi!1eyZWW(EcYc%Vr!crrLK
z)FXwO9CD~JGI%j~L!GpZfeCDdy_U{424*|3!^~JjS>`e5$<AZYf;vx>1>(MK3^Fqr
zM4^JR;K)Z$#E|GtWng2dPiNp|$YjuF$YwBS$Yro*$Y-!+C;~g(1Y#%L>Gn{kGcedQ
z_%N6=Ffp((Sb}4onSqzV2<#n5a%E>={L5g=i0U0*20v&bSi!)=z{0@5V9sRAJoy0+
zM?EO}En-kZI2jbo+ZZIYw=u}hWZ;msUCzMS!pyk*|0NkjMuhmGoPmj<l0k@}nn8=9
zmO+Q1jzOQHlEIXr8SDiu1{MYu215pa1}AXhHHUk~9O@Y+22+Om0C?)<W?=ryz{1F=
z^^1X(feBQ^L!y9@8*CB-Lj%;2+Zed^GRXNb+sYsW7BR?b!?@72vW-C^xP^&v`TyIX
z3<p;#>Z=1y>qa^|8R{X4-ER{EkM1@GiCqlxprS`acN>F(_D%*xCI(Q6B&4*Bfp7W$
z(}?7+$H2|Nz|hIS$I!(f$I!!I#L&fH!O+iO!!VH{ieWNCCc_kl5{9V^H4M`j>KUfP
z14Mv90~{bs3{eb9pv;j84x0vO*zhqFF$6ILGcba)vnT`0Uj_koh7iVI4C;Rv_}CfT
weleIMl|jr5p$rTROblTRyTIi&Bf}1cJq$Y;BpK4dB|8&C1_L8QCYY=R04Gg!Y5)KL
delta 1889
zcmeBFSSVY6>ff$?3=9nB4C}ZUWEuQ98Dtm&I2i&Ng18uh8A8|@Lb(`N8Nxs!;am(6
z43Qur3PePMBw{!jVj1Fu7#J9mxEPWdQn(mo7*at*8c0bx$czk-x=av}#l;}Tkj>7J
z1Cq<-X7FLi<CbFZVaNwb7H~5ZG8C~h6tgpwurrjhGn7r-F_W#Fk%1*EfATHXD8{JC
zXBcOQv*)FjhZd(6F*5M_6sH!Ir55RfxRVo^oF*S&+RDMKp&7==z*suDm|2s>i=Clj
z@?2*1dL;&T9tH&lMRtZt9)>E0YIcSi9)?;5TSf+MBtv)@lo;xG80r}s*clpm7@8QG
zc^Fz4T6q}S7}|LlIv6_H8M=5Fx*2*H83dg2^Gk|LiV_QaQ%f@PQ;PZ77<xGv`gj=n
z878nZOypsh#9+z8;0ChSiNVvEhhZ|vj42GZJPcDArtvULXPCjmFq5H~kwG9Uu`E$P
zCowNwKe(hQGcTQoVHU$|9)>v}Wpf$k@i5G1SisJ(kcVLr!{W`SS<W(YGN-4OFfxd0
zcuu~+E-JuLoLb_TlAD>w$iSizr5QGP8k;fm5{9Ld&#-k(&SRJ5W6vyx$}?+dMooUq
zuFlSuT3DKxQ#^ShyTRn+>~fPmIP%$+fgHbT@?H*2#x;|lb8KZ?J9#drPrVF-ECUmR
z9D_UqBLfpC5E&R4*cn(Dlo*s5m>5(T7#Q3bm>8HC7#O&;wlgqlX>Vm<+Q`7bz{H@+
zz`(%Az|6qFAjH7JAk4tYAi|)=z`!5|QO%&vpuqqFTwqff88jIf7+4q>8MGJ}8MGO6
zAg0$d+-G28U}Iolh}7D`z_f*dS$i7;OZaXE)<|s~T}hVh3~W}c5E*t!)@=+N;ZV*t
z22Pd*45CmT^EL*q0}QMz+ZebvG4N>bV&G+9*v7!8wT*$FWeo!Z12fpQN(>wf3=EPC
zJPgtdQVg;T>J0Mr45kc<4DJjn48aU)4B-qKU@zD~Tm<(*B!e!49s?uDl??g}24D|H
zG8i%#fxREeV9a2`z``KKV9#L6V8+18V9vn6z`?-yhryklffdE$77UgUk2AC~FflMQ
z)H5)sYiVy|5U`b*%^(l;jm$O%L8w1L!66h5@&_o;A>NPzyH1aRjlqC{i@}INjKPFK
ziNTCPjllx!dIhkn)ZwmIhq|7PL6O0V!J2^y>^?S-`_$@D<Hd%-7V5kzu=5xg6yUBC
zN4O3a)+}q75uq!_z{<eDV9UV9V9&tC;K(4u;LIS$;D+QR1-O$GU{0!MkYcbyb(0*b
zlk6EBpibJxzy!9!UQ1^igMb~_VP-6%Eb|!jWalwxL7gYc0!a(o7=&lS(}yfLM8T;6
z$;EOE?DY%`3_c8O41Nr}3;_(<3_%R$3?U5G3}Fnm43S``n?US@JKY}YbOr`{21f=x
z1||kJ21{_bGBfZp7=eAm0uEtz2FAY(wv4FWabj?0U<Bu@6%0%aEZU&LnaP&fP8RC?
zZ48`?7}TH~S(sNuw6`&cPPXS0tq0{gIR<tH28K8WCWZtCA%-LdErt{Z9fni}eTD=E
zQ-(~iv$Ysl7+4q#8C)2w!O6iK?g4YC2bdU48C>B(&&|O6mw|<mQR^22D+3d#XoH6O
z6R<%H45?r@)ibbfW8mD&Am+ntD+3k*3oK%g)rN6p;EoP%VPahV|2ABixUbGm1_?%n
znGDi8I~gPy84fV8`sr?Ckka1CAkD-OzWo0qL@HMTXVyFhK86AYIffzzBZdM73x@hq
zhA@V5hD3%6h7^WMxK9NbG{8P(VhCg4X7FGz1N%7@>SsQNa0X8XF9t?%w1_gW{ACbe
zXYgkH#i0I&fs38N=NE$lQZ8j?@C6reehe!?#U2AA!*Yhz3@aEU8R8kZ!5Nz&fq{`B
F5dg=SD9r!>
diff --git a/src.zip b/src.zip
deleted file mode 100644
index d037531c7c7e5a2934c2e6521fdab3171a018182..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 25722
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
S>Xv1YWw_7Hz|a~2;sF4O-f=(x
diff --git a/src/GUI/ApplicationMain.java b/src/GUI/ApplicationMain.java
deleted file mode 100644
index 6c35fec..0000000
--- a/src/GUI/ApplicationMain.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package GUI;
-
-import client.Client;
-
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.rmi.RemoteException;
-
-public class ApplicationMain extends JPanel {
- Client client;
- ChatScreen chatScreen;
- PaintGUI paintGUI;
- JFrame frame;
-
- public ChatScreen getChatScreen() { return chatScreen; }
-
- public PaintGUI getPaintGUI() { return paintGUI; }
-
- public JFrame getFrame() {
- return frame;
- }
-
- public ApplicationMain(Client client) {
- this.client = client;
- this.chatScreen = new ChatScreen(client);
- this.paintGUI = new PaintGUI(client);
- }
-
- public void createAndShowGUI() {
- frame = new JFrame("Application Main");
- JFrame.setDefaultLookAndFeelDecorated(true);
- Container content = frame.getContentPane();
- content.setLayout(new BorderLayout());
- content.add(paintGUI.getGlobal(), BorderLayout.WEST);
- content.add(chatScreen.panel2, BorderLayout.EAST);
- SwingUtilities.getRootPane(chatScreen.getSendButton()).setDefaultButton(chatScreen.getSendButton());
- frame.addWindowListener(new WindowAdapter()
- {
- @Override
- public void windowClosing(WindowEvent arg0)
- {
- int answer = JOptionPane.showConfirmDialog(null,
- "Are you sure you want to quit the session?",
- "Shut down session", JOptionPane.YES_NO_OPTION);
- System.out.println(answer);
- if (answer == 0)
- {
- System.out.println("Quitting session");
- try
- {
- client.getClientController().quit(client.getUserName());
- }
- catch (RemoteException e)
- {
- e.printStackTrace();
- }
- System.exit(0);
- }
- }
- });
-
- frame.setSize(1200, 700);
- frame.setLocationRelativeTo( null );
- frame.setResizable(false);
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.pack();
- frame.setVisible(true);
- }
-
-}
diff --git a/src/GUI/ChatScreen.form b/src/GUI/ChatScreen.form
deleted file mode 100644
index baeed11..0000000
--- a/src/GUI/ChatScreen.form
+++ /dev/null
@@ -1,200 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="GUI.ChatScreen">
- <grid id="27dc6" binding="panel2" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
- <margin top="0" left="0" bottom="0" right="0"/>
- <constraints>
- <xy x="20" y="20" width="1200" height="1200"/>
- </constraints>
- <properties>
- <maximumSize width="-1" height="-1"/>
- <minimumSize width="-1" height="-1"/>
- <preferredSize width="700" height="600"/>
- </properties>
- <border type="none"/>
- <children>
- <grid id="b37e3" binding="othersPanel" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
- <margin top="0" left="0" bottom="0" right="0"/>
- <constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="1" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties/>
- <border type="none"/>
- <children>
- <grid id="bad73" binding="myAreaPanel" layout-manager="GridLayoutManager" row-count="12" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
- <margin top="0" left="0" bottom="0" right="0"/>
- <constraints>
- <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="7" hsize-policy="1" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties/>
- <border type="none" title="My Area"/>
- <children>
- <component id="a35da" class="javax.swing.JLabel" binding="managersNameLabel">
- <constraints>
- <grid row="4" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <font size="14" style="1"/>
- <text value="Manager's Name:"/>
- </properties>
- </component>
- <vspacer id="38e19">
- <constraints>
- <grid row="10" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
- </constraints>
- </vspacer>
- <component id="98bbe" class="javax.swing.JLabel" binding="yourNameLabel">
- <constraints>
- <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <font size="14" style="1"/>
- <text value="Your Name:"/>
- </properties>
- </component>
- <component id="33d66" class="javax.swing.JLabel" binding="yourNameDisplay">
- <constraints>
- <grid row="3" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="Here goes User's Name"/>
- </properties>
- </component>
- <grid id="4212" binding="managersPanel" layout-manager="GridLayoutManager" row-count="4" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
- <margin top="0" left="0" bottom="0" right="0"/>
- <constraints>
- <grid row="6" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties/>
- <border type="none" title="Manager's Tools"/>
- <children>
- <component id="b7068" class="javax.swing.JComboBox" binding="userSelectComboBox">
- <constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <model/>
- </properties>
- </component>
- <vspacer id="aae38">
- <constraints>
- <grid row="3" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
- </constraints>
- </vspacer>
- <component id="be5e9" class="javax.swing.JButton" binding="kickOutButton" default-binding="true">
- <constraints>
- <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="Kick Out"/>
- </properties>
- </component>
- <component id="1336c" class="javax.swing.JButton" binding="promoteToManagerButton" default-binding="true">
- <constraints>
- <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="Promote to Manager"/>
- </properties>
- </component>
- </children>
- </grid>
- <component id="51b56" class="javax.swing.JLabel" binding="managersNameDisplay">
- <constraints>
- <grid row="5" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="Here goes Admin's Name"/>
- </properties>
- </component>
- <vspacer id="e9e96">
- <constraints>
- <grid row="11" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
- </constraints>
- </vspacer>
- <component id="deaed" class="javax.swing.JButton" binding="exitThisRoomButton" default-binding="true">
- <constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="Exit This Room"/>
- </properties>
- </component>
- <component id="bd8ec" class="javax.swing.JButton" binding="quitButton">
- <constraints>
- <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="Quit Program"/>
- </properties>
- </component>
- </children>
- </grid>
- <grid id="5d886" binding="chatPanel" layout-manager="GridLayoutManager" row-count="6" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
- <margin top="0" left="0" bottom="0" right="0"/>
- <constraints>
- <grid row="0" column="0" row-span="2" col-span="1" vsize-policy="7" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties/>
- <border type="none" title="Chat Area"/>
- <children>
- <component id="6a928" class="javax.swing.JLabel">
- <constraints>
- <grid row="3" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="Your Message"/>
- </properties>
- </component>
- <component id="9e940" class="javax.swing.JButton" binding="sendButton">
- <constraints>
- <grid row="5" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="Send"/>
- </properties>
- </component>
- <scrollpane id="ec60d">
- <constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="7" hsize-policy="7" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties/>
- <border type="none"/>
- <children>
- <component id="c55f3" class="javax.swing.JTextArea" binding="chatDisplayBox">
- <constraints/>
- <properties>
- <editable value="true"/>
- <lineWrap value="true"/>
- </properties>
- </component>
- </children>
- </scrollpane>
- <component id="2b67f" class="javax.swing.JTextField" binding="chatInputBox">
- <constraints>
- <grid row="4" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
- <preferred-size width="150" height="-1"/>
- </grid>
- </constraints>
- <properties/>
- </component>
- <component id="df8f1" class="javax.swing.JLabel" binding="sendMessageToLabel">
- <constraints>
- <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="Send Message To:"/>
- </properties>
- </component>
- <component id="cc35d" class="javax.swing.JComboBox" binding="sendMessageToComboBox">
- <constraints>
- <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties/>
- </component>
- </children>
- </grid>
- </children>
- </grid>
- </children>
- </grid>
-</form>
diff --git a/src/GUI/ChatScreen.java b/src/GUI/ChatScreen.java
deleted file mode 100644
index 972ea6e..0000000
--- a/src/GUI/ChatScreen.java
+++ /dev/null
@@ -1,142 +0,0 @@
-package GUI;
-
-import client.Client;
-import remote.IChatController;
-import remote.IClientController;
-
-import javax.swing.*;
-import java.awt.event.*;
-import java.rmi.RemoteException;
-
-public class ChatScreen {
-
- public JPanel panel2;
-
- private JButton sendButton;
-
- // private JPanel drawingPanel;
- private JPanel othersPanel;
- private JComboBox sendMessageToComboBox;
- private JTextArea chatDisplayBox;
- private JComboBox userSelectComboBox;
- private JButton kickOutButton;
- private JButton promoteToManagerButton;
- private JTextField chatInputBox;
- private JLabel sendMessageToLabel;
- private JLabel managersNameLabel;
- private JLabel yourNameLabel;
- private JLabel yourNameDisplay;
- private JLabel managersNameDisplay;
- private JPanel myAreaPanel;
- private JPanel managersPanel;
- private JPanel chatPanel;
- private JButton exitThisRoomButton;
- private JButton quitButton;
- private JFrame frame;
- public Client getClient() {
- return client;
- }
-
- public Client client;
-
-
- public ChatScreen(Client client)
- {
- this.client = client;
- yourNameDisplay.setText(client.getUserName());
-// drawingPanel = new PaintGUI(client);
-// SwingUtilities.getRootPane(sendButton).setDefaultButton(sendButton);
- }
-
- frame.addWindowListener(new WindowAdapter()
- {
- @Override
- public void windowClosing(WindowEvent arg0)
- {
- int answer = JOptionPane.showConfirmDialog(null,
- "Are you sure you want to quit the session?",
- "Shut down session", JOptionPane.YES_NO_OPTION);
- System.out.println(answer);
- if (answer == 0)
- {
- System.out.println("Quitting session");
- try
- {
- client.getClientController().quit(client.getUserName());
- }
- catch (RemoteException e)
- {
- e.printStackTrace();
- }
- System.exit(0);
- }
- }
- });
-
- public JButton getSendButton() {
- return sendButton;
- }
-
-
- public JTextArea getChatDisplayBox() {
- return chatDisplayBox;
- }
-
- public JComboBox getSendMessageToComboBox()
- {
- return sendMessageToComboBox;
- }
-
-// public JPanel getDrawingPanel() {
-// return drawingPanel;
-// }
-
-
-
- ActionListener actionListener = new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
- if (e.getSource() == sendButton)
- {
- String message = chatInputBox.getText();
- chatInputBox.setText("");
- IChatController chatController = client.getChatController();
- try
- {
- System.out.println("Send button pressed");
-
- String toUser = sendMessageToComboBox.getSelectedItem().toString();
-
- if( toUser.equals("All") )
- {
- chatController.broadcastMessage(client.getUserName(), message);
- }
- else
- {
- chatController.sendPrivateMessage(client.getUserName(), toUser, message);
- }
- }
- catch (RemoteException ex)
- {
- ex.printStackTrace();
- }
- }
- else if (e.getSource() == exitThisRoomButton)
- {
- IClientController clientController = client.getClientController();
- try
- {
- System.out.println("Exit room button pressed");
- clientController.quit(client.getUserName());
- System.exit(0);
- }
- catch (RemoteException ex)
- {
- ex.printStackTrace();
- }
- }
- }
-
- };
-}
diff --git a/src/GUI/DrawingArea.java b/src/GUI/DrawingArea.java
deleted file mode 100644
index 2106949..0000000
--- a/src/GUI/DrawingArea.java
+++ /dev/null
@@ -1,374 +0,0 @@
-package GUI;
-
-import client.Client;
-import remote.IDrawingController;
-
-import javax.imageio.ImageIO;
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionListener;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.Line2D;
-import java.awt.geom.Rectangle2D;
-import java.awt.geom.RectangularShape;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.rmi.RemoteException;
-
-public class DrawingArea extends JPanel implements MouseMotionListener, MouseListener {
-
-
-
- /// enum for all different mode ///
- enum Mode { FREEHAND, LINE, CIRCLE, RECTANGLE, OVAL, ERASE }
-
- /// Canvas size parameter ///
- private final static int AREA_WIDTH = 600;
- private final static int AREA_HEIGHT = 620;
-
- /// Shape to be drawn on the canvas ///
- private Client client;
-
- private Shape drawing;
-
- private Point startPoint;
- private Point previousPoint;
-
- private Point currentPoint;
- /// Default mode and color ///
- private Color shapeColor;// = new Color(0, 0, 0);
-
- private Mode currentMode;// = Mode.FREEHAND;
- /// Create a empty canvas ///
- private BufferedImage image;// = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
-
- /// Drawing tool
- private Graphics2D g2;// = (Graphics2D) image.getGraphics();
-
-
- public DrawingArea(Client client) {
- this.client = client;
- setBackground(Color.WHITE); // Set Background color
- setDoubleBuffered(false); // Non-buffered drawing
- image = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
- g2 = (Graphics2D) image.getGraphics();
- /// Antialiasing the graphic for smoothness ///
- g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- shapeColor = new Color(0, 0, 0);
- currentMode = Mode.FREEHAND;
- drawing = null;
- addMouseListener(this);
- addMouseMotionListener(this);
- }
-
-
- public Shape getDrawing() {
- return drawing;
- }
-
- public void setDrawing(Shape drawing) {
- this.drawing = drawing;
- }
-
-
- @Override
- public Dimension getPreferredSize()
- {
- return isPreferredSizeSet() ?
- super.getPreferredSize() : new Dimension(AREA_WIDTH, AREA_HEIGHT);
- }
-
-/// Create a white image to clear previous drawing ///
- public void clear() {
-
- image = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_ARGB);
- g2 = (Graphics2D) image.getGraphics();
- g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- repaint();
-
- }
-
- @Override
- protected void paintComponent(Graphics g) {
- super.paintComponent(g);
-
-/// Draw the whole image on JPanel ///
- if (image != null) {
- g.drawImage(image, 0, 0, null);
- }
-
-/// Draw temporary shape ///
- if (drawing != null) {
- Graphics2D g2 = (Graphics2D) g;
-
-/// Eraser has no border color ///
- Color borderColor = currentMode != Mode.ERASE ? shapeColor : Color.WHITE;
- g2.setColor(borderColor);
- g2.draw(drawing);
- IDrawingController drawingController = client.getDrawingController();
- try {
- drawingController.broadcastDrawing(client.getUserName(), drawing);
- } catch (RemoteException ex) {
- ex.printStackTrace();
- }
- }
- }
-
-/// File manipulations (PNG only) ///
- public void saveFile() {
- try {
- ImageIO.write(image, "PNG", new File("Saved_White_Board.png"));
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- public void saveAsFile(File file) {
- try {
- ImageIO.write(image, "PNG", file);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- public void openFile(File file) {
- try {
- image = ImageIO.read(file);
- } catch (IOException e) {
- e.printStackTrace();
- }
- repaint();
- }
-
-/// Drawing mode setters ///
-
- public void setModeFreehand() {
- currentMode = Mode.FREEHAND;
- }
-
- public void setModeLine() {
- currentMode = Mode.LINE;
- }
-
- public void setModeCircle() {
- currentMode = Mode.CIRCLE;
- }
-
- public void setModeRectangle() {
- currentMode = Mode.RECTANGLE;
- }
-
- public void setModeOval() {
- currentMode = Mode.OVAL;
- }
-
- public void setModeErase() {
- currentMode = Mode.ERASE;
- }
-
-/// Drawing color setters ///
-
- public void setColorAqua() {
- shapeColor = new Color(0,255, 255);
- }
-
- public void setColorBlack() {
- shapeColor = new Color(0, 0, 0);
- }
-
- public void setColorBlue() {
- shapeColor = new Color(0, 0, 255);
- }
-
- public void setColorFuchsia() {
- shapeColor = new Color(255, 0, 255);
- }
-
- public void setColorGray() {
- shapeColor = new Color(128, 128, 128);
- }
-
- public void setColorGreen() {
- shapeColor = new Color(0, 128, 0);
- }
-
- public void setColorLime() {
- shapeColor = new Color(0, 255, 0);
- }
-
- public void setColorMaroon() {
- shapeColor = new Color(128,0, 0);
- }
-
- public void setColorNavy() {
- shapeColor = new Color(0, 0, 128);
- }
-
- public void setColorOlive() {
- shapeColor = new Color(128, 128, 0);
- }
-
- public void setColorPurple() {
- shapeColor = new Color(128, 0, 128);
- }
-
- public void setColorRed() {
- shapeColor = new Color(255, 0, 0);
- }
-
- public void setColorSilver() {
- shapeColor = new Color(192, 192, 192);
- }
-
- public void setColorTeal() {
- shapeColor = new Color(0, 128, 128);
- }
-
- public void setColorWhite() {
- shapeColor = new Color(255, 255, 255);
- }
-
- public void setColorYellow() {
- shapeColor = new Color(255, 255, 0);
- }
-
- @Override
- public void mouseClicked(MouseEvent e) {
-
- }
-
- @Override
- public void mousePressed(MouseEvent e) {
- startPoint = previousPoint = e.getPoint();
-
-/// Instantiate object based on current mode ///
- switch (currentMode) {
-
- case FREEHAND:
- case LINE:
-
- drawing = new Line2D.Double();
- break;
-
- case ERASE:
- case CIRCLE:
- case OVAL:
-
- drawing = new Ellipse2D.Double();
- break;
-
- case RECTANGLE:
-
- drawing = new Rectangle2D.Double();
- break;
- }
- }
-
- @Override
- public void mouseReleased(MouseEvent e) {
- switch (currentMode) {
- case OVAL:
- case RECTANGLE:
- case CIRCLE:
-
-/// Abort drawing if 2D has no width or height ///
- if (((RectangularShape) drawing).getWidth() == 0 || ((RectangularShape) drawing).getHeight() == 0) {
- break;
- }
- case FREEHAND:
- case LINE:
-// Graphics2D g2 = (Graphics2D) image.getGraphics();
- g2.setColor(shapeColor);
-
-/// Uncomment the line below to fill the shapes with color ///
-// g2.fill(drawing);
- g2.draw(drawing);
- }
-
- g2 = (Graphics2D) image.getGraphics();
- g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- g2.setColor(shapeColor);
-
-/// This repaint is needed if we want to fill the drawing shape with color
- repaint();
-
- drawing = null;
- }
-
- @Override
- public void mouseEntered(MouseEvent e) {
-
- }
-
- @Override
- public void mouseExited(MouseEvent e) {
-
- }
-
- @Override
- public void mouseDragged(MouseEvent e) {
- currentPoint = e.getPoint();
-
- int x = Math.min(startPoint.x, e.getX());
- int y = Math.min(startPoint.y, e.getY());
- int width = Math.abs(startPoint.x - e.getX());
- int height = Math.abs(startPoint.y - e.getY());
-
- switch (currentMode) {
-
-/// Freehand drawing is continuously drawing line from current point to previous point ///
- case FREEHAND:
-
- ((Line2D) drawing).setLine(currentPoint, previousPoint);
- g2.setColor(shapeColor);
- g2.draw(drawing);
- previousPoint = currentPoint;
- break;
-
-/// Single line ///
- case LINE:
-
- ((Line2D) drawing).setLine(startPoint, currentPoint);
- break;
-
-/// Eraser is continuously drawing "small white circle" from current point to previous point ///
- case ERASE:
-
- ((Ellipse2D) drawing).setFrame(currentPoint.getX(), currentPoint.getY(), 10, 10);
- g2.setColor(Color.WHITE);
- g2.fill(drawing);
- g2.draw(drawing);
- break;
-
-/// Single circle (How to draw more intuitively?)///
- case CIRCLE:
-
- double radius = Math.sqrt(width * width + height * height);
-// ((Ellipse2D) drawing).setFrame(x, y, radius, radius);
- ((Ellipse2D) drawing).setFrame(startPoint.getX() - radius, startPoint.getY() - radius, 2 * radius, 2 * radius);
- break;
-
-/// Single oval ///
- case OVAL:
-
- ((Ellipse2D) drawing).setFrame(x, y, width, height);
- break;
-
-/// Single rectangle ///
- case RECTANGLE:
-
- ((Rectangle2D) drawing).setFrame(x, y, width, height);
- break;
- }
-
- repaint();
- }
-
- @Override
- public void mouseMoved(MouseEvent e) {
-
- }
-}
\ No newline at end of file
diff --git a/src/GUI/MenuBar.java b/src/GUI/MenuBar.java
deleted file mode 100644
index b466e4b..0000000
--- a/src/GUI/MenuBar.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package GUI;
-
-import javax.swing.*;
-
-public class MenuBar extends JMenuBar {
- JButton clearBtn, newBtn, openBtn, saveBtn, saveAsBtn, closeBtn;
-}
diff --git a/src/GUI/PaintGUI.java b/src/GUI/PaintGUI.java
deleted file mode 100644
index 40a6358..0000000
--- a/src/GUI/PaintGUI.java
+++ /dev/null
@@ -1,232 +0,0 @@
-package GUI;
-
-import client.Client;
-
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.io.File;
-
-public class PaintGUI extends JPanel {
-
- Client client;
-
- String[] shapes = {"Freehand", "Line", "Circle", "Rectangle", "Oval", "Eraser"};
- String[] colors = {"Aqua", "Black", "Blue", "Fuchsia", "Gray", "Green", "Lime", "Maroon", "Navy", "Olive", "Purple", "Red", "Silver", "Teal", "White", "Yellow"};
- JFrame frame;
- JButton clearBtn, newBtn, openBtn, saveBtn, saveAsBtn, closeBtn;
- JComboBox colorOptions;
- JComboBox shapeOptions;
- DrawingArea drawingArea;
-
-
- JPanel global = new JPanel();
- JFileChooser fileChooser= new JFileChooser();
- JPanel toolbox = new JPanel();
- JPanel fileControl = new JPanel();
-
- /// GUI setup ///
- public PaintGUI(Client client) {
-
- this.client = client;
-
-/// Main drawing area ///
- drawingArea = new DrawingArea(client);
-
-/// Set up main frame and container ///
- global.setLayout(new BorderLayout());
-
-/// Set up elements ///
- shapeOptions = new JComboBox(shapes);
- shapeOptions.addActionListener(actionListener);
- colorOptions = new JComboBox(colors);
- colorOptions.setSelectedItem("Black");
- colorOptions.addActionListener(actionListener);
- clearBtn = new JButton("Clear");
- clearBtn.addActionListener(actionListener);
- newBtn = new JButton("New");
- newBtn.addActionListener(actionListener);
- openBtn = new JButton("Open");
- openBtn.addActionListener(actionListener);
- saveBtn = new JButton("Save");
- saveBtn.addActionListener(actionListener);
- saveAsBtn = new JButton("Save As");
- saveAsBtn.addActionListener(actionListener);
- closeBtn = new JButton("Close");
- closeBtn.addActionListener(actionListener);
-
-/// Toolbox panel ///
- toolbox.add(colorOptions);
- toolbox.add(shapeOptions);
- toolbox.add(clearBtn);
-
-/// File control panel ///
- fileControl.add(newBtn);
- fileControl.add(openBtn);
- fileControl.add(saveBtn);
- fileControl.add(saveAsBtn);
- fileControl.add(closeBtn);
-
-/// Layout ///
- global.add(fileControl, BorderLayout.NORTH);
- global.add(drawingArea);
- global.add(toolbox, BorderLayout.SOUTH);
- }
-
- public JPanel getGlobal() {
- return global;
- }
-
- ActionListener actionListener = new ActionListener() {
-
- public void actionPerformed(ActionEvent e) {
-
-/// Clear button ///
- if (e.getSource() == clearBtn) {
- drawingArea.clear();
-
-/// Create new canvas ///
- } else if (e.getSource() == newBtn) {
- int returnVal = JOptionPane.showConfirmDialog(new JFrame(), "Save your current whiteboard?", "Save or Discard", JOptionPane.YES_NO_CANCEL_OPTION);
- if (returnVal == JOptionPane.YES_OPTION) {
-
- drawingArea.saveFile();
- drawingArea.clear();
-
- } else if (returnVal == JOptionPane.NO_OPTION) {
-
- drawingArea.clear();
-
- }
-
-// Open file (PNG only) ///
- } else if (e.getSource() == openBtn) {
- int returnVal = fileChooser.showOpenDialog(frame);
- if (returnVal == JFileChooser.APPROVE_OPTION) {
- File file = fileChooser.getSelectedFile();
- drawingArea.openFile(file);
- }
-
-/// Save under project directory without filename (PNG file with default filename) ///
- } else if (e.getSource() == saveBtn) {
- drawingArea.saveFile();
-
-/// Save with other filename (PNG only) ///
- } else if (e.getSource() == saveAsBtn) {
- fileChooser = new JFileChooser();
- int returnVal = fileChooser.showSaveDialog(frame);
- if (returnVal == JFileChooser.APPROVE_OPTION) {
- File file = fileChooser.getSelectedFile();
- drawingArea.saveAsFile(file);
- }
-
-/// Close application ///
- } else if (e.getSource() == closeBtn) {
- System.exit(0);
-
-/// Choose drawing color ///
- } else if (e.getSource() == colorOptions) {
-
- String colorChosen = (String) colorOptions.getSelectedItem();
-
- switch (colorChosen){
- case "Aqua":
- drawingArea.setColorAqua();
- break;
- case "Black":
- drawingArea.setColorBlack();
- break;
- case "Blue":
- drawingArea.setColorBlue();
- break;
- case "Fuchsia":
- drawingArea.setColorFuchsia();
- break;
- case "Gray":
- drawingArea.setColorGray();
- break;
- case "Green":
- drawingArea.setColorGreen();
- break;
- case "Lime":
- drawingArea.setColorLime();
- break;
- case "Maroon":
- drawingArea.setColorMaroon();
- break;
- case "Navy":
- drawingArea.setColorNavy();
- break;
- case "Olive":
- drawingArea.setColorOlive();
- break;
- case "Purple":
- drawingArea.setColorPurple();
- break;
- case "Red":
- drawingArea.setColorRed();
- break;
- case "Silver":
- drawingArea.setColorSilver();
- break;
- case "Teal":
- drawingArea.setColorTeal();
- break;
- case "White":
- drawingArea.setColorWhite();
- break;
- case "Yellow":
- drawingArea.setColorYellow();
- break;
- }
-
-/// Choose drawing tool ///
- } else if (e.getSource() == shapeOptions) {
-
- String shapeChosen = (String) shapeOptions.getSelectedItem();
-
- switch (shapeChosen){
- case "Freehand":
- drawingArea.setModeFreehand();
- break;
- case "Line":
- drawingArea.setModeLine();
- break;
- case "Circle":
- drawingArea.setModeCircle();
- break;
- case "Rectangle":
- drawingArea.setModeRectangle();
- break;
- case "Oval":
- drawingArea.setModeOval();
- break;
- case "Eraser":
- drawingArea.setModeErase();
- break;
- }
- }
- }
- };
-
- public DrawingArea getDrawingArea() {
- return drawingArea;
- }
-
-
-
-
- public void showGUI() {
- frame = new JFrame("Shared Whiteboard System");
- JFrame.setDefaultLookAndFeelDecorated(true);
- frame.setContentPane(global);
-
- frame.setSize(800, 600);
- frame.setLocationRelativeTo( null );
- frame.setResizable(false);
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.setVisible(true);
- }
-
-}
\ No newline at end of file
diff --git a/src/GUI/StartScreen.form b/src/GUI/StartScreen.form
deleted file mode 100644
index f266275..0000000
--- a/src/GUI/StartScreen.form
+++ /dev/null
@@ -1,114 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="GUI.StartScreen">
- <grid id="27dc6" binding="panel1" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
- <margin top="0" left="0" bottom="0" right="0"/>
- <constraints>
- <xy x="20" y="20" width="833" height="400"/>
- </constraints>
- <properties/>
- <border type="none"/>
- <children>
- <grid id="abaca" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
- <margin top="0" left="0" bottom="0" right="0"/>
- <constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties/>
- <border type="none"/>
- <children>
- <hspacer id="53fe0">
- <constraints>
- <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- </hspacer>
- <component id="ebca9" class="javax.swing.JLabel">
- <constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="Distributed Whiteboard App"/>
- </properties>
- </component>
- <component id="d60e2" class="javax.swing.JTextArea" binding="information">
- <constraints>
- <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false">
- <preferred-size width="150" height="50"/>
- </grid>
- </constraints>
- <properties>
- <editable value="false"/>
- <text value="Welcome, please provide server's IP to connect to and nameto be identified by in the Whiteboard's chat."/>
- </properties>
- </component>
- </children>
- </grid>
- <grid id="790e1" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
- <margin top="0" left="0" bottom="0" right="0"/>
- <constraints>
- <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties/>
- <border type="none"/>
- <children>
- <component id="87b91" class="javax.swing.JLabel">
- <constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="Your name:"/>
- </properties>
- </component>
- <component id="e39f4" class="javax.swing.JTextField" binding="textField1" default-binding="true">
- <constraints>
- <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
- <preferred-size width="150" height="-1"/>
- </grid>
- </constraints>
- <properties/>
- </component>
- <component id="ea0c1" class="javax.swing.JButton" binding="joinButton">
- <constraints>
- <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="JOIN WHITEBOARD"/>
- </properties>
- </component>
- </children>
- </grid>
- <grid id="6ef31" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
- <margin top="0" left="0" bottom="0" right="0"/>
- <constraints>
- <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties/>
- <border type="none"/>
- <children>
- <hspacer id="23c9f">
- <constraints>
- <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- </hspacer>
- <component id="94078" class="javax.swing.JLabel">
- <constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="Server IP:"/>
- </properties>
- </component>
- <component id="63209" class="javax.swing.JTextField" binding="textField2">
- <constraints>
- <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
- <preferred-size width="150" height="-1"/>
- </grid>
- </constraints>
- <properties>
- <text value=""/>
- </properties>
- </component>
- </children>
- </grid>
- </children>
- </grid>
-</form>
diff --git a/src/GUI/StartScreen.java b/src/GUI/StartScreen.java
deleted file mode 100644
index 7755662..0000000
--- a/src/GUI/StartScreen.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package GUI;
-
-import client.Client;
-
-import javax.swing.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-public class StartScreen {
-
- private JPanel panel1;
- private JTextArea information;
- private JTextField textField1;
- private JButton joinButton;
- private JTextField textField2;
- JFrame frame;
-
- private Client client;
-
- public StartScreen(Client client)
- {
- this.client = client;
- }
-
-// public static void main(String[] args) {
-// new StartScreen().go();
-// }
-
-
- ActionListener actionListener = new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
- if (e.getSource() == joinButton)
- {
- client.setServerAddress(textField2.getText());
- client.setUsername(textField1.getText());
-
- if( client.connect() )
- {
- frame.setVisible(false);
- frame.dispose();
- //client.doSomething();
- new ChatScreen(client);
- }
- else
- {
- showErrorMessage("Could not connect to server...");
- }
- }
- }
-
- };
-
- private void showErrorMessage(String message)
- {
- JOptionPane.showMessageDialog(null,
- message, "Error", JOptionPane.PLAIN_MESSAGE);
- }
-
- public void go(){
- joinButton.addActionListener(actionListener);
- frame = new JFrame("StartScreen");
- frame.setContentPane(panel1);
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.pack();
- frame.setVisible(true);
- }
-
-}
diff --git a/src/GUI/ToolBar.java b/src/GUI/ToolBar.java
deleted file mode 100644
index 04087e8..0000000
--- a/src/GUI/ToolBar.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package GUI;
-
-import javax.swing.*;
-import java.awt.*;
-
-public class ToolBar extends JPanel {
- private DrawingArea drawingArea;
-
- public ToolBar() {
-
- }
-}
-
-class Tools extends JPanel {
-
-}
-
-class ColorPallete extends JPanel {
- private Color color;
-
- public ColorPallete() {
- this.color = new Color(0, 0, 0); // Black
- }
-
- public void setColor(Color color) {
- this.color = color;
- }
-
- public void setColorRBG(int r, int b, int g) {
- this.color = new Color(r, b, g);
- }
-
- public Color getColor() {
- return this.color;
- }
-
- public void setColorAqua() {
- this.color = new Color(0,255, 255);
- }
-
- public void setColorBlack() {
- this.color = new Color(0, 0, 0);
- }
-
- public void setColorBlue() {
- this.color = new Color(0, 0, 255);
- }
-
- public void setColorFuchsia() {
- this.color = new Color(255, 0, 255);
- }
-
- public void setColorGray() {
- this.color = new Color(128, 128, 128);
- }
-
- public void setColorGreen() {
- this.color = new Color(0, 128, 0);
- }
-
- public void setColorLime() {
- this.color = new Color(0, 255, 0);
- }
-
- public void setColorMaroon() {
- this.color = new Color(128,0, 0);
- }
-
- public void setColorNavy() {
- this.color = new Color(0, 0, 128);
- }
-
- public void setColorOlive() {
- this.color = new Color(128, 128, 0);
- }
-
- public void setColorPurple() {
- this.color = new Color(128, 0, 128);
- }
-
- public void setColorRed() {
- this.color = new Color(255, 0, 0);
- }
-
- public void setColorSilver() {
- this.color = new Color(192, 192, 192);
- }
-
- public void setColorTeal() {
- this.color = new Color(0, 128, 128);
- }
-
- public void setColorWhite() {
- this.color = new Color(255, 255, 255);
- }
-
- public void setColorYellow() {
- this.color = new Color(255, 255, 0);
- }
-}
\ No newline at end of file
diff --git a/src/LICENSE b/src/LICENSE
deleted file mode 100644
index ba0e33f..0000000
--- a/src/LICENSE
+++ /dev/null
@@ -1,339 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- COMP90015-DSAss2-InfinityMonkeys-remaster
- Copyright (C) 2019 Ho Dac Hai
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- {signature of Ty Coon}, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff --git a/src/client/ChatUpdate.java b/src/client/ChatUpdate.java
deleted file mode 100644
index 2edc3cc..0000000
--- a/src/client/ChatUpdate.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package client;
-
-import remote.IChatUpdate;
-
-import java.io.Serializable;
-import java.rmi.RemoteException;
-import java.rmi.server.UnicastRemoteObject;
-
-public class ChatUpdate extends UnicastRemoteObject implements IChatUpdate, Serializable
-{
- private Client client;
-
- public ChatUpdate(Client client) throws RemoteException
- {
- super();
- this.client = client;
- }
-
- @Override
- public boolean notifyChat(String fromClient, String message, boolean isPrivate) throws RemoteException
- {
- String outputString;
-
- if( isPrivate )
- {
- outputString = "PRIVATE (from " + fromClient + "): " + message + "\n";
- }
- else
- {
- outputString = fromClient + ": " + message + "\n";
- }
-
- client.getApplicationMain().getChatScreen().getChatDisplayBox().append(outputString);
-
- //client.setReceivedMessage(message);
- //System.out.println(fromClient + ": " + message);
- return true;
- }
-
- @Override
- public boolean notifyUserLogin(String fromClient) throws RemoteException {
- client.getApplicationMain().getChatScreen().getChatDisplayBox().append(fromClient + " has joined the room.\n");
- return true;
- }
-
- @Override
- public boolean notifyUserLogout(String fromClient) throws RemoteException {
- client.getApplicationMain().getChatScreen().getChatDisplayBox().append(fromClient + " has left the room.\n");
- return true;
- }
-
-}
diff --git a/src/client/Client.java b/src/client/Client.java
deleted file mode 100644
index df3c806..0000000
--- a/src/client/Client.java
+++ /dev/null
@@ -1,156 +0,0 @@
-package client;
-
-import GUI.ApplicationMain;
-import GUI.ChatScreen;
-import GUI.PaintGUI;
-import GUI.StartScreen;
-import remote.IChatController;
-import remote.IClientController;
-import remote.IDrawingController;
-
-import java.rmi.RemoteException;
-import java.rmi.registry.LocateRegistry;
-import java.rmi.registry.Registry;
-
-public class Client
-{
- private String userName;
- private String serverAddress;
-
- private Registry registryServer;
- private IChatController chatController;
- private IClientController clientController;
-
- private IDrawingController drawingController;
-
- private ClientUpdate clientUpdate;
-
- private ChatUpdate chatUpdate;
- private DrawingUpdate drawingUpdate;
- private StartScreen startScreen;
-
- private ChatScreen chatScreen;
- private PaintGUI paintGUI;
-
- public ApplicationMain getApplicationMain() { return applicationMain; }
-
- private ApplicationMain applicationMain;
-
- public PaintGUI getPaintGUI() { return paintGUI; }
-
-
- public ChatScreen getChatScreen() { return chatScreen; }
-
- public void setConnectedUsers(String[] users)
- {
- this.connectedUsers = users;
- }
-
-
- public IChatController getChatController()
- {
- return chatController;
- }
-
- public IClientController getClientController()
- {
- return clientController;
- }
-
- public IDrawingController getDrawingController() { return drawingController; }
-
- public void setUsername(String userName)
- {
- this.userName = userName;
- }
-
- public String getUserName()
- {
- return this.userName;
- }
-
- public void setServerAddress(String serverAddress)
- {
- this.serverAddress = serverAddress;
- }
-
- public Client(String username) throws RemoteException
- {
- this.userName = username;
- this.clientUpdate = new ClientUpdate(this);
- this.chatUpdate = new ChatUpdate(this);
- this.drawingUpdate = new DrawingUpdate(this);
-// this.startScreen = new StartScreen(this);
-// this.chatScreen = new ChatScreen(this);
-// this.paintGUI = new PaintGUI(this);
- this.applicationMain = new ApplicationMain(this);
-
- }
-
- public static void main(String[] args)
- {
- try
- {
- Client client = new Client(args[0]);
- client.connect();
-// client.getChatScreen().showGUI();
-// client.getPaintGUI().showGUI();
- client.getApplicationMain().createAndShowGUI();
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
-
-// public void doSomething()
-// {
-//// new ChatScreen();
-//
-// try
-// {
-// new ChatScreen(this);
-// System.out.println("Sleeping...");
-// TimeUnit.MINUTES.sleep(5);
-// }
-// catch(Exception e)
-// {
-// e.printStackTrace();
-// }
-// }
-
- public boolean connect()
- {
- try
- {
- registryServer = LocateRegistry.getRegistry(serverAddress);
-
- chatController = (IChatController) registryServer.lookup("ChatController");
- clientController = (IClientController) registryServer.lookup("ClientController");
- drawingController = (IDrawingController) registryServer.lookup("DrawingController");
-
- if (clientController.join(userName, this.chatUpdate, this.clientUpdate, this.drawingUpdate))
- {
- System.out.println("Connected to server");
-
- return true;
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
-
- return false;
- }
-
- public String getReceivedMessage()
- {
- return receivedMessage;
- }
-
- public void setReceivedMessage(String receivedMessage)
- {
- this.receivedMessage = receivedMessage;
- }
-}
\ No newline at end of file
diff --git a/src/client/ClientUpdate.java b/src/client/ClientUpdate.java
deleted file mode 100644
index aefdaf5..0000000
--- a/src/client/ClientUpdate.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package client;
-
-import remote.IClientUpdate;
-
-import javax.swing.*;
-import java.io.Serializable;
-import java.rmi.Remote;
-import java.rmi.RemoteException;
-import java.rmi.server.UnicastRemoteObject;
-
-public class ClientUpdate extends UnicastRemoteObject implements IClientUpdate, Serializable {
-
- private Client client;
-
- public ClientUpdate(Client client) throws RemoteException
- {
- super();
- this.client = client;
- }
-
- @Override
- public boolean notifyClient(String fromClient, String newUsername) throws RemoteException
- {
- client.getApplicationMain().getChatScreen().getSendMessageToComboBox().addItem(newUsername);
-
- return true;
- }
-
- @Override
- public boolean updateUserList(String[] users) throws RemoteException
- {
- //client.setConnectedUsers(users);
-
- JComboBox userBox = client.getApplicationMain().getChatScreen().getSendMessageToComboBox();
-
- userBox.removeAllItems();
-
- userBox.addItem("All");
-
- for( String s : users )
- {
- if( !s.equals(client.getUserName()) )
- {
- userBox.addItem(s);
- }
- }
-
- return true;
- }
-}
diff --git a/src/client/DrawingUpdate.java b/src/client/DrawingUpdate.java
deleted file mode 100644
index 4b41c02..0000000
--- a/src/client/DrawingUpdate.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package client;
-
-import GUI.DrawingArea;
-import remote.IDrawingUpdate;
-
-import java.awt.*;
-import java.io.Serializable;
-import java.rmi.RemoteException;
-import java.rmi.server.UnicastRemoteObject;
-
-public class DrawingUpdate extends UnicastRemoteObject implements IDrawingUpdate, Serializable {
-
- private Client client;
-
- public DrawingUpdate(Client client) throws RemoteException {
- super();
- this.client = client;
- }
-
- @Override
- public boolean notifyDrawing(String fromClient, Shape drawing) throws RemoteException {
- client.getApplicationMain().getPaintGUI().getDrawingArea().setDrawing(drawing);
- client.getApplicationMain().getPaintGUI().getDrawingArea().repaint();
-// DrawingArea drawingArea = (DrawingArea) client.getChatScreen().getDrawingPanel().getComponent(1);
-// drawingArea.setDrawing(drawing);
-// drawingArea.repaint();
- return false;
- }
-}
diff --git a/src/remote/IChatController.java b/src/remote/IChatController.java
deleted file mode 100644
index 8230587..0000000
--- a/src/remote/IChatController.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package remote;
-
-import java.rmi.Remote;
-import java.rmi.RemoteException;
-
-public interface IChatController extends Remote
-{
- boolean broadcastMessage(String fromClient, String message) throws RemoteException;
- boolean broadcastMessageUserLogin(String fromClient) throws RemoteException;
- boolean broadcastMessageUserLogout(String fromClient) throws RemoteException;
- boolean sendPrivateMessage(String fromClient, String toClient, String message) throws RemoteException;
-}
diff --git a/src/remote/IChatUpdate.java b/src/remote/IChatUpdate.java
deleted file mode 100644
index 0c9b54d..0000000
--- a/src/remote/IChatUpdate.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package remote;
-
-import java.io.Serializable;
-import java.rmi.Remote;
-import java.rmi.RemoteException;
-
-public interface IChatUpdate extends Remote, Serializable
-{
- boolean notifyChat(String fromClient, String message, boolean isPrivate) throws RemoteException;
- boolean notifyUserLogin(String fromClient) throws RemoteException;
- boolean notifyUserLogout(String fromClient) throws RemoteException;
-}
diff --git a/src/remote/IClientController.java b/src/remote/IClientController.java
deleted file mode 100644
index bde0a0f..0000000
--- a/src/remote/IClientController.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package remote;
-
-import java.rmi.Remote;
-import java.rmi.RemoteException;
-
-public interface IClientController extends Remote
-{
- boolean join(String username, IChatUpdate clientChat, IClientUpdate clientUpdate, IDrawingUpdate clientDrawing) throws RemoteException;
-
- void quit(String username) throws RemoteException;
-
- boolean assignAdmin(String username) throws RemoteException;
-
- boolean kickUser(String username, String who) throws RemoteException;
-}
diff --git a/src/remote/IClientUpdate.java b/src/remote/IClientUpdate.java
deleted file mode 100644
index c1337f9..0000000
--- a/src/remote/IClientUpdate.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package remote;
-
-import java.io.Serializable;
-import java.rmi.Remote;
-import java.rmi.RemoteException;
-
-public interface IClientUpdate extends Remote, Serializable {
-
- boolean notifyClient(String fromClient, String newUsername) throws RemoteException;
-
- boolean updateUserList(String[] users) throws RemoteException;
-}
diff --git a/src/remote/IDrawingController.java b/src/remote/IDrawingController.java
deleted file mode 100644
index 145cc49..0000000
--- a/src/remote/IDrawingController.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package remote;
-
-import java.awt.*;
-import java.rmi.Remote;
-import java.rmi.RemoteException;
-
-
-/**
- * RMI Remote interface - must be shared between client and server.
- * All methods must throw RemoteException.
- * All parameters and return types must be either primitives or Serializable.
- *
- * Any object that is a remote object must implement this interface.
- * Only those methods specified in a "remote interface" are available remotely.
- */
-public interface IDrawingController extends Remote {
-
- boolean broadcastDrawing(String fromClient, Shape drawing) throws RemoteException;
-
-
-}
diff --git a/src/remote/IDrawingUpdate.java b/src/remote/IDrawingUpdate.java
deleted file mode 100644
index 3df14ff..0000000
--- a/src/remote/IDrawingUpdate.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package remote;
-
-import java.awt.*;
-import java.io.Serializable;
-import java.rmi.Remote;
-import java.rmi.RemoteException;
-
-public interface IDrawingUpdate extends Remote, Serializable {
- boolean notifyDrawing(String fromClient, Shape drawing) throws RemoteException;
-}
diff --git a/src/server/ChatController.java b/src/server/ChatController.java
deleted file mode 100644
index 8fbff1e..0000000
--- a/src/server/ChatController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package server;
-
-import remote.IChatController;
-import remote.IChatUpdate;
-
-import java.io.Serializable;
-import java.rmi.RemoteException;
-import java.rmi.server.UnicastRemoteObject;
-
-public class ChatController extends UnicastRemoteObject implements IChatController, Serializable
-{
- private Server server;
-
- public ChatController(Server server) throws RemoteException
- {
- this.server = server;
- }
-
- @Override
- public boolean broadcastMessage(String fromClient, String message) throws RemoteException
- {
- System.out.print("Broadcasting message to everyone...");
-
- IChatUpdate client;
-
- for( User u : server.users )
- {
- client = u.getIChatUpdate();
- client.notifyChat(fromClient, message, false);
- }
-
- System.out.print("...DONE\n");
-
- return true;
- }
-
- @Override
- public boolean broadcastMessageUserLogin(String fromClient) throws RemoteException {
- System.out.print("Broadcasting message to everyone...");
-
- IChatUpdate client;
-
- for( User u : server.users )
- {
- client = u.getIChatUpdate();
- client.notifyUserLogin(fromClient);
- }
-
- System.out.print("...DONE\n");
- System.out.println(fromClient + " has joined the room.");
-
- return true;
- }
-
- @Override
- public boolean broadcastMessageUserLogout(String fromClient) throws RemoteException {
- System.out.print("Broadcasting message to everyone...");
-
- IChatUpdate client;
-
- for( User u : server.users )
- {
- client = u.getIChatUpdate();
- client.notifyUserLogout(fromClient);
- }
-
- System.out.print("...DONE\n");
- System.out.println(fromClient + " has left the room.");
-
- return true;
- }
-
- @Override
- public boolean sendPrivateMessage(String fromClient, String toClient, String message) throws RemoteException
- {
- int toClientIndex = server.clientController.getUserIndex(toClient);
- int fromClientIndex = server.clientController.getUserIndex(fromClient);
-
- if( toClientIndex >= 0 && fromClientIndex >= 0 )
- {
- server.users.get(toClientIndex).getIChatUpdate().notifyChat(fromClient, message, true);
-
- server.users.get(fromClientIndex).getIChatUpdate().notifyChat(fromClient, message, true);
-
- return true;
- }
-
- return false;
- }
-}
diff --git a/src/server/ClientController.java b/src/server/ClientController.java
deleted file mode 100644
index bcfd261..0000000
--- a/src/server/ClientController.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package server;
-
-import remote.IChatUpdate;
-import remote.IClientController;
-import remote.IClientUpdate;
-import remote.IDrawingUpdate;
-
-import java.io.Serializable;
-import java.rmi.Remote;
-import java.rmi.RemoteException;
-import java.rmi.server.UnicastRemoteObject;
-
-public class ClientController extends UnicastRemoteObject implements IClientController, Serializable
-{
- private Server server;
-
- protected ClientController(Server server) throws RemoteException
- {
- this.server = server;
- }
-
- @Override
- public boolean join(String username, IChatUpdate clientChat, IClientUpdate clientUpdate, IDrawingUpdate clientDrawing) throws RemoteException
- {
- server.chatController.broadcastMessageUserLogin(username);
-
- User newUser = new User(username, clientChat, clientUpdate, clientDrawing);
-
- server.users.add(newUser);
-
- if(server.users.size() == 1)
- {
- server.users.get(0).setAdmin(true);
- }
-
- System.out.println(username + " registered successfully");
-
- broadcastUserList();
-
- return true;
- }
-
- @Override
- public void quit(String username) throws RemoteException
- {
- int userIndex = getUserIndex(username);
-
- if( userIndex >= 0 )
- {
- server.users.remove(userIndex);
-
- server.chatController.broadcastMessageUserLogout(username);
-
- broadcastUserList();
- }
- }
-
- @Override
- public boolean assignAdmin(String username) throws RemoteException
- {
- int adminIndex = getUserIndex(username);
-
- if( adminIndex >= 0 )
- {
- server.users.get(adminIndex).setAdmin(true);
-
- return true;
- }
-
- return false;
- }
-
- @Override
- public boolean kickUser(String username, String who) throws RemoteException
- {
- int userIndex = getUserIndex(who);
-
- int adminIndex = getUserIndex(username);
-
- if ( adminIndex > 0 && userIndex > 0 && server.users.get(adminIndex).isAdmin() )
- {
- server.users.remove(userIndex);
-
- broadcastUserList();
-
- return true;
- }
-
- return false;
- }
-
- public int getUserIndex(String username)
- {
- int index = -1;
-
- for( int i = 0; i < server.users.size(); i++ )
- {
- if( server.users.get(i).getUserName().equals(username) )
- {
- index = i;
- break;
- }
- }
-
- return index;
- }
-
- private void broadcastUserList() throws RemoteException
- {
- String[] connectedUsers = new String[server.users.size()];
-
- for( int i = 0; i<server.users.size(); i++ )
- {
- connectedUsers[i] = server.users.get(i).getUserName();
- }
-
- for( User u : server.users )
- {
- u.getIClientUpdate().updateUserList(connectedUsers);
- }
- }
-}
diff --git a/src/server/DrawingController.java b/src/server/DrawingController.java
deleted file mode 100644
index 1471e8a..0000000
--- a/src/server/DrawingController.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package server;
-
-import remote.IDrawingController;
-import remote.IDrawingUpdate;
-
-import java.awt.*;
-import java.rmi.RemoteException;
-import java.rmi.server.UnicastRemoteObject;
-
-public class DrawingController extends UnicastRemoteObject implements IDrawingController {
-
- private Server server;
-
- protected DrawingController(Server server) throws RemoteException {
- this.server = server;
- }
-
- @Override
- public boolean broadcastDrawing(String fromClient, Shape drawing) throws RemoteException {
- System.out.print("Broadcasting drawing to everyone...");
-
- IDrawingUpdate client;
-
- for( User u : server.users )
- {
- client = u.getIDrawingUpdate();
- client.notifyDrawing(fromClient, drawing);
- }
-
- System.out.print("...DONE\n");
-
- return true;
- }
-}
\ No newline at end of file
diff --git a/src/server/Server.java b/src/server/Server.java
deleted file mode 100644
index 6584224..0000000
--- a/src/server/Server.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package server;
-
-import remote.IChatController;
-import remote.IClientController;
-import remote.IDrawingController;
-
-import java.rmi.RemoteException;
-import java.rmi.registry.LocateRegistry;
-import java.rmi.registry.Registry;
-import java.util.ArrayList;
-
-public class Server
-{
- protected ArrayList<User> users;
-
- protected ClientController clientController;
- protected ChatController chatController;
- protected DrawingController drawingController;
-
- public Server() throws RemoteException
- {
- users = new ArrayList<User>();
- clientController = new ClientController(this);
- chatController = new ChatController(this);
- drawingController = new DrawingController(this);
- }
-
- public static void main(String[] args)
- {
- try
- {
- Server server = new Server();
-
- server.run();
- }
- catch( Exception e )
- {
- e.printStackTrace();
- }
- }
-
- public void run() throws RemoteException
- {
-
- LocateRegistry.createRegistry(1099);
- Registry registry = LocateRegistry.getRegistry();
-
- String clientControllerName = "ClientController";
- String chatControllerName = "ChatController";
- String drawingControllerName = "DrawingController";
-
- IClientController clientController = new ClientController(this);
- IChatController chatController = new ChatController(this);
- IDrawingController drawingController = new DrawingController(this);
-
- registry.rebind(clientControllerName, clientController);
- registry.rebind(chatControllerName, chatController);
- registry.rebind(drawingControllerName, drawingController);
-
- System.out.println("Server is ready");
- }
-}
diff --git a/src/server/User.java b/src/server/User.java
deleted file mode 100644
index a79c8c6..0000000
--- a/src/server/User.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package server;
-
-import remote.IChatUpdate;
-import remote.IClientUpdate;
-import remote.IDrawingUpdate;
-
-public class User
-{
- private String username;
- private remote.IChatUpdate IChatUpdate;
- private remote.IDrawingUpdate IDrawingUpdate;
- private remote.IClientUpdate IClientUpdate;
- private boolean isAdmin;
- public User(String username, remote.IChatUpdate IChatUpdate, remote.IClientUpdate IClientUpdate, remote.IDrawingUpdate IDrawingUpdate)
-
- public User(String username, IChatUpdate IChatUpdate, IClientUpdate IClientUpdate, IDrawingUpdate IDrawingUpdate)
- {
- this.username = username;
- this.IChatUpdate = IChatUpdate;
- this.IDrawingUpdate = IDrawingUpdate;
- this.IClientUpdate = IClientUpdate;
- this.isAdmin = false;
- }
-
- public String getUserName()
- {
- return this.username;
- }
-
- public void setAdmin(boolean admin)
- {
- isAdmin = admin;
- }
-
- public boolean isAdmin()
- {
- return isAdmin;
- }
-
- public IChatUpdate getIChatUpdate()
- {
- return this.IChatUpdate;
- }
-
- public remote.IClientUpdate getIClientUpdate()
- {
- return this.IClientUpdate;
- }
-
- public remote.IDrawingUpdate getIDrawingUpdate() { return this.IDrawingUpdate; }
-
-}
--
GitLab