Revision 2fe68f38
Added by Patrick Plitzner about 5 years ago
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/DescriptiveDataSetComposite.java | ||
---|---|---|
23 | 23 |
import org.eclipse.swt.widgets.Tree; |
24 | 24 |
|
25 | 25 |
import eu.etaxonomy.cdm.model.common.TermType; |
26 |
import eu.etaxonomy.cdm.model.description.Character; |
|
26 | 27 |
import eu.etaxonomy.cdm.model.description.FeatureTree; |
27 | 28 |
import eu.etaxonomy.cdm.model.name.Rank; |
28 | 29 |
import eu.etaxonomy.cdm.persistence.dto.TermDto; |
... | ... | |
43 | 44 |
private Text txtDescriptiveDataSet; |
44 | 45 |
private TermUuidComboViewer comboRankMin; |
45 | 46 |
private TermUuidComboViewer comboRankMax; |
46 |
private FeatureTreeEditorComposite featureTreeEditorComposite; |
|
47 |
private FeatureTreeEditorComposite<Character> featureTreeEditorComposite;
|
|
47 | 48 |
private TreeViewer taxonNodeTree; |
48 | 49 |
private List<TermDto> areas = new ArrayList<>(); |
49 | 50 |
private Text textAreaText; |
... | ... | |
134 | 135 |
btnChooseArea = new Button(composite, SWT.NONE); |
135 | 136 |
btnChooseArea.setImage(ImageResources.getImage(ImageResources.BROWSE_ICON)); |
136 | 137 |
|
137 |
featureTreeEditorComposite = new FeatureTreeEditorComposite(this, SWT.NONE); |
|
138 |
featureTreeEditorComposite = new FeatureTreeEditorComposite<Character>(this, SWT.NONE);
|
|
138 | 139 |
featureTreeEditorComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); |
139 | 140 |
} |
140 | 141 |
|
... | ... | |
160 | 161 |
comboRankMax.setElement(max); |
161 | 162 |
} |
162 | 163 |
|
163 |
public FeatureTreeEditorComposite getFeatureTreeEditorComposite() { |
|
164 |
public FeatureTreeEditorComposite<Character> getFeatureTreeEditorComposite() {
|
|
164 | 165 |
return featureTreeEditorComposite; |
165 | 166 |
} |
166 | 167 |
|
167 |
public FeatureTree getCharacters(){ |
|
168 |
public FeatureTree<Character> getCharacters(){
|
|
168 | 169 |
return featureTreeEditorComposite.getFeatureTree(); |
169 | 170 |
} |
170 |
public void setCharacters(FeatureTree characters) { |
|
171 |
public void setCharacters(FeatureTree<Character> characters) {
|
|
171 | 172 |
featureTreeEditorComposite.setSelectedTree(characters); |
172 | 173 |
} |
173 | 174 |
|
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/DescriptiveDataSetEditor.java | ||
---|---|---|
59 | 59 |
import eu.etaxonomy.cdm.api.service.ITermService; |
60 | 60 |
import eu.etaxonomy.cdm.model.common.DefinedTermBase; |
61 | 61 |
import eu.etaxonomy.cdm.model.common.TermType; |
62 |
import eu.etaxonomy.cdm.model.description.Character; |
|
62 | 63 |
import eu.etaxonomy.cdm.model.description.DescriptiveDataSet; |
63 | 64 |
import eu.etaxonomy.cdm.model.description.FeatureTree; |
64 | 65 |
import eu.etaxonomy.cdm.model.location.NamedArea; |
... | ... | |
288 | 289 |
} |
289 | 290 |
} |
290 | 291 |
} |
291 |
FeatureTree characters = composite.getCharacters(); |
|
292 |
FeatureTree<Character> characters = composite.getCharacters();
|
|
292 | 293 |
if(characters!=null){ |
293 | 294 |
//save characters because they can be modified in this editor |
294 | 295 |
characters.getDistinctFeatures().forEach(character->CdmStore.getService(ITermService.class).merge(character,true)); |
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/character/CharacterEditor.java | ||
---|---|---|
58 | 58 |
import eu.etaxonomy.cdm.api.service.IFeatureTreeService; |
59 | 59 |
import eu.etaxonomy.cdm.api.service.ITermService; |
60 | 60 |
import eu.etaxonomy.cdm.api.service.IVocabularyService; |
61 |
import eu.etaxonomy.cdm.model.common.DefinedTermBase; |
|
61 | 62 |
import eu.etaxonomy.cdm.model.common.Representation; |
62 | 63 |
import eu.etaxonomy.cdm.model.common.TermType; |
63 | 64 |
import eu.etaxonomy.cdm.model.common.TermVocabulary; |
... | ... | |
95 | 96 |
public class CharacterEditor implements IFeatureTreeEditor,IConversationEnabled, ISelectionChangedListener, |
96 | 97 |
ModifyListener, IE4ViewerPart, IPartContentHasDetails, IPartContentHasSupplementalData, IDirtyMarkable { |
97 | 98 |
|
98 |
private FeatureTreeEditorComposite characterTreeEditorComposite; |
|
99 |
private FeatureTreeEditorComposite propertiesTreeEditorComposite; |
|
100 |
private FeatureTreeEditorComposite structuresTreeEditorComposite; |
|
99 |
private FeatureTreeEditorComposite<Character> characterTreeEditorComposite;
|
|
100 |
private FeatureTreeEditorComposite<DefinedTermBase> propertiesTreeEditorComposite;
|
|
101 |
private FeatureTreeEditorComposite<DefinedTermBase> structuresTreeEditorComposite;
|
|
101 | 102 |
private final FormToolkit formToolkit = new FormToolkit(Display.getDefault()); |
102 | 103 |
|
103 | 104 |
@Inject |
... | ... | |
228 | 229 |
Collection<Character> characters = createCharacters((TreeSelection)structureTreeSelection, (TreeSelection)propertyTreeSelection); |
229 | 230 |
for (Character character : characters) { |
230 | 231 |
//add new Character to feature tree |
231 |
FeatureNode parent = ((FeatureTree) characterTreeEditorComposite.getViewer().getInput()).getRoot();
|
|
232 |
FeatureNode<Character> parent = ((FeatureTree<Character>) characterTreeEditorComposite.getViewer().getInput()).getRoot();
|
|
232 | 233 |
vocabulary.addTerm(character); |
233 | 234 |
CdmStore.getService(IFeatureNodeService.class).createChildFeatureNode(parent, character); |
234 | 235 |
} |
... | ... | |
252 | 253 |
|
253 | 254 |
} |
254 | 255 |
|
255 |
private FeatureTreeEditorComposite addFeatureTreeEditor(Composite composite_3) {
|
|
256 |
FeatureTreeEditorComposite featureTreeEditorComposite = new FeatureTreeEditorComposite(composite_3, SWT.NONE);
|
|
256 |
private <T extends DefinedTermBase> FeatureTreeEditorComposite<T> addFeatureTreeEditor(Composite composite_3) {
|
|
257 |
FeatureTreeEditorComposite<T> featureTreeEditorComposite = new FeatureTreeEditorComposite<>(composite_3, SWT.NONE);
|
|
257 | 258 |
featureTreeEditorComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); |
258 | 259 |
return featureTreeEditorComposite; |
259 | 260 |
} |
... | ... | |
292 | 293 |
public static Collection<Character> createCharacters(TreeSelection structureTreeSelection, TreeSelection propertyTreeSelection){ |
293 | 294 |
Set<Character> characters = new HashSet<>(); |
294 | 295 |
//get selected structures and properties |
295 |
Iterator<FeatureNode> structureIterator = structureTreeSelection.iterator(); |
|
296 |
Iterator<FeatureNode<DefinedTermBase>> structureIterator = structureTreeSelection.iterator();
|
|
296 | 297 |
|
297 | 298 |
//create all combinations of structures and properties |
298 | 299 |
while(structureIterator.hasNext()){ |
299 |
FeatureNode structureNode = structureIterator.next(); |
|
300 |
Iterator<FeatureNode> propertiesIterator = propertyTreeSelection.iterator(); |
|
300 |
FeatureNode<DefinedTermBase> structureNode = structureIterator.next();
|
|
301 |
Iterator<FeatureNode<DefinedTermBase>> propertiesIterator = propertyTreeSelection.iterator();
|
|
301 | 302 |
while(propertiesIterator.hasNext()){ |
302 |
FeatureNode propertyNode = propertiesIterator.next(); |
|
303 |
FeatureNode<DefinedTermBase> propertyNode = propertiesIterator.next();
|
|
303 | 304 |
Representation structureRepresentation = structureNode.getTerm().getRepresentation(PreferencesUtil.getGlobalLanguage()); |
304 | 305 |
Representation propertyRepresentation = propertyNode.getTerm().getRepresentation(PreferencesUtil.getGlobalLanguage()); |
305 | 306 |
String label = null; |
... | ... | |
328 | 329 |
// commit the conversation and start a new transaction immediately |
329 | 330 |
conversation.commit(true); |
330 | 331 |
|
331 |
FeatureTree featureTree = characterTreeEditorComposite.getFeatureTree(); |
|
332 |
FeatureTree<Character> featureTree = characterTreeEditorComposite.getFeatureTree();
|
|
332 | 333 |
if(featureTree!=null){ |
333 | 334 |
//save characters because they can be modified in this editor |
334 | 335 |
featureTree.getDistinctFeatures().forEach(character->CdmStore.getService(ITermService.class).merge(character,true)); |
... | ... | |
382 | 383 |
} |
383 | 384 |
|
384 | 385 |
@Override |
385 |
public List<FeatureTree> getRootEntities() { |
|
386 |
List<FeatureTree> root = new ArrayList<>(); |
|
386 |
public List<FeatureTree<Character>> getRootEntities() {
|
|
387 |
List<FeatureTree<Character>> root = new ArrayList<>();
|
|
387 | 388 |
root.add(characterTreeEditorComposite.getFeatureTree()); |
388 | 389 |
return root; |
389 | 390 |
} |
... | ... | |
423 | 424 |
return (IStructuredSelection) characterTreeEditorComposite.getViewer().getSelection(); |
424 | 425 |
} |
425 | 426 |
|
426 |
public FeatureTree getCharacterTree(){ |
|
427 |
public FeatureTree<Character> getCharacterTree(){
|
|
427 | 428 |
return characterTreeEditorComposite.getFeatureTree(); |
428 | 429 |
} |
429 | 430 |
|
... | ... | |
435 | 436 |
} |
436 | 437 |
|
437 | 438 |
private class FeatureTreeChooserListener extends SelectionAdapter{ |
438 |
private FeatureTreeEditorComposite featureTreeEditorComposite; |
|
439 |
private FeatureTreeEditorComposite<?> featureTreeEditorComposite;
|
|
439 | 440 |
private TermType termType; |
440 | 441 |
|
441 |
public FeatureTreeChooserListener(FeatureTreeEditorComposite featureTreeEditorComposite, TermType termType) { |
|
442 |
public FeatureTreeChooserListener(FeatureTreeEditorComposite<?> featureTreeEditorComposite, TermType termType) {
|
|
442 | 443 |
super(); |
443 | 444 |
this.featureTreeEditorComposite = featureTreeEditorComposite; |
444 | 445 |
this.termType = termType; |
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/matrix/CharacterMatrix.java | ||
---|---|---|
98 | 98 |
import eu.etaxonomy.cdm.api.service.dto.RowWrapperDTO; |
99 | 99 |
import eu.etaxonomy.cdm.api.service.dto.SpecimenRowWrapperDTO; |
100 | 100 |
import eu.etaxonomy.cdm.common.monitor.IRemotingProgressMonitor; |
101 |
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; |
|
102 |
import eu.etaxonomy.cdm.model.common.DefinedTermBase; |
|
103 | 101 |
import eu.etaxonomy.cdm.model.description.Character; |
104 | 102 |
import eu.etaxonomy.cdm.model.description.DescriptionBase; |
105 | 103 |
import eu.etaxonomy.cdm.model.description.DescriptiveDataSet; |
... | ... | |
271 | 269 |
natTable.doCommand(new ClientAreaResizeCommand(natTable)); |
272 | 270 |
} |
273 | 271 |
|
274 |
private List<Character> initCharacterList(FeatureNode node){ |
|
272 |
private List<Character> initCharacterList(FeatureNode<Character> node){
|
|
275 | 273 |
List<Character> characters = new ArrayList<>(); |
276 | 274 |
node.getChildNodes().forEach(childNode-> |
277 | 275 |
{ |
278 |
DefinedTermBase term = childNode.getTerm(); |
|
279 |
// FIXME #8146 this is currently checked via the termType of the tree |
|
280 |
// in the init() method. This may be solved by adding generics to FeatureNode |
|
281 |
// so that getTerm is typified. This would make this check obsolete |
|
282 |
if(term.isInstanceOf(Character.class)){ |
|
283 |
characters.add(HibernateProxyHelper.deproxy(term, Character.class)); |
|
284 |
} |
|
276 |
characters.add(childNode.getTerm()); |
|
285 | 277 |
characters.addAll(initCharacterList(childNode)); |
286 | 278 |
}); |
287 | 279 |
return characters; |
... | ... | |
290 | 282 |
public void initDescriptiveDataSet(DescriptiveDataSet descriptiveDataSet){ |
291 | 283 |
this.descriptiveDataSet = descriptiveDataSet; |
292 | 284 |
//get features/columns stored in descriptive data set |
293 |
FeatureTree tree = descriptiveDataSet.getDescriptiveSystem(); |
|
285 |
FeatureTree<Character> tree = descriptiveDataSet.getDescriptiveSystem();
|
|
294 | 286 |
characters = initCharacterList(tree.getRoot()); |
295 | 287 |
|
296 | 288 |
//init state data for categorical features |
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/e4/handler/DynamicFeatureMenuE4.java | ||
---|---|---|
60 | 60 |
Object selectedElement = selection.getFirstElement(); |
61 | 61 |
|
62 | 62 |
if (selectedElement instanceof DescriptionBase<?>) { |
63 |
FeatureTree featureTree = getFeatureTree((DescriptionBase<?>) selectedElement); |
|
63 |
FeatureTree<?> featureTree = getFeatureTree((DescriptionBase<?>) selectedElement);
|
|
64 | 64 |
|
65 |
for (FeatureNode childNode : featureTree.getRootChildren()) { |
|
65 |
for (FeatureNode<?> childNode : featureTree.getRootChildren()) {
|
|
66 | 66 |
createMenuItem(menu, childNode.getTerm(), globalLanguage); |
67 | 67 |
} |
68 | 68 |
} else if (selectedElement instanceof FeatureNodeContainer) { |
69 |
FeatureNode featureNode = ((FeatureNodeContainer) selectedElement) |
|
69 |
FeatureNode<?> featureNode = ((FeatureNodeContainer) selectedElement)
|
|
70 | 70 |
.getFeatureNode(); |
71 | 71 |
|
72 | 72 |
// add the feature to the menu |
73 | 73 |
createMenuItem(menu, featureNode.getTerm(), globalLanguage); |
74 | 74 |
|
75 | 75 |
// add possible children to the menu |
76 |
for (FeatureNode childNode : featureNode.getChildNodes()) { |
|
76 |
for (FeatureNode<?> childNode : featureNode.getChildNodes()) {
|
|
77 | 77 |
createMenuItem(menu, childNode.getTerm(), globalLanguage); |
78 | 78 |
} |
79 | 79 |
} else if (selectedElement instanceof DescriptionElementBase) { |
... | ... | |
122 | 122 |
* @param description |
123 | 123 |
* @return |
124 | 124 |
*/ |
125 |
private FeatureTree getFeatureTree(DescriptionBase description) { |
|
126 |
FeatureTree featureTree = null; |
|
125 |
private FeatureTree<?> getFeatureTree(DescriptionBase description) {
|
|
126 |
FeatureTree<?> featureTree = null;
|
|
127 | 127 |
|
128 | 128 |
// TODO change this to the feature tree associated with this taxon |
129 | 129 |
// description |
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/e4/FeatureTreeEditorComposite.java | ||
---|---|---|
28 | 28 |
import org.eclipse.swt.widgets.Text; |
29 | 29 |
import org.eclipse.swt.widgets.Tree; |
30 | 30 |
|
31 |
import eu.etaxonomy.cdm.model.common.DefinedTermBase; |
|
31 | 32 |
import eu.etaxonomy.cdm.model.common.TermType; |
32 | 33 |
import eu.etaxonomy.cdm.model.description.FeatureTree; |
33 | 34 |
import eu.etaxonomy.taxeditor.editor.definedterm.TermTransfer; |
... | ... | |
44 | 45 |
* @since Jun 19, 2017 |
45 | 46 |
* |
46 | 47 |
*/ |
47 |
public class FeatureTreeEditorComposite extends Composite{ |
|
48 |
public class FeatureTreeEditorComposite <T extends DefinedTermBase> extends Composite{
|
|
48 | 49 |
|
49 |
private FeatureTree featureTree; |
|
50 |
private FeatureTree<T> featureTree;
|
|
50 | 51 |
|
51 | 52 |
private Label label_title; |
52 | 53 |
private Text text_title; |
... | ... | |
180 | 181 |
btnOpenFeatureTree.addSelectionListener(new SelectionAdapter(){ |
181 | 182 |
@Override |
182 | 183 |
public void widgetSelected(SelectionEvent e) { |
183 |
FeatureTree tree = FeatureTreeSelectionDialog.select(getDisplay().getActiveShell(), |
|
184 |
FeatureTree<T> tree = FeatureTreeSelectionDialog.select(getDisplay().getActiveShell(),
|
|
184 | 185 |
null, termType); |
185 | 186 |
if(tree!=null){ |
186 | 187 |
setSelectedTree(tree); |
... | ... | |
193 | 194 |
} |
194 | 195 |
} |
195 | 196 |
|
196 |
public void setSelectedTree(FeatureTree featureTree) { |
|
197 |
public void setSelectedTree(FeatureTree<T> featureTree) {
|
|
197 | 198 |
this.featureTree = featureTree; |
198 | 199 |
|
199 | 200 |
viewer.setInput(featureTree); |
... | ... | |
208 | 209 |
} |
209 | 210 |
} |
210 | 211 |
|
211 |
public FeatureTree getFeatureTree() { |
|
212 |
public FeatureTree<T> getFeatureTree() {
|
|
212 | 213 |
return featureTree; |
213 | 214 |
} |
214 | 215 |
|
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/FeatureNodeContainer.java | ||
---|---|---|
41 | 41 |
|
42 | 42 |
|
43 | 43 |
|
44 |
private FeatureNode featureNode; |
|
44 |
private FeatureNode<Feature> featureNode;
|
|
45 | 45 |
private List<FeatureNodeContainer> children = new ArrayList<FeatureNodeContainer>(); |
46 | 46 |
private List<DescriptionElementBase> descriptionElements = new ArrayList<DescriptionElementBase>(); |
47 | 47 |
|
... | ... | |
64 | 64 |
* @param description |
65 | 65 |
* @return |
66 | 66 |
*/ |
67 |
protected void findLeaves(FeatureNode featureNode) { |
|
67 |
protected void findLeaves(FeatureNode<Feature> featureNode) {
|
|
68 | 68 |
if(featureNode.isLeaf()){ |
69 | 69 |
buildLeaf(featureNode); |
70 | 70 |
}else{ |
71 |
for(FeatureNode childNode : featureNode.getChildNodes()){ |
|
71 |
for(FeatureNode<Feature> childNode : featureNode.getChildNodes()){
|
|
72 | 72 |
findLeaves(childNode); |
73 | 73 |
} |
74 | 74 |
} |
... | ... | |
80 | 80 |
* @param description |
81 | 81 |
* @return |
82 | 82 |
*/ |
83 |
private void buildLeaf(FeatureNode featureNode){ |
|
84 |
if(featureNode.getFeature() == null){
|
|
83 |
private void buildLeaf(FeatureNode<Feature> featureNode){
|
|
84 |
if(featureNode.getTerm() == null){
|
|
85 | 85 |
throw new IllegalArgumentException("The given feature node does not have a feature."); |
86 | 86 |
} |
87 | 87 |
|
88 |
Feature feature = (Feature) HibernateProxyHelper.deproxy(featureNode.getFeature());
|
|
88 |
Feature feature = HibernateProxyHelper.deproxy(featureNode.getTerm());
|
|
89 | 89 |
|
90 | 90 |
// get feature node container for the given feature |
91 | 91 |
FeatureNodeContainer container = containerTree.getFeatureNodeContainer(feature); |
... | ... | |
140 | 140 |
*/ |
141 | 141 |
private void buildBranch(){ |
142 | 142 |
if(getParent() == null){ |
143 |
FeatureNode parentFeatureNode = getFeatureNode().getParent(); |
|
143 |
FeatureNode<Feature> parentFeatureNode = getFeatureNode().getParent();
|
|
144 | 144 |
|
145 | 145 |
if(parentFeatureNode.isRoot()){ |
146 | 146 |
containerTree.getRoot().addChild(this); |
... | ... | |
277 | 277 |
* |
278 | 278 |
* @param featureNode a {@link eu.etaxonomy.cdm.model.description.FeatureNode} object. |
279 | 279 |
*/ |
280 |
public void setFeatureNode(FeatureNode featureNode) { |
|
280 |
public void setFeatureNode(FeatureNode<Feature> featureNode) {
|
|
281 | 281 |
this.featureNode = featureNode; |
282 | 282 |
} |
283 | 283 |
|
... | ... | |
286 | 286 |
* |
287 | 287 |
* @return a {@link eu.etaxonomy.cdm.model.description.FeatureNode} object. |
288 | 288 |
*/ |
289 |
public FeatureNode getFeatureNode() { |
|
289 |
public FeatureNode<Feature> getFeatureNode() {
|
|
290 | 290 |
return featureNode; |
291 | 291 |
} |
292 | 292 |
|
... | ... | |
297 | 297 |
*/ |
298 | 298 |
public Feature getFeature(){ |
299 | 299 |
if(featureNode != null){ |
300 |
return featureNode.getFeature();
|
|
300 |
return featureNode.getTerm();
|
|
301 | 301 |
} |
302 | 302 |
return null; |
303 | 303 |
} |
Also available in: Unified diff
ref #6794 Adapt taxeditor to model changes (feature tree/node generics)