From 86deb7eb4215bba2ac5bd60230238042c14e3687 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 18 Mar 2017 17:32:01 +0100 Subject: [PATCH 1/5] Add sorting of all groups and subgroups, recursively For #2599 --- .../gui/groups/GroupTreeController.java | 29 ++++++++++++++----- .../jabref/gui/groups/GroupTreeViewModel.java | 19 ++++++++++-- .../org/jabref/gui/groups/GroupsTree.java | 1 + .../jabref/model/groups/AbstractGroup.java | 18 ++++++++++++ src/main/resources/l10n/JabRef_da.properties | 2 ++ src/main/resources/l10n/JabRef_de.properties | 2 ++ src/main/resources/l10n/JabRef_en.properties | 2 ++ src/main/resources/l10n/JabRef_es.properties | 2 ++ src/main/resources/l10n/JabRef_fa.properties | 2 ++ src/main/resources/l10n/JabRef_fr.properties | 2 ++ src/main/resources/l10n/JabRef_in.properties | 2 ++ src/main/resources/l10n/JabRef_it.properties | 2 ++ src/main/resources/l10n/JabRef_ja.properties | 2 ++ src/main/resources/l10n/JabRef_nl.properties | 2 ++ src/main/resources/l10n/JabRef_no.properties | 2 ++ .../resources/l10n/JabRef_pt_BR.properties | 2 ++ src/main/resources/l10n/JabRef_ru.properties | 2 ++ src/main/resources/l10n/JabRef_sv.properties | 2 ++ src/main/resources/l10n/JabRef_tr.properties | 2 ++ src/main/resources/l10n/JabRef_vi.properties | 2 ++ src/main/resources/l10n/JabRef_zh.properties | 2 ++ 21 files changed, 92 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/jabref/gui/groups/GroupTreeController.java b/src/main/java/org/jabref/gui/groups/GroupTreeController.java index 7e0eaaa2a8b..b04d432f28e 100644 --- a/src/main/java/org/jabref/gui/groups/GroupTreeController.java +++ b/src/main/java/org/jabref/gui/groups/GroupTreeController.java @@ -43,14 +43,21 @@ public class GroupTreeController extends AbstractController private static final Log LOGGER = LogFactory.getLog(GroupTreeController.class); - @FXML private TreeTableView groupTree; - @FXML private TreeTableColumn mainColumn; - @FXML private TreeTableColumn numberColumn; - @FXML private TreeTableColumn disclosureNodeColumn; - @FXML private CustomTextField searchField; + @FXML + private TreeTableView groupTree; + @FXML + private TreeTableColumn mainColumn; + @FXML + private TreeTableColumn numberColumn; + @FXML + private TreeTableColumn disclosureNodeColumn; + @FXML + private CustomTextField searchField; - @Inject private StateManager stateManager; - @Inject private DialogService dialogService; + @Inject + private StateManager stateManager; + @Inject + private DialogService dialogService; @FXML public void initialize() { @@ -222,8 +229,16 @@ private ContextMenu createContextMenuForGroup(GroupNodeViewModel group) { MenuItem removeGroupAndSubgroups = new MenuItem(Localization.lang("Remove group and subgroups")); removeGroupAndSubgroups.setOnAction(event -> viewModel.removeGroupAndSubgroups(group)); + MenuItem sortAlphabetically = new MenuItem(Localization.lang("Sort alphabetically")); + sortAlphabetically.setOnAction(event -> viewModel.sortAlphabetically(group)); + + MenuItem sortSubGroups = new MenuItem(Localization.lang("Sort subgroups alphabetically")); + sortSubGroups.setOnAction(event -> viewModel.sortSubGroupAlphabetically(group)); + menu.getItems().add(addSubgroup); menu.getItems().add(removeGroupAndSubgroups); + menu.getItems().add(sortAlphabetically); + menu.getItems().add(sortSubGroups); return menu; } diff --git a/src/main/java/org/jabref/gui/groups/GroupTreeViewModel.java b/src/main/java/org/jabref/gui/groups/GroupTreeViewModel.java index a6c55cbe0d8..f42a1e90d5d 100644 --- a/src/main/java/org/jabref/gui/groups/GroupTreeViewModel.java +++ b/src/main/java/org/jabref/gui/groups/GroupTreeViewModel.java @@ -1,5 +1,6 @@ package org.jabref.gui.groups; +import java.util.Comparator; import java.util.Objects; import java.util.Optional; import java.util.function.Predicate; @@ -27,6 +28,10 @@ public class GroupTreeViewModel extends AbstractViewModel { private final DialogService dialogService; private final ObjectProperty> filterPredicate = new SimpleObjectProperty<>(); private final StringProperty filterText = new SimpleStringProperty(); + private final Comparator compAlphabetIgnoreCase = (GroupTreeNode v1, GroupTreeNode v2) -> v1 + .getName() + .compareToIgnoreCase(v2.getName()); + private Optional currentDatabase; public GroupTreeViewModel(StateManager stateManager, DialogService dialogService) { @@ -34,11 +39,13 @@ public GroupTreeViewModel(StateManager stateManager, DialogService dialogService this.dialogService = Objects.requireNonNull(dialogService); // Register listener - stateManager.activeDatabaseProperty().addListener((observable, oldValue, newValue) -> onActiveDatabaseChanged(newValue)); + stateManager.activeDatabaseProperty() + .addListener((observable, oldValue, newValue) -> onActiveDatabaseChanged(newValue)); selectedGroup.addListener((observable, oldValue, newValue) -> onSelectedGroupChanged(newValue)); // Set-up bindings - filterPredicate.bind(Bindings.createObjectBinding(() -> group -> group.isMatchedBy(filterText.get()), filterText)); + filterPredicate + .bind(Bindings.createObjectBinding(() -> group -> group.isMatchedBy(filterText.get()), filterText)); // Init onActiveDatabaseChanged(stateManager.activeDatabaseProperty().getValue()); @@ -144,4 +151,12 @@ public void removeGroupAndSubgroups(GroupNodeViewModel group) { dialogService.notify(Localization.lang("Removed group \"%0\" and its subgroups.", group.getDisplayName())); } } + + public void sortAlphabetically(GroupNodeViewModel group) { + group.getGroupNode().getRoot().sortChildren(compAlphabetIgnoreCase, true); + } + + public void sortSubGroupAlphabetically(GroupNodeViewModel group) { + group.getGroupNode().sortChildren(compAlphabetIgnoreCase, true); + } } diff --git a/src/main/java/org/jabref/gui/groups/GroupsTree.java b/src/main/java/org/jabref/gui/groups/GroupsTree.java index a664f710832..e628f30d5c7 100644 --- a/src/main/java/org/jabref/gui/groups/GroupsTree.java +++ b/src/main/java/org/jabref/gui/groups/GroupsTree.java @@ -28,6 +28,7 @@ public GroupsTree(GroupSelector groupSelector) { getSelectionModel().setSelectionMode( TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); this.setFocusable(true); + } /** Returns the first selected node, or null if nothing is selected. */ diff --git a/src/main/java/org/jabref/model/groups/AbstractGroup.java b/src/main/java/org/jabref/model/groups/AbstractGroup.java index 9a247c6d3f8..b00899fe249 100644 --- a/src/main/java/org/jabref/model/groups/AbstractGroup.java +++ b/src/main/java/org/jabref/model/groups/AbstractGroup.java @@ -45,6 +45,24 @@ public String toString() { '}'; } + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + if ((other == null) || (getClass() != other.getClass())) { + return false; + } + AbstractGroup that = (AbstractGroup) other; + return Objects.equals(this.name, that.name) && Objects.equals(this.description, that.description) + && Objects.equals(this.context, that.context); + } + + @Override + public int hashCode() { + return Objects.hash(name, description, context); + } + public Optional getColor() { return color; } diff --git a/src/main/resources/l10n/JabRef_da.properties b/src/main/resources/l10n/JabRef_da.properties index 2633a21f402..da4adfce273 100644 --- a/src/main/resources/l10n/JabRef_da.properties +++ b/src/main/resources/l10n/JabRef_da.properties @@ -2368,3 +2368,5 @@ Default_table_font_size= Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= + +Sort_subgroups_alphabetically= diff --git a/src/main/resources/l10n/JabRef_de.properties b/src/main/resources/l10n/JabRef_de.properties index e35a51b8d67..e9506639b8c 100644 --- a/src/main/resources/l10n/JabRef_de.properties +++ b/src/main/resources/l10n/JabRef_de.properties @@ -2368,3 +2368,5 @@ Default_table_font_size=Standard_Tabellenschriftgröße Escape_underscores=Unterstriche_maskieren Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= + +Sort_subgroups_alphabetically= diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 960f46d3eca..6f20d7e125e 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -2368,3 +2368,5 @@ Default_table_font_size=Default_table_font_size Escape_underscores=Escape_underscores Color=Color Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.=Please_also_add_all_steps_to_reproduce_this_issue,_if_possible. + +Sort_subgroups_alphabetically=Sort_subgroups_alphabetically diff --git a/src/main/resources/l10n/JabRef_es.properties b/src/main/resources/l10n/JabRef_es.properties index 41a9e6d91c0..666affe6be2 100644 --- a/src/main/resources/l10n/JabRef_es.properties +++ b/src/main/resources/l10n/JabRef_es.properties @@ -2368,3 +2368,5 @@ Default_table_font_size= Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= + +Sort_subgroups_alphabetically= diff --git a/src/main/resources/l10n/JabRef_fa.properties b/src/main/resources/l10n/JabRef_fa.properties index bb43554a84e..36e75cb00d2 100644 --- a/src/main/resources/l10n/JabRef_fa.properties +++ b/src/main/resources/l10n/JabRef_fa.properties @@ -2368,3 +2368,5 @@ Default_table_font_size= Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= + +Sort_subgroups_alphabetically= diff --git a/src/main/resources/l10n/JabRef_fr.properties b/src/main/resources/l10n/JabRef_fr.properties index a5b2b11aa1e..837978826c1 100644 --- a/src/main/resources/l10n/JabRef_fr.properties +++ b/src/main/resources/l10n/JabRef_fr.properties @@ -2368,3 +2368,5 @@ Default_table_font_size=Taille_par_défaut_des_police_du_tableau Escape_underscores=Echapper_les_soulignements Color=Couleur Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.=S'il_vous_plaît,_Ajouter_si_possible_toutes_les_étapes_permettant_de_reproduire_cette_anomalie. + +Sort_subgroups_alphabetically= diff --git a/src/main/resources/l10n/JabRef_in.properties b/src/main/resources/l10n/JabRef_in.properties index ed3fffd8648..2977d20239e 100644 --- a/src/main/resources/l10n/JabRef_in.properties +++ b/src/main/resources/l10n/JabRef_in.properties @@ -2368,3 +2368,5 @@ Default_table_font_size= Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= + +Sort_subgroups_alphabetically= diff --git a/src/main/resources/l10n/JabRef_it.properties b/src/main/resources/l10n/JabRef_it.properties index fb18551cf9e..8222678e210 100644 --- a/src/main/resources/l10n/JabRef_it.properties +++ b/src/main/resources/l10n/JabRef_it.properties @@ -2368,3 +2368,5 @@ Default_table_font_size= Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= + +Sort_subgroups_alphabetically= diff --git a/src/main/resources/l10n/JabRef_ja.properties b/src/main/resources/l10n/JabRef_ja.properties index 52cb6183ecc..d8e68dfbf2d 100644 --- a/src/main/resources/l10n/JabRef_ja.properties +++ b/src/main/resources/l10n/JabRef_ja.properties @@ -2368,3 +2368,5 @@ Default_table_font_size= Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= + +Sort_subgroups_alphabetically= diff --git a/src/main/resources/l10n/JabRef_nl.properties b/src/main/resources/l10n/JabRef_nl.properties index a20cfd99de9..bf3a7106356 100644 --- a/src/main/resources/l10n/JabRef_nl.properties +++ b/src/main/resources/l10n/JabRef_nl.properties @@ -2368,3 +2368,5 @@ Default_table_font_size= Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= + +Sort_subgroups_alphabetically= diff --git a/src/main/resources/l10n/JabRef_no.properties b/src/main/resources/l10n/JabRef_no.properties index 3b799a3bf2e..8cf956ce924 100644 --- a/src/main/resources/l10n/JabRef_no.properties +++ b/src/main/resources/l10n/JabRef_no.properties @@ -2368,3 +2368,5 @@ Default_table_font_size= Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= + +Sort_subgroups_alphabetically= diff --git a/src/main/resources/l10n/JabRef_pt_BR.properties b/src/main/resources/l10n/JabRef_pt_BR.properties index c7420e17a5d..d8c1e2fc7f9 100644 --- a/src/main/resources/l10n/JabRef_pt_BR.properties +++ b/src/main/resources/l10n/JabRef_pt_BR.properties @@ -2368,3 +2368,5 @@ Default_table_font_size= Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= + +Sort_subgroups_alphabetically= diff --git a/src/main/resources/l10n/JabRef_ru.properties b/src/main/resources/l10n/JabRef_ru.properties index c8730c58d5c..70ec7053a4d 100644 --- a/src/main/resources/l10n/JabRef_ru.properties +++ b/src/main/resources/l10n/JabRef_ru.properties @@ -2368,3 +2368,5 @@ Default_table_font_size= Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= + +Sort_subgroups_alphabetically= diff --git a/src/main/resources/l10n/JabRef_sv.properties b/src/main/resources/l10n/JabRef_sv.properties index 5abfcd8a347..d4d2db9f6bb 100644 --- a/src/main/resources/l10n/JabRef_sv.properties +++ b/src/main/resources/l10n/JabRef_sv.properties @@ -2368,3 +2368,5 @@ Default_table_font_size= Escape_underscores=Maskera_understreck Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= + +Sort_subgroups_alphabetically= diff --git a/src/main/resources/l10n/JabRef_tr.properties b/src/main/resources/l10n/JabRef_tr.properties index addb5a748e8..b4b6794b107 100644 --- a/src/main/resources/l10n/JabRef_tr.properties +++ b/src/main/resources/l10n/JabRef_tr.properties @@ -2368,3 +2368,5 @@ Default_table_font_size= Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= + +Sort_subgroups_alphabetically= diff --git a/src/main/resources/l10n/JabRef_vi.properties b/src/main/resources/l10n/JabRef_vi.properties index 51bd9eb35cb..111438e6006 100644 --- a/src/main/resources/l10n/JabRef_vi.properties +++ b/src/main/resources/l10n/JabRef_vi.properties @@ -2368,3 +2368,5 @@ Default_table_font_size= Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= + +Sort_subgroups_alphabetically= diff --git a/src/main/resources/l10n/JabRef_zh.properties b/src/main/resources/l10n/JabRef_zh.properties index d6c56918b4e..9799cd66bc6 100644 --- a/src/main/resources/l10n/JabRef_zh.properties +++ b/src/main/resources/l10n/JabRef_zh.properties @@ -2368,3 +2368,5 @@ Default_table_font_size= Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= + +Sort_subgroups_alphabetically= From 540444f74af81e27c9deb8ecec71dde8a68c3cac Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sun, 19 Mar 2017 18:31:16 +0100 Subject: [PATCH 2/5] Fix formattiong --- .../gui/groups/GroupTreeController.java | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/jabref/gui/groups/GroupTreeController.java b/src/main/java/org/jabref/gui/groups/GroupTreeController.java index b04d432f28e..26eee779250 100644 --- a/src/main/java/org/jabref/gui/groups/GroupTreeController.java +++ b/src/main/java/org/jabref/gui/groups/GroupTreeController.java @@ -43,21 +43,14 @@ public class GroupTreeController extends AbstractController private static final Log LOGGER = LogFactory.getLog(GroupTreeController.class); - @FXML - private TreeTableView groupTree; - @FXML - private TreeTableColumn mainColumn; - @FXML - private TreeTableColumn numberColumn; - @FXML - private TreeTableColumn disclosureNodeColumn; - @FXML - private CustomTextField searchField; - - @Inject - private StateManager stateManager; - @Inject - private DialogService dialogService; + @FXML private TreeTableView groupTree; + @FXML private TreeTableColumn mainColumn; + @FXML private TreeTableColumn numberColumn; + @FXML private TreeTableColumn disclosureNodeColumn; + @FXML private CustomTextField searchField; + + @Inject private StateManager stateManager; + @Inject private DialogService dialogService; @FXML public void initialize() { From 1269433edd732dab5759d77b8f8b040144383348 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 25 Mar 2017 17:18:40 +0100 Subject: [PATCH 3/5] Change localization --- .../java/org/jabref/gui/groups/GroupTreeController.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/gui/groups/GroupTreeController.java b/src/main/java/org/jabref/gui/groups/GroupTreeController.java index 26eee779250..a6bdc18e47e 100644 --- a/src/main/java/org/jabref/gui/groups/GroupTreeController.java +++ b/src/main/java/org/jabref/gui/groups/GroupTreeController.java @@ -138,6 +138,8 @@ public void initialize() { .map(this::createContextMenuForGroup) .orElse((ContextMenu) null)); + + // Drag and drop support row.setOnDragDetected(event -> { TreeItem selectedItem = treeTable.getSelectionModel().getSelectedItem(); @@ -186,6 +188,7 @@ public void initialize() { event.consume(); }); + return row; }); @@ -222,12 +225,13 @@ private ContextMenu createContextMenuForGroup(GroupNodeViewModel group) { MenuItem removeGroupAndSubgroups = new MenuItem(Localization.lang("Remove group and subgroups")); removeGroupAndSubgroups.setOnAction(event -> viewModel.removeGroupAndSubgroups(group)); - MenuItem sortAlphabetically = new MenuItem(Localization.lang("Sort alphabetically")); + MenuItem sortAlphabetically = new MenuItem(Localization.lang("Sort all subgroups (recursively)")); sortAlphabetically.setOnAction(event -> viewModel.sortAlphabetically(group)); - MenuItem sortSubGroups = new MenuItem(Localization.lang("Sort subgroups alphabetically")); + MenuItem sortSubGroups = new MenuItem(Localization.lang("sort subgroups")); sortSubGroups.setOnAction(event -> viewModel.sortSubGroupAlphabetically(group)); + menu.getItems().add(addSubgroup); menu.getItems().add(removeGroupAndSubgroups); menu.getItems().add(sortAlphabetically); From 289112384a64519469c1fb1a2d124e87cdc9629b Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Sat, 25 Mar 2017 17:25:46 +0100 Subject: [PATCH 4/5] change localilaztion --- src/main/resources/l10n/JabRef_da.properties | 2 +- src/main/resources/l10n/JabRef_de.properties | 5 ++++- src/main/resources/l10n/JabRef_en.properties | 2 +- src/main/resources/l10n/JabRef_es.properties | 2 +- src/main/resources/l10n/JabRef_fa.properties | 2 +- src/main/resources/l10n/JabRef_fr.properties | 2 +- src/main/resources/l10n/JabRef_in.properties | 2 +- src/main/resources/l10n/JabRef_it.properties | 2 +- src/main/resources/l10n/JabRef_ja.properties | 2 +- src/main/resources/l10n/JabRef_nl.properties | 2 +- src/main/resources/l10n/JabRef_no.properties | 2 +- src/main/resources/l10n/JabRef_pt_BR.properties | 2 +- src/main/resources/l10n/JabRef_ru.properties | 2 +- src/main/resources/l10n/JabRef_sv.properties | 2 +- src/main/resources/l10n/JabRef_tr.properties | 2 +- src/main/resources/l10n/JabRef_vi.properties | 2 +- src/main/resources/l10n/JabRef_zh.properties | 2 +- 17 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/main/resources/l10n/JabRef_da.properties b/src/main/resources/l10n/JabRef_da.properties index 15c8123535e..67b03bd6939 100644 --- a/src/main/resources/l10n/JabRef_da.properties +++ b/src/main/resources/l10n/JabRef_da.properties @@ -2375,4 +2375,4 @@ Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= diff --git a/src/main/resources/l10n/JabRef_de.properties b/src/main/resources/l10n/JabRef_de.properties index ee3ceeebc1d..889b28cb1ff 100644 --- a/src/main/resources/l10n/JabRef_de.properties +++ b/src/main/resources/l10n/JabRef_de.properties @@ -533,6 +533,7 @@ File_type=Dateityp File_updated_externally=Datei_extern_geändert filename=Dateiname + Filename=Dateiname Files_opened=Dateien_geöffnet @@ -612,6 +613,7 @@ Help_on_regular_expression_search=Hilfe_zur_Suche_mit_regulärem_Ausdruck Hide_non-hits=Nicht-Treffer_ausblenden Hierarchical_context=Hierarchischer_Kontext + Highlight=Hervorhebung Marking=Markierung Underline=Unterstreichung @@ -933,6 +935,7 @@ Path_to_LyX_pipe=Pfad_zur_LyX-pipe PDF_does_not_exist=PDF_existiert_nicht File_has_no_attached_annotations= + Reload_annotations=Annotationen_erneut_laden Plain_text_import=Klartext_importieren @@ -2372,4 +2375,4 @@ Escape_underscores=Unterstriche_maskieren Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index bb2b0671949..035e5426cbe 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -2375,4 +2375,4 @@ Escape_underscores=Escape_underscores Color=Color Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.=Please_also_add_all_steps_to_reproduce_this_issue,_if_possible. -Sort_subgroups_alphabetically=Sort_subgroups_alphabetically +Sort_all_subgroups_(recursively)=Sort_all_subgroups_(recursively) diff --git a/src/main/resources/l10n/JabRef_es.properties b/src/main/resources/l10n/JabRef_es.properties index 2be37c155d7..8f426682d7f 100644 --- a/src/main/resources/l10n/JabRef_es.properties +++ b/src/main/resources/l10n/JabRef_es.properties @@ -2375,4 +2375,4 @@ Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= diff --git a/src/main/resources/l10n/JabRef_fa.properties b/src/main/resources/l10n/JabRef_fa.properties index ff9440d12df..fc7fd1c225f 100644 --- a/src/main/resources/l10n/JabRef_fa.properties +++ b/src/main/resources/l10n/JabRef_fa.properties @@ -2375,4 +2375,4 @@ Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= diff --git a/src/main/resources/l10n/JabRef_fr.properties b/src/main/resources/l10n/JabRef_fr.properties index d1cc97cce59..1e6e854e068 100644 --- a/src/main/resources/l10n/JabRef_fr.properties +++ b/src/main/resources/l10n/JabRef_fr.properties @@ -2375,4 +2375,4 @@ Escape_underscores=Echapper_les_soulignements Color=Couleur Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.=S'il_vous_plaît,_Ajouter_si_possible_toutes_les_étapes_permettant_de_reproduire_cette_anomalie. -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= diff --git a/src/main/resources/l10n/JabRef_in.properties b/src/main/resources/l10n/JabRef_in.properties index 5240b38a0df..c0ef83566fa 100644 --- a/src/main/resources/l10n/JabRef_in.properties +++ b/src/main/resources/l10n/JabRef_in.properties @@ -2375,4 +2375,4 @@ Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= diff --git a/src/main/resources/l10n/JabRef_it.properties b/src/main/resources/l10n/JabRef_it.properties index c8eca834717..25585a900af 100644 --- a/src/main/resources/l10n/JabRef_it.properties +++ b/src/main/resources/l10n/JabRef_it.properties @@ -2375,4 +2375,4 @@ Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= diff --git a/src/main/resources/l10n/JabRef_ja.properties b/src/main/resources/l10n/JabRef_ja.properties index 88fc8abeb23..94de36f25fc 100644 --- a/src/main/resources/l10n/JabRef_ja.properties +++ b/src/main/resources/l10n/JabRef_ja.properties @@ -2375,4 +2375,4 @@ Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= diff --git a/src/main/resources/l10n/JabRef_nl.properties b/src/main/resources/l10n/JabRef_nl.properties index c37a1a34218..58d8fe15a71 100644 --- a/src/main/resources/l10n/JabRef_nl.properties +++ b/src/main/resources/l10n/JabRef_nl.properties @@ -2375,4 +2375,4 @@ Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= diff --git a/src/main/resources/l10n/JabRef_no.properties b/src/main/resources/l10n/JabRef_no.properties index 649fa2cb0f0..2103a69f13d 100644 --- a/src/main/resources/l10n/JabRef_no.properties +++ b/src/main/resources/l10n/JabRef_no.properties @@ -2375,4 +2375,4 @@ Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= diff --git a/src/main/resources/l10n/JabRef_pt_BR.properties b/src/main/resources/l10n/JabRef_pt_BR.properties index 4e45be08e62..05b6156456d 100644 --- a/src/main/resources/l10n/JabRef_pt_BR.properties +++ b/src/main/resources/l10n/JabRef_pt_BR.properties @@ -2375,4 +2375,4 @@ Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= diff --git a/src/main/resources/l10n/JabRef_ru.properties b/src/main/resources/l10n/JabRef_ru.properties index 7d9cbba7c4e..dafd7b27bec 100644 --- a/src/main/resources/l10n/JabRef_ru.properties +++ b/src/main/resources/l10n/JabRef_ru.properties @@ -2375,4 +2375,4 @@ Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= diff --git a/src/main/resources/l10n/JabRef_sv.properties b/src/main/resources/l10n/JabRef_sv.properties index cf10b69c85e..e7628422a56 100644 --- a/src/main/resources/l10n/JabRef_sv.properties +++ b/src/main/resources/l10n/JabRef_sv.properties @@ -2375,4 +2375,4 @@ Escape_underscores=Maskera_understreck Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= diff --git a/src/main/resources/l10n/JabRef_tr.properties b/src/main/resources/l10n/JabRef_tr.properties index 9da6834fb50..ef3eebe8a19 100644 --- a/src/main/resources/l10n/JabRef_tr.properties +++ b/src/main/resources/l10n/JabRef_tr.properties @@ -2375,4 +2375,4 @@ Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= diff --git a/src/main/resources/l10n/JabRef_vi.properties b/src/main/resources/l10n/JabRef_vi.properties index 8b7fc28c734..880c925f6d3 100644 --- a/src/main/resources/l10n/JabRef_vi.properties +++ b/src/main/resources/l10n/JabRef_vi.properties @@ -2375,4 +2375,4 @@ Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= diff --git a/src/main/resources/l10n/JabRef_zh.properties b/src/main/resources/l10n/JabRef_zh.properties index 36fb35cc490..f527fe5f2df 100644 --- a/src/main/resources/l10n/JabRef_zh.properties +++ b/src/main/resources/l10n/JabRef_zh.properties @@ -2375,4 +2375,4 @@ Escape_underscores= Color= Please_also_add_all_steps_to_reproduce_this_issue,_if_possible.= -Sort_subgroups_alphabetically= +Sort_all_subgroups_(recursively)= From 2e86aa07f24e44b79a89f46d9003fb391d1f04a9 Mon Sep 17 00:00:00 2001 From: Siedlerchr Date: Thu, 6 Apr 2017 14:57:27 +0200 Subject: [PATCH 5/5] Add sort subgroups recursively --- .../gui/groups/GroupTreeController.java | 6 ++++ .../jabref/gui/groups/GroupTreeViewModel.java | 33 ++++++++++++------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/jabref/gui/groups/GroupTreeController.java b/src/main/java/org/jabref/gui/groups/GroupTreeController.java index a19062e3688..fe431a5e7d6 100644 --- a/src/main/java/org/jabref/gui/groups/GroupTreeController.java +++ b/src/main/java/org/jabref/gui/groups/GroupTreeController.java @@ -242,11 +242,17 @@ private ContextMenu createContextMenuForGroup(GroupNodeViewModel group) { MenuItem removeEntries = new MenuItem(Localization.lang("Remove selected entries from this group")); removeSubgroups.setOnAction(event -> viewModel.removeSelectedEntries(group)); + MenuItem sortAlphabetically = new MenuItem(Localization.lang("Sort all subgroups (recursively)")); + sortAlphabetically.setOnAction(event -> viewModel.sortAlphabeticallyRecursive(group)); + menu.getItems().add(editGroup); menu.getItems().add(new SeparatorMenuItem()); menu.getItems().addAll(addSubgroup, removeSubgroups, removeGroupAndSubgroups, removeGroupKeepSubgroups); menu.getItems().add(new SeparatorMenuItem()); menu.getItems().addAll(addEntries, removeEntries); + menu.getItems().add(new SeparatorMenuItem()); + menu.getItems().add(sortAlphabetically); + return menu; } diff --git a/src/main/java/org/jabref/gui/groups/GroupTreeViewModel.java b/src/main/java/org/jabref/gui/groups/GroupTreeViewModel.java index fd93640e72c..a1e60939d1e 100644 --- a/src/main/java/org/jabref/gui/groups/GroupTreeViewModel.java +++ b/src/main/java/org/jabref/gui/groups/GroupTreeViewModel.java @@ -1,5 +1,6 @@ package org.jabref.gui.groups; +import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -33,6 +34,9 @@ public class GroupTreeViewModel extends AbstractViewModel { private final ObjectProperty> filterPredicate = new SimpleObjectProperty<>(); private final StringProperty filterText = new SimpleStringProperty(); private Optional currentDatabase; + private final Comparator compAlphabetIgnoreCase = (GroupTreeNode v1, GroupTreeNode v2) -> v1 + .getName() + .compareToIgnoreCase(v2.getName()); public GroupTreeViewModel(StateManager stateManager, DialogService dialogService, TaskExecutor taskExecutor) { this.stateManager = Objects.requireNonNull(stateManager); @@ -40,11 +44,13 @@ public GroupTreeViewModel(StateManager stateManager, DialogService dialogService this.taskExecutor = Objects.requireNonNull(taskExecutor); // Register listener - stateManager.activeDatabaseProperty().addListener((observable, oldValue, newValue) -> onActiveDatabaseChanged(newValue)); + stateManager.activeDatabaseProperty() + .addListener((observable, oldValue, newValue) -> onActiveDatabaseChanged(newValue)); selectedGroup.addListener((observable, oldValue, newValue) -> onSelectedGroupChanged(newValue)); // Set-up bindings - filterPredicate.bind(Bindings.createObjectBinding(() -> group -> group.isMatchedBy(filterText.get()), filterText)); + filterPredicate + .bind(Bindings.createObjectBinding(() -> group -> group.isMatchedBy(filterText.get()), filterText)); // Init onActiveDatabaseChanged(stateManager.activeDatabaseProperty().getValue()); @@ -106,7 +112,8 @@ private void onActiveDatabaseChanged(Optional newDatabase) { rootGroup.setValue(newRoot); stateManager.getSelectedGroup(newDatabase.get()).ifPresent( - selectedGroup -> this.selectedGroup.setValue(new GroupNodeViewModel(newDatabase.get(), stateManager, taskExecutor, selectedGroup))); + selectedGroup -> this.selectedGroup.setValue( + new GroupNodeViewModel(newDatabase.get(), stateManager, taskExecutor, selectedGroup))); } currentDatabase = newDatabase; @@ -135,7 +142,8 @@ public void addNewSubgroup(GroupNodeViewModel parent) { * Opens "Edit Group Dialog" and changes the given group to the edited one. */ public void editGroup(GroupNodeViewModel oldGroup) { - Optional newGroup = dialogService.showCustomDialogAndWait(new GroupDialog(oldGroup.getGroupNode().getGroup())); + Optional newGroup = dialogService + .showCustomDialogAndWait(new GroupDialog(oldGroup.getGroupNode().getGroup())); newGroup.ifPresent(group -> { // TODO: Keep assignments @@ -143,11 +151,10 @@ public void editGroup(GroupNodeViewModel oldGroup) { Localization.lang("Change of Grouping Method"), Localization.lang("Assign the original group's entries to this group?")); // WarnAssignmentSideEffects.warnAssignmentSideEffects(newGroup, panel.frame()); - boolean removePreviousAssignents = - (oldGroup.getGroupNode().getGroup() instanceof ExplicitGroup) && (group instanceof ExplicitGroup); + boolean removePreviousAssignents = (oldGroup.getGroupNode().getGroup() instanceof ExplicitGroup) + && (group instanceof ExplicitGroup); - List addChange = oldGroup. - getGroupNode().setGroup( + List addChange = oldGroup.getGroupNode().setGroup( group, keepPreviousAssignments, removePreviousAssignents, @@ -197,15 +204,14 @@ public void removeGroupKeepSubgroups(GroupNodeViewModel group) { //final UndoableAddOrRemoveGroup undo = new UndoableAddOrRemoveGroup(groupsRoot, node, UndoableAddOrRemoveGroup.REMOVE_NODE_KEEP_CHILDREN); //panel.getUndoManager().addEdit(undo); GroupTreeNode groupNode = group.getGroupNode(); - groupNode.getParent().ifPresent(parent -> - groupNode.moveAllChildrenTo(parent, parent.getIndexOfChild(groupNode).get())); + groupNode.getParent() + .ifPresent(parent -> groupNode.moveAllChildrenTo(parent, parent.getIndexOfChild(groupNode).get())); groupNode.removeFromParent(); dialogService.notify(Localization.lang("Removed group \"%0\".", group.getDisplayName())); } } - /** * Removes the specified group and its subgroups (after asking for confirmation). */ @@ -249,4 +255,9 @@ public void removeSelectedEntries(GroupNodeViewModel group) { // if (!undo.isEmpty()) { // mPanel.getUndoManager().addEdit(UndoableChangeEntriesOfGroup.getUndoableEdit(mNode, undo)); } + + public void sortAlphabeticallyRecursive(GroupNodeViewModel group) { + group.getGroupNode().sortChildren(compAlphabetIgnoreCase, true); + + } }