Skip to content

Commit 998418d

Browse files
author
Jan Schraff
committed
Merge branch 'develop' into feature/save_active_work_item_periodically
2 parents 06365d6 + 64c01c8 commit 998418d

23 files changed

+513
-239
lines changed

pom.xml

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,15 @@
3131
<relativePath /> <!-- lookup parent from repository -->
3232
</parent>
3333

34+
<repositories>
35+
<!-- Including for fontawesome -->
36+
<repository>
37+
<id>fontawesomefx-repo</id>
38+
<name>FontAwesome Repository</name>
39+
<url>https://bintray.com/jerady/maven/FontAwesomeFX</url>
40+
</repository>
41+
</repositories>
42+
3443
<properties>
3544
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
3645
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
@@ -93,13 +102,13 @@
93102
<version>3.1.1</version>
94103
<type>maven-plugin</type>
95104
</dependency>
96-
105+
97106
<dependency>
98107
<groupId>de.jensd</groupId>
99108
<artifactId>fontawesomefx-commons</artifactId>
100109
<version>8.15</version>
101110
</dependency>
102-
111+
103112
<dependency>
104113
<groupId>de.jensd</groupId>
105114
<artifactId>fontawesomefx-fontawesome</artifactId>
@@ -144,7 +153,7 @@
144153
<failOnError>${maven-dependency-check.failOnError}</failOnError>
145154
<failBuildOnCVSS>${maven-dependency-check.failBuildOnCVSS}</failBuildOnCVSS>
146155
<outputDirectory>target/site</outputDirectory>
147-
<!--suppressionFile>${project.basedir}/dependency-check-report_suppressions.xml</suppressionFile-->
156+
<!--suppressionFile>${project.basedir}/dependency-check-report_suppressions.xml</suppressionFile -->
148157
</configuration>
149158
<executions>
150159
<execution>
@@ -184,7 +193,7 @@
184193
<failOnError>${maven-dependency-check.failOnError}</failOnError>
185194
<failBuildOnCVSS>${maven-dependency-check.failBuildOnCVSS}</failBuildOnCVSS>
186195
<outputDirectory>target/site</outputDirectory>
187-
<!--suppressionFile>${project.basedir}/dependency-check-report_suppressions.xml</suppressionFile-->
196+
<!--suppressionFile>${project.basedir}/dependency-check-report_suppressions.xml</suppressionFile -->
188197
</configuration>
189198
</plugin>
190199
</plugins>

src/main/java/de/doubleslash/keeptime/Main.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import de.doubleslash.keeptime.common.FontProvider;
3434
import de.doubleslash.keeptime.common.Resources;
3535
import de.doubleslash.keeptime.common.Resources.RESOURCE;
36-
import de.doubleslash.keeptime.controller.Controller;
3736
import de.doubleslash.keeptime.model.Model;
3837
import de.doubleslash.keeptime.model.Project;
3938
import de.doubleslash.keeptime.model.Settings;
@@ -74,7 +73,6 @@ public class Main extends Application {
7473
private Stage popupViewStage;
7574

7675
private Model model;
77-
private Controller controller;
7876

7977
private ViewController viewController;
8078

@@ -89,7 +87,7 @@ public void init() throws Exception {
8987
springContext = SpringApplication.run(Main.class);
9088
// TODO test if everywhere is used the same model
9189
model = springContext.getBean(Model.class);
92-
controller = springContext.getBean(Controller.class);
90+
model.setSpringContext(springContext);
9391
}
9492

9593
@Override
@@ -201,6 +199,7 @@ private void readSettings() {
201199
model.useHotkey.set(settings.isUseHotkey());
202200
model.displayProjectsRight.set(settings.isDisplayProjectsRight());
203201
model.hideProjectsOnMouseExit.set(settings.isHideProjectsOnMouseExit());
202+
model.remindIfNotesAreEmpty.set(settings.isRemindIfNotesAreEmpty());
204203
}
205204

206205
private void initialisePopupUI(final Stage primaryStage) throws IOException {
@@ -216,6 +215,7 @@ private void initialisePopupUI(final Stage primaryStage) throws IOException {
216215
// Load root layout from fxml file.
217216
final FXMLLoader loader = new FXMLLoader();
218217
loader.setLocation(Resources.getResource(RESOURCE.FXML_VIEW_POPUP_LAYOUT));
218+
loader.setControllerFactory(springContext::getBean);
219219
final Parent popupLayout = loader.load();
220220
popupViewStage.initStyle(StageStyle.TRANSPARENT);
221221
// Show the scene containing the root layout.
@@ -227,8 +227,6 @@ private void initialisePopupUI(final Stage primaryStage) throws IOException {
227227
popupViewStage.setAlwaysOnTop(true);
228228
final ViewControllerPopup viewControllerPopupController = loader.getController();
229229
viewControllerPopupController.setStage(popupViewStage);
230-
viewControllerPopupController.setControllerAndModel(controller, model);
231-
viewControllerPopupController.secondInitialize();
232230

233231
globalScreenListener.setViewController(viewControllerPopupController);
234232
}
@@ -264,8 +262,6 @@ public void handle(final WindowEvent event) {
264262
viewController = loader.getController();
265263
// Give the controller access to the main app.
266264
viewController.setStage(primaryStage);
267-
viewController.setController(controller, model);
268-
viewController.secondInitialize();
269265

270266
}
271267

src/main/java/de/doubleslash/keeptime/controller/Controller.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ public void addNewProject(final Project project) {
121121

122122
public void updateSettings(final Color hoverBackgroundColor, final Color hoverFontColor,
123123
final Color defaultBackgroundColor, final Color defaultFontColor, final Color taskBarColor,
124-
final boolean useHotkey, final boolean displayProjectsRight, final boolean hideProjectsOnMouseExit) {
124+
final boolean useHotkey, final boolean displayProjectsRight, final boolean hideProjectsOnMouseExit,
125+
final boolean emptyNoteReminder) {
125126
// TODO create holder for all the properties (or reuse Settings.class?)
126127
final Settings settings = model.getSettingsRepository().findAll().get(0);
127128
settings.setTaskBarColor(taskBarColor);
@@ -134,6 +135,7 @@ public void updateSettings(final Color hoverBackgroundColor, final Color hoverFo
134135
settings.setUseHotkey(useHotkey);
135136
settings.setDisplayProjectsRight(displayProjectsRight);
136137
settings.setHideProjectsOnMouseExit(hideProjectsOnMouseExit);
138+
settings.setRemindIfNotesAreEmpty(emptyNoteReminder);
137139

138140
model.getSettingsRepository().save(settings);
139141

@@ -145,6 +147,7 @@ public void updateSettings(final Color hoverBackgroundColor, final Color hoverFo
145147
model.useHotkey.set(settings.isUseHotkey());
146148
model.displayProjectsRight.set(settings.isDisplayProjectsRight());
147149
model.hideProjectsOnMouseExit.set(settings.isHideProjectsOnMouseExit());
150+
model.remindIfNotesAreEmpty.set(settings.isRemindIfNotesAreEmpty());
148151
}
149152

150153
@PreDestroy
@@ -222,17 +225,24 @@ public void editWork(final Work workToBeEdited, final Work newValuedWork) {
222225

223226
}
224227

228+
public void deleteWork(final Work workToBeDeleted) {
229+
LOG.info("Deleting work '{}'.", workToBeDeleted);
230+
231+
model.getPastWorkItems().removeIf(w -> (w.getId() == workToBeDeleted.getId()));
232+
model.getWorkRepository().delete(workToBeDeleted);
233+
}
234+
225235
/**
226236
* Changes the indexes of the originalList parameter to have a consistent order.
227237
*
228238
* @param originalList
229-
* list of all projects to adapt the indexes for
239+
* list of all projects to adapt the indexes for
230240
* @param changedProject
231-
* the project which has changed which already has the new index
241+
* the project which has changed which already has the new index
232242
* @param oldIndex
233-
* the old index of the changed project
243+
* the old index of the changed project
234244
* @param newIndex
235-
* the new index of the changed project (which the projects also already has)
245+
* the new index of the changed project (which the projects also already has)
236246
* @return all projects whose index has been adapted
237247
*/
238248
List<Project> resortProjectIndexes(final List<Project> originalList, final Project changedProject,
@@ -269,9 +279,9 @@ List<Project> resortProjectIndexes(final List<Project> originalList, final Proje
269279
* Decreases all indexes by one, after the removed index
270280
*
271281
* @param originalList
272-
* list of all projects to adapt the indexes for
282+
* list of all projects to adapt the indexes for
273283
* @param removedIndex
274-
* the index which has been removed
284+
* the index which has been removed
275285
* @return all projects whose index has been adapted
276286
*/
277287
List<Project> adaptProjectIndexesAfterRemoving(final List<Project> originalList, final int removedIndex) {

src/main/java/de/doubleslash/keeptime/model/Model.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ public Model(final ProjectRepository projectRepository, final WorkRepository wor
7979
public final ObjectProperty<Boolean> useHotkey = new SimpleObjectProperty<>(false);
8080
public final ObjectProperty<Boolean> displayProjectsRight = new SimpleObjectProperty<>(false);
8181
public final ObjectProperty<Boolean> hideProjectsOnMouseExit = new SimpleObjectProperty<>(true);
82-
public final ObjectProperty<Boolean> emptyNoteReminder = new SimpleObjectProperty<>(false);
82+
83+
public final ObjectProperty<Boolean> remindIfNotesAreEmpty = new SimpleObjectProperty<>(false);
8384

8485
private ConfigurableApplicationContext springContext;
8586

@@ -146,4 +147,5 @@ public ConfigurableApplicationContext getSpringContext() {
146147
public SortedList<Work> getSortedPastWorkItems() {
147148
return sortedPastWorkItems;
148149
}
150+
149151
}

src/main/java/de/doubleslash/keeptime/model/Settings.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ public class Settings {
5959

6060
private boolean hideProjectsOnMouseExit;
6161

62+
private boolean remindIfNotesAreEmpty;
63+
6264
public long getId() {
6365
return id;
6466
}
@@ -127,4 +129,12 @@ public void setHideProjectsOnMouseExit(final boolean hideProjectsOnMouseExit) {
127129
this.hideProjectsOnMouseExit = hideProjectsOnMouseExit;
128130
}
129131

132+
public boolean isRemindIfNotesAreEmpty() {
133+
return remindIfNotesAreEmpty;
134+
}
135+
136+
public void setRemindIfNotesAreEmpty(final boolean emptyNoteReminder) {
137+
this.remindIfNotesAreEmpty = emptyNoteReminder;
138+
}
139+
130140
}

src/main/java/de/doubleslash/keeptime/view/AboutController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import org.slf4j.Logger;
2222
import org.slf4j.LoggerFactory;
23+
import org.springframework.stereotype.Component;
2324

2425
import de.doubleslash.keeptime.Main;
2526
import de.doubleslash.keeptime.common.BrowserHelper;
@@ -42,6 +43,7 @@
4243
import javafx.scene.layout.Region;
4344
import javafx.scene.paint.Color;
4445

46+
@Component
4547
public class AboutController {
4648

4749
private static final String GITHUB_PAGE = "https://www.github.com/doubleSlashde/KeepTime";

src/main/java/de/doubleslash/keeptime/view/ManageProjectController.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import org.slf4j.Logger;
2020
import org.slf4j.LoggerFactory;
21+
import org.springframework.beans.factory.annotation.Autowired;
22+
import org.springframework.stereotype.Component;
2123

2224
import de.doubleslash.keeptime.model.Model;
2325
import de.doubleslash.keeptime.model.Project;
@@ -30,11 +32,12 @@
3032
import javafx.scene.control.TextField;
3133
import javafx.scene.layout.GridPane;
3234

35+
@Component
3336
public class ManageProjectController {
3437

3538
private static final Logger LOG = LoggerFactory.getLogger(ManageProjectController.class);
3639

37-
private Model model;
40+
private final Model model;
3841

3942
@FXML
4043
private GridPane grid;
@@ -54,17 +57,17 @@ public class ManageProjectController {
5457
@FXML
5558
private Spinner<Integer> sortIndexSpinner;
5659

57-
public void setModel(final Model model) {
60+
@Autowired
61+
public ManageProjectController(final Model model) {
5862
this.model = model;
5963
}
6064

61-
public void secondInitialize() {
62-
if (model != null) {
63-
final int availableProjectAmount = model.getAllProjects().size();
64-
sortIndexSpinner
65-
.setValueFactory(new IntegerSpinnerValueFactory(0, availableProjectAmount, availableProjectAmount));
66-
sortIndexSpinner.getValueFactory().setValue(model.getAvailableProjects().size());
67-
}
65+
@FXML
66+
private void initialize() {
67+
final int availableProjectAmount = model.getAllProjects().size();
68+
sortIndexSpinner
69+
.setValueFactory(new IntegerSpinnerValueFactory(0, availableProjectAmount, availableProjectAmount));
70+
sortIndexSpinner.getValueFactory().setValue(model.getAvailableProjects().size());
6871
}
6972

7073
public void initializeWith(final Project project) {

src/main/java/de/doubleslash/keeptime/view/ManageWorkController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,9 @@ public void changed(final ObservableValue<? extends String> observable, final St
215215
// needed to avoid exception on empty textfield https://bugs.openjdk.java.net/browse/JDK-8081700
216216
Platform.runLater(() -> {
217217
projectComboBox.hide();
218-
projectComboBox.setItems(model.getAllProjects().filtered(project -> ProjectsListViewController
219-
.doesProjectMatchSearchFilter(projectComboBox.getEditor().getText(), project)));
218+
projectComboBox
219+
.setItems(model.getSortedAvailableProjects().filtered(project -> ProjectsListViewController
220+
.doesProjectMatchSearchFilter(projectComboBox.getEditor().getText(), project)));
220221
if (projectComboBox.getEditor().focusedProperty().get()) {
221222
projectComboBox.show();
222223
}

src/main/java/de/doubleslash/keeptime/view/ProjectsListViewController.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import de.doubleslash.keeptime.exceptions.FXMLLoaderException;
3535
import de.doubleslash.keeptime.model.Model;
3636
import de.doubleslash.keeptime.model.Project;
37+
import de.doubleslash.keeptime.model.Work;
3738
import javafx.collections.transformation.FilteredList;
3839
import javafx.fxml.FXMLLoader;
3940
import javafx.scene.Node;
@@ -49,6 +50,7 @@
4950
import javafx.scene.control.MultipleSelectionModel;
5051
import javafx.scene.control.SelectionMode;
5152
import javafx.scene.control.TextField;
53+
import javafx.scene.control.TextInputDialog;
5254
import javafx.scene.control.Tooltip;
5355
import javafx.scene.effect.Bloom;
5456
import javafx.scene.input.MouseButton;
@@ -165,7 +167,27 @@ private void changeProject(final Project newProject, final long minusSeconds) {
165167
if (hideable) {
166168
mainStage.hide();
167169
}
170+
if (model.remindIfNotesAreEmpty.get()) {
171+
final Work currentWork = model.activeWorkItem.get();
172+
if (currentWork != null && currentWork.getNotes().isEmpty()) {
173+
final TextInputDialog noteDialog = new TextInputDialog();
174+
noteDialog.setTitle("Empty Notes");
175+
noteDialog.setHeaderText("Switch projects without notes?");
176+
noteDialog.setContentText(
177+
"What did you do for project '" + model.activeWorkItem.get().getProject().getName() + "' ?");
178+
noteDialog.initOwner(mainStage);
179+
180+
final Optional<String> result = noteDialog.showAndWait();
181+
if (result.isPresent()) {
182+
currentWork.setNotes(result.get());
183+
} else {
184+
// cancel pressed
185+
return;
186+
}
187+
}
188+
}
168189
controller.changeProject(newProject, minusSeconds);
190+
169191
}
170192

171193
private void addProjectToProjectSelectionNodeMap(final Project project) {
@@ -187,6 +209,7 @@ private Node createListEntryForProject(final Project p) {
187209

188210
final FXMLLoader loader = new FXMLLoader();
189211
loader.setLocation(Resources.getResource(RESOURCE.FXML_PROJECT_LAYOUT));
212+
loader.setControllerFactory(model.getSpringContext()::getBean);
190213
Pane projectElement;
191214
try {
192215
projectElement = loader.load();
@@ -332,14 +355,13 @@ private Dialog<Project> setupEditProjectDialog(final String title, final String
332355
private GridPane setUpEditProjectGridPane(final Project p, final Dialog<Project> dialog) {
333356
GridPane grid;
334357
final FXMLLoader loader = new FXMLLoader(Resources.getResource(RESOURCE.FXML_MANAGE_PROJECT));
358+
loader.setControllerFactory(model.getSpringContext()::getBean);
335359
try {
336360
grid = loader.load();
337361
} catch (final IOException e) {
338362
throw new FXMLLoaderException("Error while loading '" + Resources.RESOURCE.FXML_MANAGE_PROJECT + "'.", e);
339363
}
340364
final ManageProjectController manageProjectController = loader.getController();
341-
manageProjectController.setModel(model);
342-
manageProjectController.secondInitialize();
343365
manageProjectController.initializeWith(p);
344366

345367
dialog.setResultConverter(dialogButton -> {

0 commit comments

Comments
 (0)