Finished implementing room codes.

- Fixed bug where room code wasn't parsed correctly
- Added room code selection to server list screen.
- Added room code to hosts lobby.
- Implemented communication protocols on the game client.

Tags: #story[1281]
This commit is contained in:
Michael Rausch
2017-09-21 22:48:33 +12:00
parent e17e9749d8
commit 95ad7a4840
10 changed files with 167 additions and 53 deletions
@@ -3,6 +3,8 @@ package seng302.gameServer;
import com.sun.org.apache.xpath.internal.operations.Bool; import com.sun.org.apache.xpath.internal.operations.Bool;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import seng302.serverRepository.ServerListing;
import seng302.serverRepository.ServerRepositoryClient;
import javax.jmdns.JmDNS; import javax.jmdns.JmDNS;
import javax.jmdns.ServiceInfo; import javax.jmdns.ServiceInfo;
@@ -31,17 +33,20 @@ public class ServerAdvertiser {
*/ */
private static String SERVICE = "_partyatsea"; private static String SERVICE = "_partyatsea";
private static String PROTOCOL = "_tcp"; private static String PROTOCOL = "_tcp";
public static String SERVICE_TYPE = SERVICE + "." + PROTOCOL + ".homekit.bonjour.michaelrausch.nz."; public static String SERVICE_TYPE = SERVICE + "." + PROTOCOL + ".local.";
private static ServerAdvertiser instance = null; private static ServerAdvertiser instance = null;
private static JmDNS jmdnsInstance = null; private static JmDNS jmdnsInstance = null;
private ServiceInfo serviceInfo; // Note: Whenever this is changed, our service will be re-registered on the network. private ServiceInfo serviceInfo; // Note: Whenever this is changed, our service will be re-registered on the network.
private ServerRepositoryClient repositoryClient;
private Hashtable<String ,String> props; private Hashtable<String ,String> props;
private ServerAdvertiser() throws IOException{ private ServerAdvertiser() throws IOException{
jmdnsInstance = JmDNS.create(InetAddress.getByName(getLocalHostIp())); jmdnsInstance = JmDNS.create(InetAddress.getByName(getLocalHostIp()));
repositoryClient = new ServerRepositoryClient();
props = new Hashtable<>(); props = new Hashtable<>();
props.put("map", ""); props.put("map", "");
props.put("spacesLeft", "0"); props.put("spacesLeft", "0");
@@ -130,6 +135,9 @@ public class ServerAdvertiser {
} }
} }
}, 0); }, 0);
ServerListing serverListing = new ServerListing(serverName, props.get("map"), getLocalHostIp(), portNo, Integer.parseInt(props.get("capacity")));
repositoryClient.register(serverListing);
} }
/** /**
@@ -1,13 +1,32 @@
package seng302.gameServer.messages; package seng302.gameServer.messages;
import seng302.serverRepository.ServerListing;
public class ServerRegistrationMessage extends Message { public class ServerRegistrationMessage extends Message {
private int size; private int size;
public ServerRegistrationMessage(ServerListing serverListing) {
String serverName = serverListing.getServerName();
String mapName = serverListing.getMapName();
String address = serverListing.getAddress();
int port = serverListing.getPortNumber();
int players = serverListing.getPortNumber();
int capacity = serverListing.getCapacity();
String roomCode = serverListing.getRoomCode();
createMessage(serverName, mapName, address, port, players, capacity, roomCode);
}
@Override @Override
public int getSize() { public int getSize() {
return size; return size;
} }
public ServerRegistrationMessage(String serverName, String mapName, String address, int port, int players, int capacity, String roomCode){ public ServerRegistrationMessage(String serverName, String mapName, String address, int port, int players, int capacity, String roomCode){
createMessage(serverName, mapName, address, port, players, capacity, roomCode);
}
private void createMessage(String serverName, String mapName, String address, int port, int players, int capacity, String roomCode){
size = serverName.getBytes().length + mapName.length() + address.length() + roomCode.length() + 36; size = serverName.getBytes().length + mapName.length() + address.length() + roomCode.length() + 36;
setHeader(new Header(MessageType.REPO_REGISTRATION_REQUEST, 0x01, (short) getSize())); setHeader(new Header(MessageType.REPO_REGISTRATION_REQUEST, 0x01, (short) getSize()));
@@ -37,4 +56,5 @@ public class ServerRegistrationMessage extends Message {
writeCRC(); writeCRC();
rewind(); rewind();
} }
} }
@@ -57,9 +57,9 @@ public class ServerRepoStreamParser {
} }
private String parseRoomCodeRequest(byte[] payload) { private String parseRoomCodeRequest(byte[] payload) {
int roomCodeLength = (int) Message.bytesToLong(Arrays.copyOfRange(payload, 0 ,4)); int roomCodeLength = (int) Message.bytesToLong(Arrays.copyOfRange(payload, 0 ,6));
return new String(Arrays.copyOfRange(payload, 4, 4+roomCodeLength)); return new String(Arrays.copyOfRange(payload, 6, 6+roomCodeLength));
} }
public static ServerListing parseServerRegistration(byte[] payload) { public static ServerListing parseServerRegistration(byte[] payload) {
@@ -20,17 +20,20 @@ public class ServerRepository {
ServerSocket serverSocket = new ServerSocket(9999); ServerSocket serverSocket = new ServerSocket(9999);
// TODO Remove later, this is for testing // // TODO Remove later, this is for testing
new Timer().schedule(new TimerTask() { // new Timer().schedule(new TimerTask() {
@Override // @Override
public void run() { // public void run() {
try { // try {
new ServerRepositoryClient(); // System.out.println("Starting repo client");
} catch (Exception e) { // new ServerRepositoryClient();
e.printStackTrace(); // } catch (Exception e) {
} // e.printStackTrace();
} // }
}, 5000); // }
// }, 5000);
while (true){ while (true){
Socket clientSocket = serverSocket.accept(); Socket clientSocket = serverSocket.accept();
@@ -1,36 +1,67 @@
package seng302.serverRepository; package seng302.serverRepository;
import com.sun.xml.internal.ws.api.message.Packet;
import seng302.gameServer.messages.Message; import seng302.gameServer.messages.Message;
import seng302.gameServer.messages.RoomCodeRequest;
import seng302.gameServer.messages.ServerRegistrationMessage; import seng302.gameServer.messages.ServerRegistrationMessage;
import seng302.model.stream.packets.PacketType; import seng302.model.stream.packets.PacketType;
import java.io.IOException;
import java.net.Socket; import java.net.Socket;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
public class ServerRepositoryClient { public class ServerRepositoryClient {
private String roomCode = "0"; private static String roomCode = null;
private Timer serverListingUpdateTimer;
public ServerRepositoryClient() throws Exception { public ServerRepositoryClient() {
new Timer().schedule(new TimerTask() {
}
public void register(ServerListing serverListing){
serverListingUpdateTimer = new Timer();
serverListingUpdateTimer.schedule(new TimerTask() {
@Override @Override
public void run() { public void run() {
try { try {
sendUpdate(); sendRegistrationUpdate(serverListing);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();//todo proper error handling
} }
} }
}, 0, 5000); }, 0, 5000);
} }
private void sendUpdate() throws Exception { public void unregister(){
serverListingUpdateTimer.cancel();
}
public ServerListing getServerForRoomCode(String roomCode) throws Exception {
// TODO replace localhost with server
Socket socket = new Socket("localhost", 9999); Socket socket = new Socket("localhost", 9999);
ServerRepoStreamParser parser = new ServerRepoStreamParser(socket.getInputStream()); ServerRepoStreamParser parser = new ServerRepoStreamParser(socket.getInputStream());
Message req = new ServerRegistrationMessage("asdf", "Asdf", "asdf", 6969, 1, 20, "4949");
Message request = new RoomCodeRequest(roomCode); //roomCode);
socket.getOutputStream().write(request.getBuffer());
PacketType packetType = parser.parse();
if (packetType != PacketType.SERVER_REGISTRATION){
System.out.println("Wrong packet type");
return null;
}
socket.close();
return parser.getServerListing();
}
private void sendRegistrationUpdate(ServerListing serverListing) throws Exception {
Socket socket = new Socket("localhost", 9999);
ServerRepoStreamParser parser = new ServerRepoStreamParser(socket.getInputStream());
Message req = new ServerRegistrationMessage(serverListing);
socket.getOutputStream().write(req.getBuffer()); socket.getOutputStream().write(req.getBuffer());
@@ -42,13 +73,15 @@ public class ServerRepositoryClient {
String roomCode = parser.getRoomCode(); String roomCode = parser.getRoomCode();
if (roomCode.equals("0")){ if (roomCode.length() != 0){
return; ServerRepositoryClient.roomCode = roomCode;
} }
this.roomCode = roomCode;
socket.close(); socket.close();
} }
public static String getRoomCode(){
return roomCode;
}
} }
@@ -22,6 +22,7 @@ import seng302.model.RaceState;
import seng302.model.mark.CompoundMark; import seng302.model.mark.CompoundMark;
import seng302.model.mark.Corner; import seng302.model.mark.Corner;
import seng302.model.stream.xml.parser.RaceXMLData; import seng302.model.stream.xml.parser.RaceXMLData;
import seng302.serverRepository.ServerRepositoryClient;
import seng302.utilities.Sounds; import seng302.utilities.Sounds;
import seng302.visualiser.GameView; import seng302.visualiser.GameView;
import seng302.visualiser.controllers.cells.PlayerCell; import seng302.visualiser.controllers.cells.PlayerCell;
@@ -29,10 +30,7 @@ import seng302.visualiser.controllers.dialogs.BoatCustomizeController;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
public class LobbyController implements Initializable { public class LobbyController implements Initializable {
@@ -85,6 +83,10 @@ public class LobbyController implements Initializable {
serverName.setText(ViewManager.getInstance().getProperty("serverName")); serverName.setText(ViewManager.getInstance().getProperty("serverName"));
mapName.setText(ViewManager.getInstance().getProperty("mapName")); mapName.setText(ViewManager.getInstance().getProperty("mapName"));
if (ServerRepositoryClient.getRoomCode() != null){
setRoomCode(ServerRepositoryClient.getRoomCode());
}
ViewManager.getInstance().getPlayerList().addListener((ListChangeListener<String>) c -> Platform.runLater(this::refreshPlayerList)); ViewManager.getInstance().getPlayerList().addListener((ListChangeListener<String>) c -> Platform.runLater(this::refreshPlayerList));
ViewManager.getInstance().getPlayerList().setAll(ViewManager.getInstance().getPlayerList().sorted()); ViewManager.getInstance().getPlayerList().setAll(ViewManager.getInstance().getPlayerList().sorted());
@@ -242,4 +244,8 @@ public class LobbyController implements Initializable {
public void closeCustomizationDialog() { public void closeCustomizationDialog() {
customizationDialog.close(); customizationDialog.close();
} }
public void setRoomCode(String roomCode) {
serverName.setText(serverName.getText() + " ( " + roomCode +" )");
}
} }
@@ -23,6 +23,8 @@ import javafx.scene.layout.VBox;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import seng302.gameServer.ServerDescription; import seng302.gameServer.ServerDescription;
import seng302.serverRepository.ServerListing;
import seng302.serverRepository.ServerRepositoryClient;
import seng302.utilities.Sounds; import seng302.utilities.Sounds;
import seng302.visualiser.ServerListener; import seng302.visualiser.ServerListener;
import seng302.visualiser.ServerListenerDelegate; import seng302.visualiser.ServerListenerDelegate;
@@ -51,6 +53,10 @@ public class ServerListController implements Initializable, ServerListenerDelega
private JFXTextField serverHostName; private JFXTextField serverHostName;
@FXML @FXML
private JFXTextField serverPortNumber; private JFXTextField serverPortNumber;
@FXML
private JFXButton roomConnectButton;
@FXML
private JFXTextField roomNumber;
//---------FXML END---------// //---------FXML END---------//
private Label noServersFound; private Label noServersFound;
@@ -64,6 +70,17 @@ public class ServerListController implements Initializable, ServerListenerDelega
// Set Event Bindings // Set Event Bindings
connectButton.setOnMouseEntered(event -> Sounds.playHoverSound()); connectButton.setOnMouseEntered(event -> Sounds.playHoverSound());
serverListHostButton.setOnMouseEntered(event -> Sounds.playHoverSound()); serverListHostButton.setOnMouseEntered(event -> Sounds.playHoverSound());
roomConnectButton.setOnMouseReleased(event -> {
connectToRoomCode(roomNumber.getText());
Sounds.playButtonClick();
});
roomNumber.setOnKeyPressed(event -> {
if (event.getCode().equals(KeyCode.ENTER)) {
connectToRoomCode(roomNumber.getText());
}
});
connectButton.setOnMouseReleased(event -> { connectButton.setOnMouseReleased(event -> {
attemptToDirectConnect(); attemptToDirectConnect();
Sounds.playButtonClick(); Sounds.playButtonClick();
@@ -150,6 +167,15 @@ public class ServerListController implements Initializable, ServerListenerDelega
return hostNameValid && portNumberValid; return hostNameValid && portNumberValid;
} }
private void connectToRoomCode(String roomCode){
try {
ServerListing serverListing = new ServerRepositoryClient().getServerForRoomCode(roomCode);
ViewManager.getInstance().getGameClient().runAsClient(serverListing.getAddress(), serverListing.getPortNumber());
} catch (Exception e) {
e.printStackTrace();
}
}
/** /**
* Connects the user to a lobby via the Direct Connect form. * Connects the user to a lobby via the Direct Connect form.
*/ */
@@ -20,6 +20,7 @@ import javafx.stage.Stage;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import seng302.gameServer.ServerAdvertiser; import seng302.gameServer.ServerAdvertiser;
import seng302.serverRepository.ServerRepositoryClient;
import seng302.utilities.BonjourInstallChecker; import seng302.utilities.BonjourInstallChecker;
import seng302.utilities.Sounds; import seng302.utilities.Sounds;
import seng302.visualiser.GameClient; import seng302.visualiser.GameClient;
@@ -233,8 +234,9 @@ public class ViewManager {
logger.error("Could not load lobby view"); logger.error("Could not load lobby view");
} }
if (disableReadyButton) {
LobbyController lobbyController = loader.getController(); LobbyController lobbyController = loader.getController();
if (disableReadyButton) {
lobbyController.disableReadyButton(); lobbyController.disableReadyButton();
} }
@@ -245,7 +247,6 @@ public class ViewManager {
* Sets up the view for the race. Creating a new decorator and destroying the old one. * Sets up the view for the race. Creating a new decorator and destroying the old one.
* @return A RaceViewController for the race view screen. * @return A RaceViewController for the race view screen.
*/ */
public RaceViewController loadRaceView() { public RaceViewController loadRaceView() {
FXMLLoader loader = loadFxml("/views/RaceView.fxml"); FXMLLoader loader = loadFxml("/views/RaceView.fxml");
// have to create a new stage and set the race view maximized as JFoenix decorator has // have to create a new stage and set the race view maximized as JFoenix decorator has
+6 -6
View File
@@ -38,30 +38,30 @@
-fx-font-size: 23px; -fx-font-size: 23px;
} }
#connectButton { #connectButton, #roomConnectButton {
-fx-background-color: -fx-pp-light-text-color; /* inverted */ -fx-background-color: -fx-pp-light-text-color; /* inverted */
-fx-text-fill: -fx-pp-theme-color; /* inverted */ -fx-text-fill: -fx-pp-theme-color; /* inverted */
-fx-font-size: 20px; -fx-font-size: 20px;
-fx-pref-height: 65px; -fx-pref-height: 45px;
} }
#connectButton:hover { #connectButton:hover, #roomConnectButton:hover {
-fx-font-size: 23px; -fx-font-size: 23px;
} }
#connectLabel, #serverPortNumber, #serverHostName { #connectLabel, #connectLabel1, #serverPortNumber, #roomNumber, #serverHostName {
-fx-text-fill: -fx-pp-light-text-color; -fx-text-fill: -fx-pp-light-text-color;
-fx-font-size: 18px; -fx-font-size: 18px;
} }
#serverHostName, #serverPortNumber { #serverHostName, #serverPortNumber, #roomNumber {
-jfx-focus-color: -fx-pp-light-text-color; -jfx-focus-color: -fx-pp-light-text-color;
-jfx-unfocus-color: -fx-pp-light-text-color; -jfx-unfocus-color: -fx-pp-light-text-color;
-fx-prompt-text-fill: -fx-pp-light-text-color; -fx-prompt-text-fill: -fx-pp-light-text-color;
} }
#serverHostName .error-label, #serverPortNumber .error-label { #serverHostName .error-label, #serverPortNumber .error-label, #roomNumber .error-label {
-fx-font-size: 12px; -fx-font-size: 12px;
-fx-text-fill: lightblue; -fx-text-fill: lightblue;
} }
+29 -12
View File
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.*?>
<?import java.lang.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import com.jfoenix.controls.JFXButton?> <?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXTextField?> <?import com.jfoenix.controls.JFXTextField?>
<?import java.lang.String?> <?import java.lang.String?>
@@ -12,35 +18,48 @@
<?import javafx.scene.layout.StackPane?> <?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?> <?import javafx.scene.text.Font?>
<StackPane fx:id="serverListMainStackPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="seng302.visualiser.controllers.ServerListController"> <StackPane fx:id="serverListMainStackPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="seng302.visualiser.controllers.ServerListController">
<children> <children>
<GridPane fx:id="serverListMainGridPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308"> <GridPane fx:id="serverListMainGridPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308">
<children> <children>
<GridPane fx:id="connectGridPane" GridPane.rowIndex="2"> <GridPane fx:id="connectGridPane" GridPane.rowIndex="2">
<children> <children>
<JFXButton fx:id="connectButton" buttonType="RAISED" prefHeight="45.0" <JFXButton fx:id="connectButton" buttonType="RAISED" prefHeight="45.0" prefWidth="220.0" ripplerFill="#3493e3" text="CONNECT" textFill="WHITE" GridPane.columnIndex="5" GridPane.halignment="RIGHT" GridPane.rowIndex="1" GridPane.valignment="CENTER">
prefWidth="220.0" ripplerFill="#3493e3" text="CONNECT" textFill="WHITE"
GridPane.columnIndex="5" GridPane.halignment="RIGHT"
GridPane.valignment="CENTER">
<GridPane.margin> <GridPane.margin>
<Insets right="50.0" /> <Insets right="50.0" />
</GridPane.margin> </GridPane.margin>
</JFXButton> </JFXButton>
<JFXTextField fx:id="serverHostName" maxHeight="30.0" minHeight="30.0" prefHeight="30.0" promptText="Host Name" GridPane.columnIndex="2" GridPane.halignment="CENTER" GridPane.valignment="CENTER"> <JFXTextField fx:id="serverHostName" maxHeight="30.0" minHeight="30.0" prefHeight="30.0" promptText="Host Name" GridPane.columnIndex="2" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER">
<GridPane.margin> <GridPane.margin>
<Insets left="20.0" right="20.0" /> <Insets left="20.0" right="20.0" />
</GridPane.margin> </GridPane.margin>
</JFXTextField> </JFXTextField>
<JFXTextField fx:id="serverPortNumber" maxHeight="30.0" minHeight="30.0" prefHeight="30.0" promptText="Port Number" GridPane.columnIndex="3" GridPane.halignment="CENTER" GridPane.valignment="CENTER"> <JFXTextField fx:id="serverPortNumber" maxHeight="30.0" minHeight="30.0" prefHeight="30.0" promptText="Port Number" GridPane.columnIndex="3" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER">
<GridPane.margin> <GridPane.margin>
<Insets left="20.0" right="20.0" /> <Insets left="20.0" right="20.0" />
</GridPane.margin> </GridPane.margin>
</JFXTextField> </JFXTextField>
<Label fx:id="connectLabel" text="Direct Connect:" GridPane.columnIndex="1" GridPane.halignment="RIGHT" GridPane.valignment="CENTER"> <Label fx:id="connectLabel" text="Direct Connect:" GridPane.columnIndex="1" GridPane.halignment="RIGHT" GridPane.rowIndex="1" GridPane.valignment="CENTER">
<GridPane.margin> <GridPane.margin>
<Insets right="45.0" /> <Insets right="45.0" />
</GridPane.margin> </GridPane.margin>
</Label> </Label>
<Label fx:id="connectLabel1" text="Connect to Room:" GridPane.columnIndex="2" GridPane.halignment="RIGHT" GridPane.valignment="CENTER">
<GridPane.margin>
<Insets right="45.0" top="5.0" />
</GridPane.margin>
</Label>
<JFXButton fx:id="roomConnectButton" buttonType="RAISED" prefHeight="45.0" prefWidth="220.0" text="CONNECT" GridPane.columnIndex="5" GridPane.halignment="RIGHT" GridPane.valignment="CENTER">
<GridPane.margin>
<Insets right="50.0" top="5.0" />
</GridPane.margin>
</JFXButton>
<JFXTextField fx:id="roomNumber" maxHeight="30.0" minHeight="30.0" prefHeight="30.0" promptText="Room Number" GridPane.columnIndex="3" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
<GridPane.margin>
<Insets left="20.0" right="20.0" top="5.0" />
</GridPane.margin>
</JFXTextField>
</children> </children>
<columnConstraints> <columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" /> <ColumnConstraints hgrow="SOMETIMES" />
@@ -51,6 +70,7 @@
<ColumnConstraints hgrow="SOMETIMES" maxWidth="273.0" minWidth="250.0" prefWidth="273.0" /> <ColumnConstraints hgrow="SOMETIMES" maxWidth="273.0" minWidth="250.0" prefWidth="273.0" />
</columnConstraints> </columnConstraints>
<rowConstraints> <rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints> </rowConstraints>
</GridPane> </GridPane>
@@ -76,10 +96,7 @@
<Insets left="35.0" top="5.0" /> <Insets left="35.0" top="5.0" />
</padding> </padding>
</Label> </Label>
<JFXButton id="hostButton" fx:id="serverListHostButton" buttonType="RAISED" <JFXButton id="hostButton" fx:id="serverListHostButton" buttonType="RAISED" prefHeight="45.0" prefWidth="220.0" text="HOST" GridPane.columnIndex="1" GridPane.halignment="RIGHT" GridPane.valignment="CENTER">
prefHeight="45.0" prefWidth="220.0"
text="HOST" GridPane.columnIndex="1" GridPane.halignment="RIGHT"
GridPane.valignment="CENTER">
<GridPane.margin> <GridPane.margin>
<Insets right="50.0" /> <Insets right="50.0" />
</GridPane.margin> </GridPane.margin>
@@ -100,7 +117,7 @@
<rowConstraints> <rowConstraints>
<RowConstraints maxHeight="80.0" minHeight="80.0" prefHeight="80.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="80.0" minHeight="80.0" prefHeight="80.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="1.7976931348623157E308" minHeight="400.0" prefHeight="400.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="1.7976931348623157E308" minHeight="400.0" prefHeight="400.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="80.0" minHeight="80.0" prefHeight="80.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="80.0" minHeight="125.0" prefHeight="80.0" vgrow="SOMETIMES" />
</rowConstraints> </rowConstraints>
<stylesheets> <stylesheets>
<String fx:value="/css/Master.css" /> <String fx:value="/css/Master.css" />