package de.pbauerochse.worklogviewer.fx; import de.pbauerochse.worklogviewer.WorklogViewer; import de.pbauerochse.worklogviewer.fx.converter.YouTrackAuthenticationMethodStringConverter; import de.pbauerochse.worklogviewer.util.SettingsUtil; import de.pbauerochse.worklogviewer.youtrack.connector.YouTrackAuthenticationMethod; import javafx.application.Platform; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.*; import javafx.stage.Window; import javafx.stage.WindowEvent; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.MalformedURLException; import java.net.URL; import java.util.ResourceBundle; import static java.time.DayOfWeek.*; /** * @author Patrick Bauerochse * @since 15.04.15 */ public class SettingsViewController implements Initializable { private static final Logger LOGGER = LoggerFactory.getLogger(SettingsViewController.class); private static final String MYJETBRAINS_HOST = "myjetbrains.com"; private static final String MYJETBRAINS_HOSTED_YOUTRACK_PATH = "/youtrack"; @FXML private TextField youtrackUrlField; @FXML private TextField youtrackUsernameField; @FXML private PasswordField youtrackPasswordField; @FXML private ComboBox<Integer> workhoursComboBox; @FXML private CheckBox showAllWorklogsCheckBox; @FXML private CheckBox showStatisticsCheckBox; @FXML private CheckBox loadDataAtStartupCheckBox; @FXML private CheckBox showDecimalsInExcel; @FXML private ComboBox<YouTrackAuthenticationMethod> youtrackAuthenticationMethodField; @FXML private TextField youtrackOAuthHubUrlField; @FXML private TextField youtrackOAuthServiceIdField; @FXML private PasswordField youtrackOAuthServiceSecretField; @FXML private Button saveSettingsButton; @FXML private Button cancelSettingsButton; @FXML private CheckBox mondayCollapseCheckbox; @FXML private CheckBox mondayHighlightCheckbox; @FXML private CheckBox tuesdayCollapseCheckbox; @FXML private CheckBox tuesdayHighlightCheckbox; @FXML private CheckBox wednesdayCollapseCheckbox; @FXML private CheckBox wednesdayHighlightCheckbox; @FXML private CheckBox thursdayCollapseCheckbox; @FXML private CheckBox thursdayHighlightCheckbox; @FXML private CheckBox fridayCollapseCheckbox; @FXML private CheckBox fridayHighlightCheckbox; @FXML private CheckBox saturdayCollapseCheckbox; @FXML private CheckBox saturdayHighlightCheckbox; @FXML private CheckBox sundayCollapseCheckbox; @FXML private CheckBox sundayHighlightCheckbox; private ResourceBundle resourceBundle; @Override public void initialize(URL location, ResourceBundle resources) { LOGGER.debug("Initializing"); this.resourceBundle = resources; SettingsUtil.Settings settings = SettingsUtil.loadSettings(); for (int i = 1; i <= 24; i++) { workhoursComboBox.getItems().add(i); } youtrackAuthenticationMethodField.getItems().addAll(YouTrackAuthenticationMethod.values()); youtrackAuthenticationMethodField.setConverter(new YouTrackAuthenticationMethodStringConverter()); youtrackUrlField.textProperty().addListener((observable, oldValue, newValue) -> { try { youtrackOAuthHubUrlField.setText(getHubUrl(newValue).toExternalForm()); } catch (MalformedURLException e) {} }); // disable oauth fields when api is selected youtrackOAuthHubUrlField.disableProperty().bind(youtrackAuthenticationMethodField.getSelectionModel().selectedItemProperty().isEqualTo(YouTrackAuthenticationMethod.HTTP_API)); youtrackOAuthServiceIdField.disableProperty().bind(youtrackAuthenticationMethodField.getSelectionModel().selectedItemProperty().isEqualTo(YouTrackAuthenticationMethod.HTTP_API)); youtrackOAuthServiceSecretField.disableProperty().bind(youtrackAuthenticationMethodField.getSelectionModel().selectedItemProperty().isEqualTo(YouTrackAuthenticationMethod.HTTP_API)); updateComponentsFromSettings(settings); // youtrackUrlField.textProperty().bindBidirectional(settings.youtrackUrlProperty()); // youtrackUsernameField.textProperty().bindBidirectional(settings.youtrackUsernameProperty()); // youtrackPasswordField.textProperty().bindBidirectional(settings.youtrackPasswordProperty()); // // youtrackOAuthHubUrlField.textProperty().bindBidirectional(settings.youtrackOAuthHubUrlProperty()); // youtrackOAuthServiceIdField.textProperty().bindBidirectional(settings.youtrackOAuthServiceIdProperty()); // youtrackOAuthServiceSecretField.textProperty().bindBidirectional(settings.youtrackOAuthServiceSecretProperty()); // // youtrackAuthenticationMethodField.getSelectionModel().select(settings.youTrackAuthenticationMethodProperty().get()); // youtrackAuthenticationMethodField.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> settings.youTrackAuthenticationMethodProperty().set(newValue)); // // if (youtrackAuthenticationMethodField.getSelectionModel().getSelectedItem() == YouTrackAuthenticationMethod.OAUTH2 && StringUtils.isBlank(youtrackOAuthHubUrlField.getText())) { // try { // youtrackOAuthHubUrlField.setText(getHubUrl(youtrackUrlField.getText()).toExternalForm()); // } catch (MalformedURLException e) {} // } // // showAllWorklogsCheckBox.selectedProperty().bindBidirectional(settings.showAllWorklogsProperty()); // showStatisticsCheckBox.selectedProperty().bindBidirectional(settings.showStatisticsProperty()); // loadDataAtStartupCheckBox.selectedProperty().bindBidirectional(settings.loadDataAtStartupProperty()); // showDecimalsInExcel.selectedProperty().bindBidirectional(settings.showDecimalHourTimesInExcelReportProperty()); // // settings.workHoursADayProperty().bind(workhoursComboBox.getSelectionModel().selectedItemProperty()); // button clicks cancelSettingsButton.setOnAction(event -> { updateComponentsFromSettings(settings); closeSettingsDialogue(); }); saveSettingsButton.setOnAction(event -> { LOGGER.debug("Save settings clicked"); applyToSettings(settings); closeSettingsDialogue(); }); } private void updateComponentsFromSettings(SettingsUtil.Settings settings) { youtrackUrlField.setText(settings.getYoutrackUrl()); if (settings.getYouTrackAuthenticationMethod() != null) { youtrackAuthenticationMethodField.getSelectionModel().select(settings.getYouTrackAuthenticationMethod()); } youtrackUsernameField.setText(settings.getYoutrackUsername()); youtrackPasswordField.setText(settings.getYoutrackPassword()); youtrackOAuthHubUrlField.setText(settings.getYoutrackOAuthHubUrl()); youtrackOAuthServiceIdField.setText(settings.getYoutrackOAuthServiceId()); youtrackOAuthServiceSecretField.setText(settings.getYoutrackOAuthServiceSecret()); workhoursComboBox.getSelectionModel().select((Integer) settings.getWorkHoursADay()); showAllWorklogsCheckBox.setSelected(settings.isShowAllWorklogs()); showStatisticsCheckBox.setSelected(settings.isShowStatistics()); loadDataAtStartupCheckBox.setSelected(settings.isLoadDataAtStartup()); showDecimalsInExcel.setSelected(settings.isShowDecimalHourTimesInExcelReport()); mondayCollapseCheckbox.setSelected(settings.hasCollapseState(MONDAY)); mondayHighlightCheckbox.setSelected(settings.hasHighlightState(MONDAY)); tuesdayCollapseCheckbox.setSelected(settings.hasCollapseState(TUESDAY)); tuesdayHighlightCheckbox.setSelected(settings.hasHighlightState(TUESDAY)); wednesdayCollapseCheckbox.setSelected(settings.hasCollapseState(WEDNESDAY)); wednesdayHighlightCheckbox.setSelected(settings.hasHighlightState(WEDNESDAY)); thursdayCollapseCheckbox.setSelected(settings.hasCollapseState(THURSDAY)); thursdayHighlightCheckbox.setSelected(settings.hasHighlightState(THURSDAY)); fridayCollapseCheckbox.setSelected(settings.hasCollapseState(FRIDAY)); fridayHighlightCheckbox.setSelected(settings.hasHighlightState(FRIDAY)); saturdayCollapseCheckbox.setSelected(settings.hasCollapseState(SATURDAY)); saturdayHighlightCheckbox.setSelected(settings.hasHighlightState(SATURDAY)); sundayCollapseCheckbox.setSelected(settings.hasCollapseState(SUNDAY)); sundayHighlightCheckbox.setSelected(settings.hasHighlightState(SUNDAY)); } private void applyToSettings(SettingsUtil.Settings settings) { settings.setYoutrackUrl(youtrackUrlField.getText()); settings.setYouTrackAuthenticationMethod(youtrackAuthenticationMethodField.getSelectionModel().getSelectedItem()); settings.setYoutrackUsername(youtrackUsernameField.getText()); settings.setYoutrackPassword(youtrackPasswordField.getText()); settings.setYoutrackOAuthHubUrl(youtrackOAuthHubUrlField.getText()); settings.setYoutrackOAuthServiceId(youtrackOAuthServiceIdField.getText()); settings.setYoutrackOAuthServiceSecret(youtrackOAuthServiceSecretField.getText()); settings.setWorkHoursADay(workhoursComboBox.getSelectionModel().getSelectedItem()); settings.setShowAllWorklogs(showAllWorklogsCheckBox.isSelected()); settings.setShowStatistics(showStatisticsCheckBox.isSelected()); settings.setLoadDataAtStartup(loadDataAtStartupCheckBox.isSelected()); settings.setShowDecimalHourTimesInExcelReport(showDecimalsInExcel.isSelected()); settings.setCollapseState(MONDAY, mondayCollapseCheckbox.isSelected()); settings.setCollapseState(TUESDAY, tuesdayCollapseCheckbox.isSelected()); settings.setCollapseState(WEDNESDAY, wednesdayCollapseCheckbox.isSelected()); settings.setCollapseState(THURSDAY, thursdayCollapseCheckbox.isSelected()); settings.setCollapseState(FRIDAY, fridayCollapseCheckbox.isSelected()); settings.setCollapseState(SATURDAY, saturdayCollapseCheckbox.isSelected()); settings.setCollapseState(SUNDAY, sundayCollapseCheckbox.isSelected()); settings.setHighlightState(MONDAY, mondayHighlightCheckbox.isSelected()); settings.setHighlightState(TUESDAY, tuesdayHighlightCheckbox.isSelected()); settings.setHighlightState(WEDNESDAY, wednesdayHighlightCheckbox.isSelected()); settings.setHighlightState(THURSDAY, thursdayHighlightCheckbox.isSelected()); settings.setHighlightState(FRIDAY, fridayHighlightCheckbox.isSelected()); settings.setHighlightState(SATURDAY, saturdayHighlightCheckbox.isSelected()); settings.setHighlightState(SUNDAY, sundayHighlightCheckbox.isSelected()); } @FXML public void showSettingsHelp() { String helpUrl = resourceBundle.getString("view.settings.authentication.help_url"); LOGGER.debug("Opening page {} in browser", helpUrl); Platform.runLater(() -> WorklogViewer.getInstance().getHostServices().showDocument(helpUrl)); } private void closeSettingsDialogue() { LOGGER.debug("Closing settings dialogue"); Window window = saveSettingsButton.getScene().getWindow(); window.fireEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSE_REQUEST)); } private static URL getHubUrl(String baseUrl) throws MalformedURLException { if (StringUtils.isBlank(baseUrl)) { return new URL(""); } StringBuilder sb = new StringBuilder(StringUtils.trim(baseUrl)); while (sb.charAt(sb.length() - 1) == '/') { sb.deleteCharAt(sb.length() - 1); } sb.append("/hub"); boolean seemsToBeJetbrainsHosted = StringUtils.containsIgnoreCase(baseUrl, MYJETBRAINS_HOST); int indexOfYoutrackPath = sb.indexOf(MYJETBRAINS_HOSTED_YOUTRACK_PATH); if (seemsToBeJetbrainsHosted && indexOfYoutrackPath >= 0) { sb.replace(indexOfYoutrackPath, indexOfYoutrackPath + MYJETBRAINS_HOSTED_YOUTRACK_PATH.length(), ""); } return new URL(sb.toString()); } }