Skip to content

Commit c08df86

Browse files
author
Jan Schraff
committed
Merge branch 'develop' into feature/#38_remember_last_position_on_screen
2 parents 9ba10d9 + 64c01c8 commit c08df86

23 files changed

+515
-232
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: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ public class Main extends Application {
7777
private Stage popupViewStage;
7878

7979
private Model model;
80+
8081
private Controller controller;
8182

8283
private ViewController viewController;
@@ -93,6 +94,7 @@ public void init() throws Exception {
9394
// TODO test if everywhere is used the same model
9495
model = springContext.getBean(Model.class);
9596
controller = springContext.getBean(Controller.class);
97+
model.setSpringContext(springContext);
9698
}
9799

98100
@Override
@@ -208,6 +210,8 @@ private void readSettings() {
208210
model.windowPositionY.set(settings.getWindowPositionY());
209211
model.screenHash.set(settings.getScreenHash());
210212
model.saveWindowPosition.set(settings.isSaveWindowPosition());
213+
model.remindIfNotesAreEmpty.set(settings.isRemindIfNotesAreEmpty());
214+
211215
}
212216

213217
private void initialisePopupUI(final Stage primaryStage) throws IOException {
@@ -223,6 +227,7 @@ private void initialisePopupUI(final Stage primaryStage) throws IOException {
223227
// Load root layout from fxml file.
224228
final FXMLLoader loader = new FXMLLoader();
225229
loader.setLocation(Resources.getResource(RESOURCE.FXML_VIEW_POPUP_LAYOUT));
230+
loader.setControllerFactory(springContext::getBean);
226231
final Parent popupLayout = loader.load();
227232
popupViewStage.initStyle(StageStyle.TRANSPARENT);
228233
// Show the scene containing the root layout.
@@ -234,8 +239,6 @@ private void initialisePopupUI(final Stage primaryStage) throws IOException {
234239
popupViewStage.setAlwaysOnTop(true);
235240
final ViewControllerPopup viewControllerPopupController = loader.getController();
236241
viewControllerPopupController.setStage(popupViewStage);
237-
viewControllerPopupController.setControllerAndModel(controller, model);
238-
viewControllerPopupController.secondInitialize();
239242

240243
globalScreenListener.setViewController(viewControllerPopupController);
241244
}
@@ -263,7 +266,7 @@ public void changed(final ObservableValue<? extends Number> observable, final Nu
263266
model.defaultBackgroundColor.get(), model.defaultFontColor.get(), model.taskBarColor.get(),
264267
model.useHotkey.get(), model.displayProjectsRight.get(), model.hideProjectsOnMouseExit.get(),
265268
model.windowPositionX.get(), model.windowPositionY.get(), model.screenHash.get(),
266-
model.saveWindowPosition.get());
269+
model.saveWindowPosition.get(), model.remindIfNotesAreEmpty.get());
267270

268271
if (observable.equals(primaryStage.xProperty())) {
269272
Screen screen = Screen.getPrimary();
@@ -334,8 +337,6 @@ public void handle(final WindowEvent event) {
334337
viewController = loader.getController();
335338
// Give the controller access to the main app.
336339
viewController.setStage(primaryStage);
337-
viewController.setController(controller, model);
338-
viewController.secondInitialize();
339340

340341
}
341342

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ public void updateSettings(final Settings newValuedSettings) {
116116
settings.setWindowPositionX(newValuedSettings.getWindowPositionX());
117117
settings.setWindowPositionY(newValuedSettings.getWindowPositionY());
118118
settings.setScreenHash(newValuedSettings.getScreenHash());
119+
settings.setRemindIfNotesAreEmpty(newValuedSettings.isRemindIfNotesAreEmpty());
119120

120121
settings = model.getSettingsRepository().save(settings);
121122

@@ -131,6 +132,7 @@ public void updateSettings(final Settings newValuedSettings) {
131132
model.windowPositionX.set(settings.getWindowPositionX());
132133
model.windowPositionY.set(settings.getWindowPositionY());
133134
model.screenHash.set(settings.getScreenHash());
135+
model.remindIfNotesAreEmpty.set(settings.isRemindIfNotesAreEmpty());
134136
}
135137

136138
@PreDestroy
@@ -208,6 +210,13 @@ public void editWork(final Work workToBeEdited, final Work newValuedWork) {
208210

209211
}
210212

213+
public void deleteWork(final Work workToBeDeleted) {
214+
LOG.info("Deleting work '{}'.", workToBeDeleted);
215+
216+
model.getPastWorkItems().removeIf(w -> (w.getId() == workToBeDeleted.getId()));
217+
model.getWorkRepository().delete(workToBeDeleted);
218+
}
219+
211220
/**
212221
* Changes the indexes of the originalList parameter to have a consistent order.
213222
*

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

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

8586
public final ObjectProperty<Boolean> saveWindowPosition = new SimpleObjectProperty<>(false);
8687
public final ObjectProperty<Double> windowPositionY = new SimpleObjectProperty<>(0.5);
@@ -174,4 +175,5 @@ public ConfigurableApplicationContext getSpringContext() {
174175
public SortedList<Work> getSortedPastWorkItems() {
175176
return sortedPastWorkItems;
176177
}
178+
177179
}

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ public Settings() {
7373
public Settings(final Color hoverBackgroundColor, final Color hoverFontColor, final Color defaultBackgroundColor,
7474
final Color defaultFontColor, final Color taskBarColor, final boolean useHotkey,
7575
final boolean displayProjectsRight, final boolean hideProjectsOnMouseExit, final double windowPositionX,
76-
final double windowPositionY, final int screenHash, final boolean saveWindowPosition) {
76+
final double windowPositionY, final int screenHash, final boolean saveWindowPosition,
77+
final boolean remindIfNotesAreEmpty) {
7778
this.hoverBackgroundColor = hoverBackgroundColor;
7879
this.hoverFontColor = hoverFontColor;
7980
this.defaultBackgroundColor = defaultBackgroundColor;
@@ -86,9 +87,12 @@ public Settings(final Color hoverBackgroundColor, final Color hoverFontColor, fi
8687
this.windowPositionY = windowPositionY;
8788
this.screenHash = screenHash;
8889
this.saveWindowPosition = saveWindowPosition;
90+
this.remindIfNotesAreEmpty = remindIfNotesAreEmpty;
8991

9092
}
9193

94+
private boolean remindIfNotesAreEmpty;
95+
9296
public long getId() {
9397
return id;
9498
}
@@ -189,4 +193,12 @@ public void setSaveWindowPosition(final boolean saveWindowPosition) {
189193
this.saveWindowPosition = saveWindowPosition;
190194
}
191195

196+
public boolean isRemindIfNotesAreEmpty() {
197+
return remindIfNotesAreEmpty;
198+
}
199+
200+
public void setRemindIfNotesAreEmpty(final boolean emptyNoteReminder) {
201+
this.remindIfNotesAreEmpty = emptyNoteReminder;
202+
}
203+
192204
}

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)