diff --git a/keeptime.bat b/keeptime.bat index f557fc3c..f1e9ef14 100644 --- a/keeptime.bat +++ b/keeptime.bat @@ -1 +1,27 @@ -start "" "javaw" -Dprism.order=sw -jar keeptime.jar \ No newline at end of file +@echo off +setlocal + +cd /d "%~dp0" + +where javaw >nul 2>&1 +if errorlevel 1 ( + echo ERROR: Java was not found. + echo. + echo Please install Java. + echo See installation requirements: https://github.com/doubleSlashde/KeepTime#requirements + echo. + pause + exit /b 1 +) + +if not exist "keeptime.jar" ( + echo ERROR: keeptime.jar was not found in this folder. + echo. + echo Please download and extract KeepTime from the releases page. + echo See installation instructions: https://github.com/doubleSlashde/KeepTime#install + echo. + pause + exit /b 1 +) + +start "" "javaw" -Dprism.order=sw -jar keeptime.jar diff --git a/src/main/java/de/doubleslash/keeptime/view/ExternalProjectsMapController.java b/src/main/java/de/doubleslash/keeptime/view/ExternalProjectsMapController.java index add05f9a..62d6bb26 100644 --- a/src/main/java/de/doubleslash/keeptime/view/ExternalProjectsMapController.java +++ b/src/main/java/de/doubleslash/keeptime/view/ExternalProjectsMapController.java @@ -357,8 +357,8 @@ private boolean showInvalidMappingsDialog(final List warnings) { dialog.getDialogPane().setContent(scrollPane); dialog.getDialogPane().setMinWidth(400); - ButtonType removeButton = new ButtonType("Remove", ButtonBar.ButtonData.YES); - ButtonType keepButton = new ButtonType("Keep", ButtonBar.ButtonData.NO); + ButtonType removeButton = new ButtonType("Remove", ButtonBar.ButtonData.NO); + ButtonType keepButton = new ButtonType("Keep", ButtonBar.ButtonData.YES); dialog.getDialogPane().getButtonTypes().setAll(removeButton, keepButton); Optional result = dialog.showAndWait(); diff --git a/src/main/java/de/doubleslash/keeptime/view/ExternalProjectsSyncController.java b/src/main/java/de/doubleslash/keeptime/view/ExternalProjectsSyncController.java index 3a37af68..a7e9855a 100644 --- a/src/main/java/de/doubleslash/keeptime/view/ExternalProjectsSyncController.java +++ b/src/main/java/de/doubleslash/keeptime/view/ExternalProjectsSyncController.java @@ -187,14 +187,25 @@ public void initForDate(LocalDate currentReportDate, List currentWorkItems heimatTimeLabel.setText(localTimeStringConverter.toString( LocalTime.ofSecondOfDay(tableRows.stream().mapToLong(HeimatController.Mapping::heimatSeconds).sum()))); - BooleanBinding projectsValidProperty = Bindings.createBooleanBinding(() -> items.stream().anyMatch(item -> { - boolean shouldSync = item.shouldSyncCheckBox.get(); - boolean hasNote = !item.userNotes.get().isBlank(); - boolean hasTime = areSecondsOfDayValid(item.userTimeSeconds.get()); - return shouldSync && !(hasNote && hasTime); - }), itemsForBindings); - - saveButton.disableProperty().bind(projectsValidProperty); + BooleanBinding saveButtonDisabledProperty = Bindings.createBooleanBinding(() -> { + boolean anyShouldSync = items.stream().anyMatch(item -> item.shouldSyncCheckBox.get()); + if (!anyShouldSync) { + return true; + } + return items.stream().anyMatch(item -> { + if (!item.shouldSyncCheckBox.get()) { + return false; + } + boolean hasNote = !item.userNotes.get().isBlank(); + boolean hasTime = areSecondsOfDayValid(item.userTimeSeconds.get()); + return !(hasNote && hasTime); + }); + }, itemsForBindings); + + saveButton.disableProperty().bind(saveButtonDisabledProperty); + saveButton.textProperty().bind(Bindings.createStringBinding( + () -> "Sync (" + items.stream().filter(item -> item.shouldSyncCheckBox.get()).count() + ")", + itemsForBindings)); externalSystemLink.setOnAction(ae -> BrowserHelper.openURL(heimatController.getUrlForDay(currentReportDate))); externalSystemLinkLoadingScreen.setOnAction( ae -> BrowserHelper.openURL(heimatController.getUrlForDay(currentReportDate))); @@ -247,21 +258,21 @@ private void initialize() { // Custom Cell Factory to disable CheckBoxes shouldSyncColumn.setCellFactory(col -> new TableCell<>() { private final CheckBox checkBox = new CheckBox(); - private ChangeListener boolChangeListener; + private BooleanProperty boundProperty = null; @Override protected void updateItem(TableRow item, boolean empty) { super.updateItem(item, empty); - if (boolChangeListener != null) - checkBox.selectedProperty().removeListener(boolChangeListener); - + if(boundProperty != null){ + checkBox.selectedProperty().unbindBidirectional(boundProperty); + boundProperty = null; + } if (empty || item == null) { setGraphic(null); } else { checkBox.setDisable(!item.mapping.canBeSynced()); - checkBox.setSelected(item.shouldSyncCheckBox.get()); - boolChangeListener = (obs, oldText, newBoolean) -> item.shouldSyncCheckBox.set(newBoolean); - checkBox.selectedProperty().addListener(boolChangeListener); + checkBox.selectedProperty().bindBidirectional(item.shouldSyncCheckBox); + boundProperty = item.shouldSyncCheckBox; setAlignment(Pos.TOP_CENTER); setGraphic(checkBox); } @@ -337,6 +348,7 @@ protected void updateItem(TableRow item, boolean empty) { localTimeChangeListener = (observable, oldValue, newValue) -> { item.userTimeSeconds.set(newValue.toSecondOfDay()); spinnerValidConsumer.accept(timeSpinner); + item.shouldSyncCheckBox.set(true); }; spinnerValidConsumer.accept(timeSpinner); timeSpinner.valueProperty().addListener(localTimeChangeListener);