Skip to content

Commit 15de11a

Browse files
author
Martin Plieske
committed
refactored changeWithTimeDialog
put it in a dedicated class
1 parent 625fa2e commit 15de11a

File tree

2 files changed

+180
-129
lines changed

2 files changed

+180
-129
lines changed
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
package de.doubleslash.keeptime.view;
2+
3+
import java.util.Optional;
4+
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
8+
import de.doubleslash.keeptime.common.DateFormatter;
9+
import de.doubleslash.keeptime.model.Model;
10+
import de.doubleslash.keeptime.model.Project;
11+
import javafx.beans.binding.Bindings;
12+
import javafx.beans.property.LongProperty;
13+
import javafx.geometry.Insets;
14+
import javafx.scene.control.Button;
15+
import javafx.scene.control.ButtonType;
16+
import javafx.scene.control.Dialog;
17+
import javafx.scene.control.Label;
18+
import javafx.scene.control.Slider;
19+
import javafx.scene.input.KeyCode;
20+
import javafx.scene.layout.GridPane;
21+
import javafx.scene.layout.VBox;
22+
23+
public class ChangeWithTimeDialog {
24+
25+
private static final Logger LOG = LoggerFactory.getLogger(ChangeWithTimeDialog.class);
26+
private static final String TIME_ZERO = "00:00:00";
27+
28+
private LongProperty activeWorkSecondsProperty;
29+
private Model model;
30+
private Dialog<Integer> dialog;
31+
private boolean ctrlIsPressed = false;
32+
33+
public void setUpDialog(final Project p) {
34+
35+
LOG.info("Change with time");
36+
dialog = new Dialog<>();
37+
dialog.setTitle("Change project with time transfer");
38+
dialog.setHeaderText("Choose the time to transfer");
39+
dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
40+
final Button okButton = (Button) dialog.getDialogPane().lookupButton(ButtonType.OK);
41+
okButton.setDefaultButton(true);
42+
final Button cancelButton = (Button) dialog.getDialogPane().lookupButton(ButtonType.CANCEL);
43+
cancelButton.setDefaultButton(false);
44+
45+
final VBox vBox = new VBox();
46+
final Label description = new Label(
47+
"Choose the amount of minutes to transfer from the active project to the new project");
48+
description.setWrapText(true);
49+
vBox.getChildren().add(description);
50+
51+
final GridPane grid = new GridPane();
52+
grid.setHgap(10);
53+
grid.setVgap(10);
54+
grid.setPadding(new Insets(20, 150, 10, 10));
55+
int gridRow = 0;
56+
grid.add(new Label("Minutes to transfer"), 0, gridRow);
57+
final Slider slider = setUpSliderChangeWithTimeMenuItem(activeWorkSecondsProperty);
58+
59+
okButton.setOnKeyPressed(ke -> slider.requestFocus());
60+
61+
grid.add(slider, 1, gridRow);
62+
final Label minutesToTransferLabel = new Label("999 minute(s)");
63+
grid.add(minutesToTransferLabel, 2, gridRow);
64+
gridRow++;
65+
66+
grid.add(new Label("New time distribution"), 0, gridRow);
67+
gridRow++;
68+
grid.add(new Label("Active project duration: " + model.activeWorkItem.get().getProject().getName()), 0, gridRow);
69+
final Label currentProjectTimeLabel = new Label(TIME_ZERO);
70+
grid.add(currentProjectTimeLabel, 1, gridRow);
71+
gridRow++;
72+
73+
grid.add(new Label("New end and start time:"), 0, gridRow);
74+
final Label newEndTimeLabel = new Label(TIME_ZERO);
75+
grid.add(newEndTimeLabel, 1, gridRow);
76+
gridRow++;
77+
78+
grid.add(new Label("New project duration: " + p.getName()), 0, gridRow);
79+
final Label newProjectTimeLabel = new Label(TIME_ZERO);
80+
grid.add(newProjectTimeLabel, 1, gridRow);
81+
gridRow++;
82+
83+
final Runnable updateLabelsRunnable = () -> {
84+
final long minutesOffset = slider.valueProperty().longValue();
85+
final long secondsOffset = minutesOffset * 60;
86+
87+
final long secondsActiveWork = activeWorkSecondsProperty.get() - secondsOffset;
88+
final long secondsNewWork = 0 + secondsOffset;
89+
minutesToTransferLabel.setText(minutesOffset + " minute(s)");
90+
currentProjectTimeLabel.setText(DateFormatter.secondsToHHMMSS(secondsActiveWork));
91+
newProjectTimeLabel.setText(DateFormatter.secondsToHHMMSS(secondsNewWork));
92+
newEndTimeLabel.setText(
93+
DateFormatter.toTimeString(model.activeWorkItem.get().getEndTime().minusSeconds(secondsOffset)));
94+
};
95+
activeWorkSecondsProperty.addListener((obs, oldValue, newValue) -> updateLabelsRunnable.run());
96+
slider.valueProperty().addListener((obs, oldValue, newValue) -> updateLabelsRunnable.run());
97+
vBox.getChildren().add(grid);
98+
99+
dialog.getDialogPane().setContent(vBox);
100+
101+
dialog.setResultConverter(dialogButton -> {
102+
if (dialogButton == ButtonType.OK) {
103+
return slider.valueProperty().intValue() * 60;
104+
}
105+
return null;
106+
});
107+
108+
}
109+
110+
public Optional<Integer> show() {
111+
112+
return dialog.showAndWait();
113+
114+
}
115+
116+
public void setModel(final Model model) {
117+
this.model = model;
118+
}
119+
120+
public void setActiveWorkSecondsProperty(final LongProperty activeWorkSecondsProperty) {
121+
this.activeWorkSecondsProperty = activeWorkSecondsProperty;
122+
}
123+
124+
private Slider setUpSliderChangeWithTimeMenuItem(final LongProperty activeWorkSecondsProperty) {
125+
final Slider slider = new Slider();
126+
127+
slider.setMin(0);
128+
slider.maxProperty().bind(Bindings.createLongBinding(() -> {
129+
final long maxValue = activeWorkSecondsProperty.longValue() / 60;
130+
if (maxValue > 0) {
131+
slider.setDisable(false);
132+
return maxValue;
133+
}
134+
slider.setDisable(true);
135+
return 1l;
136+
}, activeWorkSecondsProperty));
137+
slider.setValue(0);
138+
slider.setShowTickLabels(true);
139+
slider.setShowTickMarks(true);
140+
slider.setMajorTickUnit(60);
141+
slider.setMinorTickCount(58);
142+
slider.setBlockIncrement(1);
143+
slider.setSnapToTicks(true);
144+
slider.setFocusTraversable(true);
145+
146+
slider.setOnKeyPressed(ke -> {
147+
if (!slider.isFocused()) {
148+
slider.requestFocus();
149+
}
150+
151+
if (ke.getCode() == KeyCode.CONTROL) {
152+
ctrlIsPressed = true;
153+
}
154+
155+
if (ke.getCode() == KeyCode.LEFT && ctrlIsPressed) {
156+
slider.adjustValue(slider.getValue() - 5);
157+
}
158+
159+
if (ke.getCode() == KeyCode.RIGHT && ctrlIsPressed) {
160+
slider.adjustValue(slider.getValue() + 5);
161+
}
162+
163+
});
164+
165+
slider.setOnKeyReleased(ke -> {
166+
if (ke.getCode() == KeyCode.CONTROL) {
167+
ctrlIsPressed = false;
168+
}
169+
});
170+
171+
return slider;
172+
}
173+
174+
}

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

Lines changed: 6 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@
7272
import javafx.scene.control.Dialog;
7373
import javafx.scene.control.Label;
7474
import javafx.scene.control.MenuItem;
75-
import javafx.scene.control.Slider;
7675
import javafx.scene.control.Spinner;
7776
import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory;
7877
import javafx.scene.control.TextArea;
@@ -189,7 +188,7 @@ public void changeProject(final Project newProject, final long minusSeconds) {
189188

190189
private Map<Project, Node> projectSelectionNodeMap;
191190

192-
private boolean ctrlIsPressed = false;
191+
private final boolean ctrlIsPressed = false;
193192

194193
@FXML
195194
private void initialize() {
@@ -555,109 +554,11 @@ private Node addProjectToProjectList(final Project p) {
555554

556555
final MenuItem changeWithTimeMenuItem = new MenuItem("Change with time");
557556
changeWithTimeMenuItem.setOnAction(e -> {
558-
LOG.info("Change with time");
559-
final Dialog<Integer> dialog = new Dialog<>();
560-
dialog.setTitle("Change project with time transfer");
561-
dialog.setHeaderText("Choose the time to transfer");
562-
dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
563-
final Button okButton = (Button) dialog.getDialogPane().lookupButton(ButtonType.OK);
564-
okButton.setDefaultButton(true);
565-
final Button cancelButton = (Button) dialog.getDialogPane().lookupButton(ButtonType.CANCEL);
566-
cancelButton.setDefaultButton(false);
567-
568-
final VBox vBox = new VBox();
569-
final Label description = new Label(
570-
"Choose the amount of minutes to transfer from the active project to the new project");
571-
description.setWrapText(true);
572-
vBox.getChildren().add(description);
573-
574-
final GridPane grid = new GridPane();
575-
grid.setHgap(10);
576-
grid.setVgap(10);
577-
grid.setPadding(new Insets(20, 150, 10, 10));
578-
int gridRow = 0;
579-
grid.add(new Label("Minutes to transfer"), 0, gridRow);
580-
final Slider slider = setUpSliderChangeWithTimeMenuItem(activeWorkSecondsProperty);
581-
slider.setFocusTraversable(true);
582-
583-
okButton.setOnKeyPressed(ke -> slider.requestFocus());
584-
585-
grid.add(slider, 1, gridRow);
586-
final Label minutesToTransferLabel = new Label("999 minute(s)");
587-
grid.add(minutesToTransferLabel, 2, gridRow);
588-
gridRow++;
589-
590-
grid.add(new Label("New time distribution"), 0, gridRow);
591-
gridRow++;
592-
grid.add(new Label("Active project duration: " + model.activeWorkItem.get().getProject().getName()), 0,
593-
gridRow);
594-
final Label currentProjectTimeLabel = new Label(TIME_ZERO);
595-
grid.add(currentProjectTimeLabel, 1, gridRow);
596-
gridRow++;
597-
598-
grid.add(new Label("New end and start time:"), 0, gridRow);
599-
final Label newEndTimeLabel = new Label(TIME_ZERO);
600-
grid.add(newEndTimeLabel, 1, gridRow);
601-
gridRow++;
602-
603-
grid.add(new Label("New project duration: " + p.getName()), 0, gridRow);
604-
final Label newProjectTimeLabel = new Label(TIME_ZERO);
605-
grid.add(newProjectTimeLabel, 1, gridRow);
606-
gridRow++;
607-
608-
final Runnable updateLabelsRunnable = () -> {
609-
final long minutesOffset = slider.valueProperty().longValue();
610-
final long secondsOffset = minutesOffset * 60;
611-
612-
final long secondsActiveWork = activeWorkSecondsProperty.get() - secondsOffset;
613-
final long secondsNewWork = 0 + secondsOffset;
614-
minutesToTransferLabel.setText(minutesOffset + " minute(s)");
615-
currentProjectTimeLabel.setText(DateFormatter.secondsToHHMMSS(secondsActiveWork));
616-
newProjectTimeLabel.setText(DateFormatter.secondsToHHMMSS(secondsNewWork));
617-
newEndTimeLabel.setText(
618-
DateFormatter.toTimeString(model.activeWorkItem.get().getEndTime().minusSeconds(secondsOffset)));
619-
};
620-
activeWorkSecondsProperty.addListener((obs, oldValue, newValue) -> updateLabelsRunnable.run());
621-
slider.valueProperty().addListener((obs, oldValue, newValue) -> updateLabelsRunnable.run());
622-
vBox.getChildren().add(grid);
623-
624-
dialog.getDialogPane().setContent(vBox);
625-
626-
slider.setOnKeyPressed(ke -> {
627-
if (!slider.isFocused()) {
628-
slider.requestFocus();
629-
}
630-
631-
if (ke.getCode() == KeyCode.CONTROL) {
632-
ctrlIsPressed = true;
633-
}
634-
635-
if (ke.getCode() == KeyCode.LEFT && ctrlIsPressed) {
636-
slider.adjustValue(slider.getValue() - 5);
637-
}
638-
639-
if (ke.getCode() == KeyCode.RIGHT && ctrlIsPressed) {
640-
slider.adjustValue(slider.getValue() + 5);
641-
}
642-
643-
});
644-
645-
slider.setOnKeyReleased(ke -> {
646-
if (ke.getCode() == KeyCode.CONTROL) {
647-
ctrlIsPressed = false;
648-
}
649-
});
650-
651-
dialog.setResultConverter(dialogButton -> {
652-
if (dialogButton == ButtonType.OK) {
653-
return slider.valueProperty().intValue() * 60;
654-
}
655-
return null;
656-
});
657-
mainStage.setAlwaysOnTop(false);
658-
final Optional<Integer> result = dialog.showAndWait();
659-
mainStage.setAlwaysOnTop(true);
660-
557+
final ChangeWithTimeDialog changeWithTimeDialog = new ChangeWithTimeDialog();
558+
changeWithTimeDialog.setModel(model);
559+
changeWithTimeDialog.setActiveWorkSecondsProperty(activeWorkSecondsProperty);
560+
changeWithTimeDialog.setUpDialog(p);
561+
final Optional<Integer> result = changeWithTimeDialog.show();
661562
result.ifPresent(minusSeconds -> changeProject(p, minusSeconds));
662563
});
663564
final MenuItem deleteMenuItem = new MenuItem("Delete");
@@ -722,30 +623,6 @@ private Node addProjectToProjectList(final Project p) {
722623
return projectElement;
723624
}
724625

725-
private Slider setUpSliderChangeWithTimeMenuItem(final LongProperty activeWorkSecondsProperty) {
726-
final Slider slider = new Slider();
727-
728-
slider.setMin(0);
729-
slider.maxProperty().bind(Bindings.createLongBinding(() -> {
730-
final long maxValue = activeWorkSecondsProperty.longValue() / 60;
731-
if (maxValue > 0) {
732-
slider.setDisable(false);
733-
return maxValue;
734-
}
735-
slider.setDisable(true);
736-
return 1l;
737-
}, activeWorkSecondsProperty));
738-
slider.setValue(0);
739-
slider.setShowTickLabels(true);
740-
slider.setShowTickMarks(true);
741-
slider.setMajorTickUnit(60);
742-
slider.setMinorTickCount(58);
743-
slider.setBlockIncrement(1);
744-
slider.setSnapToTicks(true);
745-
746-
return slider;
747-
}
748-
749626
private void editProject(final ObservableList<Node> nodes, final Project p) {
750627
final TextField projectNameTextField = (TextField) nodes.get(1);
751628
final ColorPicker colorPicker = (ColorPicker) nodes.get(3);

0 commit comments

Comments
 (0)