Merge branch 'release/5.18.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / editor / definedterm / e4 / DefinedTermTreeMenu.java
1 /**
2 * Copyright (C) 2009 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.taxeditor.editor.definedterm.e4;
11
12 import java.util.ArrayList;
13 import java.util.Collections;
14 import java.util.Comparator;
15 import java.util.EnumSet;
16 import java.util.List;
17 import java.util.Set;
18
19 import org.eclipse.e4.ui.di.AboutToShow;
20 import org.eclipse.e4.ui.model.application.commands.MCommand;
21 import org.eclipse.e4.ui.model.application.commands.MCommandsFactory;
22 import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
23 import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
24 import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement;
25 import org.eclipse.e4.ui.model.application.ui.menu.MMenuFactory;
26
27 import eu.etaxonomy.cdm.model.term.TermType;
28 import eu.etaxonomy.taxeditor.l10n.Messages;
29 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
30 import eu.etaxonomy.taxeditor.store.CdmStore;
31
32 /**
33 *
34 * Menu to dynamically generate menu (sub-menu) contribution items
35 * for term types which when clicked open the defined term editor for the chosen term type
36 *
37 * @author pplitzner
38 * @since Aug 23, 2017
39 *
40 */
41 public class DefinedTermTreeMenu {
42
43 private static final String COMMAND_ID = "eu.etaxonomy.taxeditor.store.openDefinedTermEditor";
44
45 /** {@inheritDoc} */
46 @AboutToShow
47 public void aboutToShow(List<MMenuElement> items) {
48
49 if(CdmStore.isActive()){
50
51 //add Feature and NamedArea to top level
52 // addChildTermsToMenuManager(items, TermType.Feature, true);
53 // addChildTermsToMenuManager(items, TermType.NamedArea);
54
55 MMenu otherMenu = MMenuFactory.INSTANCE.createMenu();
56 otherMenu.setLabel(Messages.DefinedTermMenu_Vocabularies);
57 items.add(otherMenu);
58
59 items.add(MMenuFactory.INSTANCE.createMenuSeparator());
60
61 List<TermType> ttList = new ArrayList<TermType>(EnumSet.allOf(TermType.class));
62 Collections.sort(ttList,new SortByTermTypeMessage());
63 for (TermType tt : ttList)
64 {
65 //skip Feature and NamedArea as they have already been added to top level
66 // if(tt.equals(TermType.Feature) || tt.equals(TermType.NamedArea)){
67 // continue;
68 // }
69 // if term type has a parent, do not add it
70 // it will be added in the recursive call
71 if(tt.getKindOf() == null) {
72 addChildTermsToMenuManager(otherMenu.getChildren(), tt);
73 }
74 }
75 }
76 }
77
78 private void addChildTermsToMenuManager(List<MMenuElement> items, TermType termType) {
79 addChildTermsToMenuManager(items, termType, false);
80 }
81
82 private void addChildTermsToMenuManager(List<MMenuElement> items, TermType termType, boolean skipChildren) {
83
84 //FIXME : need a better way to find out if a term type can be editable (ticket 3853)
85 if(termType.getEmptyDefinedTermBase() != null) {
86 Set<TermType> children = termType.getGeneralizationOf();
87 // term type has no children, so create menu item
88 if(skipChildren || children.isEmpty()) {
89 items.add(createMenuItem(termType));
90 }
91 else{
92 MMenu subMenu = MMenuFactory.INSTANCE.createMenu();
93 subMenu.setLabel(termType.getLabel(PreferencesUtil.getGlobalLanguage()));
94 items.add(subMenu);
95 // term type has children, so create sub menu
96 subMenu.getChildren().add(createDefaultMenuItem(termType));
97
98 subMenu.getChildren().add(MMenuFactory.INSTANCE.createMenuSeparator());
99
100 // add child items to the sub menu
101 for(TermType tt : children) {
102 addChildTermsToMenuManager(subMenu.getChildren(), tt);
103 }
104 }
105 }
106
107 }
108
109 private MHandledMenuItem createMenuItem(TermType termType) {
110
111 MHandledMenuItem menuItem = MMenuFactory.INSTANCE.createHandledMenuItem();
112 menuItem.setLabel(termType.getLabel());
113 MCommand mCommand = MCommandsFactory.INSTANCE.createCommand();
114 mCommand.setElementId(COMMAND_ID);
115
116 //set params
117 menuItem.getTransientData().put(COMMAND_ID+".termTypeUuid", termType.getUuid());
118
119 menuItem.setCommand(mCommand);
120 return menuItem;
121 }
122
123 private MHandledMenuItem createDefaultMenuItem(TermType termType) {
124
125 MHandledMenuItem menuItem = MMenuFactory.INSTANCE.createHandledMenuItem();
126 menuItem.setLabel(String.format(Messages.DefinedTermMenu_OTHER_S, termType.getLabel()));
127 MCommand mCommand = MCommandsFactory.INSTANCE.createCommand();
128 mCommand.setElementId(COMMAND_ID);
129
130 //set params
131 menuItem.getTransientData().put(COMMAND_ID+".termTypeUuid", termType.getUuid());
132
133 menuItem.setCommand(mCommand);
134
135 return menuItem;
136 }
137
138 private class SortByTermTypeMessage implements Comparator<TermType> {
139 @Override
140 public int compare(TermType t1, TermType t2) {
141 if (t1.equals(t2)){
142 return 0;
143 }
144 int result = t1.getLabel().compareTo(t2.getLabel());
145 if (result == 0){
146 return t1.compareTo(t2);
147 }
148 return result;
149 }
150 }
151 }