2 * Copyright (C) 2009 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.taxeditor
.editor
.definedterm
.e4
;
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
;
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
;
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
;
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
41 public class DefinedTermTreeMenu
{
43 private static final String COMMAND_ID
= "eu.etaxonomy.taxeditor.store.openDefinedTermEditor";
47 public void aboutToShow(List
<MMenuElement
> items
) {
49 if(CdmStore
.isActive()){
51 //add Feature and NamedArea to top level
52 addChildTermsToMenuManager(items
, TermType
.Feature
, true);
53 addChildTermsToMenuManager(items
, TermType
.NamedArea
);
55 MMenu otherMenu
= MMenuFactory
.INSTANCE
.createMenu();
56 otherMenu
.setLabel(Messages
.DefinedTermMenu_OTHERS
);
59 items
.add(MMenuFactory
.INSTANCE
.createMenuSeparator());
61 List
<TermType
> ttList
= new ArrayList
<TermType
>(EnumSet
.allOf(TermType
.class));
62 Collections
.sort(ttList
,new SortByTermTypeMessage());
63 for (TermType tt
: ttList
)
65 //skip Feature and NamedArea as they have already been added to top level
66 if(tt
.equals(TermType
.Feature
) || tt
.equals(TermType
.NamedArea
)){
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
);
78 private void addChildTermsToMenuManager(List
<MMenuElement
> items
, TermType termType
) {
79 addChildTermsToMenuManager(items
, termType
, false);
82 private void addChildTermsToMenuManager(List
<MMenuElement
> items
, TermType termType
, boolean skipChildren
) {
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
));
92 MMenu subMenu
= MMenuFactory
.INSTANCE
.createMenu();
93 subMenu
.setLabel(termType
.getMessage(PreferencesUtil
.getGlobalLanguage()));
95 // term type has children, so create sub menu
96 subMenu
.getChildren().add(createDefaultMenuItem(termType
));
98 subMenu
.getChildren().add(MMenuFactory
.INSTANCE
.createMenuSeparator());
100 // add child items to the sub menu
101 for(TermType tt
: children
) {
102 addChildTermsToMenuManager(subMenu
.getChildren(), tt
);
109 private MHandledMenuItem
createMenuItem(TermType termType
) {
111 MHandledMenuItem menuItem
= MMenuFactory
.INSTANCE
.createHandledMenuItem();
112 menuItem
.setLabel(termType
.getMessage());
113 MCommand mCommand
= MCommandsFactory
.INSTANCE
.createCommand();
114 mCommand
.setElementId(COMMAND_ID
);
117 menuItem
.getTransientData().put(COMMAND_ID
+".termTypeUuid", termType
.getUuid());
119 menuItem
.setCommand(mCommand
);
123 private MHandledMenuItem
createDefaultMenuItem(TermType termType
) {
125 MHandledMenuItem menuItem
= MMenuFactory
.INSTANCE
.createHandledMenuItem();
126 menuItem
.setLabel(String
.format(Messages
.DefinedTermMenu_OTHER_S
, termType
.getMessage()));
127 MCommand mCommand
= MCommandsFactory
.INSTANCE
.createCommand();
128 mCommand
.setElementId(COMMAND_ID
);
131 menuItem
.getTransientData().put(COMMAND_ID
+".termTypeUuid", termType
.getUuid());
133 menuItem
.setCommand(mCommand
);
138 private class SortByTermTypeMessage
implements Comparator
<TermType
> {
140 public int compare(TermType t1
, TermType t2
) {
144 int result
= t1
.getMessage().compareTo(t2
.getMessage());
146 return t1
.compareTo(t2
);