package bluej.groupwork.ui;
import java.util.Arrays;
import java.util.List;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
import javafx.collections.ObservableList;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import bluej.Config;
import bluej.groupwork.TeamSettings;
import bluej.groupwork.TeamSettingsController;
import bluej.groupwork.TeamSettingsController.ServerType;
import bluej.groupwork.TeamworkProvider;
import bluej.groupwork.actions.ValidateConnectionAction;
import bluej.utility.Debug;
import bluej.utility.javafx.HorizontalRadio;
import bluej.utility.javafx.JavaFXUtil;
import threadchecker.OnThread;
import threadchecker.Tag;
| A panel for team settings.
|
| @author fisker
| @author Amjad Altadmri
|
@OnThread(Tag.FXPlatform)
public class TeamSettingsPanel
extends VBox{
private TeamSettingsController teamSettingsController;
private TeamSettingsDialog teamSettingsDialog;
private GridPane personalPane;
private GridPane locationPane;
private Label serverLabel = new Label(Config.getString("team.settings.server"));
private Label prefixLabel = new Label(Config.getString("team.settings.prefix"));
private Label protocolLabel = new Label(Config.getString("team.settings.protocol"));
private Label uriLabel = new Label(Config.getString("team.settings.uri"));
private Label yourNameLabel = new Label(Config.getString("team.settings.yourName"));
private Label yourEmailLabel = new Label(Config.getString("team.settings.yourEmail"));
private Label userLabel = new Label(Config.getString("team.settings.user"));
private Label passwordLabel = new Label(Config.getString("team.settings.password"));
private Label groupLabel = new Label(Config.getString("team.settings.group"));
private final HorizontalRadio<ServerType> serverTypes;
private final TextField serverField = new TextField();
private final TextField prefixField = new TextField();
private final ComboBox<String> protocolComboBox = new ComboBox<>();
private final TextField uriField = new TextField();
private final TextField yourNameField = new TextField();
private final TextField yourEmailField = new TextField();
private final TextField userField = new TextField();
private final PasswordField passwordField = new PasswordField();
private final TextField groupField = new TextField();
| identifies which field is the primary server information field
|
private TextField locationPrimaryField;
| identifiers which field is the primary personal information field
|
private TextField personalPrimaryField;
private CheckBox useAsDefault;
private ServerType selectedServerType = null;
public TeamSettingsPanel(TeamSettingsController teamSettingsController, TeamSettingsDialog dialog, ObservableList<String> styleClass)
{
this.teamSettingsController = teamSettingsController;
this.teamSettingsDialog = dialog;
JavaFXUtil.addStyleClass(this, "panel");
serverTypes = new HorizontalRadio<>(Arrays.asList(ServerType.Subversion, ServerType.Git));
serverTypes.select(ServerType.Subversion);
HBox serverTypeBox = new HBox();
JavaFXUtil.addStyleClass(serverTypeBox, "serverType-box");
serverTypeBox.getChildren().add(new Label(Config.getString("team.settings.serverType")));
serverTypeBox.getChildren().addAll(serverTypes.getButtons());
serverTypeBox.setAlignment(Pos.CENTER);
this.getChildren().add(serverTypeBox);
useAsDefault = new CheckBox(Config.getString("team.settings.rememberSettings"));
locationPane = createGridPane();
personalPane = createGridPane();
preparePanes(serverTypes.selectedProperty().get());
JavaFXUtil.addChangeListenerPlatform(serverTypes.selectedProperty(), type -> {
preparePanes(type);
updateOKButtonBinding();
});
ValidateConnectionAction validateConnectionAction = new ValidateConnectionAction(this, dialog::getOwner);
Button validateButton = new Button();
validateConnectionAction.useButton(teamSettingsController.getProject(), validateButton);
getChildren().addAll(createPropertiesContainer(Config.getString("team.settings.location"), locationPane),
createPropertiesContainer(Config.getString("team.settings.personal"), personalPane),
useAsDefault,
validateButton);
setupContent();
updateOKButtonBinding();
if (!teamSettingsController.hasProject()){
useAsDefault.setSelected(true);
useAsDefault.setDisable(true);
}
}
| Request focus to whatever field seems the most likely to be filled out next.
|
public void doRequestFocus()
{
if (locationPrimaryField != null && locationPrimaryField.getText().isEmpty())
{
locationPrimaryField.requestFocus();
}
else if (personalPrimaryField.getText().isEmpty())
{
personalPrimaryField.requestFocus();
}
else
{
passwordField.requestFocus();
}
}
private GridPane createGridPane()
{
GridPane pane = new GridPane();
pane.getStyleClass().add("grid");
ColumnConstraints column1 = new ColumnConstraints();
column1.setPrefWidth(102);
ColumnConstraints column2 = new ColumnConstraints();
column2.setPrefWidth(260);
column2.setHgrow(Priority.ALWAYS);
pane.getColumnConstraints().addAll(column1, column2);
return pane;
}
private Pane createPropertiesContainer(String title, Pane gridPane)
{
VBox container = new VBox();
container.setSpacing(-5);
container.getChildren().addAll(new Label(title), gridPane);
return container;
}
private void preparePanes(ServerType type)
{
prepareLocationPane(type);
preparePersonalPane(type);
setProviderSettings();
useAsDefault.setDisable(false);
}
private void preparePersonalPane(ServerType type)
{
personalPane.getChildren().clear();
switch (type) {
case Subversion:
personalPane.addRow(0, userLabel, userField);
personalPane.addRow(1, passwordLabel, passwordField);
personalPane.addRow(2, groupLabel, groupField);
personalPrimaryField = userField;
break;
case Git:
personalPane.addRow(0, yourNameLabel, yourNameField);
personalPane.addRow(1, yourEmailLabel, yourEmailField);
personalPane.addRow(2, userLabel, userField);
personalPane.addRow(3, passwordLabel, passwordField);
personalPrimaryField = yourNameField;
break;
default:
Debug.reportError(type + " is not recognisable as s server type");
}
}
private void prepareLocationPane(ServerType type)
{
locationPane.getChildren().clear();
protocolComboBox.setEditable(false);
switch (type) {
case Subversion:
locationPane.addRow(0, serverLabel, serverField);
locationPane.addRow(1, prefixLabel, prefixField);
locationPane.addRow(2, protocolLabel, protocolComboBox);
locationPrimaryField = serverField;
break;
case Git:
locationPane.addRow(0, uriLabel, uriField);
locationPrimaryField = uriField;
break;
default:
Debug.reportError(type + " is not recognisable as s server type");
}
}
| Set a text field's text property, adjusting null to the empty string.
|
| @param field the text field to set the text for
| @param value the value to set the text property to, or null for the empty string
|
private void setTextFieldText(TextField field, String value)
{
field.setText(value == null ? "" : value);
}
private void setupContent()
{
String user = teamSettingsController.getPropString("bluej.teamsettings.user");
if (user != null) {
setUser(user);
}
String yourName = teamSettingsController.getPropString("bluej.teamsettings.yourName");
if (yourName != null){
setYourName(yourName);
}
String yourEmail = teamSettingsController.getPropString("bluej.teamsettings.yourEmail");
if (yourEmail != null){
setYourEmail(yourEmail);
}
String password = teamSettingsController.getPasswordString();
if (password != null) {
setPassword(password);
}
String group = teamSettingsController.getPropString("bluej.teamsettings.groupname");
if (group != null) {
setGroup(group);
}
String useAsDefault = teamSettingsController.getPropString("bluej.teamsettings.useAsDefault");
if (useAsDefault != null) {
setUseAsDefault(Boolean.getBoolean(useAsDefault));
}
String providerName = teamSettingsController.getPropString("bluej.teamsettings.vcs");
List<TeamworkProvider> teamProviders = teamSettingsController.getTeamworkProviders();
for (int index = 0; index < teamProviders.size(); index++)
{
TeamworkProvider provider = teamProviders.get(index);
if (provider.getProviderName().equalsIgnoreCase(providerName)
|| (providerName == null && index == 0))
{
serverTypes.select(ServerType.valueOf(teamProviders.get(index).getProviderName()));
if (provider.needsEmail())
{
if (teamSettingsController.getProject() != null)
{
File respositoryRoot = teamSettingsController.getProject().getProjectDir();
setTextFieldText(yourEmailField, provider.getYourEmailFromRepo(respositoryRoot));
setTextFieldText(yourNameField, provider.getYourNameFromRepo(respositoryRoot));
}
}
break;
}
}
setProviderSettings();
}
| Set settings to provider-specific values (repository prefix, server, protocol).
| The values are remembered on a per-provider basis; this sets the fields to show
| the remembered values for the selected provider.
|
private void setProviderSettings()
{
String keyBase = "bluej.teamsettings."
+ getSelectedProvider().getProviderName().toLowerCase() + ".";
String prefix = teamSettingsController.getPropString(keyBase + "repositoryPrefix");
if (prefix != null) {
setPrefix(prefix);
}
String server = teamSettingsController.getPropString(keyBase + "server");
if (server != null) {
setServer(server);
}
fillProtocolSelections();
String protocol = readProtocolString();
if (protocol != null){
setProtocol(protocol);
}
}
| Empty the protocol selection box, then fill it with the available protocols
| from the currently selected teamwork provider.
|
private void fillProtocolSelections()
{
ServerType type = serverTypes.selectedProperty().get();
if (type != selectedServerType) {
selectedServerType = type;
protocolComboBox.getItems().clear();
TeamworkProvider provider = teamSettingsController.getTeamworkProvider(type);
protocolComboBox.getItems().addAll(Arrays.asList(provider.getProtocols()));
}
}
private String readProtocolString()
{
String keyBase = "bluej.teamsettings."
+ getSelectedProvider().getProviderName().toLowerCase() + ".";
return teamSettingsController.getPropString(keyBase + "protocol");
}
private void setUser(String user)
{
userField.setText(user);
}
private void setYourName(String yourName)
{
yourNameField.setText(yourName);
}
private void setYourEmail(String yourEmail)
{
yourEmailField.setText(yourEmail);
}
private void setPassword(String password)
{
passwordField.setText(password);
}
private void setGroup(String group)
{
groupField.setText(group);
}
private void setPrefix(String prefix)
{
prefixField.setText(prefix);
}
private void setServer(String server)
{
serverField.setText(server);
}
| Set the protocol to that identified by the given protocol key.
|
private void setProtocol(String protocolKey)
{
String protocolLabel = getSelectedProvider().getProtocolLabel(protocolKey);
protocolComboBox.getSelectionModel().select(protocolLabel);
}
private void setUseAsDefault(boolean use)
{
useAsDefault.setSelected(use);
}
public TeamworkProvider getSelectedProvider()
{
return teamSettingsController.getTeamworkProviders().stream()
.filter(provider -> provider.getProviderName().equals(serverTypes.selectedProperty().get().name()))
.findAny().get();
}
private String getUser()
{
return userField.getText();
}
private String getPassword()
{
return passwordField.getText();
}
private String getGroup()
{
if (getSelectedProvider().needsEmail()){
return "";
}
return groupField.getText();
}
private String getPrefix()
{
if (getSelectedProvider().needsEmail()) {
try {
URI uri = new URI(uriField.getText());
return uri.getPath();
} catch (URISyntaxException ex) {
return null;
}
}
return prefixField.getText();
}
private String getServer()
{
if (getSelectedProvider().needsEmail()) {
try {
URI uri = new URI(uriField.getText());
return uri.getHost();
} catch (URISyntaxException ex) {
return null;
}
}
return serverField.getText();
}
private String getProtocolKey()
{
if (getSelectedProvider().needsEmail()) {
try {
URI uri = new URI(uriField.getText());
return uri.getScheme();
} catch (URISyntaxException ex) {
return null;
}
}
int protocol = protocolComboBox.getSelectionModel().getSelectedIndex();
if (protocol == -1) {
return null;
}
return getSelectedProvider().getProtocolKey(protocol);
}
public boolean getUseAsDefault()
{
return useAsDefault.isSelected();
}
private String getYourName()
{
return yourNameField.getText();
}
private String getYourEmail()
{
return yourEmailField.getText();
}
public TeamSettings getSettings()
{
TeamSettings result = new TeamSettings(getSelectedProvider(), getProtocolKey(),
getServer(), getPrefix(), getGroup(), getUser(), getPassword());
result.setYourEmail(getYourEmail());
result.setYourName(getYourName());
return result;
}
| Check whether the "ok" button should be enabled or disabled according
|* to whether required fields have been provided.
*/
private void updateOKButtonBinding()
{
teamSettingsDialog.getOkButton().disableProperty().unbind();
|
|BooleanBinding disabled = userField.textProperty().isEmpty();
|
|switch (serverTypes.selectedProperty().get()) {
|
|case Subversion:
|
|disabled = disabled.or(serverField.textProperty().isEmpty());
|
|break;
|
|case Git:
|
|disabled = disabled.or(uriField.textProperty().isEmpty())
|
|.or(yourNameField.textProperty().isEmpty())
|
|.or(yourEmailField.textProperty().isEmpty())
|
|.or(Bindings.createBooleanBinding(() -> !yourEmailField.getText().contains("@"), yourEmailField.textProperty()));
break;
}
teamSettingsDialog.getOkButton().disableProperty().bind(disabled);
}
/**
* Disable the fields used to specify the repository:
| group, prefix, server and protocol
|
public void disableRepositorySettings()
{
serverTypes.setDisable(true);
groupField.setDisable(true);
prefixField.setDisable(true);
serverField.setDisable(true);
protocolComboBox.setDisable(true);
uriField.setDisable(true);
if (uriField.isVisible() && uriField.getText().isEmpty()){
uriField.setText(TeamSettings.getURI(readProtocolString(), serverField.getText(), prefixField.getText()));
}
groupLabel.setDisable(true);
prefixLabel.setDisable(true);
serverLabel.setDisable(true);
protocolLabel.setDisable(true);
}
}
top,
use,
map,
class TeamSettingsPanel
. TeamSettingsPanel
. doRequestFocus
. createGridPane
. createPropertiesContainer
. preparePanes
. preparePersonalPane
. prepareLocationPane
. setTextFieldText
. setupContent
. setProviderSettings
. fillProtocolSelections
. readProtocolString
. setUser
. setYourName
. setYourEmail
. setPassword
. setGroup
. setPrefix
. setServer
. setProtocol
. setUseAsDefault
. getSelectedProvider
. getUser
. getPassword
. getGroup
. getPrefix
. getServer
. getProtocolKey
. getUseAsDefault
. getYourName
. getYourEmail
. getSettings
. disableRepositorySettings
613 neLoCode
+ 27 LoComm