Skip to content

Commit eb5f80d

Browse files
committed
changed all View Controllers to use Dependency Injection for Model and Controller
1 parent 4fa50bf commit eb5f80d

File tree

10 files changed

+113
-94
lines changed

10 files changed

+113
-94
lines changed

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

Lines changed: 2 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
@@ -215,6 +213,7 @@ private void initialisePopupUI(final Stage primaryStage) throws IOException {
215213
// Load root layout from fxml file.
216214
final FXMLLoader loader = new FXMLLoader();
217215
loader.setLocation(Resources.getResource(RESOURCE.FXML_VIEW_POPUP_LAYOUT));
216+
loader.setControllerFactory(springContext::getBean);
218217
final Parent popupLayout = loader.load();
219218
popupViewStage.initStyle(StageStyle.TRANSPARENT);
220219
// Show the scene containing the root layout.
@@ -226,8 +225,6 @@ private void initialisePopupUI(final Stage primaryStage) throws IOException {
226225
popupViewStage.setAlwaysOnTop(true);
227226
final ViewControllerPopup viewControllerPopupController = loader.getController();
228227
viewControllerPopupController.setStage(popupViewStage);
229-
viewControllerPopupController.setControllerAndModel(controller, model);
230-
viewControllerPopupController.secondInitialize();
231228

232229
globalScreenListener.setViewController(viewControllerPopupController);
233230
}
@@ -264,8 +261,6 @@ public void handle(final WindowEvent event) {
264261
viewController = loader.getController();
265262
// Give the controller access to the main app.
266263
viewController.setStage(primaryStage);
267-
viewController.setController(controller, model);
268-
viewController.secondInitialize();
269264

270265
}
271266

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,13 +188,13 @@ public void editProject(final Project projectToBeUpdated, final Project newValue
188188
* Changes the indexes of the originalList parameter to have a consistent order.
189189
*
190190
* @param originalList
191-
* list of all projects to adapt the indexes for
191+
* list of all projects to adapt the indexes for
192192
* @param changedProject
193-
* the project which has changed which already has the new index
193+
* the project which has changed which already has the new index
194194
* @param oldIndex
195-
* the old index of the changed project
195+
* the old index of the changed project
196196
* @param newIndex
197-
* the new index of the changed project (which the projects also already has)
197+
* the new index of the changed project (which the projects also already has)
198198
* @return all projects whose index has been adapted
199199
*/
200200
List<Project> resortProjectIndexes(final List<Project> originalList, final Project changedProject,
@@ -231,9 +231,9 @@ List<Project> resortProjectIndexes(final List<Project> originalList, final Proje
231231
* Decreases all indexes by one, after the removed index
232232
*
233233
* @param originalList
234-
* list of all projects to adapt the indexes for
234+
* list of all projects to adapt the indexes for
235235
* @param removedIndex
236-
* the index which has been removed
236+
* the index which has been removed
237237
* @return all projects whose index has been adapted
238238
*/
239239
List<Project> adaptProjectIndexesAfterRemoving(final List<Project> originalList, final int removedIndex) {

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.Comparator;
2020

2121
import org.springframework.beans.factory.annotation.Autowired;
22+
import org.springframework.context.ConfigurableApplicationContext;
2223
import org.springframework.stereotype.Component;
2324

2425
import de.doubleslash.keeptime.model.repos.ProjectRepository;
@@ -77,6 +78,8 @@ public Model(final ProjectRepository projectRepository, final WorkRepository wor
7778
public final ObjectProperty<Boolean> displayProjectsRight = new SimpleObjectProperty<>(false);
7879
public final ObjectProperty<Boolean> hideProjectsOnMouseExit = new SimpleObjectProperty<>(true);
7980

81+
private ConfigurableApplicationContext springContext;
82+
8083
public void setWorkRepository(final WorkRepository workRepository) {
8184
this.workRepository = workRepository;
8285
}
@@ -128,4 +131,12 @@ public ObservableList<Project> getAvailableProjects() {
128131
public ObservableList<Project> getAllProjects() {
129132
return allProjects;
130133
}
134+
135+
public void setSpringContext(final ConfigurableApplicationContext springContext) {
136+
this.springContext = springContext;
137+
}
138+
139+
public ConfigurableApplicationContext getSpringContext() {
140+
return this.springContext;
141+
}
131142
}

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

Lines changed: 3 additions & 1 deletion
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";
@@ -154,7 +156,7 @@ private void showLicense(final Licenses license) {
154156
alert.setContentText(String.format(
155157
"We could not find the license file at \"%s\". Did you remove it?%nPlease redownload or visit \"%s\".",
156158
license.getPath(), license.getUrl()));
157-
159+
158160
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
159161

160162
alert.show();

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/ProjectsListViewController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ private Node createListEntryForProject(final Project p) {
187187

188188
final FXMLLoader loader = new FXMLLoader();
189189
loader.setLocation(Resources.getResource(RESOURCE.FXML_PROJECT_LAYOUT));
190+
loader.setControllerFactory(model.getSpringContext()::getBean);
190191
Pane projectElement;
191192
try {
192193
projectElement = loader.load();
@@ -332,14 +333,13 @@ private Dialog<Project> setupEditProjectDialog(final String title, final String
332333
private GridPane setUpEditProjectGridPane(final Project p, final Dialog<Project> dialog) {
333334
GridPane grid;
334335
final FXMLLoader loader = new FXMLLoader(Resources.getResource(RESOURCE.FXML_MANAGE_PROJECT));
336+
loader.setControllerFactory(model.getSpringContext()::getBean);
335337
try {
336338
grid = loader.load();
337339
} catch (final IOException e) {
338340
throw new FXMLLoaderException("Error while loading '" + Resources.RESOURCE.FXML_MANAGE_PROJECT + "'.", e);
339341
}
340342
final ManageProjectController manageProjectController = loader.getController();
341-
manageProjectController.setModel(model);
342-
manageProjectController.secondInitialize();
343343
manageProjectController.initializeWith(p);
344344

345345
dialog.setResultConverter(dialogButton -> {

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

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
import org.slf4j.Logger;
2727
import org.slf4j.LoggerFactory;
28+
import org.springframework.beans.factory.annotation.Autowired;
29+
import org.springframework.stereotype.Component;
2830

2931
import com.sun.javafx.scene.control.skin.DatePickerSkin;
3032

@@ -55,6 +57,7 @@
5557
import javafx.scene.shape.Circle;
5658
import javafx.util.Callback;
5759

60+
@Component
5861
public class ReportController {
5962

6063
public static final String NOTE_DELIMETER = "; ";
@@ -89,12 +92,18 @@ public class ReportController {
8992

9093
private DatePicker datePicker; // for calendar element
9194

92-
private Model model;
95+
private final Model model;
9396

94-
private Controller controller;
97+
private final Controller controller;
9598

9699
private ColorTimeLine colorTimeLine;
97100

101+
@Autowired
102+
public ReportController(final Model model, final Controller controller) {
103+
this.model = model;
104+
this.controller = controller;
105+
}
106+
98107
@FXML
99108
private void initialize() {
100109
LOG.info("Init reportController");
@@ -106,6 +115,24 @@ private void initialize() {
106115
});
107116

108117
colorTimeLine = new ColorTimeLine(colorTimeLineCanvas);
118+
119+
// HACK to show calendar from datepicker
120+
// https://stackoverflow.com/questions/34681975/javafx-extract-calendar-popup-from-datepicker-only-show-popup
121+
final DatePickerSkin datePickerSkin = new DatePickerSkin(datePicker);
122+
final Callback<DatePicker, DateCell> dayCellFactory = callback -> new DateCell() {
123+
@Override
124+
public void updateItem(final LocalDate item, final boolean empty) {
125+
super.updateItem(item, empty);
126+
if (model.getWorkRepository().findByCreationDate(item).isEmpty()) {
127+
setDisable(true);
128+
setStyle(FX_BACKGROUND_COLOR_NOT_WORKED);
129+
}
130+
}
131+
};
132+
133+
this.datePicker.setDayCellFactory(dayCellFactory);
134+
final Node popupContent = datePickerSkin.getPopupContent();
135+
this.topBorderPane.setRight(popupContent);
109136
}
110137

111138
private void updateReport(final LocalDate dateToShow) {
@@ -219,33 +246,8 @@ public void handle(final ActionEvent event) {
219246
return bProjectReport;
220247
}
221248

222-
public void setModel(final Model model) {
223-
this.model = model;
224-
225-
// HACK to show calendar from datepicker
226-
// https://stackoverflow.com/questions/34681975/javafx-extract-calendar-popup-from-datepicker-only-show-popup
227-
final DatePickerSkin datePickerSkin = new DatePickerSkin(datePicker);
228-
final Callback<DatePicker, DateCell> dayCellFactory = callback -> new DateCell() {
229-
@Override
230-
public void updateItem(final LocalDate item, final boolean empty) {
231-
super.updateItem(item, empty);
232-
if (model.getWorkRepository().findByCreationDate(item).isEmpty()) {
233-
setDisable(true);
234-
setStyle(FX_BACKGROUND_COLOR_NOT_WORKED);
235-
}
236-
}
237-
};
238-
239-
this.datePicker.setDayCellFactory(dayCellFactory);
240-
final Node popupContent = datePickerSkin.getPopupContent();
241-
this.topBorderPane.setRight(popupContent);
242-
}
243-
244249
public void update() {
245250
updateReport(this.datePicker.getValue());
246251
}
247252

248-
public void setController(final Controller controller) {
249-
this.controller = controller;
250-
}
251253
}

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
import org.slf4j.Logger;
2222
import org.slf4j.LoggerFactory;
23+
import org.springframework.beans.factory.annotation.Autowired;
24+
import org.springframework.stereotype.Component;
2325

2426
import de.doubleslash.keeptime.common.OS;
2527
import de.doubleslash.keeptime.common.Resources;
@@ -43,6 +45,7 @@
4345
import javafx.stage.Modality;
4446
import javafx.stage.Stage;
4547

48+
@Component
4649
public class SettingsController {
4750

4851
@FXML
@@ -95,13 +98,19 @@ public class SettingsController {
9598

9699
private static final Logger LOG = LoggerFactory.getLogger(SettingsController.class);
97100

98-
private Controller controller;
99-
private Model model;
101+
private final Controller controller;
102+
private final Model model;
100103

101104
private Stage thisStage;
102105

103106
private Stage aboutStage;
104107

108+
@Autowired
109+
public SettingsController(final Model model, final Controller controller) {
110+
this.model = model;
111+
this.controller = controller;
112+
}
113+
105114
@FXML
106115
private void initialize() {
107116
LOG.debug("start init");
@@ -191,12 +200,6 @@ private void initialize() {
191200
});
192201
}
193202

194-
public void setControllerAndModel(final Controller controller, final Model model) {
195-
this.controller = controller;
196-
this.model = model;
197-
update();
198-
}
199-
200203
void update() {
201204
// needed to close stage on esc
202205
settingsRoot.requestFocus();
@@ -223,6 +226,7 @@ private void loadAboutStage() {
223226
// About stage
224227
LOG.debug("load about.fxml");
225228
final FXMLLoader fxmlLoader3 = createFXMLLoader(RESOURCE.FXML_ABOUT);
229+
fxmlLoader3.setControllerFactory(model.getSpringContext()::getBean);
226230
LOG.debug("load root");
227231
final Parent rootAbout = fxmlLoader3.load();
228232
LOG.debug("set stage");

0 commit comments

Comments
 (0)