package lighthouse.subwindows; import com.google.common.base.*; import com.google.common.net.*; import javafx.application.Platform; import javafx.collections.*; import javafx.event.*; import javafx.fxml.*; import javafx.scene.control.*; import javafx.scene.text.*; import lighthouse.*; import lighthouse.model.*; import lighthouse.protocol.*; import lighthouse.utils.*; import org.slf4j.*; import java.io.*; import static com.google.common.base.Preconditions.*; import static lighthouse.utils.GuiUtils.*; import static lighthouse.utils.I18nUtil.*; /** * Screen where user chooses between server assisted and serverless mode. */ public class AddProjectTypeWindow { private static final Logger log = LoggerFactory.getLogger(AddProjectTypeWindow.class); @FXML RadioButton fullyDecentralised; @FXML RadioButton serverAssisted; @FXML ComboBox<String> serverNameCombo; @FXML Button saveButton; @FXML Text serverInstructionsLabel; @FXML Label serverNameLabel; private ProjectModel model; private boolean editing; public Main.OverlayUI<InnerWindow> overlayUI; public static Main.OverlayUI<AddProjectTypeWindow> open(ProjectModel projectModel, boolean editing) { Main.OverlayUI<AddProjectTypeWindow> result = Main.instance.overlayUI("subwindows/add_project_type.fxml", editing ? tr("Change type") : tr("Select type")); result.controller.setModel(projectModel); result.controller.editing = editing; return result; } private void setModel(ProjectModel model) { this.model = model; if (model.serverName.get() != null) { serverNameCombo.setValue(model.serverName.get()); serverAssisted.setSelected(true); } else { fullyDecentralised.setSelected(true); } } public void initialize() { ObservableList<String> hostnames = FXCollections.observableArrayList(ServerList.hostnameToServer.keySet()); serverNameCombo.itemsProperty().set(hostnames); serverNameCombo.disableProperty().bind(fullyDecentralised.selectedProperty()); serverNameCombo.valueProperty().addListener((observable, oldValue, newValue) -> { ServerList.Entry entry = ServerList.hostnameToServer.get(newValue); if (entry != null) { serverInstructionsLabel.setText(entry.getInstructions()); } else { serverInstructionsLabel.setText(""); } }); } private boolean isServerNameValid(String str) { try { if (str.equals("localhost")) return true; HostAndPort hostAndPort = HostAndPort.fromString(str); return (InternetDomainName.isValid(hostAndPort.getHostText()) && InternetDomainName.from(hostAndPort.getHostText()).isUnderPublicSuffix()); } catch (IllegalArgumentException e) { return false; } } // Returns true if form is valid. private boolean validateAndSync() { if (serverAssisted.isSelected()) { if (serverNameCombo.getValue() == null || serverNameCombo.getValue().equals("")) { GuiUtils.arrowBubbleToNode(serverNameCombo, tr("You must pick a server.")); return false; } else if (!isServerNameValid(serverNameCombo.getValue())) { GuiUtils.arrowBubbleToNode(serverNameCombo, tr("The server name is not considered valid.")); return false; } } model.serverName.set(serverAssisted.isSelected() ? serverNameCombo.getValue() : ""); return true; } @FXML public void saveClicked(ActionEvent event) { // Work around ConcurrentModificationException error. Platform.runLater(() -> { if (!validateAndSync()) return; final LHProtos.ProjectDetails detailsProto = model.getDetailsProto().build(); log.info("Saving: {}", detailsProto.getExtraDetails().getTitle()); try { Project project = editing ? Main.backend.editProject(model.getProject(), checkNotNull(model.originalProject)) : Main.backend.saveProject(model.getProject()); ExportWindow.openForProject(project); } catch (IOException e) { log.error("Could not save project", e); informationalAlert(tr("Could not save project"), // TRANS: %s = error message tr("An error was encountered whilst trying to save the project: %s"), Throwables.getRootCause(e)); } }); } @FXML public void cancelClicked(ActionEvent event) { // Work around ConcurrentModificationException error in framework. Platform.runLater(() -> { if (editing) EditProjectWindow.openForEdit(model); else EditProjectWindow.openForCreate(model); }); } }