From ca1256f01f0dcb42ecc0c5ec0339bd3162683d0e Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger Date: Tue, 12 Apr 2022 23:46:38 +0200 Subject: [PATCH 1/6] Created Classes and Interfaces. Trying to adhere to the MVC pattern --- .../client/gui/ClientController.java | 5 + .../multiplayer/client/gui/ClientModel.java | 5 + .../multiplayer/client/gui/ClientView.java | 5 + .../client/gui/chat/BroadcastButton.java | 7 + .../client/gui/chat/ChatController.java | 7 + .../multiplayer/client/gui/chat/ChatMsg.java | 7 + .../client/gui/chat/ChatObserver.java | 5 + .../multiplayer/client/gui/chat/ChatView.java | 20 ++ .../client/gui/chat/InChatObserver.java | 5 + .../client/gui/chat/InComingChMsg.java | 225 ++++++++++++++++++ .../client/gui/chat/OutChatObserver.java | 5 + .../client/gui/chat/SendButton.java | 7 + .../client/gui/chat/WhisperButton.java | 7 + 13 files changed, 310 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientController.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientModel.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientView.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/BroadcastButton.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatController.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatMsg.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatObserver.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatView.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/InChatObserver.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/InComingChMsg.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutChatObserver.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/SendButton.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/WhisperButton.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientController.java new file mode 100644 index 0000000..b993dba --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientController.java @@ -0,0 +1,5 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui; + +public class ClientController { + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientModel.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientModel.java new file mode 100644 index 0000000..da11ecc --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientModel.java @@ -0,0 +1,5 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui; + +public class ClientModel { + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientView.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientView.java new file mode 100644 index 0000000..7440425 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientView.java @@ -0,0 +1,5 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui; + +public class ClientView { + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/BroadcastButton.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/BroadcastButton.java new file mode 100644 index 0000000..1ce08d2 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/BroadcastButton.java @@ -0,0 +1,7 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +import javafx.scene.Node; + +public class BroadcastButton extends Node { + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatController.java new file mode 100644 index 0000000..97fb8a1 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatController.java @@ -0,0 +1,7 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +public class ChatController { + + public void setChatView(){}; + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatMsg.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatMsg.java new file mode 100644 index 0000000..69954a1 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatMsg.java @@ -0,0 +1,7 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +public interface ChatMsg { + + public String display(String msg); + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatObserver.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatObserver.java new file mode 100644 index 0000000..c89cde3 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatObserver.java @@ -0,0 +1,5 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +public interface ChatObserver { + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatView.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatView.java new file mode 100644 index 0000000..b0086b1 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatView.java @@ -0,0 +1,20 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.SceneAntialiasing; +import javafx.scene.control.Label; +import javafx.scene.layout.Pane; +import javafx.scene.paint.Paint; + +public class ChatView { + + private Label send = new Label("Send"); + + private Pane root; + + private Pane createNodeHierarchy(){ + Pane p = new Pane(); + return p; + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/InChatObserver.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/InChatObserver.java new file mode 100644 index 0000000..7dcb7da --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/InChatObserver.java @@ -0,0 +1,5 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +public interface InChatObserver { + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/InComingChMsg.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/InComingChMsg.java new file mode 100644 index 0000000..9f37b26 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/InComingChMsg.java @@ -0,0 +1,225 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +import javafx.beans.InvalidationListener; +import javafx.beans.property.Property; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; + +/** + * This class represents an incoming chat message to be displayed by the clients gui. When creating + * an instance we should make sure we are also passing a String, otherwise {@code incomingChatMsg} + * will have a null value. For now the {@code getValue()} and {@code setValue(Object value)} are the + * main focus. + */ + +public class InComingChMsg implements Property { + + private String incomingChatMsg; + + public InComingChMsg(String incomingChatMsg) { + this.incomingChatMsg = incomingChatMsg; + } + + public InComingChMsg() { + this.incomingChatMsg = null; + } + + /** + * Create a unidirection binding for this {@code Property}. + *

+ * Note that JavaFX has all the bind calls implemented through weak listeners. This means the + * bound property can be garbage collected and stopped from being updated. + * + * @param observable The observable this {@code Property} should be bound to. + * @throws NullPointerException if {@code observable} is {@code null} + */ + @Override + public void bind(ObservableValue observable) { + + } + + /** + * Remove the unidirectional binding for this {@code Property}. + *

+ * If the {@code Property} is not bound, calling this method has no effect. + * + * @see #bind(ObservableValue) + */ + @Override + public void unbind() { + + } + + /** + * Can be used to check, if a {@code Property} is bound. + * + * @return {@code true} if the {@code Property} is bound, {@code false} otherwise + * @see #bind(ObservableValue) + */ + @Override + public boolean isBound() { + return false; + } + + /** + * Create a bidirectional binding between this {@code Property} and another one. Bidirectional + * bindings exists independently of unidirectional bindings. So it is possible to add + * unidirectional binding to a property with bidirectional binding and vice-versa. However, this + * practice is discouraged. + *

+ * It is possible to have multiple bidirectional bindings of one Property. + *

+ * JavaFX bidirectional binding implementation use weak listeners. This means bidirectional + * binding does not prevent properties from being garbage collected. + * + * @param other the other {@code Property} + * @throws NullPointerException if {@code other} is {@code null} + * @throws IllegalArgumentException if {@code other} is {@code this} + */ + @Override + public void bindBidirectional(Property other) { + + } + + /** + * Remove a bidirectional binding between this {@code Property} and another one. + *

+ * If no bidirectional binding between the properties exists, calling this method has no effect. + *

+ * It is possible to unbind by a call on the second property. This code will work: + * + *

+   *     property1.bindBirectional(property2);
+   *     property2.unbindBidirectional(property1);
+   * 
+ * + * @param other the other {@code Property} + * @throws NullPointerException if {@code other} is {@code null} + * @throws IllegalArgumentException if {@code other} is {@code this} + */ + @Override + public void unbindBidirectional(Property other) { + + } + + /** + * Returns the {@code Object} that contains this property. If this property is not contained in an + * {@code Object}, {@code null} is returned. + * + * @return the containing {@code Object} or {@code null} + */ + @Override + public Object getBean() { + return null; + } + + /** + * Returns the name of this property. If the property does not have a name, this method returns an + * empty {@code String}. + * + * @return the name or an empty {@code String} + */ + @Override + public String getName() { + return null; + } + + /** + * Adds a {@link ChangeListener} which will be notified whenever the value of the {@code + * ObservableValue} changes. If the same listener is added more than once, then it will be + * notified more than once. That is, no check is made to ensure uniqueness. + *

+ * Note that the same actual {@code ChangeListener} instance may be safely registered for + * different {@code ObservableValues}. + *

+ * The {@code ObservableValue} stores a strong reference to the listener which will prevent the + * listener from being garbage collected and may result in a memory leak. It is recommended to + * either unregister a listener by calling {@link #removeListener(ChangeListener) removeListener} + * after use or to use an instance of {@link WeakChangeListener} avoid this situation. + * + * @param listener The listener to register + * @throws NullPointerException if the listener is null + * @see #removeListener(ChangeListener) + */ + @Override + public void addListener(ChangeListener listener) { + + } + + /** + * Removes the given listener from the list of listeners that are notified whenever the value of + * the {@code ObservableValue} changes. + *

+ * If the given listener has not been previously registered (i.e. it was never added) then this + * method call is a no-op. If it had been previously added then it will be removed. If it had been + * added more than once, then only the first occurrence will be removed. + * + * @param listener The listener to remove + * @throws NullPointerException if the listener is null + * @see #addListener(ChangeListener) + */ + @Override + public void removeListener(ChangeListener listener) { + + } + + /** + * Returns the current value of this {@code ObservableValue} + * + * @return The current value + */ + @Override + public String getValue() { + return this.incomingChatMsg; + } + + /** + * Set the wrapped value. + * + * @param value The new value + */ + @Override + public void setValue(Object value) { + this.incomingChatMsg = (String) value; + } + + /** + * Adds an {@link InvalidationListener} which will be notified whenever the {@code Observable} + * becomes invalid. If the same listener is added more than once, then it will be notified more + * than once. That is, no check is made to ensure uniqueness. + *

+ * Note that the same actual {@code InvalidationListener} instance may be safely registered for + * different {@code Observables}. + *

+ * The {@code Observable} stores a strong reference to the listener which will prevent the + * listener from being garbage collected and may result in a memory leak. It is recommended to + * either unregister a listener by calling {@link #removeListener(InvalidationListener) + * removeListener} after use or to use an instance of {@link WeakInvalidationListener} avoid this + * situation. + * + * @param listener The listener to register + * @throws NullPointerException if the listener is null + * @see #removeListener(InvalidationListener) + */ + @Override + public void addListener(InvalidationListener listener) { + + } + + /** + * Removes the given listener from the list of listeners, that are notified whenever the value of + * the {@code Observable} becomes invalid. + *

+ * If the given listener has not been previously registered (i.e. it was never added) then this + * method call is a no-op. If it had been previously added then it will be removed. If it had been + * added more than once, then only the first occurrence will be removed. + * + * @param listener The listener to remove + * @throws NullPointerException if the listener is null + * @see #addListener(InvalidationListener) + */ + @Override + public void removeListener(InvalidationListener listener) { + + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutChatObserver.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutChatObserver.java new file mode 100644 index 0000000..aa93e98 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutChatObserver.java @@ -0,0 +1,5 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +public interface OutChatObserver { + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/SendButton.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/SendButton.java new file mode 100644 index 0000000..8bba790 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/SendButton.java @@ -0,0 +1,7 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +import javafx.scene.Node; + +public class SendButton extends Node { + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/WhisperButton.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/WhisperButton.java new file mode 100644 index 0000000..a029bef --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/WhisperButton.java @@ -0,0 +1,7 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +import javafx.scene.Node; + +public class WhisperButton extends Node { + +} From 68248c71750c23f8e5ad1c2d4d91b71ee4b339c8 Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger Date: Tue, 12 Apr 2022 23:50:30 +0200 Subject: [PATCH 2/6] (noch sehr kurzer) Dairy Update --- Meilenstein III/Diary.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Meilenstein III/Diary.txt b/Meilenstein III/Diary.txt index 4520955..144497e 100644 --- a/Meilenstein III/Diary.txt +++ b/Meilenstein III/Diary.txt @@ -257,6 +257,10 @@ Stand 15:00 Uhr: Variablen von git auf meinem Rechner neu configuriere. +12.04.2022 - Sebastian + Nach dem durchstöbern vieler Literatur endlich die Grundidee für den Chat-GUI. Insbesondere mit Hinblick + auf Integration in einen grösseres GUI-Modul. Wir werden wohl JavaFX(openFX) verwenden. + ToDo: Spiellogik: - Send() methode von Passenger mit Client-Server verknüpfen(Seraina) - NoiseHandler (Alex) From e4f9776f7f65a034b1514bd8d136462795177892 Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger Date: Wed, 13 Apr 2022 01:07:49 +0200 Subject: [PATCH 3/6] Slowly building the SceneGraph from the bottom. Created a abstract class that imlements the Toggle interface for toggling between who one wants to chat. --- .../client/gui/chat/BroadcastButton.java | 14 +++- .../client/gui/chat/ChatTargetToggle.java | 81 +++++++++++++++++++ .../multiplayer/client/gui/chat/ChatView.java | 42 +++++++--- .../client/gui/chat/ChildNode.java | 10 +++ .../client/gui/chat/NodeWithChildren.java | 13 +++ .../gui/chat/OutMsgTargetChooserNode.java | 32 ++++++++ .../client/gui/chat/SendButton.java | 11 ++- .../multiplayer/client/gui/chat/UINode.java | 9 +++ .../client/gui/chat/WhisperButton.java | 9 ++- 9 files changed, 207 insertions(+), 14 deletions(-) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatTargetToggle.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChildNode.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/NodeWithChildren.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutMsgTargetChooserNode.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/UINode.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/BroadcastButton.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/BroadcastButton.java index 1ce08d2..04d52ce 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/BroadcastButton.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/BroadcastButton.java @@ -1,7 +1,19 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.ObjectProperty; +import javafx.collections.ObservableMap; import javafx.scene.Node; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.Toggle; +import javafx.scene.control.ToggleGroup; -public class BroadcastButton extends Node { +/** + * Represents toggling to broadcast to everyone + */ +public class BroadcastButton extends ChatTargetToggle implements Toggle { + + Label l = new Label("Broadcast"); } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatTargetToggle.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatTargetToggle.java new file mode 100644 index 0000000..d7606f8 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatTargetToggle.java @@ -0,0 +1,81 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.Property; +import javafx.collections.ObservableMap; +import javafx.scene.Node; +import javafx.scene.control.Button; +import javafx.scene.control.RadioButton; +import javafx.scene.control.Toggle; +import javafx.scene.control.ToggleGroup; + +/** + * If this is toggled than the client chat is operating in whisper mode. + */ + +public abstract class ChatTargetToggle extends Node implements Toggle{ + + BooleanProperty isToggled; + ObjectProperty myFriends; + + /** + * Returns The {@link ToggleGroup} to which this {@code Toggle} belongs. + * + * @return The {@link ToggleGroup} to which this {@code Toggle} belongs. + */ + @Override + public ToggleGroup getToggleGroup() { + return myFriends.get(); + } + + /** + * Sets the {@link ToggleGroup} to which this {@code Toggle} belongs. + * + * @param toggleGroup The new {@link ToggleGroup}. + */ + @Override + public void setToggleGroup(ToggleGroup toggleGroup) { + myFriends.bindBidirectional((Property) toggleGroup); + } + + /** + * The {@link ToggleGroup} to which this {@code Toggle} belongs. + * + * @return the toggle group property + */ + @Override + public ObjectProperty toggleGroupProperty() { + return myFriends; + } + + /** + * Indicates whether this {@code Toggle} is selected. + * + * @return {@code true} if this {@code Toggle} is selected. + */ + @Override + public boolean isSelected() { + return isToggled.get(); + } + + /** + * Sets this {@code Toggle} as selected or unselected. + * + * @param selected {@code true} to make this {@code Toggle} selected. + */ + @Override + public void setSelected(boolean selected) { + this.isToggled.set(selected); + } + + /** + * The selected state for this {@code Toggle}. + * + * @return the selected property + */ + @Override + public BooleanProperty selectedProperty() { + return isToggled; + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatView.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatView.java index b0086b1..db2f39d 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatView.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatView.java @@ -1,20 +1,42 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; -import javafx.scene.Parent; -import javafx.scene.Scene; -import javafx.scene.SceneAntialiasing; -import javafx.scene.control.Label; +import javafx.scene.Node; +import javafx.scene.control.Button; +import javafx.scene.control.TextArea; import javafx.scene.layout.Pane; -import javafx.scene.paint.Paint; -public class ChatView { +/** + * This is the view of the client chat gui. + */ +public class ChatView extends Node implements NodeWithChildren, ChildNode { - private Label send = new Label("Send"); private Pane root; - private Pane createNodeHierarchy(){ - Pane p = new Pane(); - return p; + public void createNodeHierarchy(){ + Button send = new SendButton(); + OutMsgTargetChooserNode chooseTarget = new OutMsgTargetChooserNode(); + TextArea clientOutgoingChatMsg = new TextArea(); + } + + @Override + public Pane getRootPane() { + return root; + } + + @Override + public ChildNode getInstance() { + return this; + } + + @Override + public void create() { + + } + + @Override + public void getChildren() { + //TODO implement + NodeWithChildren.super.getChildren(); } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChildNode.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChildNode.java new file mode 100644 index 0000000..537e609 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChildNode.java @@ -0,0 +1,10 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +import javafx.scene.layout.Pane; + +public interface ChildNode { + + public Pane getRootPane(); + public ChildNode getInstance(); + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/NodeWithChildren.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/NodeWithChildren.java new file mode 100644 index 0000000..4d86854 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/NodeWithChildren.java @@ -0,0 +1,13 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +/** + * Any class that represents a JavaFX node and has children should implement this interface + */ +public interface NodeWithChildren { + + void create(); + + public default void getChildren(){}; + + void createNodeHierarchy(); +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutMsgTargetChooserNode.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutMsgTargetChooserNode.java new file mode 100644 index 0000000..1978c77 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutMsgTargetChooserNode.java @@ -0,0 +1,32 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +import javafx.collections.ObservableList; +import javafx.scene.Node; +import javafx.scene.control.Toggle; +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; + +public class OutMsgTargetChooserNode extends ToggleGroup implements NodeWithChildren { + + private Pane root; + private ObservableList targets; + + @Override + public void create() { + + } + + @Override + public void getChildren() { + NodeWithChildren.super.getChildren(); + } + + @Override + public void createNodeHierarchy() { + this.root = new HBox(); + for(Node n : targets) + root.getChildren().add(n); + + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/SendButton.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/SendButton.java index 8bba790..888299d 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/SendButton.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/SendButton.java @@ -1,7 +1,16 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; import javafx.scene.Node; +import javafx.scene.control.Button; -public class SendButton extends Node { +public class SendButton extends Button implements UINode { + + public SendButton() { + super("Send"); + } + @Override + public void listen() { + + } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/UINode.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/UINode.java new file mode 100644 index 0000000..7baa136 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/UINode.java @@ -0,0 +1,9 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +/** + * Any class that represents a JavaFX node that takes user input should implement this interface. + */ +public interface UINode { + + void listen(); +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/WhisperButton.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/WhisperButton.java index a029bef..4970ad8 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/WhisperButton.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/WhisperButton.java @@ -1,7 +1,12 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; -import javafx.scene.Node; +import javafx.scene.control.Label; -public class WhisperButton extends Node { +/** + * Represents the toggle for a whisper chat. + */ +public class WhisperButton extends ChatTargetToggle { + + Label l = new Label("Whisper"); } From 3e2288026bab9d2cba213b80956984184025dce2 Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger Date: Wed, 13 Apr 2022 01:45:32 +0200 Subject: [PATCH 4/6] Further Building the scene --- .../multiplayer/client/gui/chat/BroadcastButton.java | 12 +++++++++--- .../multiplayer/client/gui/chat/ControlWrapper.java | 9 +++++++++ .../client/gui/chat/NodeWithChildren.java | 4 +++- .../client/gui/chat/OutMsgTargetChooserNode.java | 2 +- .../multiplayer/client/gui/chat/PropertyButton.java | 5 +++++ .../multiplayer/client/gui/chat/SendButton.java | 4 ++++ .../multiplayer/client/gui/chat/WhisperButton.java | 12 ++++++++---- 7 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ControlWrapper.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/PropertyButton.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/BroadcastButton.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/BroadcastButton.java index 04d52ce..c050725 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/BroadcastButton.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/BroadcastButton.java @@ -5,15 +5,21 @@ import javafx.beans.property.ObjectProperty; import javafx.collections.ObservableMap; import javafx.scene.Node; import javafx.scene.control.Button; +import javafx.scene.control.Control; import javafx.scene.control.Label; +import javafx.scene.control.RadioButton; import javafx.scene.control.Toggle; import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.Pane; /** * Represents toggling to broadcast to everyone */ -public class BroadcastButton extends ChatTargetToggle implements Toggle { - - Label l = new Label("Broadcast"); +public class BroadcastButton extends Node implements ControlWrapper { + private static RadioButton broadcast = new RadioButton("Broadcast"); + @Override + public Control getControl() { + return broadcast; + } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ControlWrapper.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ControlWrapper.java new file mode 100644 index 0000000..578919e --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ControlWrapper.java @@ -0,0 +1,9 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +import javafx.scene.control.Control; + +public interface ControlWrapper { + + public Control getControl(); + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/NodeWithChildren.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/NodeWithChildren.java index 4d86854..b8fc7c4 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/NodeWithChildren.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/NodeWithChildren.java @@ -1,5 +1,7 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; +import javafx.scene.Node; + /** * Any class that represents a JavaFX node and has children should implement this interface */ @@ -7,7 +9,7 @@ public interface NodeWithChildren { void create(); - public default void getChildren(){}; + public default Node getChildren(){}; void createNodeHierarchy(); } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutMsgTargetChooserNode.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutMsgTargetChooserNode.java index 1978c77..79a265b 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutMsgTargetChooserNode.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutMsgTargetChooserNode.java @@ -18,7 +18,7 @@ public class OutMsgTargetChooserNode extends ToggleGroup implements NodeWithChil } @Override - public void getChildren() { + public Node getChildren() { NodeWithChildren.super.getChildren(); } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/PropertyButton.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/PropertyButton.java new file mode 100644 index 0000000..2e0f1fc --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/PropertyButton.java @@ -0,0 +1,5 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +public interface PropertyButton { + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/SendButton.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/SendButton.java index 888299d..56ebe45 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/SendButton.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/SendButton.java @@ -3,12 +3,16 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; import javafx.scene.Node; import javafx.scene.control.Button; +/** + * Represents the button in the chat to send a chat message. + */ public class SendButton extends Button implements UINode { public SendButton() { super("Send"); } + @Override public void listen() { diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/WhisperButton.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/WhisperButton.java index 4970ad8..2f18c42 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/WhisperButton.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/WhisperButton.java @@ -1,12 +1,16 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; -import javafx.scene.control.Label; +import javafx.scene.control.Control; +import javafx.scene.control.RadioButton; /** * Represents the toggle for a whisper chat. */ -public class WhisperButton extends ChatTargetToggle { - - Label l = new Label("Whisper"); +public class WhisperButton implements ControlWrapper { + private static RadioButton whisper = new RadioButton("Whisper"); + @Override + public Control getControl() { + return null; + } } From 76e1ed3ff122dbb7f9cfefd8f1c92748701bf014 Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger Date: Wed, 13 Apr 2022 01:46:28 +0200 Subject: [PATCH 5/6] Added a missing return statement --- .../multiplayer/client/gui/chat/ChatView.java | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatView.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatView.java index db2f39d..fb51094 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatView.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatView.java @@ -1,9 +1,14 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; +import javafx.geometry.Orientation; import javafx.scene.Node; import javafx.scene.control.Button; +import javafx.scene.control.SplitPane; import javafx.scene.control.TextArea; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; +import javax.print.attribute.standard.OrientationRequested; /** * This is the view of the client chat gui. @@ -15,8 +20,39 @@ public class ChatView extends Node implements NodeWithChildren, ChildNode { public void createNodeHierarchy(){ Button send = new SendButton(); + AnchorPane whereTheSendFieldLives = new AnchorPane(); + whereTheSendFieldLives.getChildren().add(send); + OutMsgTargetChooserNode chooseTarget = new OutMsgTargetChooserNode(); + AnchorPane whereTheTargetFieldLives = new AnchorPane(); + whereTheTargetFieldLives.getChildren().add(chooseTarget.getChildren()); + TextArea clientOutgoingChatMsg = new TextArea(); + AnchorPane whereOutTextLives = new AnchorPane(); + whereOutTextLives.getChildren().add(clientOutgoingChatMsg); + + + TextArea target = new TextArea(); + + + SplitPane inputOutputSeperation = new SplitPane(); + SplitPane sendAndToggleSeperation = new SplitPane(); + HBox buttonAndTextSeperation = new HBox(); + + + + sendAndToggleSeperation.setOrientation(Orientation.HORIZONTAL); + sendAndToggleSeperation.getItems().add(whereTheSendFieldLives); + sendAndToggleSeperation.getItems().add(whereTheTargetFieldLives); + /* + buttonAndTextSeperation.a + buttonAndTextSeperation.getItems().add(sendAndToggleSeperation); + buttonAndTextSeperation.getItems().add() + */ + + inputOutputSeperation.setOrientation(Orientation.HORIZONTAL); + inputOutputSeperation.getItems().add(sendAndToggleSeperation); + } @Override @@ -35,8 +71,8 @@ public class ChatView extends Node implements NodeWithChildren, ChildNode { } @Override - public void getChildren() { + public Node getChildren() { //TODO implement - NodeWithChildren.super.getChildren(); + return NodeWithChildren.super.getChildren(); } } From a6d416e45740db22cdec0c0469eb8e3825361718 Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger Date: Wed, 13 Apr 2022 01:47:25 +0200 Subject: [PATCH 6/6] final tiny touch ups --- .../cs108/multiplayer/client/gui/chat/NodeWithChildren.java | 4 +++- .../multiplayer/client/gui/chat/OutMsgTargetChooserNode.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/NodeWithChildren.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/NodeWithChildren.java index b8fc7c4..709c193 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/NodeWithChildren.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/NodeWithChildren.java @@ -9,7 +9,9 @@ public interface NodeWithChildren { void create(); - public default Node getChildren(){}; + public default Node getChildren() { + return null; + } void createNodeHierarchy(); } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutMsgTargetChooserNode.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutMsgTargetChooserNode.java index 79a265b..0a54cbc 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutMsgTargetChooserNode.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/OutMsgTargetChooserNode.java @@ -19,7 +19,7 @@ public class OutMsgTargetChooserNode extends ToggleGroup implements NodeWithChil @Override public Node getChildren() { - NodeWithChildren.super.getChildren(); + return NodeWithChildren.super.getChildren(); } @Override