Skip to content

Commit ba5e2df

Browse files
author
Jan Schraff
committed
Merge branch 'develop' into feature/save_active_work_item_periodically
2 parents 09f293c + 7de41f8 commit ba5e2df

File tree

4 files changed

+90
-27
lines changed

4 files changed

+90
-27
lines changed

pom.xml

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,22 @@
3232
</parent>
3333

3434
<repositories>
35-
<!-- Including for fontawesome -->
35+
36+
<!-- Including for fontawesome-->
3637
<repository>
3738
<id>fontawesomefx-repo</id>
3839
<name>FontAwesome Repository</name>
39-
<url>https://bintray.com/jerady/maven/FontAwesomeFX</url>
40+
<url>https://dl.bintray.com/jerady/maven</url>
4041
</repository>
41-
</repositories>
42+
43+
<!-- needed to resolve against central first-->
44+
<repository>
45+
<id>central</id>
46+
<name>Maven Central</name>
47+
<layout>default</layout>
48+
<url>https://repo1.maven.org/maven2</url>
49+
</repository>
50+
</repositories>
4251

4352
<properties>
4453
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

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

Lines changed: 70 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import org.slf4j.Logger;
2525
import org.slf4j.LoggerFactory;
2626

27+
import com.sun.javafx.scene.control.skin.ComboBoxListViewSkin;
28+
2729
import de.doubleslash.keeptime.common.ColorHelper;
2830
import de.doubleslash.keeptime.common.StyleUtils;
2931
import de.doubleslash.keeptime.model.Model;
@@ -33,14 +35,19 @@
3335
import javafx.beans.property.StringProperty;
3436
import javafx.beans.value.ChangeListener;
3537
import javafx.beans.value.ObservableValue;
38+
import javafx.collections.transformation.FilteredList;
3639
import javafx.fxml.FXML;
3740
import javafx.scene.Node;
3841
import javafx.scene.control.ComboBox;
3942
import javafx.scene.control.DatePicker;
4043
import javafx.scene.control.ListCell;
44+
import javafx.scene.control.ListView;
4145
import javafx.scene.control.Spinner;
4246
import javafx.scene.control.SpinnerValueFactory;
4347
import javafx.scene.control.TextArea;
48+
import javafx.scene.input.KeyCode;
49+
import javafx.scene.input.KeyCodeCombination;
50+
import javafx.scene.input.KeyEvent;
4451
import javafx.scene.layout.GridPane;
4552
import javafx.scene.paint.Color;
4653
import javafx.util.StringConverter;
@@ -76,9 +83,12 @@ public class ManageWorkController {
7683
private boolean comboChange;
7784
private Project selectedProject;
7885

86+
private FilteredList<Project> filteredList;
87+
7988
public void setModel(final Model model) {
8089
this.model = model;
81-
projectComboBox.setItems(model.getSortedAvailableProjects());
90+
filteredList = new FilteredList<>(model.getSortedAvailableProjects());
91+
projectComboBox.setItems(filteredList);
8292
}
8393

8494
@FXML
@@ -90,19 +100,19 @@ private void initialize() {
90100

91101
setProjectUpComboBox();
92102

103+
Platform.runLater(() -> projectComboBox.requestFocus());
93104
}
94105

95106
private void setUpTimeSpinner(final Spinner<LocalTime> spinner) {
96-
spinner.getEditor().textProperty().addListener((observable, oldValue, newValue) -> {
107+
spinner.focusedProperty().addListener((e) -> {
97108
final LocalTimeStringConverter stringConverter = new LocalTimeStringConverter(FormatStyle.MEDIUM);
98-
final StringProperty text = (StringProperty) observable;
109+
final StringProperty text = spinner.getEditor().textProperty();
99110
try {
100-
stringConverter.fromString(newValue);
101-
text.setValue(newValue);
111+
stringConverter.fromString(text.get());
102112
// needed to log in value from editor to spinner
103113
spinner.increment(0); // TODO find better Solution
104-
} catch (final DateTimeParseException e) {
105-
text.setValue(oldValue);
114+
} catch (final DateTimeParseException ex) {
115+
text.setValue(spinner.getValue().toString());
106116
}
107117
});
108118

@@ -146,8 +156,11 @@ protected void updateItem(final Project project, final boolean empty) {
146156
if (project == null || empty) {
147157
setGraphic(null);
148158
} else {
149-
setColor(this, project.getColor());
159+
setColor(this, model.hoverBackgroundColor.get());
160+
161+
setTextFill(project.getColor());
150162
setText(project.getName());
163+
151164
setUnderline(project.isWork());
152165
}
153166
}
@@ -184,16 +197,17 @@ public Project fromString(final String string) {
184197
comboChange = true;
185198
// needed to avoid exception on empty textfield https://bugs.openjdk.java.net/browse/JDK-8081700
186199
Platform.runLater(() -> {
187-
projectComboBox.getEditor().selectAll();
188-
setColor(projectComboBox, newValue.getColor());
200+
setTextColor(projectComboBox.getEditor(), newValue.getColor());
189201
});
190202
}
191203

192204
);
193205

206+
enableStrgA_combo();
207+
194208
projectComboBox.getEditor().textProperty().addListener(new ChangeListener<String>() {
195209

196-
Boolean isValidProject = true;
210+
boolean isValidProject = true;
197211

198212
@Override
199213
public void changed(final ObservableValue<? extends String> observable, final String oldValue,
@@ -210,14 +224,20 @@ public void changed(final ObservableValue<? extends String> observable, final St
210224
if (isValidProject) {
211225
isValidProject = false;
212226
projectComboBox.getSelectionModel().clearSelection();
227+
// needed to avoid exception on empty textfield https://bugs.openjdk.java.net/browse/JDK-8081700
228+
Platform.runLater(() -> {
229+
setTextColor(projectComboBox.getEditor(), model.hoverFontColor.get());
230+
});
213231
}
214232

215233
// needed to avoid exception on empty textfield https://bugs.openjdk.java.net/browse/JDK-8081700
216234
Platform.runLater(() -> {
217235
projectComboBox.hide();
218-
projectComboBox
219-
.setItems(model.getSortedAvailableProjects().filtered(project -> ProjectsListViewController
220-
.doesProjectMatchSearchFilter(projectComboBox.getEditor().getText(), project)));
236+
237+
final String searchText = projectComboBox.getEditor().getText();
238+
filteredList.setPredicate(
239+
project -> ProjectsListViewController.doesProjectMatchSearchFilter(searchText, project));
240+
221241
if (projectComboBox.getEditor().focusedProperty().get()) {
222242
projectComboBox.show();
223243
}
@@ -240,6 +260,17 @@ public void changed(final ObservableValue<? extends String> observable, final St
240260

241261
});
242262

263+
// on
264+
projectComboBox.setOnKeyReleased(ke -> {
265+
if (ke.getCode() == KeyCode.ENTER && projectComboBox.getSelectionModel().isEmpty()) {
266+
if (!projectComboBox.getItems().isEmpty()) {
267+
projectComboBox.getSelectionModel().selectFirst();
268+
comboChange = true;
269+
}
270+
}
271+
272+
});
273+
243274
}
244275

245276
public void initializeWith(final Work work) {
@@ -255,8 +286,26 @@ public void initializeWith(final Work work) {
255286

256287
projectComboBox.getSelectionModel().select(work.getProject());
257288

258-
setColor(projectComboBox, work.getProject().getColor());
289+
setColor(projectComboBox, model.hoverBackgroundColor.get());
290+
setColor(projectComboBox.getEditor(), model.hoverBackgroundColor.get());
259291

292+
setTextColor(projectComboBox.getEditor(), model.hoverFontColor.get());
293+
}
294+
295+
private void enableStrgA_combo() {
296+
// strg+a Behaviour bug hack
297+
// https://stackoverflow.com/questions/51943654/javafx-combobox-make-control-a-select-all-in-text-box-while-dropdown-is-visi
298+
projectComboBox.setOnShown(e -> {
299+
final ComboBoxListViewSkin<?> skin = (ComboBoxListViewSkin<?>) projectComboBox.getSkin();
300+
final ListView<?> list = (ListView<?>) skin.getPopupContent();
301+
final KeyCodeCombination ctrlA = new KeyCodeCombination(KeyCode.A, KeyCodeCombination.CONTROL_DOWN);
302+
list.addEventFilter(KeyEvent.KEY_PRESSED, keyEvent -> {
303+
if (ctrlA.match(keyEvent)) {
304+
projectComboBox.getEditor().selectAll();
305+
}
306+
});
307+
projectComboBox.setOnShown(null);
308+
});
260309
}
261310

262311
private void setColor(final Node object, final Color color) {
@@ -266,10 +315,15 @@ private void setColor(final Node object, final Color color) {
266315
}
267316

268317
public Work getWorkFromUserInput() {
269-
270318
return new Work(LocalDateTime.of(startDatePicker.getValue(), startTimeSpinner.getValue()),
271319
LocalDateTime.of(endDatePicker.getValue(), endTimeSpinner.getValue()), selectedProject,
272320
noteTextArea.getText());
273321
}
274322

323+
private void setTextColor(final Node object, final Color color) {
324+
final String style = StyleUtils.changeStyleAttribute(object.getStyle(), "fx-text-fill",
325+
"rgba(" + ColorHelper.colorToCssRgba(color) + ")");
326+
object.setStyle(style);
327+
}
328+
275329
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ public class ReportController {
118118

119119
private LocalDate currentReportDate;
120120

121+
private final TreeItem<TableRow> rootItem = new TreeItem<>();
122+
121123
@Autowired
122124
public ReportController(final Model model, final Controller controller) {
123125
this.model = model;
@@ -185,11 +187,13 @@ protected void updateItem(final TableRow item, final boolean empty) {
185187

186188
workTableTreeView.setShowRoot(false);
187189

190+
workTableTreeView.setRoot(rootItem);
191+
rootItem.setExpanded(true);
188192
}
189193

190194
private void updateReport(final LocalDate dateToShow) {
191195
this.currentReportDate = dateToShow;
192-
196+
rootItem.getChildren().clear();
193197
reportRoot.requestFocus();
194198

195199
this.currentDayLabel.setText(DateFormatter.toDayDateString(this.currentReportDate));
@@ -204,8 +208,6 @@ private void updateReport(final LocalDate dateToShow) {
204208
long currentWorkSeconds = 0;
205209
long currentSeconds = 0;
206210

207-
final TreeItem<TableRow> root = new TreeItem<>();
208-
209211
for (final Project project : workedProjectsSet) {
210212
final List<Work> onlyCurrentProjectWork = currentWorkItems.stream().filter(w -> w.getProject() == project)
211213
.collect(Collectors.toList());
@@ -234,12 +236,10 @@ private void updateReport(final LocalDate dateToShow) {
234236
}
235237

236238
projectRow.setExpanded(true);
237-
root.getChildren().add(projectRow);
239+
rootItem.getChildren().add(projectRow);
238240

239241
}
240242

241-
root.setExpanded(true);
242-
workTableTreeView.setRoot(root);
243243
this.currentDayTimeLabel.setText(DateFormatter.secondsToHHMMSS(currentSeconds));
244244
this.currentDayWorkTimeLabel.setText(DateFormatter.secondsToHHMMSS(currentWorkSeconds));
245245

src/main/resources/layouts/manage-work.fxml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<?import javafx.scene.layout.RowConstraints?>
1212
<?import javafx.scene.text.Font?>
1313

14-
<GridPane fx:id="grid" hgap="5.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="214.0" prefWidth="371.0" vgap="5.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.doubleslash.keeptime.view.ManageWorkController">
14+
<GridPane fx:id="grid" hgap="5.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="214.0" prefWidth="371.0" vgap="5.0" xmlns="http://javafx.com/javafx/8.0.202-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.doubleslash.keeptime.view.ManageWorkController">
1515
<columnConstraints>
1616
<ColumnConstraints hgrow="SOMETIMES" />
1717
<ColumnConstraints hgrow="SOMETIMES" maxWidth="200.0" minWidth="100.0" prefWidth="150.0" />
@@ -50,7 +50,7 @@
5050
</Label>
5151
<Spinner fx:id="startTimeSpinner" editable="true" GridPane.columnIndex="2" />
5252
<Spinner fx:id="endTimeSpinner" editable="true" GridPane.columnIndex="2" GridPane.rowIndex="1" />
53-
<TextArea fx:id="noteTextArea" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="4" />
53+
<TextArea fx:id="noteTextArea" prefHeight="200.0" prefWidth="200.0" wrapText="true" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="4" />
5454
<Label text="Changing the times may result in overlapping times!" textFill="#ffa100" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="2">
5555
<font>
5656
<Font name="Open Sans Regular" size="12.0" />

0 commit comments

Comments
 (0)