Integrate FeatureTreeEditorComposite into CharacterEditor
authorPatrick Plitzner <p.plitzner@bgbm.org>
Mon, 19 Jun 2017 15:04:40 +0000 (17:04 +0200)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Mon, 19 Jun 2017 15:04:40 +0000 (17:04 +0200)
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/workingSet/CharacterEditor.java

index e41aded0242a95db9d9cb95115575237158e5245..92c5d5f01558fc0dfb21d10dc763220cf2353b55 100644 (file)
@@ -9,22 +9,29 @@
 */
 package eu.etaxonomy.taxeditor.editor.workingSet;
 
-import java.util.Collections;
 import java.util.UUID;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
+import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.eclipse.e4.ui.di.Focus;
+import org.eclipse.e4.ui.model.application.ui.MDirtyable;
 import org.eclipse.e4.ui.services.IServiceConstants;
+import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
 import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.TreeSelection;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.SashForm;
 import org.eclipse.swt.dnd.DND;
 import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.layout.GridData;
@@ -39,32 +46,42 @@ import org.eclipse.ui.forms.widgets.FormToolkit;
 
 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
+import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.description.Character;
 import eu.etaxonomy.cdm.model.description.FeatureNode;
 import eu.etaxonomy.cdm.model.description.FeatureTree;
+import eu.etaxonomy.taxeditor.featuretree.FeatureNodeDragListener;
+import eu.etaxonomy.taxeditor.featuretree.FeatureNodeDropAdapter;
 import eu.etaxonomy.taxeditor.featuretree.FeatureNodeTransfer;
 import eu.etaxonomy.taxeditor.featuretree.FeatureTreeContentProvider;
 import eu.etaxonomy.taxeditor.featuretree.FeatureTreeLabelProvider;
-import eu.etaxonomy.taxeditor.featuretree.e4.FeatureTreeEditor;
+import eu.etaxonomy.taxeditor.featuretree.e4.FeatureTreeEditorComposite;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.ui.dialog.selection.FeatureTreeSelectionDialog;
 
 /**
  * @author pplitzner
  * @date 24.05.2017
  *
  */
-public class CharacterEditor {
+public class CharacterEditor implements ISelectionChangedListener, ModifyListener{
 
 
-    private TreeViewer treeViewerCharacters;
+    private FeatureTreeEditorComposite featureTreeEditorComposite;
     private TreeViewer treeViewerProperties;
     private TreeViewer treeViewerStructures;
-    private FeatureTreeEditor editor;
     private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
     private Button btnAddCharacter;
 
+    @Inject
+    private ESelectionService selService;
+
+    @Inject
+    private MDirtyable dirty;
+
     private ConversationHolder conversation;
+    private FeatureTree featureTree;
 
     public CharacterEditor() {
         conversation = CdmStore.createConversation();
@@ -117,24 +134,44 @@ public class CharacterEditor {
 
         btnAddCharacter = new Button(composite_2, SWT.NONE);
         btnAddCharacter.setText(">>");
-        btnAddCharacter.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true, 1, 1));
+        btnAddCharacter.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, true, 1, 1));
         formToolkit.adapt(btnAddCharacter, true, true);
 
-
         Composite composite_3 = new Composite(sashForm, SWT.NONE);
         formToolkit.adapt(composite_3);
         formToolkit.paintBordersFor(composite_3);
         composite_3.setLayout(new GridLayout(1, false));
 
-        editor = new FeatureTreeEditor(shell);
-        editor.createControl(composite_3, shell);
-
-        //                treeViewerCharacters = new TreeViewer(sashForm, SWT.BORDER);
+        featureTreeEditorComposite = new FeatureTreeEditorComposite(composite_3, SWT.BORDER);
+        featureTreeEditorComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
+        featureTreeEditorComposite.getButton_add().setVisible(false);
+        featureTreeEditorComposite.getButton_remove().setVisible(false);
+        featureTreeEditorComposite.init(new FeatureNodeDragListener(featureTreeEditorComposite.getViewer()), new FeatureNodeDropAdapter(featureTreeEditorComposite.getViewer()), this, new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                FeatureTree tree = FeatureTreeSelectionDialog.select(shell, conversation, null);
+                if(tree!=null){
+                    setSelectedTree(tree);
+                }
+            }
+        }, new SelectionAdapter() {
+        }, new SelectionAdapter() {
+        });
         sashForm.setWeights(new int[] {3, 3, 1, 3});
 
         init();
     }
 
+    public void setSelectedTree(FeatureTree featureTree) {
+        this.featureTree = HibernateProxyHelper.deproxy(featureTree, FeatureTree.class);
+        this.featureTree.setRoot(HibernateProxyHelper.deproxy(featureTree.getRoot(), FeatureNode.class));
+        featureTreeEditorComposite.getViewer().setInput(featureTree);
+
+        featureTreeEditorComposite.getText_title().removeModifyListener(this);
+        featureTreeEditorComposite.getText_title().setText(featureTree.getTitleCache());
+        featureTreeEditorComposite.getText_title().addModifyListener(this);
+    }
+
     private void init(){
         int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
         Transfer[] transfers = new Transfer[] { FeatureNodeTransfer.getInstance() };
@@ -158,24 +195,31 @@ public class CharacterEditor {
             public void widgetSelected(SelectionEvent e) {
                 ISelection structureTreeSelection = treeViewerStructures.getSelection();
                 ISelection propertyTreeSelection = treeViewerProperties.getSelection();
-                if(structureTreeSelection==null || propertyTreeSelection==null || editor.getSelectedFeatureTree()==null){
+                if(structureTreeSelection==null || propertyTreeSelection==null /*|| editor.getSelectedFeatureTree()==null*/){
                     MessagingUtils.warningDialog("Cannot perform action", CharacterEditor.this,
                             "You have to select a structure, a property and a feature tree to perform this action.");
                     return;
                 }
+                //get selected structure and property
                 FeatureNode structureNode = (FeatureNode) ((TreeSelection)structureTreeSelection).getFirstElement();
                 FeatureNode propertyNode = (FeatureNode) ((TreeSelection)propertyTreeSelection).getFirstElement();
+                //create new Character
                 String label = structureNode.getFeature().toString()+" "+propertyNode.getFeature().toString();
                 Character character = Character.NewInstance(structureNode, propertyNode, null, label, label);
-                //TODO session handling
-//                CdmStore.getService(ITermService.class).save(character);
-                editor.addFeatures(Collections.singleton(character));
+//                CdmStore.getService(ITermService.class).merge(character);
+
+                //add new Character to feature tree
+                IStructuredSelection selection = (IStructuredSelection) featureTreeEditorComposite.getViewer().getSelection();
+                FeatureNode parent = (FeatureNode) (selection.getFirstElement() != null ? selection.getFirstElement()
+                        : ((FeatureTree) featureTreeEditorComposite.getViewer().getInput()).getRoot());
+                FeatureNode child = FeatureNode.NewInstance(character);
+//                CdmStore.getService(IFeatureNodeService.class).merge(child, true);
+
+                parent.addChild(child);
+                setDirty(true);
+                featureTreeEditorComposite.getViewer().refresh();
             }
         });
-
-//        treeViewerCharacters.setContentProvider(new FeatureTreeContentProvider());
-//        treeViewerCharacters.setLabelProvider(new FeatureTreeLabelProvider());
-//        treeViewerCharacters.addDropSupport(dndOperations, transfers, new CharacterDropAdapter(treeViewerCharacters));
     }
 
     @PreDestroy
@@ -189,13 +233,33 @@ public class CharacterEditor {
         }
     }
 
-    public TreeViewer getTreeViewerCharacters() {
-        return treeViewerCharacters;
-    }
     public TreeViewer getTreeViewerProperties() {
         return treeViewerProperties;
     }
     public TreeViewer getTreeViewerStructures() {
         return treeViewerStructures;
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void selectionChanged(SelectionChangedEvent event) {
+        //propagate selection
+        IStructuredSelection isel = (IStructuredSelection) event.getSelection();
+        selService.setSelection((isel.size() == 1 ? isel.getFirstElement() : isel.toArray()));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void modifyText(ModifyEvent e) {
+        featureTree.setTitleCache(featureTreeEditorComposite.getText_title().getText(), true);
+        setDirty(true);
+    }
+
+    private void setDirty(boolean isDirty) {
+        dirty.setDirty(isDirty);
+    }
 }