diff --git a/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerTagConnection.java b/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerTagConnection.java index 01519a042b671216b908ae1a235ecd5e5d122089..80bb67a649515c3fda5b6f30bf6d9e94073ac326 100644 --- a/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerTagConnection.java +++ b/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerTagConnection.java @@ -19,6 +19,7 @@ import com.google.gson.reflect.TypeToken; import de.deadlocker8.budgetmaster.logic.Settings; import de.deadlocker8.budgetmaster.logic.payment.NormalPayment; import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment; +import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry; import de.deadlocker8.budgetmaster.logic.tag.Tag; import de.deadlocker8.budgetmaster.logic.utils.Helpers; import tools.Read; @@ -267,7 +268,7 @@ public class ServerTagConnection } } - public ArrayList<Tag> getAllTagsForRepeatingPayment(RepeatingPayment repeatingPayment) throws Exception + public ArrayList<Tag> getAllTagsForRepeatingPayment(RepeatingPaymentEntry repeatingPayment) throws Exception { URL url = new URL(settings.getUrl() + "/tag/match/all/normal?secret=" + Helpers.getURLEncodedString(settings.getSecret()) + "&repeatingPaymentID=" + repeatingPayment.getID()); HttpsURLConnection httpsCon = (HttpsURLConnection)url.openConnection(); diff --git a/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java b/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java index ceb6e3b849862c04c97d5f6c56fc5d306057c7c9..bcfac99f547d24be2b1457b0ac827c955ca70c1e 100644 --- a/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java +++ b/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java @@ -64,6 +64,7 @@ public class Strings public static final String TRUSTED_HOSTS_PLACEHOLDER = "trusted.hosts.placeholder"; public static final String VERSION = "version"; public static final String UNDEFINED = "undefined"; + public static final String TAGFIELD_PLACEHOLDER = "tagfield.placeholder"; //REPORT public static final String REPORT_POSITION = "report.position"; diff --git a/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties b/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties index 75185156f695760796198000c8448d398c2eb36a..b2d1f24ad95864eb89c0a4f6ad1225a163b6093f 100644 --- a/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties +++ b/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties @@ -61,6 +61,7 @@ url.placeholder=z.B. https://yourdomain.de currency.placeholder=z.B. \u20AC, CHF, $ trusted.hosts.placeholder=z.B. localhost undefined=unbekannt +tagfield.placeholder=Neuen Tag hier eingeben # REPORT report.position=Nr. diff --git a/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties b/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties index a745d5d1334d8f85729df53d1eaea4fa88e13525..1a3ae52280c71dd084fe5a3dc25a22415769509f 100644 --- a/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties +++ b/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties @@ -61,6 +61,7 @@ url.placeholder=e.g. https://yourdomain.de currency.placeholder=e.g. \u20AC, CHF, $ trusted.hosts.placeholder=e.g. localhost undefined=undefined +tagfield.placeholder=Enter new Tag here # REPORT report.position=No. diff --git a/src/de/deadlocker8/budgetmaster/ui/controller/NewPaymentController.java b/src/de/deadlocker8/budgetmaster/ui/controller/NewPaymentController.java index ae9c0f5719908125c62c46e0aa1f4a105f7fafb8..cc3322caac9367190611e0d59ba08717c9cf3a1c 100644 --- a/src/de/deadlocker8/budgetmaster/ui/controller/NewPaymentController.java +++ b/src/de/deadlocker8/budgetmaster/ui/controller/NewPaymentController.java @@ -13,6 +13,7 @@ import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry; import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler; import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection; import de.deadlocker8.budgetmaster.logic.serverconnection.ServerTagConnection; +import de.deadlocker8.budgetmaster.logic.tag.Tag; import de.deadlocker8.budgetmaster.logic.utils.Colors; import de.deadlocker8.budgetmaster.logic.utils.Helpers; import de.deadlocker8.budgetmaster.logic.utils.Strings; @@ -75,6 +76,7 @@ public class NewPaymentController extends BaseController implements Styleable private boolean edit; private Payment payment; private ButtonCategoryCell buttonCategoryCell; + private TagField tagField; public NewPaymentController(Stage parentStage, Controller controller, PaymentController paymentController, boolean isPayment, boolean edit, Payment payment) { @@ -113,35 +115,59 @@ public class NewPaymentController extends BaseController implements Styleable @Override public void init() - { + { vboxContent.prefWidthProperty().bind(scrollPane.widthProperty().subtract(25)); - applyStyle(); + applyStyle(); - SpinnerValueFactory<Integer> valueFactory = new SpinnerValueFactory.IntegerSpinnerValueFactory(1, 1000, 0); - spinnerRepeatingPeriod.setValueFactory(valueFactory); - spinnerRepeatingPeriod.setEditable(true); - spinnerRepeatingPeriod.focusedProperty().addListener((observable, oldValue, newValue) -> { - if(!newValue) + tagField = new TagField(new ArrayList<Tag>(), new ArrayList<Tag>()); + hboxTags.getChildren().add(tagField); + tagField.maxWidthProperty().bind(hboxTags.widthProperty()); + HBox.setHgrow(tagField, Priority.ALWAYS); + + initRepeatingArea(); + + if(edit) + { + prefill(); + } + else + { + comboBoxCategory.setValue(controller.getCategoryHandler().getCategory(1)); + checkBoxRepeat.setSelected(false); + radioButtonPeriod.setSelected(true); + toggleRepeatingArea(false); + + //preselect correct month and year + DateTime currentDate = controller.getCurrentDate(); + if(DateTime.now().getDayOfMonth() > currentDate.dayOfMonth().withMaximumValue().getDayOfMonth()) { - spinnerRepeatingPeriod.increment(0); // won't change value, but will commit editor + currentDate = currentDate.dayOfMonth().withMaximumValue(); + } + + LocalDate currentLocalDate = LocalDate.now().withYear(currentDate.getYear()) + .withMonth(currentDate.getMonthOfYear()) + .withDayOfMonth(currentDate.getDayOfMonth()); + datePicker.setValue(currentLocalDate); + datePickerEnddate.setValue(currentLocalDate); + + try + { + ServerTagConnection serverTagConnection = new ServerTagConnection(controller.getSettings()); + tagField.setAllTags(serverTagConnection.getTags()); + } + catch(Exception e) + { + //ERRORHANDLING + Logger.error(e); } - }); - - comboBoxRepeatingDay.setCellFactory((view) -> { - return new RepeatingDayCell(); - }); - ArrayList<Integer> days = new ArrayList<>(); - for(int i = 1; i <= 31; i++) - { - days.add(i); } - comboBoxRepeatingDay.getItems().addAll(days); - comboBoxCategory.setCellFactory((view) -> { - return new SmallCategoryCell(); - }); - comboBoxRepeatingDay.setValue(1); + datePicker.setEditable(false); + } + + private void initComboBoxCategory() + { buttonCategoryCell = new ButtonCategoryCell(Color.WHITE); comboBoxCategory.setButtonCell(buttonCategoryCell); comboBoxCategory.setStyle("-fx-border-color: #000000; -fx-border-width: 2; -fx-border-radius: 5; -fx-background-radius: 5;"); @@ -149,11 +175,10 @@ public class NewPaymentController extends BaseController implements Styleable comboBoxCategory.setStyle("-fx-background-color: " + newValue.getColor() + "; -fx-border-color: #000000; -fx-border-width: 2; -fx-border-radius: 5; -fx-background-radius: 5;"); buttonCategoryCell.setColor(Color.web(newValue.getColor())); }); - - checkBoxRepeat.selectedProperty().addListener((listener, oldValue, newValue) -> { - toggleRepeatingArea(newValue); + comboBoxCategory.setCellFactory((view) -> { + return new SmallCategoryCell(); }); - + comboBoxCategory.getItems().clear(); try { @@ -167,8 +192,7 @@ public class NewPaymentController extends BaseController implements Styleable { comboBoxCategory.getItems().add(currentCategory); } - } - + } } } catch(Exception e) @@ -177,6 +201,17 @@ public class NewPaymentController extends BaseController implements Styleable getStage().close(); return; } + } + + private void initRepeatingArea() + { + checkBoxRepeat.selectedProperty().addListener((listener, oldValue, newValue) -> { + toggleRepeatingArea(newValue); + }); + + initSpinnerRepeatingPeriod(); + initComboBoxRepeatingDay(); + initComboBoxCategory(); final ToggleGroup toggleGroup = new ToggleGroup(); radioButtonPeriod.setToggleGroup(toggleGroup); @@ -198,22 +233,55 @@ public class NewPaymentController extends BaseController implements Styleable setStyle("-fx-background-color: #ffc0cb;"); } } - }); + }); + } + + private void initSpinnerRepeatingPeriod() + { + SpinnerValueFactory<Integer> valueFactory = new SpinnerValueFactory.IntegerSpinnerValueFactory(1, 1000, 0); + spinnerRepeatingPeriod.setValueFactory(valueFactory); + spinnerRepeatingPeriod.setEditable(true); + spinnerRepeatingPeriod.focusedProperty().addListener((observable, oldValue, newValue) -> { + if(!newValue) + { + spinnerRepeatingPeriod.increment(0); // won't change value, but will commit editor + } + }); + } + + private void initComboBoxRepeatingDay() + { + comboBoxRepeatingDay.setCellFactory((view) -> { + return new RepeatingDayCell(); + }); + ArrayList<Integer> days = new ArrayList<>(); + for(int i = 1; i <= 31; i++) + { + days.add(i); + } + comboBoxRepeatingDay.getItems().addAll(days); + comboBoxRepeatingDay.setValue(1); + } + + private void prefill() + { + textFieldName.setText(payment.getName()); + textFieldAmount.setText(Helpers.NUMBER_FORMAT.format(Math.abs(payment.getAmount()/100.0)).replace(".", ",")); + comboBoxCategory.setValue(controller.getCategoryHandler().getCategory(payment.getCategoryID())); + datePicker.setValue(LocalDate.parse(payment.getDate())); + textArea.setText(payment.getDescription()); - if(edit) + try { - //prefill - textFieldName.setText(payment.getName()); - textFieldAmount.setText(Helpers.NUMBER_FORMAT.format(Math.abs(payment.getAmount()/100.0)).replace(".", ",")); - comboBoxCategory.setValue(controller.getCategoryHandler().getCategory(payment.getCategoryID())); - datePicker.setValue(LocalDate.parse(payment.getDate())); - textArea.setText(payment.getDescription()); - + ServerTagConnection serverTagConnection = new ServerTagConnection(controller.getSettings()); + tagField.setAllTags(serverTagConnection.getTags()); + if(payment instanceof RepeatingPaymentEntry) - { + { try { RepeatingPaymentEntry currentPayment = (RepeatingPaymentEntry)payment; + tagField.setTags(serverTagConnection.getAllTagsForRepeatingPayment(currentPayment)); ServerConnection connection = new ServerConnection(controller.getSettings()); RepeatingPayment repeatingPayment = connection.getRepeatingPayment(currentPayment.getRepeatingPaymentID()); @@ -247,50 +315,18 @@ public class NewPaymentController extends BaseController implements Styleable } } else - { + { + tagField.setTags(serverTagConnection.getAllTagsForPayment((NormalPayment)payment)); checkBoxRepeat.setSelected(false); radioButtonPeriod.setSelected(true); toggleRepeatingArea(false); - } - - - ServerTagConnection s; - try - { - s = new ServerTagConnection(controller.getSettings()); - TagField tagField = new TagField(s.getAllTagsForPayment((NormalPayment)payment), s.getTags()); - hboxTags.getChildren().add(tagField); - tagField.maxWidthProperty().bind(hboxTags.widthProperty()); - HBox.setHgrow(tagField, Priority.ALWAYS); - } - catch(Exception e) - { - //ERRORHANDLING - Logger.error(e); - } - } - else + } + } + catch(Exception e) { - comboBoxCategory.setValue(controller.getCategoryHandler().getCategory(1)); - checkBoxRepeat.setSelected(false); - radioButtonPeriod.setSelected(true); - toggleRepeatingArea(false); - - //preselect correct month and year - DateTime currentDate = controller.getCurrentDate(); - if(DateTime.now().getDayOfMonth() > currentDate.dayOfMonth().withMaximumValue().getDayOfMonth()) - { - currentDate = currentDate.dayOfMonth().withMaximumValue(); - } - - LocalDate currentLocalDate = LocalDate.now().withYear(currentDate.getYear()) - .withMonth(currentDate.getMonthOfYear()) - .withDayOfMonth(currentDate.getDayOfMonth()); - datePicker.setValue(currentLocalDate); - datePickerEnddate.setValue(currentLocalDate); + //ERRORHANDLING + Logger.error(e); } - - datePicker.setEditable(false); } public void save() diff --git a/src/de/deadlocker8/budgetmaster/ui/tagField/TagField.java b/src/de/deadlocker8/budgetmaster/ui/tagField/TagField.java index c62d2e588774473e2441502766cdf135b3f97189..a938861a0741d50680bb9e1072ff7cc170e94906 100644 --- a/src/de/deadlocker8/budgetmaster/ui/tagField/TagField.java +++ b/src/de/deadlocker8/budgetmaster/ui/tagField/TagField.java @@ -7,6 +7,7 @@ import org.controlsfx.control.textfield.TextFields; import de.deadlocker8.budgetmaster.logic.tag.Tag; import de.deadlocker8.budgetmaster.logic.utils.Colors; import de.deadlocker8.budgetmaster.logic.utils.Helpers; +import de.deadlocker8.budgetmaster.logic.utils.Strings; import fontAwesome.FontIconType; import javafx.geometry.Insets; import javafx.geometry.Pos; @@ -16,27 +17,55 @@ import javafx.scene.control.TextField; import javafx.scene.input.KeyCode; import javafx.scene.layout.FlowPane; import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; import tools.ConvertTo; +import tools.Localization; -public class TagField extends FlowPane +public class TagField extends VBox { private ArrayList<Tag> tags; private ArrayList<Tag> allTags; + private FlowPane flowPane; + private TextField textField; - public TagField(ArrayList<Tag> tags, ArrayList<Tag> allTags) + public TagField(ArrayList<Tag> tags, ArrayList<Tag> allAvailableTags) { this.tags = tags; - this.allTags = allTags; - this.setVgap(5); - this.setHgap(5); - this.setPadding(new Insets(5)); + this.allTags = allAvailableTags; + + this.flowPane = initFlowPane(); + this.getChildren().add(flowPane); + + textField = new TextField(); + textField.setStyle("-fx-background-color: #FFFFFF; -fx-border-color: #000000; -fx-border-width: 1 0 0 0; -fx-background-radius: 5px;"); + textField.setPromptText(Localization.getString(Strings.TAGFIELD_PLACEHOLDER)); + textField.setMaxWidth(Double.MAX_VALUE); + textField.setOnKeyPressed((event)->{ + if(event.getCode().equals(KeyCode.ENTER)) + { + addTag(textField.getText().trim()); + } + }); + TextFields.bindAutoCompletion(textField, param -> getCompletions(allTags)); + this.getChildren().add(textField); + this.setStyle("-fx-background-color: #FFFFFF; -fx-border-color: #000000; -fx-background-radius: 5px; -fx-border-radius: 5px"); + this.setSpacing(5); refresh(false); } - private ArrayList<String> getCompletions(ArrayList<Tag> allTags) + private FlowPane initFlowPane() { + FlowPane flowPane = new FlowPane(); + flowPane.setVgap(5); + flowPane.setHgap(5); + flowPane.setPadding(new Insets(5)); + return flowPane; + } + + private ArrayList<String> getCompletions(ArrayList<Tag> allTags) + { ArrayList<String> newCompletions = new ArrayList<>(); for(Tag currentTag : allTags) { @@ -63,6 +92,18 @@ public class TagField extends FlowPane return tags; } + public void setTags(ArrayList<Tag> tags) + { + this.tags = tags; + refresh(false); + } + + public void setAllTags(ArrayList<Tag> allTags) + { + this.allTags = allTags; + refresh(false); + } + public void addTag(String tagName) { if(tagName.equals("")) @@ -90,26 +131,16 @@ public class TagField extends FlowPane private void refresh(boolean requstFocus) { - this.getChildren().clear(); + flowPane.getChildren().clear(); for(Tag currentTag : tags) { - this.getChildren().add(generateTag(currentTag)); + flowPane.getChildren().add(generateTag(currentTag)); } - TextField textField = new TextField(); - textField.setMaxWidth(Double.MAX_VALUE); - textField.setOnKeyPressed((event)->{ - if(event.getCode().equals(KeyCode.ENTER)) - { - addTag(textField.getText().trim()); - } - }); - TextFields.bindAutoCompletion(textField, getCompletions(allTags)); - this.getChildren().add(textField); - if(requstFocus) { + textField.setText(""); textField.requestFocus(); } }