diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java index f349f5f2ee3cedcd058324937ff17bee0f65f2fc..f5902dac33366a72afef79270ce67114bc0a3ab6 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/Controller.java @@ -14,6 +14,7 @@ import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import de.deadlocker8.budgetmaster.logic.FilterSettings; +import de.deadlocker8.budgetmaster.logic.ServerType; import de.deadlocker8.budgetmaster.logic.Settings; import de.deadlocker8.budgetmaster.logic.category.CategoryBudget; import de.deadlocker8.budgetmaster.logic.category.CategoryHandler; @@ -112,7 +113,7 @@ public class Controller extends BaseController public Controller(Settings settings) { - this.settings = settings; + this.settings = settings; DATE_FORMAT = DateTimeFormat.forPattern("MMMM yyyy").withLocale(this.settings.getLanguage().getLocale()); load("/de/deadlocker8/budgetmaster/ui/fxml/GUI.fxml", Localization.getBundle()); getStage().show(); @@ -139,6 +140,11 @@ public class Controller extends BaseController System.exit(0); }); + if(settings.getServerType() == null) + { + settings.setServerType(ServerType.ONLINE); + } + currentDate = DateTime.now(); buttonDate.setText(currentDate.toString(DATE_FORMAT)); @@ -186,7 +192,7 @@ public class Controller extends BaseController { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(fileName)); fxmlLoader.setResources(Localization.getBundle()); - Parent nodeTab = (Parent)fxmlLoader.load(); + Parent nodeTab = (Parent)fxmlLoader.load(); tab.setContent(nodeTab); return fxmlLoader.getController(); } @@ -222,8 +228,7 @@ public class Controller extends BaseController } }); - settingsController = loadTab("/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml", tabSettings); - settingsController.init(this); + loadSettingsTab(); } catch(IOException e) { @@ -270,6 +275,31 @@ public class Controller extends BaseController refresh(filterSettings); } } + + public void loadSettingsTab() + { + try + { + if(settings.getServerType().equals(ServerType.ONLINE)) + { + settingsController = loadTab("/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabOnlineServer.fxml", tabSettings); + settingsController.init(this); + } + else + { + settingsController = loadTab("/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml", tabSettings); + settingsController.init(this); + } + + } + catch(IOException e) + { + Logger.error(e); + Platform.runLater(() -> { + AlertGenerator.showAlert(AlertType.ERROR, Localization.getString(Strings.TITLE_ERROR), "", Localization.getString(Strings.ERROR_CREATE_UI), icon, getStage(), null, false); + }); + } + } public Image getIcon() { diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/LocalServerSettingsController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/LocalServerSettingsController.java new file mode 100644 index 0000000000000000000000000000000000000000..1f5350ea3f6da91ae3623395a42e475c3559d42d --- /dev/null +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/LocalServerSettingsController.java @@ -0,0 +1,243 @@ +package de.deadlocker8.budgetmasterclient.ui.controller; + +import java.io.IOException; +import java.util.ArrayList; + +import de.deadlocker8.budgetmaster.logic.ServerType; +import de.deadlocker8.budgetmaster.logic.Settings; +import de.deadlocker8.budgetmaster.logic.updater.Updater; +import de.deadlocker8.budgetmaster.logic.utils.Colors; +import de.deadlocker8.budgetmaster.logic.utils.FileHelper; +import de.deadlocker8.budgetmaster.logic.utils.Helpers; +import de.deadlocker8.budgetmaster.logic.utils.LanguageType; +import de.deadlocker8.budgetmaster.logic.utils.Strings; +import de.deadlocker8.budgetmasterclient.ui.RestartHandler; +import de.deadlocker8.budgetmasterclient.ui.cells.LanguageCell; +import javafx.fxml.FXML; +import javafx.scene.control.Alert.AlertType; +import javafx.scene.control.Button; +import javafx.scene.control.CheckBox; +import javafx.scene.control.ComboBox; +import javafx.scene.control.Label; +import javafx.scene.control.RadioButton; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.control.ToggleButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.HBox; +import logger.Logger; +import tools.AlertGenerator; +import tools.ConvertTo; +import tools.HashUtils; +import tools.Localization; + +public class LocalServerSettingsController extends SettingsController +{ + @FXML private AnchorPane anchorPaneMain; + @FXML private ScrollPane scrollPane; + @FXML private HBox hboxSettings; + @FXML private ToggleButton toggleButtonOnline; + @FXML private ToggleButton toggleButtonLocal; + @FXML private Label labelStatus; + @FXML private Label labelLocalServerStatus; + @FXML private Button buttonLocalServerAction; + @FXML private Label labelClientSecret; + @FXML private TextField textFieldClientSecret; + @FXML private TextField textFieldCurrency; + @FXML private Label labelCurrency; + @FXML private Button buttonSave; + @FXML private Button buttonExportDB; + @FXML private Button buttonImportDB; + @FXML private Button buttonDeleteDB; + @FXML private RadioButton radioButtonRestActivated; + @FXML private RadioButton radioButtonRestDeactivated; + @FXML private ComboBox<LanguageType> comboBoxLanguage; + @FXML private CheckBox checkboxEnableAutoUpdate; + @FXML private Button buttonSearchUpdates; + @FXML private Label labelCurrentVersion; + @FXML private Label labelLatestVersion; + + private LanguageType previousLanguage; + + @Override + public void init(Controller controller) + { + super.controller = controller; + + ToggleGroup toggleGroupServerType = new ToggleGroup(); + toggleButtonOnline.setToggleGroup(toggleGroupServerType); + toggleButtonLocal.setToggleGroup(toggleGroupServerType); + toggleButtonOnline.setOnAction((event)->{ + controller.getSettings().setServerType(ServerType.ONLINE); + controller.loadSettingsTab(); + }); + + textFieldClientSecret.setText("******"); + + comboBoxLanguage.setCellFactory((view) -> { + return new LanguageCell(true); + }); + + comboBoxLanguage.getItems().addAll(LanguageType.values()); + comboBoxLanguage.setButtonCell(new LanguageCell(false)); + comboBoxLanguage.setValue(LanguageType.ENGLISH); + previousLanguage = LanguageType.ENGLISH; + checkboxEnableAutoUpdate.setSelected(true); + + prefill(); + + applyStyle(); + + textFieldCurrency.setPromptText(Localization.getString(Strings.CURRENCY_PLACEHOLDER)); + + ToggleGroup toggleGroup = new ToggleGroup(); + radioButtonRestActivated.setToggleGroup(toggleGroup); + radioButtonRestDeactivated.setToggleGroup(toggleGroup); + + hboxSettings.prefWidthProperty().bind(scrollPane.widthProperty().subtract(25)); + + refreshLabelsUpdate(); + } + + public void prefill() + { + if(controller.getSettings().isRestActivated()) + { + radioButtonRestActivated.setSelected(true); + } + else + { + radioButtonRestDeactivated.setSelected(true); + } + + if(controller.getSettings().getLanguage() != null) + { + LanguageType language = controller.getSettings().getLanguage(); + comboBoxLanguage.setValue(language); + previousLanguage = language; + } + + checkboxEnableAutoUpdate.setSelected(controller.getSettings().isAutoUpdateCheckEnabled()); + } + + @Override + void refreshLabelsUpdate() + { + Updater updater = controller.getUpdater(); + labelCurrentVersion.setText(Localization.getString(Strings.VERSION_NAME)); + labelLatestVersion.setText(updater.getLatestVersion().getVersionName()); + } + + @Override + public void save() + { + String clientSecret = textFieldClientSecret.getText().trim(); + String currency = textFieldCurrency.getText().trim(); + + if(clientSecret == null || clientSecret.equals("")) + { + AlertGenerator.showAlert(AlertType.WARNING, + Localization.getString(Strings.TITLE_WARNING), + "", + Localization.getString(Strings.WARNING_EMPTY_SECRET_CLIENT), + controller.getIcon(), + controller.getStage(), + null, + false); + return; + } + + if(currency == null || currency.equals("")) + { + AlertGenerator.showAlert(AlertType.WARNING, + Localization.getString(Strings.TITLE_WARNING), + "", + Localization.getString(Strings.WARNING_EMPTY_CURRENCY), + controller.getIcon(), + controller.getStage(), + null, + false); + return; + } + + //TODO + if(controller.getSettings().isComplete()) + { + if(!clientSecret.equals("******")) + { + controller.getSettings().setClientSecret(HashUtils.hash(clientSecret, Helpers.SALT)); + } + + controller.getSettings().setCurrency(currency); + controller.getSettings().setRestActivated(radioButtonRestActivated.isSelected()); + controller.getSettings().setLanguage(comboBoxLanguage.getValue()); + controller.getSettings().setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected()); + } + else + { + Settings settings = new Settings(); + + if(!clientSecret.equals("******")) + { + settings.setClientSecret(HashUtils.hash(clientSecret, Helpers.SALT)); + } + else + { + settings.setClientSecret(controller.getSettings().getClientSecret()); + } + + settings.setCurrency(currency); + settings.setRestActivated(radioButtonRestActivated.isSelected()); + settings.setLanguage(comboBoxLanguage.getValue()); + settings.setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected()); + controller.setSettings(settings); + } + + controller.getSettings().setSecret(HashUtils.hash("BudgetMaster", Helpers.SALT)); + controller.getSettings().setUrl("localhost:9000"); + ArrayList<String> trustedHosts = new ArrayList<>(); + trustedHosts.add("localhost"); + controller.getSettings().setTrustedHosts(trustedHosts); + + try + { + FileHelper.saveSettings(controller.getSettings()); + } + catch(IOException e) + { + Logger.error(e); + AlertGenerator.showAlert(AlertType.ERROR, + Localization.getString(Strings.TITLE_ERROR), + "", + Localization.getString(Strings.ERROR_SETTINGS_SAVE), + controller.getIcon(), + controller.getStage(), + null, + false); + } + + textFieldClientSecret.setText("******"); + + RestartHandler restartHandler = new RestartHandler(controller); + restartHandler.handleRestart(previousLanguage); + refreshLabelsUpdate(); + } + + @Override + public void applyStyle() + { + anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND)); + scrollPane.setStyle("-fx-background-color: transparent"); + labelClientSecret.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); + labelStatus.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); + labelCurrency.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); + toggleButtonOnline.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14; -fx-background-radius: 3 0 0 3"); + toggleButtonLocal.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_DARK_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14; -fx-background-radius: 0 3 3 0; -fx-effect: innershadow(gaussian, rgba(0,0,0,0.7), 10,0,0,0);"); + buttonSave.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;"); + buttonExportDB.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); + buttonImportDB.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); + buttonDeleteDB.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_RED) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); + buttonSearchUpdates.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); + } +} \ No newline at end of file diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/OnlineServerSettingsController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/OnlineServerSettingsController.java new file mode 100644 index 0000000000000000000000000000000000000000..5d6f616d3933f49b674b34982b12c98068b4a12a --- /dev/null +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/OnlineServerSettingsController.java @@ -0,0 +1,326 @@ +package de.deadlocker8.budgetmasterclient.ui.controller; + +import java.io.IOException; +import java.util.ArrayList; + +import de.deadlocker8.budgetmaster.logic.ServerType; +import de.deadlocker8.budgetmaster.logic.Settings; +import de.deadlocker8.budgetmaster.logic.updater.Updater; +import de.deadlocker8.budgetmaster.logic.utils.Colors; +import de.deadlocker8.budgetmaster.logic.utils.FileHelper; +import de.deadlocker8.budgetmaster.logic.utils.Helpers; +import de.deadlocker8.budgetmaster.logic.utils.LanguageType; +import de.deadlocker8.budgetmaster.logic.utils.Strings; +import de.deadlocker8.budgetmasterclient.ui.RestartHandler; +import de.deadlocker8.budgetmasterclient.ui.cells.LanguageCell; +import javafx.fxml.FXML; +import javafx.scene.control.Alert.AlertType; +import javafx.scene.control.Button; +import javafx.scene.control.CheckBox; +import javafx.scene.control.ComboBox; +import javafx.scene.control.Label; +import javafx.scene.control.RadioButton; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextArea; +import javafx.scene.control.TextField; +import javafx.scene.control.ToggleButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.HBox; +import logger.Logger; +import tools.AlertGenerator; +import tools.ConvertTo; +import tools.HashUtils; +import tools.Localization; + +public class OnlineServerSettingsController extends SettingsController +{ + @FXML private AnchorPane anchorPaneMain; + @FXML private ScrollPane scrollPane; + @FXML private HBox hboxSettings; + @FXML private ToggleButton toggleButtonOnline; + @FXML private ToggleButton toggleButtonLocal; + @FXML private Label labelClientSecret; + @FXML private TextField textFieldClientSecret; + @FXML private TextField textFieldURL; + @FXML private Label labelURL; + @FXML private TextField textFieldSecret; + @FXML private Label labelSecret; + @FXML private TextField textFieldCurrency; + @FXML private Label labelCurrency; + @FXML private Button buttonSave; + @FXML private Button buttonExportDB; + @FXML private Button buttonImportDB; + @FXML private Button buttonDeleteDB; + @FXML private RadioButton radioButtonRestActivated; + @FXML private RadioButton radioButtonRestDeactivated; + @FXML private TextArea textAreaTrustedHosts; + @FXML private ComboBox<LanguageType> comboBoxLanguage; + @FXML private CheckBox checkboxEnableAutoUpdate; + @FXML private Button buttonSearchUpdates; + @FXML private Label labelCurrentVersion; + @FXML private Label labelLatestVersion; + + private LanguageType previousLanguage; + + @Override + public void init(Controller controller) + { + super.controller = controller; + + ToggleGroup toggleGroupServerType = new ToggleGroup(); + toggleButtonOnline.setToggleGroup(toggleGroupServerType); + toggleButtonLocal.setToggleGroup(toggleGroupServerType); + toggleButtonLocal.setOnAction((event)->{ + controller.getSettings().setServerType(ServerType.LOCAL); + controller.loadSettingsTab(); + }); + + textFieldClientSecret.setText("******"); + + comboBoxLanguage.setCellFactory((view) -> { + return new LanguageCell(true); + }); + + comboBoxLanguage.getItems().addAll(LanguageType.values()); + comboBoxLanguage.setButtonCell(new LanguageCell(false)); + comboBoxLanguage.setValue(LanguageType.ENGLISH); + previousLanguage = LanguageType.ENGLISH; + checkboxEnableAutoUpdate.setSelected(true); + + prefill(); + + applyStyle(); + + textFieldURL.setPromptText(Localization.getString(Strings.URL_PLACEHOLDER)); + textFieldCurrency.setPromptText(Localization.getString(Strings.CURRENCY_PLACEHOLDER)); + textAreaTrustedHosts.setPromptText(Localization.getString(Strings.TRUSTED_HOSTS_PLACEHOLDER)); + + ToggleGroup toggleGroup = new ToggleGroup(); + radioButtonRestActivated.setToggleGroup(toggleGroup); + radioButtonRestDeactivated.setToggleGroup(toggleGroup); + + hboxSettings.prefWidthProperty().bind(scrollPane.widthProperty().subtract(25)); + + refreshLabelsUpdate(); + } + + @Override + public void prefill() + { + if(controller.getSettings().isComplete()) + { + textFieldURL.setText(controller.getSettings().getUrl()); + textFieldSecret.setText("******"); + textFieldCurrency.setText(controller.getSettings().getCurrency()); + } + + if(controller.getSettings().isRestActivated()) + { + radioButtonRestActivated.setSelected(true); + } + else + { + radioButtonRestDeactivated.setSelected(true); + } + setTextAreaTrustedHosts(controller.getSettings().getTrustedHosts()); + if(controller.getSettings().getLanguage() != null) + { + LanguageType language = controller.getSettings().getLanguage(); + comboBoxLanguage.setValue(language); + previousLanguage = language; + } + + checkboxEnableAutoUpdate.setSelected(controller.getSettings().isAutoUpdateCheckEnabled()); + } + + @Override + void refreshLabelsUpdate() + { + Updater updater = controller.getUpdater(); + labelCurrentVersion.setText(Localization.getString(Strings.VERSION_NAME)); + labelLatestVersion.setText(updater.getLatestVersion().getVersionName()); + } + + private void setTextAreaTrustedHosts(ArrayList<String> trustedHosts) + { + StringBuilder trustedHostsString = new StringBuilder(); + if(trustedHosts != null) + { + for(String currentHost : trustedHosts) + { + trustedHostsString.append(currentHost); + trustedHostsString.append("\n"); + } + textAreaTrustedHosts.setText(trustedHostsString.toString()); + } + else + { + textAreaTrustedHosts.setText(""); + } + } + + @Override + public void save() + { + String clientSecret = textFieldClientSecret.getText().trim(); + String url = textFieldURL.getText().trim(); + String secret = textFieldSecret.getText().trim(); + String currency = textFieldCurrency.getText().trim(); + + if(clientSecret == null || clientSecret.equals("")) + { + AlertGenerator.showAlert(AlertType.WARNING, + Localization.getString(Strings.TITLE_WARNING), + "", + Localization.getString(Strings.WARNING_EMPTY_SECRET_CLIENT), + controller.getIcon(), + controller.getStage(), + null, + false); + return; + } + + if(url == null || url.equals("")) + { + AlertGenerator.showAlert(AlertType.WARNING, + Localization.getString(Strings.TITLE_WARNING), + "", + Localization.getString(Strings.WARNING_EMPTY_URL), + controller.getIcon(), + controller.getStage(), + null, + false); + return; + } + + if(secret == null || secret.equals("")) + { + AlertGenerator.showAlert(AlertType.WARNING, + Localization.getString(Strings.TITLE_WARNING), + "", + Localization.getString(Strings.WARNING_EMPTY_SECRET_SERVER), + controller.getIcon(), + controller.getStage(), + null, + false); + return; + } + + if(currency == null || currency.equals("")) + { + AlertGenerator.showAlert(AlertType.WARNING, + Localization.getString(Strings.TITLE_WARNING), + "", + Localization.getString(Strings.WARNING_EMPTY_CURRENCY), + controller.getIcon(), + controller.getStage(), + null, + false); + return; + } + + ArrayList<String> trustedHosts = new ArrayList<>(); + String trustedHostText = textAreaTrustedHosts.getText(); + String[] trustedHostsArray = trustedHostText.split("\n"); + for(String currentHost : trustedHostsArray) + { + currentHost = currentHost.trim(); + if(!currentHost.equals("")) + { + trustedHosts.add(currentHost); + } + } + setTextAreaTrustedHosts(trustedHosts); + + if(controller.getSettings().isComplete()) + { + if(!clientSecret.equals("******")) + { + controller.getSettings().setClientSecret(HashUtils.hash(clientSecret, Helpers.SALT)); + } + + if(!secret.equals("******")) + { + controller.getSettings().setSecret(HashUtils.hash(secret, Helpers.SALT)); + } + controller.getSettings().setUrl(url); + controller.getSettings().setCurrency(currency); + controller.getSettings().setRestActivated(radioButtonRestActivated.isSelected()); + controller.getSettings().setTrustedHosts(trustedHosts); + controller.getSettings().setLanguage(comboBoxLanguage.getValue()); + controller.getSettings().setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected()); + } + else + { + Settings settings = new Settings(); + + if(!clientSecret.equals("******")) + { + settings.setClientSecret(HashUtils.hash(clientSecret, Helpers.SALT)); + } + else + { + settings.setClientSecret(controller.getSettings().getClientSecret()); + } + + if(!secret.equals("******")) + { + settings.setSecret(HashUtils.hash(secret, Helpers.SALT)); + } + else + { + settings.setSecret(controller.getSettings().getSecret()); + } + settings.setUrl(url); + settings.setCurrency(currency); + settings.setRestActivated(radioButtonRestActivated.isSelected()); + settings.setTrustedHosts(trustedHosts); + settings.setLanguage(comboBoxLanguage.getValue()); + settings.setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected()); + controller.setSettings(settings); + } + + try + { + FileHelper.saveSettings(controller.getSettings()); + } + catch(IOException e) + { + Logger.error(e); + AlertGenerator.showAlert(AlertType.ERROR, + Localization.getString(Strings.TITLE_ERROR), + "", + Localization.getString(Strings.ERROR_SETTINGS_SAVE), + controller.getIcon(), + controller.getStage(), + null, + false); + } + + textFieldClientSecret.setText("******"); + textFieldSecret.setText("******"); + + RestartHandler restartHandler = new RestartHandler(controller); + restartHandler.handleRestart(previousLanguage); + refreshLabelsUpdate(); + } + + @Override + public void applyStyle() + { + anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND)); + scrollPane.setStyle("-fx-background-color: transparent"); + toggleButtonOnline.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_DARK_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14; -fx-background-radius: 3 0 0 3; -fx-effect: innershadow(gaussian, rgba(0,0,0,0.7), 10,0,0,0);"); + toggleButtonLocal.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14; -fx-background-radius: 0 3 3 0"); + labelClientSecret.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); + labelSecret.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); + labelURL.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); + labelCurrency.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); + buttonSave.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;"); + buttonExportDB.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); + buttonImportDB.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); + buttonDeleteDB.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_RED) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); + buttonSearchUpdates.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); + } +} \ No newline at end of file diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SettingsController.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SettingsController.java index 21f167626ab2dd40171ea4d0d3f645801d66bdc5..05bedc47da525e437bea018333322e7dfbe05003 100644 --- a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SettingsController.java +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/ui/controller/SettingsController.java @@ -1,578 +1,43 @@ package de.deadlocker8.budgetmasterclient.ui.controller; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Optional; - -import de.deadlocker8.budgetmaster.logic.Settings; -import de.deadlocker8.budgetmaster.logic.database.Database; -import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler; -import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection; -import de.deadlocker8.budgetmaster.logic.updater.Updater; -import de.deadlocker8.budgetmaster.logic.utils.Colors; -import de.deadlocker8.budgetmaster.logic.utils.FileHelper; -import de.deadlocker8.budgetmaster.logic.utils.Helpers; -import de.deadlocker8.budgetmaster.logic.utils.LanguageType; -import de.deadlocker8.budgetmaster.logic.utils.Strings; -import de.deadlocker8.budgetmasterclient.ui.RestartHandler; import de.deadlocker8.budgetmasterclient.ui.Styleable; -import de.deadlocker8.budgetmasterclient.ui.cells.LanguageCell; -import de.deadlocker8.budgetmasterclient.utils.UIHelpers; -import javafx.application.Platform; -import javafx.fxml.FXML; -import javafx.scene.control.Alert; -import javafx.scene.control.Alert.AlertType; -import javafx.scene.control.Button; -import javafx.scene.control.ButtonBar.ButtonData; -import javafx.scene.control.ButtonType; -import javafx.scene.control.CheckBox; -import javafx.scene.control.ComboBox; -import javafx.scene.control.DialogPane; -import javafx.scene.control.Label; -import javafx.scene.control.RadioButton; -import javafx.scene.control.ScrollPane; -import javafx.scene.control.TextArea; -import javafx.scene.control.TextField; -import javafx.scene.control.TextInputDialog; -import javafx.scene.control.ToggleGroup; -import javafx.scene.input.KeyCode; -import javafx.scene.input.KeyEvent; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.HBox; -import javafx.stage.FileChooser; -import javafx.stage.Stage; -import logger.Logger; -import tools.AlertGenerator; -import tools.BASE58Type; -import tools.ConvertTo; -import tools.HashUtils; -import tools.Localization; -import tools.RandomCreations; -import tools.Worker; +import de.deadlocker8.budgetmasterclient.utils.DatabaseDeleter; +import de.deadlocker8.budgetmasterclient.utils.DatabaseExporter; +import de.deadlocker8.budgetmasterclient.utils.DatabaseImporter; -public class SettingsController implements Styleable +public abstract class SettingsController implements Styleable { - @FXML private AnchorPane anchorPaneMain; - @FXML private ScrollPane scrollPane; - @FXML private HBox hboxSettings; - @FXML private Label labelClientSecret; - @FXML private TextField textFieldClientSecret; - @FXML private TextField textFieldURL; - @FXML private Label labelURL; - @FXML private TextField textFieldSecret; - @FXML private Label labelSecret; - @FXML private TextField textFieldCurrency; - @FXML private Label labelCurrency; - @FXML private Button buttonSave; - @FXML private Button buttonExportDB; - @FXML private Button buttonImportDB; - @FXML private Button buttonDeleteDB; - @FXML private RadioButton radioButtonRestActivated; - @FXML private RadioButton radioButtonRestDeactivated; - @FXML private TextArea textAreaTrustedHosts; - @FXML private ComboBox<LanguageType> comboBoxLanguage; - @FXML private CheckBox checkboxEnableAutoUpdate; - @FXML private Button buttonSearchUpdates; - @FXML private Label labelCurrentVersion; - @FXML private Label labelLatestVersion; - - private Controller controller; - private LanguageType previousLanguage; - - public void init(Controller controller) - { - this.controller = controller; - - textFieldClientSecret.setText("******"); - - comboBoxLanguage.setCellFactory((view) -> { - return new LanguageCell(true); - }); - - comboBoxLanguage.getItems().addAll(LanguageType.values()); - comboBoxLanguage.setButtonCell(new LanguageCell(false)); - comboBoxLanguage.setValue(LanguageType.ENGLISH); - previousLanguage = LanguageType.ENGLISH; - checkboxEnableAutoUpdate.setSelected(true); - - prefill(); - - applyStyle(); - - textFieldURL.setPromptText(Localization.getString(Strings.URL_PLACEHOLDER)); - textFieldCurrency.setPromptText(Localization.getString(Strings.CURRENCY_PLACEHOLDER)); - textAreaTrustedHosts.setPromptText(Localization.getString(Strings.TRUSTED_HOSTS_PLACEHOLDER)); + Controller controller; - ToggleGroup toggleGroup = new ToggleGroup(); - radioButtonRestActivated.setToggleGroup(toggleGroup); - radioButtonRestDeactivated.setToggleGroup(toggleGroup); - - hboxSettings.prefWidthProperty().bind(scrollPane.widthProperty().subtract(25)); - - refreshLabelsUpdate(); - } + public abstract void init(Controller controller); - public void prefill() - { - if(controller.getSettings().isComplete()) - { - textFieldURL.setText(controller.getSettings().getUrl()); - textFieldSecret.setText("******"); - textFieldCurrency.setText(controller.getSettings().getCurrency()); - } - - if(controller.getSettings().isRestActivated()) - { - radioButtonRestActivated.setSelected(true); - } - else - { - radioButtonRestDeactivated.setSelected(true); - } - setTextAreaTrustedHosts(controller.getSettings().getTrustedHosts()); - if(controller.getSettings().getLanguage() != null) - { - LanguageType language = controller.getSettings().getLanguage(); - comboBoxLanguage.setValue(language); - previousLanguage = language; - } - - checkboxEnableAutoUpdate.setSelected(controller.getSettings().isAutoUpdateCheckEnabled()); - } + public abstract void prefill(); - private void refreshLabelsUpdate() - { - Updater updater = controller.getUpdater(); - labelCurrentVersion.setText(Localization.getString(Strings.VERSION_NAME)); - labelLatestVersion.setText(updater.getLatestVersion().getVersionName()); - } - - private void setTextAreaTrustedHosts(ArrayList<String> trustedHosts) - { - StringBuilder trustedHostsString = new StringBuilder(); - if(trustedHosts != null) - { - for(String currentHost : trustedHosts) - { - trustedHostsString.append(currentHost); - trustedHostsString.append("\n"); - } - textAreaTrustedHosts.setText(trustedHostsString.toString()); - } - else - { - textAreaTrustedHosts.setText(""); - } - } - - public void save() - { - String clientSecret = textFieldClientSecret.getText().trim(); - String url = textFieldURL.getText().trim(); - String secret = textFieldSecret.getText().trim(); - String currency = textFieldCurrency.getText().trim(); - - if(clientSecret == null || clientSecret.equals("")) - { - AlertGenerator.showAlert(AlertType.WARNING, - Localization.getString(Strings.TITLE_WARNING), - "", - Localization.getString(Strings.WARNING_EMPTY_SECRET_CLIENT), - controller.getIcon(), - controller.getStage(), - null, - false); - return; - } - - if(url == null || url.equals("")) - { - AlertGenerator.showAlert(AlertType.WARNING, - Localization.getString(Strings.TITLE_WARNING), - "", - Localization.getString(Strings.WARNING_EMPTY_URL), - controller.getIcon(), - controller.getStage(), - null, - false); - return; - } - - if(secret == null || secret.equals("")) - { - AlertGenerator.showAlert(AlertType.WARNING, - Localization.getString(Strings.TITLE_WARNING), - "", - Localization.getString(Strings.WARNING_EMPTY_SECRET_SERVER), - controller.getIcon(), - controller.getStage(), - null, - false); - return; - } - - if(currency == null || currency.equals("")) - { - AlertGenerator.showAlert(AlertType.WARNING, - Localization.getString(Strings.TITLE_WARNING), - "", - Localization.getString(Strings.WARNING_EMPTY_CURRENCY), - controller.getIcon(), - controller.getStage(), - null, - false); - return; - } - - ArrayList<String> trustedHosts = new ArrayList<>(); - String trustedHostText = textAreaTrustedHosts.getText(); - String[] trustedHostsArray = trustedHostText.split("\n"); - for(String currentHost : trustedHostsArray) - { - currentHost = currentHost.trim(); - if(!currentHost.equals("")) - { - trustedHosts.add(currentHost); - } - } - setTextAreaTrustedHosts(trustedHosts); - - if(controller.getSettings().isComplete()) - { - if(!clientSecret.equals("******")) - { - controller.getSettings().setClientSecret(HashUtils.hash(clientSecret, Helpers.SALT)); - } - - if(!secret.equals("******")) - { - controller.getSettings().setSecret(HashUtils.hash(secret, Helpers.SALT)); - } - controller.getSettings().setUrl(url); - controller.getSettings().setCurrency(currency); - controller.getSettings().setRestActivated(radioButtonRestActivated.isSelected()); - controller.getSettings().setTrustedHosts(trustedHosts); - controller.getSettings().setLanguage(comboBoxLanguage.getValue()); - controller.getSettings().setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected()); - } - else - { - Settings settings = new Settings(); - - if(!clientSecret.equals("******")) - { - settings.setClientSecret(HashUtils.hash(clientSecret, Helpers.SALT)); - } - else - { - settings.setClientSecret(controller.getSettings().getClientSecret()); - } - - if(!secret.equals("******")) - { - settings.setSecret(HashUtils.hash(secret, Helpers.SALT)); - } - else - { - settings.setSecret(controller.getSettings().getSecret()); - } - settings.setUrl(url); - settings.setCurrency(currency); - settings.setRestActivated(radioButtonRestActivated.isSelected()); - settings.setTrustedHosts(trustedHosts); - settings.setLanguage(comboBoxLanguage.getValue()); - settings.setAutoUpdateCheckEnabled(checkboxEnableAutoUpdate.isSelected()); - controller.setSettings(settings); - } - - try - { - FileHelper.saveSettings(controller.getSettings()); - } - catch(IOException e) - { - Logger.error(e); - AlertGenerator.showAlert(AlertType.ERROR, - Localization.getString(Strings.TITLE_ERROR), - "", - Localization.getString(Strings.ERROR_SETTINGS_SAVE), - controller.getIcon(), - controller.getStage(), - null, - false); - } + abstract void refreshLabelsUpdate(); - textFieldClientSecret.setText("******"); - textFieldSecret.setText("******"); - - RestartHandler restartHandler = new RestartHandler(controller); - restartHandler.handleRestart(previousLanguage); - refreshLabelsUpdate(); - } + public abstract void save(); public void exportDB() { - FileChooser fileChooser = new FileChooser(); - fileChooser.setTitle(Localization.getString(Strings.TITLE_DATABASE_EXPORT)); - FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("JSON (*.json)", "*.json"); - fileChooser.getExtensionFilters().add(extFilter); - File file = fileChooser.showSaveDialog(controller.getStage()); - if(file != null) - { - Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_EXPORT), controller.getStage(), controller.getIcon()); - - Worker.runLater(() -> { - try - { - ServerConnection connection = new ServerConnection(controller.getSettings()); - String databaseJSON = connection.exportDatabase(); - FileHelper.saveDatabaseJSON(file, databaseJSON); - - Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } - AlertGenerator.showAlert(AlertType.INFORMATION, - Localization.getString(Strings.INFO_TITLE_DATABASE_EXPORT), - "", - Localization.getString(Strings.INFO_TEXT_DATABASE_EXPORT), - controller.getIcon(), - controller.getStage(), - null, - false); - }); - } - catch(Exception e) - { - Logger.error(e); - Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } - controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); - }); - } - }); - } - } - - private void importDatabase() - { - FileChooser fileChooser = new FileChooser(); - fileChooser.setTitle(Localization.getString(Strings.TITLE_DATABASE_IMPORT)); - FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("JSON (*.json)", "*.json"); - fileChooser.getExtensionFilters().add(extFilter); - File file = fileChooser.showOpenDialog(controller.getStage()); - if(file != null) - { - Database database; - try - { - database = FileHelper.loadDatabaseJSON(file); - if(database.getCategories() == null - || database.getNormalPayments() == null - || database.getRepeatingPayments() == null - || database.getTags() == null - || database.getTagMatches() == null) - { - AlertGenerator.showAlert(AlertType.ERROR, - Localization.getString(Strings.TITLE_ERROR), - "", - Localization.getString(Strings.ERROR_DATABASE_IMPORT_WRONG_FILE), - controller.getIcon(), - controller.getStage(), - null, - false); - return; - } - } - catch(IOException e1) - { - Logger.error(e1); - AlertGenerator.showAlert(AlertType.ERROR, - Localization.getString(Strings.TITLE_ERROR), - "", - Localization.getString(Strings.ERROR_DATABASE_IMPORT), - controller.getIcon(), - controller.getStage(), - null, - false); - return; - } - - Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_IMPORT), controller.getStage(), controller.getIcon()); - - Worker.runLater(() -> { - try - { - ServerConnection connection = new ServerConnection(controller.getSettings()); - connection.importDatabase(database); - - Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } - - AlertGenerator.showAlert(AlertType.INFORMATION, - Localization.getString(Strings.INFO_TITLE_DATABASE_IMPORT), - "", - Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT), - controller.getIcon(), - controller.getStage(), - null, - false); - - controller.refresh(controller.getFilterSettings()); - }); - } - catch(Exception e) - { - Logger.error(e); - Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } - controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); - }); - } - }); - } - else - { - controller.refresh(controller.getFilterSettings()); - } + DatabaseExporter exporter = new DatabaseExporter(controller); + exporter.exportDatabase(); } public void importDB() { - Alert alert = new Alert(AlertType.CONFIRMATION); - alert.setTitle(Localization.getString(Strings.INFO_TITLE_DATABASE_IMPORT_DIALOG)); - alert.setHeaderText(""); - alert.setContentText(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG)); - Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow(); - dialogStage.getIcons().add(controller.getIcon()); - dialogStage.initOwner(controller.getStage()); - - ButtonType buttonTypeDelete = new ButtonType(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG_DELETE)); - ButtonType buttonTypeAppend = new ButtonType(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG_APPEND)); - ButtonType buttonTypeCancel = new ButtonType(Localization.getString(Strings.CANCEL), ButtonData.CANCEL_CLOSE); - alert.getButtonTypes().setAll(buttonTypeDelete, buttonTypeAppend, buttonTypeCancel); - - DialogPane dialogPane = alert.getDialogPane(); - dialogPane.getButtonTypes().stream().map(dialogPane::lookupButton).forEach(button -> button.addEventHandler(KeyEvent.KEY_PRESSED, (event) -> { - if(KeyCode.ENTER.equals(event.getCode()) && event.getTarget() instanceof Button) - { - ((Button)event.getTarget()).fire(); - } - })); - - Optional<ButtonType> result = alert.showAndWait(); - if(result.get() == buttonTypeDelete) - { - deleteDatabase(true); - } - else if(result.get() == buttonTypeAppend) - { - importDatabase(); - } + DatabaseImporter importer = new DatabaseImporter(controller); + importer.importDatabase(); } public void deleteDB() { - deleteDatabase(false); + DatabaseDeleter deleter = new DatabaseDeleter(controller); + deleter.deleteDatabase(false); } - public void deleteDatabase(boolean importPending) - { - String verificationCode = ConvertTo.toBase58(RandomCreations.generateRandomMixedCaseString(4, true), true, BASE58Type.UPPER); - - TextInputDialog dialog = new TextInputDialog(); - dialog.setTitle(Localization.getString(Strings.INFO_TITLE_DATABASE_DELETE)); - dialog.setHeaderText(Localization.getString(Strings.INFO_HEADER_TEXT_DATABASE_DELETE)); - dialog.setContentText(Localization.getString(Strings.INFO_TEXT_DATABASE_DELETE, verificationCode)); - Stage dialogStage = (Stage)dialog.getDialogPane().getScene().getWindow(); - dialogStage.getIcons().add(controller.getIcon()); - dialogStage.initOwner(controller.getStage()); - - Optional<String> result = dialog.showAndWait(); - if(result.isPresent()) - { - if(result.get().equals(verificationCode)) - { - Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_DELETE), controller.getStage(), controller.getIcon()); - - Worker.runLater(() -> { - try - { - ServerConnection connection = new ServerConnection(controller.getSettings()); - connection.deleteDatabase(); - Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - if(importPending) - { - importDatabase(); - } - else - { - controller.refresh(controller.getFilterSettings()); - } - } - }); - } - catch(Exception e) - { - Logger.error(e); - Platform.runLater(() -> { - if(modalStage != null) - { - modalStage.close(); - } - controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); - }); - } - }); - } - else - { - AlertGenerator.showAlert(AlertType.WARNING, - Localization.getString(Strings.TITLE_WARNING), - "", - Localization.getString(Strings.WARNING_WRONG_VERIFICATION_CODE), - controller.getIcon(), - controller.getStage(), - null, - false); - deleteDatabase(importPending); - } - } - } - public void checkForUpdates() { controller.checkForUpdates(true); refreshLabelsUpdate(); } - - @Override - public void applyStyle() - { - anchorPaneMain.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND)); - scrollPane.setStyle("-fx-background-color: transparent"); - labelClientSecret.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); - labelSecret.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); - labelURL.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); - labelCurrency.setStyle("-fx-text-fill: " + ConvertTo.toRGBHexWithoutOpacity(Colors.TEXT)); - buttonSave.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;"); - buttonExportDB.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); - buttonImportDB.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); - buttonDeleteDB.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_RED) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); - buttonSearchUpdates.setStyle("-fx-background-color: " + ConvertTo.toRGBHexWithoutOpacity(Colors.BACKGROUND_BUTTON_BLUE) + "; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 14;"); - } } \ No newline at end of file diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java new file mode 100644 index 0000000000000000000000000000000000000000..b750a8bf09a5f29f61907fe00da10f0fbee5c48e --- /dev/null +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseDeleter.java @@ -0,0 +1,97 @@ +package de.deadlocker8.budgetmasterclient.utils; + +import java.util.Optional; + +import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler; +import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection; +import de.deadlocker8.budgetmaster.logic.utils.Strings; +import de.deadlocker8.budgetmasterclient.ui.controller.Controller; +import javafx.application.Platform; +import javafx.scene.control.Alert.AlertType; +import javafx.scene.control.TextInputDialog; +import javafx.stage.Stage; +import logger.Logger; +import tools.AlertGenerator; +import tools.BASE58Type; +import tools.ConvertTo; +import tools.Localization; +import tools.RandomCreations; +import tools.Worker; + +public class DatabaseDeleter +{ + private Controller controller; + + public DatabaseDeleter(Controller controller) + { + this.controller = controller; + } + + public void deleteDatabase(boolean importPending) + { + String verificationCode = ConvertTo.toBase58(RandomCreations.generateRandomMixedCaseString(4, true), true, BASE58Type.UPPER); + + TextInputDialog dialog = new TextInputDialog(); + dialog.setTitle(Localization.getString(Strings.INFO_TITLE_DATABASE_DELETE)); + dialog.setHeaderText(Localization.getString(Strings.INFO_HEADER_TEXT_DATABASE_DELETE)); + dialog.setContentText(Localization.getString(Strings.INFO_TEXT_DATABASE_DELETE, verificationCode)); + Stage dialogStage = (Stage)dialog.getDialogPane().getScene().getWindow(); + dialogStage.getIcons().add(controller.getIcon()); + dialogStage.initOwner(controller.getStage()); + + Optional<String> result = dialog.showAndWait(); + if(result.isPresent()) + { + if(result.get().equals(verificationCode)) + { + Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_DELETE), controller.getStage(), controller.getIcon()); + + Worker.runLater(() -> { + try + { + ServerConnection connection = new ServerConnection(controller.getSettings()); + connection.deleteDatabase(); + Platform.runLater(() -> { + if(modalStage != null) + { + modalStage.close(); + if(importPending) + { + DatabaseImporter importer = new DatabaseImporter(controller); + importer.importDatabase(); + } + else + { + controller.refresh(controller.getFilterSettings()); + } + } + }); + } + catch(Exception e) + { + Logger.error(e); + Platform.runLater(() -> { + if(modalStage != null) + { + modalStage.close(); + } + controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); + }); + } + }); + } + else + { + AlertGenerator.showAlert(AlertType.WARNING, + Localization.getString(Strings.TITLE_WARNING), + "", + Localization.getString(Strings.WARNING_WRONG_VERIFICATION_CODE), + controller.getIcon(), + controller.getStage(), + null, + false); + deleteDatabase(importPending); + } + } + } +} \ No newline at end of file diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseExporter.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseExporter.java new file mode 100644 index 0000000000000000000000000000000000000000..43ebbd852b68b0bf033de21d0633db13a707a02e --- /dev/null +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseExporter.java @@ -0,0 +1,77 @@ +package de.deadlocker8.budgetmasterclient.utils; + +import java.io.File; + +import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler; +import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection; +import de.deadlocker8.budgetmaster.logic.utils.FileHelper; +import de.deadlocker8.budgetmaster.logic.utils.Strings; +import de.deadlocker8.budgetmasterclient.ui.controller.Controller; +import de.deadlocker8.budgetmasterclient.utils.UIHelpers; +import javafx.application.Platform; +import javafx.scene.control.Alert.AlertType; +import javafx.stage.FileChooser; +import javafx.stage.Stage; +import logger.Logger; +import tools.AlertGenerator; +import tools.Localization; +import tools.Worker; + +public class DatabaseExporter +{ + private Controller controller; + + public DatabaseExporter(Controller controller) + { + this.controller = controller; + } + + public void exportDatabase() + { + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle(Localization.getString(Strings.TITLE_DATABASE_EXPORT)); + FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("JSON (*.json)", "*.json"); + fileChooser.getExtensionFilters().add(extFilter); + File file = fileChooser.showSaveDialog(controller.getStage()); + if(file != null) + { + Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_EXPORT), controller.getStage(), controller.getIcon()); + + Worker.runLater(() -> { + try + { + ServerConnection connection = new ServerConnection(controller.getSettings()); + String databaseJSON = connection.exportDatabase(); + FileHelper.saveDatabaseJSON(file, databaseJSON); + + Platform.runLater(() -> { + if(modalStage != null) + { + modalStage.close(); + } + AlertGenerator.showAlert(AlertType.INFORMATION, + Localization.getString(Strings.INFO_TITLE_DATABASE_EXPORT), + "", + Localization.getString(Strings.INFO_TEXT_DATABASE_EXPORT), + controller.getIcon(), + controller.getStage(), + null, + false); + }); + } + catch(Exception e) + { + Logger.error(e); + Platform.runLater(() -> { + if(modalStage != null) + { + modalStage.close(); + } + controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); + }); + } + }); + } + + } +} \ No newline at end of file diff --git a/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseImporter.java b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseImporter.java new file mode 100644 index 0000000000000000000000000000000000000000..1213adb50e9fba4bc99c8afc311ac54282192763 --- /dev/null +++ b/BudgetMasterClient/src/main/java/de/deadlocker8/budgetmasterclient/utils/DatabaseImporter.java @@ -0,0 +1,162 @@ +package de.deadlocker8.budgetmasterclient.utils; + +import java.io.File; +import java.io.IOException; +import java.util.Optional; + +import de.deadlocker8.budgetmaster.logic.database.Database; +import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler; +import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection; +import de.deadlocker8.budgetmaster.logic.utils.FileHelper; +import de.deadlocker8.budgetmaster.logic.utils.Strings; +import de.deadlocker8.budgetmasterclient.ui.controller.Controller; +import de.deadlocker8.budgetmasterclient.utils.UIHelpers; +import javafx.application.Platform; +import javafx.scene.control.Alert; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonType; +import javafx.scene.control.DialogPane; +import javafx.scene.control.Alert.AlertType; +import javafx.scene.control.ButtonBar.ButtonData; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; +import javafx.stage.FileChooser; +import javafx.stage.Stage; +import logger.Logger; +import tools.AlertGenerator; +import tools.Localization; +import tools.Worker; + +public class DatabaseImporter +{ + private Controller controller; + + public DatabaseImporter(Controller controller) + { + this.controller = controller; + } + + public void importDatabase() + { + Alert alert = new Alert(AlertType.CONFIRMATION); + alert.setTitle(Localization.getString(Strings.INFO_TITLE_DATABASE_IMPORT_DIALOG)); + alert.setHeaderText(""); + alert.setContentText(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG)); + Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow(); + dialogStage.getIcons().add(controller.getIcon()); + dialogStage.initOwner(controller.getStage()); + + ButtonType buttonTypeDelete = new ButtonType(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG_DELETE)); + ButtonType buttonTypeAppend = new ButtonType(Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT_DIALOG_APPEND)); + ButtonType buttonTypeCancel = new ButtonType(Localization.getString(Strings.CANCEL), ButtonData.CANCEL_CLOSE); + alert.getButtonTypes().setAll(buttonTypeDelete, buttonTypeAppend, buttonTypeCancel); + + DialogPane dialogPane = alert.getDialogPane(); + dialogPane.getButtonTypes().stream().map(dialogPane::lookupButton).forEach(button -> button.addEventHandler(KeyEvent.KEY_PRESSED, (event) -> { + if(KeyCode.ENTER.equals(event.getCode()) && event.getTarget() instanceof Button) + { + ((Button)event.getTarget()).fire(); + } + })); + + Optional<ButtonType> result = alert.showAndWait(); + if(result.get() == buttonTypeDelete) + { + DatabaseDeleter deleter = new DatabaseDeleter(controller); + deleter.deleteDatabase(true); + } + else if(result.get() == buttonTypeAppend) + { + importDB(); + } + } + + private void importDB() + { + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle(Localization.getString(Strings.TITLE_DATABASE_IMPORT)); + FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("JSON (*.json)", "*.json"); + fileChooser.getExtensionFilters().add(extFilter); + File file = fileChooser.showOpenDialog(controller.getStage()); + if(file != null) + { + Database database; + try + { + database = FileHelper.loadDatabaseJSON(file); + if(database.getCategories() == null + || database.getNormalPayments() == null + || database.getRepeatingPayments() == null + || database.getTags() == null + || database.getTagMatches() == null) + { + AlertGenerator.showAlert(AlertType.ERROR, + Localization.getString(Strings.TITLE_ERROR), + "", + Localization.getString(Strings.ERROR_DATABASE_IMPORT_WRONG_FILE), + controller.getIcon(), + controller.getStage(), + null, + false); + return; + } + } + catch(IOException e1) + { + Logger.error(e1); + AlertGenerator.showAlert(AlertType.ERROR, + Localization.getString(Strings.TITLE_ERROR), + "", + Localization.getString(Strings.ERROR_DATABASE_IMPORT), + controller.getIcon(), + controller.getStage(), + null, + false); + return; + } + + Stage modalStage = UIHelpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_DATABASE_IMPORT), controller.getStage(), controller.getIcon()); + + Worker.runLater(() -> { + try + { + ServerConnection connection = new ServerConnection(controller.getSettings()); + connection.importDatabase(database); + + Platform.runLater(() -> { + if(modalStage != null) + { + modalStage.close(); + } + + AlertGenerator.showAlert(AlertType.INFORMATION, + Localization.getString(Strings.INFO_TITLE_DATABASE_IMPORT), + "", + Localization.getString(Strings.INFO_TEXT_DATABASE_IMPORT), + controller.getIcon(), + controller.getStage(), + null, + false); + + controller.refresh(controller.getFilterSettings()); + }); + } + catch(Exception e) + { + Logger.error(e); + Platform.runLater(() -> { + if(modalStage != null) + { + modalStage.close(); + } + controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e)); + }); + } + }); + } + else + { + controller.refresh(controller.getFilterSettings()); + } + } +} \ No newline at end of file diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties index d9136a90aacdf420fb2deb53e08000009ce8687c..9408c7b3cadd42b27aafd19352b0906cf21271d1 100644 --- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties +++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_de.properties @@ -294,6 +294,7 @@ reporttab.checkbox.inclue.categorybudgets=Verbrauch nach Kategorien hinzuf reporttab.button.generate.report=Bericht erzeugen settingstab.label.secret.client=Client Passwort: +settingstab.label.status=Status: settingstab.label.url=Server URL: settingstab.label.secret.server=Server Passwort: settingstab.label.currency=W�hrung: @@ -312,7 +313,9 @@ settingstab.button.updates.search=Suchen settingstab.button.updates.automatic=Automatisch suchen settingstab.label.updates.current.version=Installiert: settingstab.label.updates.latest.version=Verf�gbar: -settings.tab.button.save=Speichern +settingstab.button.save=Speichern +settingstab.button.server.online=Online Server +settingstab.button.server.local=Lokaler Server splashscreen.label.password=Passwort: diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties index c392f9d757c814d160f45dbad1f948f9032bb978..d5b062fb34e9105cca993ace9c74a7b707d9308c 100644 --- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties +++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/languages/_en.properties @@ -294,6 +294,7 @@ reporttab.checkbox.inclue.categorybudgets=Include consumption by categories reporttab.button.generate.report=Create Report settingstab.label.secret.client=Client Password: +settingstab.label.status=Status: settingstab.label.url=Server URL: settingstab.label.secret.server=Server Password: settingstab.label.currency=Currency: @@ -312,7 +313,9 @@ settingstab.button.updates.search=Search settingstab.button.updates.automatic=Automatic search settingstab.label.updates.current.version=Current Version: settingstab.label.updates.latest.version=Latest Version: -settings.tab.button.save=Save +settingstab.button.save=Save +settingstab.button.server.online=Online Server +settingstab.button.server.local=Local Server splashscreen.label.password=Password: diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml deleted file mode 100644 index c853b86e2034c064b80f6435fc5bd2381fd02d5d..0000000000000000000000000000000000000000 --- a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTab.fxml +++ /dev/null @@ -1,224 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<?import javafx.geometry.Insets?> -<?import javafx.scene.control.Button?> -<?import javafx.scene.control.CheckBox?> -<?import javafx.scene.control.ComboBox?> -<?import javafx.scene.control.Label?> -<?import javafx.scene.control.RadioButton?> -<?import javafx.scene.control.ScrollPane?> -<?import javafx.scene.control.TextArea?> -<?import javafx.scene.control.TextField?> -<?import javafx.scene.layout.AnchorPane?> -<?import javafx.scene.layout.HBox?> -<?import javafx.scene.layout.Region?> -<?import javafx.scene.layout.VBox?> -<?import javafx.scene.text.Font?> - -<AnchorPane fx:id="anchorPaneMain" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmasterclient.ui.controller.SettingsController"> - <children> - <VBox alignment="TOP_CENTER" prefHeight="562.0" prefWidth="772.0" spacing="25.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> - <children> - <ScrollPane fx:id="scrollPane" hbarPolicy="NEVER" VBox.vgrow="ALWAYS"> - <content> - <HBox fx:id="hboxSettings" prefHeight="359.0" prefWidth="722.0"> - <children> - <VBox alignment="CENTER_RIGHT" prefHeight="25.0" prefWidth="158.0" spacing="15.0"> - <children> - <Label fx:id="labelClientSecret" prefHeight="25.0" text="%settingstab.label.secret.client"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - </Label> - <Label fx:id="labelURL" prefHeight="25.0" text="%settingstab.label.url"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - <VBox.margin> - <Insets /> - </VBox.margin> - </Label> - <Label fx:id="labelSecret" prefHeight="25.0" text="%settingstab.label.secret.server"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - </Label> - <Label fx:id="labelCurrency" prefHeight="25.0" text="%settingstab.label.currency"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - </Label> - <Label fx:id="labelSecret11" prefHeight="25.0" text="%settingstab.label.rest"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - </Label> - <Label fx:id="labelSecret111" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" minHeight="60.0" prefWidth="158.0" text="%settingstab.label.trusted.hosts" textAlignment="RIGHT" wrapText="true"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - <VBox.margin> - <Insets top="-7.0" /> - </VBox.margin> - </Label> - <Label fx:id="labelSecret1111" alignment="CENTER" contentDisplay="CENTER" maxHeight="-Infinity" text="%settingstab.label.trusted.hosts.info" textAlignment="CENTER" wrapText="true" VBox.vgrow="ALWAYS"> - <font> - <Font size="14.0" /> - </font> - <VBox.margin> - <Insets top="-20.0" /> - </VBox.margin> - </Label> - <Label fx:id="labelSecret1112" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.language" textAlignment="RIGHT" wrapText="true"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - <VBox.margin> - <Insets top="50.0" /> - </VBox.margin> - </Label> - <Label fx:id="labelSecret11122" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.database" textAlignment="RIGHT" wrapText="true"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - <VBox.margin> - <Insets top="5.0" /> - </VBox.margin> - </Label> - <Label fx:id="labelSecret111221" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.updates" textAlignment="RIGHT" wrapText="true"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - <VBox.margin> - <Insets top="5.0" /> - </VBox.margin> - </Label> - <Label fx:id="labelSecret11121" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" textAlignment="RIGHT" wrapText="true"> - <font> - <Font name="System Bold" size="16.0" /> - </font> - <VBox.margin> - <Insets top="15.0" /> - </VBox.margin> - </Label> - <Region prefHeight="19.0" prefWidth="158.0" VBox.vgrow="ALWAYS" /> - </children> - <HBox.margin> - <Insets right="25.0" /> - </HBox.margin> - </VBox> - <VBox alignment="CENTER_LEFT" prefHeight="200.0" prefWidth="100.0" spacing="15.0" HBox.hgrow="ALWAYS"> - <children> - <TextField fx:id="textFieldClientSecret" /> - <TextField fx:id="textFieldURL" /> - <TextField fx:id="textFieldSecret" /> - <TextField fx:id="textFieldCurrency" /> - <HBox alignment="CENTER" prefHeight="11.0" prefWidth="539.0" spacing="30.0"> - <children> - <RadioButton fx:id="radioButtonRestActivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.activated"> - <font> - <Font size="14.0" /> - </font> - <HBox.margin> - <Insets /> - </HBox.margin> - </RadioButton> - <RadioButton fx:id="radioButtonRestDeactivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.deactivated" HBox.hgrow="ALWAYS"> - <font> - <Font size="14.0" /> - </font> - </RadioButton> - </children> - </HBox> - <TextArea fx:id="textAreaTrustedHosts" maxHeight="122.0" minHeight="122.0" prefHeight="122.0" prefWidth="539.0"> - <VBox.margin> - <Insets /> - </VBox.margin> - </TextArea> - <ComboBox fx:id="comboBoxLanguage" maxWidth="1.7976931348623157E308" /> - <HBox alignment="CENTER_LEFT" prefHeight="11.0" prefWidth="539.0" spacing="30.0"> - <children> - <Button fx:id="buttonExportDB" minWidth="100.0" mnemonicParsing="false" onAction="#exportDB" text="%settingstab.button.database.export"> - <font> - <Font name="System Bold" size="14.0" /> - </font> - </Button> - <Button fx:id="buttonImportDB" minWidth="100.0" mnemonicParsing="false" onAction="#importDB" text="%settingstab.button.database.import"> - <font> - <Font name="System Bold" size="14.0" /> - </font> - </Button> - <Button fx:id="buttonDeleteDB" minWidth="100.0" mnemonicParsing="false" onAction="#deleteDB" text="%settingstab.button.database.delete"> - <font> - <Font name="System Bold" size="14.0" /> - </font> - </Button> - </children> - <VBox.margin> - <Insets /> - </VBox.margin> - </HBox> - <HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0" spacing="20.0"> - <children> - <VBox minWidth="210.0" spacing="10.0" HBox.hgrow="ALWAYS"> - <children> - <Button fx:id="buttonSearchUpdates" minWidth="100.0" mnemonicParsing="false" onAction="#checkForUpdates" text="%settingstab.button.updates.search" /> - <CheckBox fx:id="checkboxEnableAutoUpdate" mnemonicParsing="false" text="%settingstab.button.updates.automatic"> - <font> - <Font size="13.0" /> - </font> - </CheckBox> - </children> - </VBox> - <VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS"> - <children> - <Label fx:id="labelSecret11111" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" text="%settingstab.label.updates.current.version" textAlignment="CENTER" wrapText="true"> - <font> - <Font name="System Bold" size="13.0" /> - </font> - </Label> - <Label fx:id="labelSecret111111" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" text="%settingstab.label.updates.latest.version" textAlignment="CENTER" wrapText="true"> - <font> - <Font name="System Bold" size="13.0" /> - </font> - <VBox.margin> - <Insets /> - </VBox.margin> - </Label> - </children> - </VBox> - <VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS"> - <children> - <Label fx:id="labelCurrentVersion" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" textAlignment="CENTER" wrapText="true"> - <font> - <Font size="13.0" /> - </font> - </Label> - <Label fx:id="labelLatestVersion" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" textAlignment="CENTER" wrapText="true"> - <font> - <Font size="13.0" /> - </font> - </Label> - </children> - </VBox> - </children> - </HBox> - <Button fx:id="buttonSave" minWidth="100.0" mnemonicParsing="false" onAction="#save" text="%settings.tab.button.save"> - <font> - <Font name="System Bold" size="14.0" /> - </font> - <VBox.margin> - <Insets top="15.0" /> - </VBox.margin> - </Button> - <Region prefWidth="158.0" VBox.vgrow="ALWAYS" /> - </children> - </VBox> - </children> - </HBox> - </content> - </ScrollPane> - </children> - </VBox> - </children> -</AnchorPane> diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml new file mode 100644 index 0000000000000000000000000000000000000000..b696f8b9d89c171d2d0c746dec9757a10b5cf3cb --- /dev/null +++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabLocalServer.fxml @@ -0,0 +1,217 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.Insets?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.CheckBox?> +<?import javafx.scene.control.ComboBox?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.control.RadioButton?> +<?import javafx.scene.control.ScrollPane?> +<?import javafx.scene.control.TextField?> +<?import javafx.scene.control.ToggleButton?> +<?import javafx.scene.layout.AnchorPane?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.Region?> +<?import javafx.scene.layout.VBox?> +<?import javafx.scene.text.Font?> + +<AnchorPane fx:id="anchorPaneMain" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmasterclient.ui.controller.LocalServerSettingsController"> + <children> + <VBox alignment="TOP_CENTER" prefHeight="562.0" prefWidth="772.0" spacing="25.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> + <children> + <ScrollPane fx:id="scrollPane" hbarPolicy="NEVER" VBox.vgrow="ALWAYS"> + <content> + <VBox spacing="14.0"> + <children> + <HBox alignment="TOP_CENTER"> + <children> + <ToggleButton fx:id="toggleButtonOnline" mnemonicParsing="false" text="%settingstab.button.server.online" /> + <ToggleButton fx:id="toggleButtonLocal" mnemonicParsing="false" text="%settingstab.button.server.local" /> + </children> + </HBox> + <HBox fx:id="hboxSettings" prefHeight="359.0" prefWidth="722.0"> + <children> + <VBox alignment="CENTER_RIGHT" prefHeight="25.0" prefWidth="158.0" spacing="15.0"> + <children> + <Label fx:id="labelStatus" prefHeight="25.0" text="%settingstab.label.status"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelClientSecret" prefHeight="25.0" text="%settingstab.label.secret.client"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelCurrency" prefHeight="25.0" text="%settingstab.label.currency"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelSecret11" prefHeight="25.0" text="%settingstab.label.rest"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelSecret1112" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.language" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret11122" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.database" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="5.0" /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret111221" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.updates" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="5.0" /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret11121" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="15.0" /> + </VBox.margin> + </Label> + <Region prefHeight="19.0" prefWidth="158.0" VBox.vgrow="ALWAYS" /> + </children> + <HBox.margin> + <Insets right="25.0" /> + </HBox.margin> + </VBox> + <VBox alignment="CENTER_LEFT" prefHeight="200.0" prefWidth="100.0" spacing="15.0" HBox.hgrow="ALWAYS"> + <children> + <HBox alignment="CENTER_LEFT" spacing="10.0"> + <children> + <Label fx:id="labelLocalServerStatus" prefHeight="25.0"> + <font> + <Font size="14.0" /> + </font> + </Label> + <Button fx:id="buttonLocalServerAction" mnemonicParsing="false"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + </children> + </HBox> + <TextField fx:id="textFieldClientSecret" /> + <TextField fx:id="textFieldCurrency" /> + <HBox alignment="CENTER" prefHeight="11.0" prefWidth="539.0" spacing="30.0"> + <children> + <RadioButton fx:id="radioButtonRestActivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.activated"> + <font> + <Font size="14.0" /> + </font> + <HBox.margin> + <Insets /> + </HBox.margin> + </RadioButton> + <RadioButton fx:id="radioButtonRestDeactivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.deactivated" HBox.hgrow="ALWAYS"> + <font> + <Font size="14.0" /> + </font> + </RadioButton> + </children> + </HBox> + <ComboBox fx:id="comboBoxLanguage" maxWidth="1.7976931348623157E308" /> + <HBox alignment="CENTER_LEFT" prefHeight="11.0" prefWidth="539.0" spacing="30.0"> + <children> + <Button fx:id="buttonExportDB" minWidth="100.0" mnemonicParsing="false" onAction="#exportDB" text="%settingstab.button.database.export"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + <Button fx:id="buttonImportDB" minWidth="100.0" mnemonicParsing="false" onAction="#importDB" text="%settingstab.button.database.import"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + <Button fx:id="buttonDeleteDB" minWidth="100.0" mnemonicParsing="false" onAction="#deleteDB" text="%settingstab.button.database.delete"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + </children> + <VBox.margin> + <Insets /> + </VBox.margin> + </HBox> + <HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0" spacing="20.0"> + <children> + <VBox minWidth="210.0" spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Button fx:id="buttonSearchUpdates" minWidth="100.0" mnemonicParsing="false" onAction="#checkForUpdates" text="%settingstab.button.updates.search" /> + <CheckBox fx:id="checkboxEnableAutoUpdate" mnemonicParsing="false" text="%settingstab.button.updates.automatic"> + <font> + <Font size="13.0" /> + </font> + </CheckBox> + </children> + </VBox> + <VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Label fx:id="labelSecret11111" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" text="%settingstab.label.updates.current.version" textAlignment="CENTER" wrapText="true"> + <font> + <Font name="System Bold" size="13.0" /> + </font> + </Label> + <Label fx:id="labelSecret111111" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" text="%settingstab.label.updates.latest.version" textAlignment="CENTER" wrapText="true"> + <font> + <Font name="System Bold" size="13.0" /> + </font> + <VBox.margin> + <Insets /> + </VBox.margin> + </Label> + </children> + </VBox> + <VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Label fx:id="labelCurrentVersion" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" textAlignment="CENTER" wrapText="true"> + <font> + <Font size="13.0" /> + </font> + </Label> + <Label fx:id="labelLatestVersion" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" textAlignment="CENTER" wrapText="true"> + <font> + <Font size="13.0" /> + </font> + </Label> + </children> + </VBox> + </children> + </HBox> + <Button fx:id="buttonSave" minWidth="100.0" mnemonicParsing="false" onAction="#save" text="%settingstab.button.save"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + <VBox.margin> + <Insets top="15.0" /> + </VBox.margin> + </Button> + <Region prefWidth="158.0" VBox.vgrow="ALWAYS" /> + </children> + </VBox> + </children> + </HBox> + </children> + </VBox> + </content> + </ScrollPane> + </children> + </VBox> + </children> +</AnchorPane> diff --git a/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabOnlineServer.fxml b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabOnlineServer.fxml new file mode 100644 index 0000000000000000000000000000000000000000..2c57219825b966e91d2075c3401e718470cbca6a --- /dev/null +++ b/BudgetMasterClient/src/main/resources/de/deadlocker8/budgetmaster/ui/fxml/SettingsTabOnlineServer.fxml @@ -0,0 +1,235 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.Insets?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.CheckBox?> +<?import javafx.scene.control.ComboBox?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.control.RadioButton?> +<?import javafx.scene.control.ScrollPane?> +<?import javafx.scene.control.TextArea?> +<?import javafx.scene.control.TextField?> +<?import javafx.scene.control.ToggleButton?> +<?import javafx.scene.layout.AnchorPane?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.Region?> +<?import javafx.scene.layout.VBox?> +<?import javafx.scene.text.Font?> + +<AnchorPane fx:id="anchorPaneMain" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.budgetmasterclient.ui.controller.OnlineServerSettingsController"> + <children> + <VBox alignment="TOP_CENTER" prefHeight="562.0" prefWidth="772.0" spacing="25.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="14.0"> + <children> + <ScrollPane fx:id="scrollPane" hbarPolicy="NEVER" VBox.vgrow="ALWAYS"> + <content> + <VBox spacing="14.0"> + <children> + <HBox alignment="TOP_CENTER"> + <children> + <ToggleButton fx:id="toggleButtonOnline" mnemonicParsing="false" text="%settingstab.button.server.online" /> + <ToggleButton fx:id="toggleButtonLocal" mnemonicParsing="false" text="%settingstab.button.server.local" /> + </children> + </HBox> + <HBox fx:id="hboxSettings" prefHeight="359.0" prefWidth="722.0"> + <children> + <VBox alignment="CENTER_RIGHT" prefHeight="25.0" prefWidth="158.0" spacing="15.0"> + <children> + <Label fx:id="labelClientSecret" prefHeight="25.0" text="%settingstab.label.secret.client"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelURL" prefHeight="25.0" text="%settingstab.label.url"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret" prefHeight="25.0" text="%settingstab.label.secret.server"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelCurrency" prefHeight="25.0" text="%settingstab.label.currency"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelSecret11" prefHeight="25.0" text="%settingstab.label.rest"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + </Label> + <Label fx:id="labelSecret111" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" minHeight="60.0" prefWidth="158.0" text="%settingstab.label.trusted.hosts" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="-7.0" /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret1111" alignment="CENTER" contentDisplay="CENTER" maxHeight="-Infinity" text="%settingstab.label.trusted.hosts.info" textAlignment="CENTER" wrapText="true" VBox.vgrow="ALWAYS"> + <font> + <Font size="14.0" /> + </font> + <VBox.margin> + <Insets top="-20.0" /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret1112" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.language" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="50.0" /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret11122" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.database" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="5.0" /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret111221" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" text="%settingstab.label.updates" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="5.0" /> + </VBox.margin> + </Label> + <Label fx:id="labelSecret11121" alignment="CENTER_RIGHT" contentDisplay="RIGHT" maxHeight="-Infinity" prefWidth="158.0" textAlignment="RIGHT" wrapText="true"> + <font> + <Font name="System Bold" size="16.0" /> + </font> + <VBox.margin> + <Insets top="15.0" /> + </VBox.margin> + </Label> + <Region prefHeight="19.0" prefWidth="158.0" VBox.vgrow="ALWAYS" /> + </children> + <HBox.margin> + <Insets right="25.0" /> + </HBox.margin> + </VBox> + <VBox alignment="CENTER_LEFT" prefHeight="200.0" prefWidth="100.0" spacing="15.0" HBox.hgrow="ALWAYS"> + <children> + <TextField fx:id="textFieldClientSecret" /> + <TextField fx:id="textFieldURL" /> + <TextField fx:id="textFieldSecret" /> + <TextField fx:id="textFieldCurrency" /> + <HBox alignment="CENTER" prefHeight="11.0" prefWidth="539.0" spacing="30.0"> + <children> + <RadioButton fx:id="radioButtonRestActivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.activated"> + <font> + <Font size="14.0" /> + </font> + <HBox.margin> + <Insets /> + </HBox.margin> + </RadioButton> + <RadioButton fx:id="radioButtonRestDeactivated" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="%settingstab.label.rest.deactivated" HBox.hgrow="ALWAYS"> + <font> + <Font size="14.0" /> + </font> + </RadioButton> + </children> + </HBox> + <TextArea fx:id="textAreaTrustedHosts" maxHeight="122.0" minHeight="122.0" prefHeight="122.0" prefWidth="539.0"> + <VBox.margin> + <Insets /> + </VBox.margin> + </TextArea> + <ComboBox fx:id="comboBoxLanguage" maxWidth="1.7976931348623157E308" /> + <HBox alignment="CENTER_LEFT" prefHeight="11.0" prefWidth="539.0" spacing="30.0"> + <children> + <Button fx:id="buttonExportDB" minWidth="100.0" mnemonicParsing="false" onAction="#exportDB" text="%settingstab.button.database.export"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + <Button fx:id="buttonImportDB" minWidth="100.0" mnemonicParsing="false" onAction="#importDB" text="%settingstab.button.database.import"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + <Button fx:id="buttonDeleteDB" minWidth="100.0" mnemonicParsing="false" onAction="#deleteDB" text="%settingstab.button.database.delete"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + </Button> + </children> + <VBox.margin> + <Insets /> + </VBox.margin> + </HBox> + <HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0" spacing="20.0"> + <children> + <VBox minWidth="210.0" spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Button fx:id="buttonSearchUpdates" minWidth="100.0" mnemonicParsing="false" onAction="#checkForUpdates" text="%settingstab.button.updates.search" /> + <CheckBox fx:id="checkboxEnableAutoUpdate" mnemonicParsing="false" text="%settingstab.button.updates.automatic"> + <font> + <Font size="13.0" /> + </font> + </CheckBox> + </children> + </VBox> + <VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Label fx:id="labelSecret11111" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" text="%settingstab.label.updates.current.version" textAlignment="CENTER" wrapText="true"> + <font> + <Font name="System Bold" size="13.0" /> + </font> + </Label> + <Label fx:id="labelSecret111111" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" text="%settingstab.label.updates.latest.version" textAlignment="CENTER" wrapText="true"> + <font> + <Font name="System Bold" size="13.0" /> + </font> + <VBox.margin> + <Insets /> + </VBox.margin> + </Label> + </children> + </VBox> + <VBox prefHeight="200.0" prefWidth="100.0" spacing="10.0" HBox.hgrow="ALWAYS"> + <children> + <Label fx:id="labelCurrentVersion" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" textAlignment="CENTER" wrapText="true"> + <font> + <Font size="13.0" /> + </font> + </Label> + <Label fx:id="labelLatestVersion" alignment="TOP_LEFT" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" minHeight="25.0" textAlignment="CENTER" wrapText="true"> + <font> + <Font size="13.0" /> + </font> + </Label> + </children> + </VBox> + </children> + </HBox> + <Button fx:id="buttonSave" minWidth="100.0" mnemonicParsing="false" onAction="#save" text="%settingstab.button.save"> + <font> + <Font name="System Bold" size="14.0" /> + </font> + <VBox.margin> + <Insets top="15.0" /> + </VBox.margin> + </Button> + <Region prefWidth="158.0" VBox.vgrow="ALWAYS" /> + </children> + </VBox> + </children> + </HBox> + </children> + </VBox> + </content> + </ScrollPane> + </children> + </VBox> + </children> +</AnchorPane> diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/ServerType.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/ServerType.java new file mode 100644 index 0000000000000000000000000000000000000000..9db45810d8bf6e7bbb5569e4b0eea0f87383d701 --- /dev/null +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/ServerType.java @@ -0,0 +1,6 @@ +package de.deadlocker8.budgetmaster.logic; + +public enum ServerType +{ + ONLINE, LOCAL; +} \ No newline at end of file diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/Settings.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/Settings.java index a0dbe9f2ae1bfa96612bde1769ea1b7d2f492e62..dd115b4e200e52e761e7a6c934a6a3324f582fbd 100644 --- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/Settings.java +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/Settings.java @@ -13,11 +13,14 @@ public class Settings * --> 1 * initial * + * --> 2 + * added field for "serverType" + * */ - @SuppressWarnings("unused") private final String TYPE = SaveFileType.BUDGETMASTER_SETTINGS.toString(); - private final int VERSION = 1; + private final int VERSION = 2; + private ServerType serverType; private String clientSecret; private String url; private String secret; @@ -30,7 +33,17 @@ public class Settings public Settings() { - } + } + + public ServerType getServerType() + { + return serverType; + } + + public void setServerType(ServerType serverType) + { + this.serverType = serverType; + } public String getClientSecret() { @@ -132,7 +145,7 @@ public class Settings @Override public String toString() { - return "Settings [TYPE=" + TYPE + ", VERSION=" + VERSION + ", clientSecret=" + clientSecret + ", url=" + url + ", secret=" + secret + ", currency=" + currency + ", restActivated=" + restActivated + ", trustedHosts=" + trustedHosts + ", language=" + language + ", autoUpdateCheckEnabled=" - + autoUpdateCheckEnabled + "]"; + return "Settings [TYPE=" + TYPE + ", VERSION=" + VERSION + ", serverType=" + serverType + ", clientSecret=" + clientSecret + ", url=" + url + ", secret=" + secret + ", currency=" + currency + ", restActivated=" + restActivated + ", trustedHosts=" + trustedHosts + ", language=" + language + + ", autoUpdateCheckEnabled=" + autoUpdateCheckEnabled + "]"; } } \ No newline at end of file diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Colors.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Colors.java index 7d394d24822956a1d04fd86912a643e6419d25c0..1403601fb0f381e4136bb805b2ca01509c52da98 100644 --- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Colors.java +++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/utils/Colors.java @@ -11,6 +11,7 @@ public class Colors public static final Color BACKGROUND = Color.web("#F4F4F4"); public static final Color BACKGROUND_MAIN = Color.web("#DDDDDD"); public static final Color BACKGROUND_BUTTON_BLUE = Color.web("#2E79B9"); + public static final Color BACKGROUND_BUTTON_DARK_BLUE = Color.web("#246091"); public static final Color BACKGROUND_BUTTON_RED = Color.web("#FF5047"); public static final Color BACKGROUND_NOTIFICATION = Color.web("#323232"); public static final Color BACKGROUND_REPORT_TABLE_HEADER_DISABLED = Color.SALMON;