Skip to content

Commit 95c8d19

Browse files
authored
Refactored GroupTree.fxml to plain java (#8035)
1 parent ff65eb8 commit 95c8d19

File tree

5 files changed

+87
-70
lines changed

5 files changed

+87
-70
lines changed

src/main/java/org/jabref/gui/JabRefFrame.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ public void showLibraryTab(LibraryTab libraryTab) {
565565
}
566566

567567
public void init() {
568-
sidePaneManager = new SidePaneManager(prefs, this, dialogService, stateManager);
568+
sidePaneManager = new SidePaneManager(prefs, this, taskExecutor, dialogService, stateManager);
569569
sidePane = sidePaneManager.getPane();
570570

571571
tabbedPane = new TabPane();

src/main/java/org/jabref/gui/SidePaneManager.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.jabref.gui.groups.GroupSidePane;
1111
import org.jabref.gui.importer.fetcher.WebSearchPane;
1212
import org.jabref.gui.openoffice.OpenOfficeSidePanel;
13+
import org.jabref.gui.util.TaskExecutor;
1314
import org.jabref.logic.openoffice.OpenOfficePreferences;
1415
import org.jabref.preferences.PreferencesService;
1516

@@ -23,13 +24,13 @@ public class SidePaneManager {
2324
private final List<SidePaneComponent> visibleComponents = new LinkedList<>();
2425
private final PreferencesService preferencesService;
2526

26-
public SidePaneManager(PreferencesService preferencesService, JabRefFrame frame, DialogService dialogService, StateManager stateManager) {
27+
public SidePaneManager(PreferencesService preferencesService, JabRefFrame frame, TaskExecutor taskExecutor, DialogService dialogService, StateManager stateManager) {
2728
this.preferencesService = preferencesService;
2829
this.sidePane = new SidePane();
2930

3031
OpenOfficePreferences openOfficePreferences = preferencesService.getOpenOfficePreferences();
3132
Stream.of(
32-
new GroupSidePane(this, preferencesService, dialogService),
33+
new GroupSidePane(this, taskExecutor, stateManager, preferencesService, dialogService),
3334
new WebSearchPane(this, preferencesService, dialogService, stateManager),
3435
new OpenOfficeSidePanel(this, preferencesService, frame))
3536
.forEach(pane -> components.put(pane.getType(), pane));

src/main/java/org/jabref/gui/groups/GroupSidePane.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,30 @@
1111
import org.jabref.gui.SidePaneComponent;
1212
import org.jabref.gui.SidePaneManager;
1313
import org.jabref.gui.SidePaneType;
14+
import org.jabref.gui.StateManager;
1415
import org.jabref.gui.actions.Action;
1516
import org.jabref.gui.actions.StandardActions;
1617
import org.jabref.gui.icon.IconTheme;
18+
import org.jabref.gui.util.TaskExecutor;
1719
import org.jabref.logic.l10n.Localization;
1820
import org.jabref.preferences.PreferencesService;
1921

20-
import com.airhacks.afterburner.views.ViewLoader;
21-
2222
/**
2323
* The groups side pane.
2424
*/
2525
public class GroupSidePane extends SidePaneComponent {
2626

2727
private final PreferencesService preferences;
2828
private final DialogService dialogService;
29+
private final TaskExecutor taskExecutor;
30+
private final StateManager stateManager;
2931
private final Button intersectionUnionToggle = IconTheme.JabRefIcons.GROUP_INTERSECTION.asButton();
3032

31-
public GroupSidePane(SidePaneManager manager, PreferencesService preferences, DialogService dialogService) {
33+
public GroupSidePane(SidePaneManager manager, TaskExecutor taskExecutor, StateManager stateManager, PreferencesService preferences, DialogService dialogService) {
3234
super(manager, IconTheme.JabRefIcons.TOGGLE_GROUPS, Localization.lang("Groups"));
3335
this.preferences = preferences;
36+
this.taskExecutor = taskExecutor;
37+
this.stateManager = stateManager;
3438
this.dialogService = dialogService;
3539
}
3640

@@ -83,9 +87,7 @@ private void setGraphicsAndTooltipForButton(GroupViewMode mode) {
8387

8488
@Override
8589
protected Node createContentPane() {
86-
return ViewLoader.view(GroupTreeView.class)
87-
.load()
88-
.getView();
90+
return new GroupTreeView(taskExecutor, stateManager, preferences, dialogService);
8991
}
9092

9193
@Override

src/main/java/org/jabref/gui/groups/GroupTree.fxml

-43
This file was deleted.

src/main/java/org/jabref/gui/groups/GroupTreeView.java

+75-18
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,13 @@
66
import java.util.ArrayList;
77
import java.util.LinkedList;
88
import java.util.List;
9+
import java.util.Objects;
910
import java.util.Optional;
1011
import java.util.stream.Collectors;
1112

12-
import javax.inject.Inject;
13-
1413
import javafx.application.Platform;
1514
import javafx.beans.property.ObjectProperty;
1615
import javafx.css.PseudoClass;
17-
import javafx.fxml.FXML;
1816
import javafx.scene.control.Button;
1917
import javafx.scene.control.ContextMenu;
2018
import javafx.scene.control.Control;
@@ -23,6 +21,7 @@
2321
import javafx.scene.control.SelectionMode;
2422
import javafx.scene.control.SeparatorMenuItem;
2523
import javafx.scene.control.TextField;
24+
import javafx.scene.control.Tooltip;
2625
import javafx.scene.control.TreeItem;
2726
import javafx.scene.control.TreeTableColumn;
2827
import javafx.scene.control.TreeTableRow;
@@ -32,6 +31,9 @@
3231
import javafx.scene.input.MouseButton;
3332
import javafx.scene.input.MouseEvent;
3433
import javafx.scene.input.TransferMode;
34+
import javafx.scene.layout.BorderPane;
35+
import javafx.scene.layout.HBox;
36+
import javafx.scene.layout.Priority;
3537
import javafx.scene.layout.StackPane;
3638
import javafx.scene.text.Text;
3739

@@ -57,29 +59,85 @@
5759
import org.slf4j.Logger;
5860
import org.slf4j.LoggerFactory;
5961

60-
public class GroupTreeView {
62+
public class GroupTreeView extends BorderPane {
6163

6264
private static final Logger LOGGER = LoggerFactory.getLogger(GroupTreeView.class);
6365

64-
@FXML private TreeTableView<GroupNodeViewModel> groupTree;
65-
@FXML private TreeTableColumn<GroupNodeViewModel, GroupNodeViewModel> mainColumn;
66-
@FXML private TreeTableColumn<GroupNodeViewModel, GroupNodeViewModel> numberColumn;
67-
@FXML private TreeTableColumn<GroupNodeViewModel, GroupNodeViewModel> expansionNodeColumn;
68-
@FXML private CustomTextField searchField;
69-
@FXML private Button addNewGroup;
66+
private TreeTableView<GroupNodeViewModel> groupTree;
67+
private TreeTableColumn<GroupNodeViewModel, GroupNodeViewModel> mainColumn;
68+
private TreeTableColumn<GroupNodeViewModel, GroupNodeViewModel> numberColumn;
69+
private TreeTableColumn<GroupNodeViewModel, GroupNodeViewModel> expansionNodeColumn;
70+
private CustomTextField searchField;
71+
private Button addNewGroup;
7072

71-
@Inject private StateManager stateManager;
72-
@Inject private DialogService dialogService;
73-
@Inject private TaskExecutor taskExecutor;
74-
@Inject private PreferencesService preferencesService;
73+
private final StateManager stateManager;
74+
private final DialogService dialogService;
75+
private final TaskExecutor taskExecutor;
76+
private final PreferencesService preferencesService;
7577

7678
private GroupTreeViewModel viewModel;
7779
private CustomLocalDragboard localDragboard;
7880

7981
private DragExpansionHandler dragExpansionHandler;
8082

81-
@FXML
82-
public void initialize() {
83+
/**
84+
* The groups panel
85+
*
86+
* Note: This panel is deliberately not created in FXML, since parsing of this took about 500 msecs. In an attempt
87+
* to speed up the startup time of JabRef, this has been rewritten to plain java.
88+
*/
89+
public GroupTreeView(TaskExecutor taskExecutor, StateManager stateManager, PreferencesService preferencesService, DialogService dialogService) {
90+
this.taskExecutor = taskExecutor;
91+
this.stateManager = stateManager;
92+
this.preferencesService = preferencesService;
93+
this.dialogService = dialogService;
94+
95+
createNodes();
96+
this.getStylesheets().add(Objects.requireNonNull(GroupTreeView.class.getResource("GroupTree.css")).toExternalForm());
97+
initialize();
98+
}
99+
100+
private void createNodes() {
101+
searchField = new CustomTextField();
102+
103+
searchField.setPromptText(Localization.lang("Filter groups"));
104+
searchField.setId("searchField");
105+
HBox.setHgrow(searchField, Priority.ALWAYS);
106+
HBox groupFilterBar = new HBox(searchField);
107+
groupFilterBar.setId("groupFilterBar");
108+
this.setTop(groupFilterBar);
109+
110+
mainColumn = new TreeTableColumn<>();
111+
mainColumn.setId("mainColumn");
112+
numberColumn = new TreeTableColumn<>();
113+
numberColumn.getStyleClass().add("numberColumn");
114+
numberColumn.setMinWidth(50d);
115+
numberColumn.setMaxWidth(70d);
116+
numberColumn.setPrefWidth(60d);
117+
expansionNodeColumn = new TreeTableColumn<>();
118+
expansionNodeColumn.getStyleClass().add("expansionNodeColumn");
119+
expansionNodeColumn.setMaxWidth(25d);
120+
expansionNodeColumn.setMinWidth(25d);
121+
122+
groupTree = new TreeTableView<>();
123+
groupTree.setId("groupTree");
124+
groupTree.setColumnResizePolicy(TreeTableView.CONSTRAINED_RESIZE_POLICY);
125+
groupTree.getColumns().addAll(List.of(mainColumn, numberColumn, expansionNodeColumn));
126+
this.setCenter(groupTree);
127+
128+
addNewGroup = new Button(Localization.lang("Add group"));
129+
addNewGroup.setId("addNewGroup");
130+
addNewGroup.setMaxWidth(Double.MAX_VALUE);
131+
HBox.setHgrow(addNewGroup, Priority.ALWAYS);
132+
addNewGroup.setTooltip(new Tooltip(Localization.lang("New group")));
133+
addNewGroup.setOnAction(event -> addNewGroup());
134+
135+
HBox groupBar = new HBox(addNewGroup);
136+
groupBar.setId("groupBar");
137+
this.setBottom(groupBar);
138+
}
139+
140+
private void initialize() {
83141
this.localDragboard = stateManager.getLocalDragboard();
84142
viewModel = new GroupTreeViewModel(stateManager, dialogService, preferencesService, taskExecutor, localDragboard);
85143

@@ -396,13 +454,12 @@ private ContextMenu createContextMenuForGroup(GroupNodeViewModel group) {
396454
return menu;
397455
}
398456

399-
@FXML
400457
private void addNewGroup() {
401458
viewModel.addNewGroupToRoot();
402459
}
403460

404461
/**
405-
* Workaround taken from https://bitbucket.org/controlsfx/controlsfx/issues/330/making-textfieldssetupclearbuttonfield
462+
* Workaround taken from https://github.com/controlsfx/controlsfx/issues/330
406463
*/
407464
private void setupClearButtonField(CustomTextField customTextField) {
408465
try {

0 commit comments

Comments
 (0)