edu.harvard.i2b2.eclipse.plugins.workplace.views.find.FindViewNodeBrowser.java Source code

Java tutorial

Introduction

Here is the source code for edu.harvard.i2b2.eclipse.plugins.workplace.views.find.FindViewNodeBrowser.java

Source

/*
 * Copyright (c) 2006-2012 Massachusetts General Hospital 
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the i2b2 Software License v2.1 
 * which accompanies this distribution. 
 * 
 * Contributors:
 *       Lori Phillips
 */
package edu.harvard.i2b2.eclipse.plugins.workplace.views.find;

import java.util.*;

import org.apache.axis2.AxisFault;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.resource.*;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.jface.window.*;

import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.graphics.*;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;

import edu.harvard.i2b2.eclipse.ICommonMethod;
import edu.harvard.i2b2.eclipse.UserInfoBean;
import edu.harvard.i2b2.eclipse.plugins.workplace.model.TermSelectionProvider;
import edu.harvard.i2b2.eclipse.plugins.workplace.util.StringUtil;
//import edu.harvard.i2b2.eclipse.plugins.workplace.views.find.ModifierComposite;
//import edu.harvard.i2b2.eclipse.plugins.workplace.views.NodeDropListener;
import edu.harvard.i2b2.eclipse.plugins.workplace.views.find.TreeData;
import edu.harvard.i2b2.eclipse.plugins.workplace.views.find.TreeNode;
import edu.harvard.i2b2.eclipse.plugins.workplace.ws.AddChildRequestMessage;
import edu.harvard.i2b2.eclipse.plugins.workplace.ws.WorkplaceResponseMessage;
import edu.harvard.i2b2.eclipse.plugins.workplace.ws.WorkplaceServiceDriver;
//import edu.harvard.i2b2.eclipse.plugins.workplace.ws.OntServiceDriver;
//import edu.harvard.i2b2.eclipse.plugins.workplace.ws.OntologyResponseMessage;
import edu.harvard.i2b2.wkplclient.datavo.i2b2message.StatusType;
import edu.harvard.i2b2.wkplclient.datavo.vdo.ConceptType;
import edu.harvard.i2b2.wkplclient.datavo.vdo.ConceptsType;
import edu.harvard.i2b2.wkplclient.datavo.wdo.FolderType;
import edu.harvard.i2b2.wkplclient.datavo.wdo.FoldersType;
import edu.harvard.i2b2.wkplclient.datavo.wdo.GetChildrenType;
import edu.harvard.i2b2.wkplclient.datavo.wdo.MatchStrType;
import edu.harvard.i2b2.wkplclient.datavo.vdo.ModifierType;
import edu.harvard.i2b2.wkplclient.datavo.vdo.ModifiersType;
import edu.harvard.i2b2.wkplclient.datavo.wdo.FindByChildType;

public class FindViewNodeBrowser extends ApplicationWindow {
    private Log log = LogFactory.getLog(FindViewNodeBrowser.class.getName());
    public boolean stopRunning = false;
    private Button findButton;
    private TreeViewer viewer;
    private int result;
    private TreeData currentData;
    public TreeNode rootNode;
    private ImageRegistry imageRegistry;
    private StatusLineManager slm;
    //private NodeBrowser browser;
    //private Menu modifierMenu;

    private Menu menu;
    private Menu folderMenu;
    private Menu caseMenu;

    public FindViewNodeBrowser(Composite parent, int inputFlag, Button button, StatusLineManager slm) {
        super(null);
        this.slm = slm;
        //this.browser = this;
        findButton = button;
        imageRegistry = new ImageRegistry();
        createImageRegistry();

        createTreeViewer(parent, SWT.MULTI | SWT.BORDER, inputFlag);
        Transfer[] types = new Transfer[] { TextTransfer.getInstance() };

        this.viewer.addDragSupport(DND.DROP_COPY, types, new NodeDragListener(this.viewer));
        //this.viewer.addDropSupport(DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_DEFAULT, types, new NodeDropListener(this.viewer));

    }

    // key mappings and icon file names match xml_i2b2_type.

    private void createImageRegistry() {
        ImageDescriptor imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/leaf.jpg");
        this.imageRegistry.put("leaf", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/multi.bmp");
        this.imageRegistry.put("multi", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/openFolder.jpg");
        this.imageRegistry.put("openFolder", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/openCase.jpg");
        this.imageRegistry.put("openCase", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/closedFolder.jpg");
        this.imageRegistry.put("closedFolder", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/closedCase.jpg");
        this.imageRegistry.put("closedCase", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/concept.jpg");
        this.imageRegistry.put("concept", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/conceptFA.jpg");
        this.imageRegistry.put("conceptFA", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/patient_coll.jpg");
        this.imageRegistry.put("patient_coll", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/xml_results.jpg");
        this.imageRegistry.put("xml_results", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/patient_count_xml.jpg");
        this.imageRegistry.put("patient_count_xml", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/prev_query.jpg");
        this.imageRegistry.put("prev_query", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/query_definition.jpg");
        this.imageRegistry.put("query_definition", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/group_template.jpg");
        this.imageRegistry.put("group_template", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/observation.png");
        this.imageRegistry.put("observation", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/patient.jpg");
        this.imageRegistry.put("patient", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/patient.jpg");
        this.imageRegistry.put("pdo", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/morepeople.jpg");
        this.imageRegistry.put("encounter_coll", imageDescriptor);
    }

    private void createTreeViewer(Composite parent, int style, int inputFlag) {
        Tree tree = new Tree(parent, style);

        GridData gridData = new GridData(GridData.FILL_BOTH);
        //gridData.verticalSpan = 50;
        gridData.horizontalSpan = 2;
        //gridData.widthHint = 150;
        gridData.grabExcessHorizontalSpace = true;
        gridData.heightHint = 100;
        //gridData.grabExcessVerticalSpace = true;
        tree.setLayoutData(gridData);

        MenuManager popupMenu = new MenuManager();
        IAction renameAction = new RenameAction();
        IAction annotateAction = new AnnotateAction();
        IAction deleteAction = new DeleteAction();
        IAction exportAction = new ExportAction();
        popupMenu.add(renameAction);
        popupMenu.add(annotateAction);
        popupMenu.add(deleteAction);
        popupMenu.add(exportAction);
        menu = popupMenu.createContextMenu(tree);

        MenuManager casePopupMenu = new MenuManager();
        IAction makeFolderAction = new NewFolderAction();
        casePopupMenu.add(makeFolderAction);
        caseMenu = casePopupMenu.createContextMenu(tree);

        MenuManager folderPopupMenu = new MenuManager();
        folderPopupMenu.add(renameAction);
        folderPopupMenu.add(annotateAction);
        folderPopupMenu.add(deleteAction);
        folderPopupMenu.add(makeFolderAction);
        folderMenu = folderPopupMenu.createContextMenu(tree);

        //       tree.setMenu(menu);

        this.viewer = new TreeViewer(tree);
        this.viewer.setLabelProvider(new LabelProvider() {
            public String getText(Object element) {
                // Set the tooltip data
                //  (cant be done in the lookup thread)
                //   maps TreeViewer node to Tree item and sets item.data
                TreeItem item = (TreeItem) (viewer.testFindItem((TreeNode) element));
                String tooltip = ((TreeNode) element).getData().getTooltip();
                if ((tooltip == null) || (tooltip.equals(""))) {
                    tooltip = ((TreeNode) element).toString();
                }
                tooltip = " " + tooltip + " ";
                item.setData("TOOLTIP", tooltip);

                // if element is Inactive; print label in gray
                if (((TreeNode) element).getData().getVisualAttributes().substring(1, 2).equals("I")) {
                    Color color = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GRAY);
                    item.setForeground(color);
                }

                //               if element is Hidden; print label in red
                else if (((TreeNode) element).getData().getVisualAttributes().substring(1, 2).equals("H")) {
                    Color color = Display.getCurrent().getSystemColor(SWT.COLOR_RED);
                    item.setForeground(color);
                }

                //              if element is undefined; print label in red
                else if (((TreeNode) element).getData().getVisualAttributes().equals("C-ERROR")) {
                    Color color = Display.getCurrent().getSystemColor(SWT.COLOR_RED);
                    item.setForeground(color);
                }

                //              if element is synonym; print label in dark blue
                //              if (((TreeNode)element).getData().getSynonymCd() != null) {
                //                 if (((TreeNode)element).getData().getSynonymCd().equals("Y"))
                //                 {
                //                    Color color = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE);
                //                    item.setForeground(color);
                //                 }
                //              }   
                return ((TreeNode) element).toString();
            }

            public Image getImage(Object element) {
                return imageRegistry.get(((TreeNode) element).getIconKey());
            }
        });
        this.viewer.setContentProvider(new ITreeContentProvider() {
            public Object[] getChildren(Object parentElement) {
                return ((TreeNode) parentElement).getChildren().toArray();
            }

            public Object getParent(Object element) {
                return ((TreeNode) element).getParent();
            }

            public boolean hasChildren(Object element) {
                return ((TreeNode) element).getChildren().size() > 0;
            }

            public Object[] getElements(Object inputElement) {
                return ((TreeNode) inputElement).getChildren().toArray();
            }

            public void dispose() {
            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            }
        });

        this.viewer.setInput(populateRootNode());

        String status = System.getProperty("errorMessage");
        if (status != null) {
            TreeNode placeholder = new TreeNode("placeholder", status, "C-ERROR");
            this.rootNode.addChild(placeholder);
            this.refresh();
            System.setProperty("errorMessage", "");
        }

        this.viewer.addTreeListener(new ITreeViewerListener() {
            public void treeExpanded(TreeExpansionEvent event) {
                final TreeNode node = (TreeNode) event.getElement();
                if (node.getData().getVisualAttributes().equals("FA"))
                    node.getData().setVisualAttributes("FAO");
                else if (node.getData().getVisualAttributes().equals("CA"))
                    node.getData().setVisualAttributes("CAO");
                else if (node.getData().getVisualAttributes().equals("FH"))
                    node.getData().setVisualAttributes("FHO");
                else if (node.getData().getVisualAttributes().equals("CH"))
                    node.getData().setVisualAttributes("CHO");
                //viewer.refresh();

                // check to see if child is a placeholder ('working...')
                //   if so, make Web Service call to update children of node

                if (node.getChildren().size() > 0) {
                    TreeNode firstChild = (TreeNode) (node.getChildren().get(0));
                    if ((firstChild.getData().getVisualAttributes().equals("LAO"))
                            || (firstChild.getData().getVisualAttributes().equals("LHO"))) {
                        // child is a placeholder, so remove from list 
                        //   update list with real children  
                        //                  node.getXMLData(viewer, browser).start();      
                        node.getXMLData(viewer).start();
                    }

                    else {
                        for (int i = 0; i < node.getChildren().size(); i++) {
                            TreeNode child = (TreeNode) (node.getChildren().get(i));
                            if (child.getData().getVisualAttributes().equals("FAO")) {
                                child.getData().setVisualAttributes("FA");
                            } else if (child.getData().getVisualAttributes().equals("CAO")) {
                                child.getData().setVisualAttributes("CA");
                            } else if (child.getData().getVisualAttributes().equals("FHO")) {
                                child.getData().setVisualAttributes("FH");
                            } else if (child.getData().getVisualAttributes().equals("CHO")) {
                                child.getData().setVisualAttributes("CH");
                            }
                        }
                    }
                }
                viewer.refresh();
                viewer.expandToLevel(node, 1);
            }

            public void treeCollapsed(TreeExpansionEvent event) {
                final TreeNode node = (TreeNode) event.getElement();
                if (node.getData().getVisualAttributes().equals("FAO"))
                    node.getData().setVisualAttributes("FA");
                else if (node.getData().getVisualAttributes().equals("CAO"))
                    node.getData().setVisualAttributes("CA");
                else if (node.getData().getVisualAttributes().equals("FHO"))
                    node.getData().setVisualAttributes("FH");
                else if (node.getData().getVisualAttributes().equals("CHO"))
                    node.getData().setVisualAttributes("CH");
                viewer.collapseToLevel(node, 1);
                viewer.refresh();
            }
        });

        this.viewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                TreeNode node = null;
                // if the selection is empty clear the label
                if (event.getSelection().isEmpty()) {
                    setCurrentNode(null);
                    return;
                }
                if (event.getSelection() instanceof IStructuredSelection) {
                    IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                    node = (TreeNode) selection.getFirstElement();
                    setCurrentNode(node);
                }

                // Case where we are expanding the node
                boolean expand = false;
                if ((node.getData().getVisualAttributes()).equals("FA")) {
                    node.getData().setVisualAttributes("FAO");
                    expand = true;
                } else if ((node.getData().getVisualAttributes()).equals("CA")) {
                    node.getData().setVisualAttributes("CAO");
                    expand = true;
                }

                else if (node.getData().getVisualAttributes().equals("FH")) {
                    node.getData().setVisualAttributes("FHO");
                    expand = true;
                } else if (node.getData().getVisualAttributes().equals("CH")) {
                    node.getData().setVisualAttributes("CHO");
                    expand = true;
                }

                if (expand == true) {
                    viewer.expandToLevel(node, 1);
                    viewer.refresh(node);

                    // check to see if this node's child is a placeholder ('working...')
                    //   if so, make Web Service call to update children of node

                    if (node.getChildren().size() > 0) {
                        TreeNode firstChild = (TreeNode) (node.getChildren().get(0));
                        if ((firstChild.getData().getVisualAttributes().equals("LAO"))
                                || (firstChild.getData().getVisualAttributes().equals("LHO"))) {
                            // child is a placeholder, so remove from list 
                            //   update list with real children  
                            ////            node.getXMLData(viewer, browser).start();
                            node.getXMLData(viewer).start();
                        }

                        else {
                            for (int i = 0; i < node.getChildren().size(); i++) {
                                TreeNode child = (TreeNode) (node.getChildren().get(i));
                                if (child.getData().getVisualAttributes().equals("FAO")) {
                                    child.getData().setVisualAttributes("FA");
                                } else if (child.getData().getVisualAttributes().equals("CAO")) {
                                    child.getData().setVisualAttributes("CA");
                                } else if (child.getData().getVisualAttributes().equals("FHO")) {
                                    child.getData().setVisualAttributes("FH");
                                } else if (child.getData().getVisualAttributes().equals("CHO")) {
                                    child.getData().setVisualAttributes("CH");
                                }
                            }
                            viewer.refresh();
                        }
                    }

                }

                // Case where we are collapsing the node
                else if (node.getData().getVisualAttributes().equals("FAO")) {
                    node.getData().setVisualAttributes("FA");
                    viewer.collapseToLevel(node, 1);
                    viewer.refresh(node);
                } else if (node.getData().getVisualAttributes().equals("CAO")) {
                    node.getData().setVisualAttributes("CA");
                    viewer.collapseToLevel(node, 1);
                    viewer.refresh(node);
                } else if (node.getData().getVisualAttributes().equals("FHO")) {
                    node.getData().setVisualAttributes("FH");
                    viewer.collapseToLevel(node, 1);
                    viewer.refresh(node);
                } else if (node.getData().getVisualAttributes().equals("CHO")) {
                    node.getData().setVisualAttributes("CH");
                    viewer.collapseToLevel(node, 1);
                    viewer.refresh(node);
                }
            }
        });

        //       Implement a "fake" tooltip
        final Listener labelListener = new Listener() {
            public void handleEvent(Event event) {
                Label label = (Label) event.widget;
                Shell shell = label.getShell();
                switch (event.type) {
                case SWT.MouseDown:
                    Event e = new Event();
                    e.item = (TreeItem) label.getData("_TREEITEM");
                    //cdh@20060314 have to fix this for multi select in treeview

                    // Assuming table is single select, set the selection as if
                    // the mouse down event went through to the table
                    (viewer.getTree()).setSelection(new TreeItem[] { (TreeItem) e.item });
                    (viewer.getTree()).notifyListeners(SWT.Selection, e);
                    //table.setSelection (new TableItem [] {(TableItem) e.item});
                    //table.notifyListeners (SWT.Selection, e);
                    // fall through
                case SWT.MouseExit:
                    shell.dispose();
                    break;
                }
            }
        };

        Listener viewerListener = new Listener() {
            Shell tip = null;
            Label label = null;

            public void handleEvent(Event event) {
                switch (event.type) {
                case SWT.Dispose:
                case SWT.KeyDown:
                case SWT.MouseDown:
                    if (event.button == 3) // right click
                    {
                        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
                        if (selection.size() != 1)
                            return;

                        TreeNode node = (TreeNode) selection.getFirstElement();
                        if (node.getData().getVisualAttributes().equals("LA"))
                            menu.setVisible(true);
                        else if (node.getData().getVisualAttributes().startsWith("ZA"))
                            menu.setVisible(true);
                        else if (node.getData().getVisualAttributes().startsWith("F"))
                            folderMenu.setVisible(true);
                        else if (node.getData().getVisualAttributes().startsWith("C"))
                            caseMenu.setVisible(true);
                    }

                case SWT.MouseMove:
                case SWT.MouseExit: {
                    if (tip == null)
                        break;
                    tip.dispose();
                    tip = null;
                    label = null;
                    break;
                }
                case SWT.MouseHover: {
                    TreeItem item = (viewer.getTree()).getItem(new Point(event.x, event.y));
                    if (item != null) {
                        if (tip != null && !tip.isDisposed())
                            tip.dispose();
                        tip = new Shell(Display.getCurrent().getActiveShell(), SWT.ON_TOP | SWT.TOOL);
                        tip.setLayout(new FillLayout());
                        label = new Label(tip, SWT.NONE);
                        label.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_FOREGROUND));
                        label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
                        label.setData("_TREEITEM", item);
                        label.setText((String) item.getData("TOOLTIP"));
                        //                     label.setText("Tooltip test");
                        label.addListener(SWT.MouseExit, labelListener);
                        label.addListener(SWT.MouseDown, labelListener);
                        Point size = tip.computeSize(SWT.DEFAULT, SWT.DEFAULT);
                        Rectangle rect = item.getBounds(0);
                        Point pt = viewer.getTree().toDisplay(event.x, event.y);
                        tip.setBounds(pt.x + 10, pt.y + 20, size.x, size.y);
                        tip.setVisible(true);
                    }
                }
                }
            }
        };
        viewer.getTree().addListener(SWT.MouseDown, viewerListener);
        viewer.getTree().addListener(SWT.Dispose, viewerListener);
        viewer.getTree().addListener(SWT.KeyDown, viewerListener);
        viewer.getTree().addListener(SWT.MouseMove, viewerListener);
        viewer.getTree().addListener(SWT.MouseHover, viewerListener);
        viewer.getTree().addListener(SWT.MouseExit, viewerListener);

    }

    public void setCurrentNode(TreeNode node) {
        this.currentData = node.getData();
    }

    public void addNodes(TreeData data) {
        this.currentData = data;
        TreeNode child = new TreeNode(data);
        this.viewer.setInput(child);
    }

    public TreeData getSelectedNode() {
        return this.currentData;
    }

    private TreeNode getRootNode() {
        TreeNode root = new TreeNode("Find Items", "Find Items", "CA");
        this.rootNode = root;
        return root;
    }

    public void refresh() {
        findButton.setText("Find");
        if (this.stopRunning == false) {
            this.slm.setMessage(System.getProperty("statusMessage"));
            this.slm.update(true);
            this.viewer.refresh(this.rootNode);
        } else {
            this.stopRunning = false;
            this.flush();
            this.viewer.refresh(this.rootNode);

        }
    }

    public void flush() {
        this.rootNode.getChildren().clear();
    }

    private TreeNode populateRootNode() {
        TreeNode root = new TreeNode("home", "home", "CA");

        //make call to getHomeFolders to get list of root nodes
        //root.getHomeFolders(this.viewer);

        this.rootNode = root;
        return root;

    }

    private class RenameAction extends Action {
        public RenameAction() {
            super("Rename");
        }

        public void run() {
            IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
            if (selection.size() != 1)
                return;

            TreeNode node = (TreeNode) selection.getFirstElement();

            if (Boolean.parseBoolean(System.getProperty("WPManager"))
                    || (node.getData().getUserId().equals(UserInfoBean.getInstance().getUserName()))) {
                node.renameNode(viewer).start();
                viewer.refresh();
            } else {
                MessageBox mBox = new MessageBox(Display.getCurrent().getActiveShell(),
                        SWT.ICON_INFORMATION | SWT.OK);
                mBox.setText("Rename Node Message");
                mBox.setMessage("You do not have permission to rename this node");
                int result = mBox.open();
            }
        }
    }

    private class ExportAction extends Action {
        public ExportAction() {
            super("Export");
        }

        public void run() {
            IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
            if (selection.size() != 1)
                return;

            TreeNode node = (TreeNode) selection.getFirstElement();
            node.exportNode(viewer).start();

        }
    }

    private class AnnotateAction extends Action {
        public AnnotateAction() {
            super("Annotate");
        }

        public void run() {
            IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
            if (selection.size() != 1)
                return;

            TreeNode node = (TreeNode) selection.getFirstElement();

            if (Boolean.parseBoolean(System.getProperty("WPManager"))
                    || (node.getData().getUserId().equals(UserInfoBean.getInstance().getUserName()))) {
                node.annotateNode(viewer).start();
                viewer.refresh();
            } else {
                MessageBox mBox = new MessageBox(Display.getCurrent().getActiveShell(),
                        SWT.ICON_INFORMATION | SWT.OK);
                mBox.setText("Annotate Node Message");
                mBox.setMessage("You do not have permission to annotate this node");
                int result = mBox.open();
            }
        }
    }

    private class DeleteAction extends Action {
        public DeleteAction() {
            super("Delete");
        }

        public void run() {
            IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
            if (selection.size() != 1)
                return;
            TreeNode node = (TreeNode) selection.getFirstElement();

            if (Boolean.parseBoolean(System.getProperty("WPManager"))
                    || (node.getData().getUserId().equals(UserInfoBean.getInstance().getUserName()))) {
                int result = SWT.NO;
                if (node.getData().getVisualAttributes().startsWith("F")) {
                    MessageBox mBox = new MessageBox(Display.getCurrent().getActiveShell(),
                            SWT.ICON_QUESTION | SWT.YES | SWT.NO);
                    mBox.setText("Delete Node Dialog");
                    mBox.setMessage("Deleting a folder will delete its contents also\n" + "Delete folder \""
                            + node.getData().getName() + "\"?\n");
                    result = mBox.open();
                } else {
                    MessageBox mBox = new MessageBox(Display.getCurrent().getActiveShell(),
                            SWT.ICON_QUESTION | SWT.YES | SWT.NO);
                    mBox.setText("Delete Node Dialog");
                    mBox.setMessage("Delete node \"" + node.getData().getName() + "\"?\n");
                    result = mBox.open();
                }
                if (result == SWT.NO) {
                    return;
                } else {
                    node.deleteNode(viewer).start();
                }
            } else {
                MessageBox mBox = new MessageBox(Display.getCurrent().getActiveShell(),
                        SWT.ICON_INFORMATION | SWT.OK);
                mBox.setText("Delete Node Message");
                mBox.setMessage("You do not have permission to delete this node");
                int result = mBox.open();
            }
        }
    }

    private class NewFolderAction extends Action {
        public NewFolderAction() {
            super("New Folder");
        }

        public void run() {
            IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
            if (selection.size() != 1)
                return;

            TreeNode currentTarget = (TreeNode) selection.getFirstElement();
            TreeData tdata = new TreeData();
            tdata.setName("New Folder");
            tdata.setTooltip("FOLDER:New Folder");
            tdata.setIndex(new AddChildRequestMessage().generateMessageId());
            tdata.setParentIndex(currentTarget.getData().getIndex());
            tdata.setVisualAttributes("FA");
            tdata.setWorkXml(null);
            tdata.setWorkXmlI2B2Type("FOLDER");
            tdata.setUserId(UserInfoBean.getInstance().getUserName());
            tdata.setGroupId(currentTarget.getData().getGroupId());
            tdata.setShareId(currentTarget.getData().getShareId());
            tdata.setWorkXmlSchema(null);
            tdata.setEntryDate(null);
            tdata.setChangeDate(null);
            tdata.setStatusCd(null);
            tdata.setTableCd(currentTarget.getData().getTableCd());
            //            log.info(tdata.getIndex());

            TreeNode child = new TreeNode(tdata);
            currentTarget.addChild(child);

            child.addNode(viewer).start();

            //       child.renameNode(viewer).start();

            viewer.refresh();
        }

    }

    public Thread getFindData(final String categoryKey, final List categories, String phrase, String match) {
        final Display theDisplay = Display.getCurrent();
        final FindViewNodeBrowser theBrowser = this;
        final TreeViewer theViewer = this.viewer;
        final String lookupPhrase = phrase;
        final String lookupOperator = match;
        final List lookupCategories = categories;
        return new Thread() {
            public void run() {
                theBrowser.rootNode.getChildren().clear();
                theBrowser.findNodes(categoryKey, lookupCategories, lookupPhrase, lookupOperator, theDisplay,
                        theViewer);

                theDisplay.syncExec(new Runnable() {
                    public void run() {
                        if (theBrowser.rootNode.getChildren().size() == 0) {
                            TreeNode placeholder = new TreeNode("placeholder", "There were no matches", "C-UNDEF");
                            theBrowser.rootNode.addChild(placeholder);
                        }
                        theBrowser.refresh();
                    }
                });
            }
        };
    }

    private void findNodes(String categoryKey, List categories, String phrase, String operator, Display display,
            TreeViewer viewer) {
        FindByChildType vocabData = new FindByChildType();

        MatchStrType match = new MatchStrType();
        match.setValue(phrase);
        if (operator.equals("Containing"))
            operator = "contains";
        else if (operator.equals("Starting with"))
            operator = "left";
        else if (operator.equals("Ending with"))
            operator = "right";
        else if (operator.equals("Exact"))
            operator = "exact";
        match.setStrategy(operator);
        vocabData.setMatchStr(match);
        vocabData.setType("core");
        vocabData.setBlob(true);
        vocabData.setMax(Integer.parseInt(System.getProperty("OntFindMax")));
        vocabData.setHiddens(Boolean.parseBoolean(System.getProperty("OntFindHiddens")));
        //vocabData.setSynonyms(Boolean.parseBoolean(System.getProperty("OntFindSynonyms")));

        if (categoryKey.equals("any")) {
            if (categories != null) {
                Iterator categoriesIterator = categories.iterator();
                while (categoriesIterator.hasNext() && this.stopRunning == false) {
                    vocabData
                            .setCategory(StringUtil.getTableCd(((ConceptType) categoriesIterator.next()).getKey()));
                    List concepts = getNodes(vocabData, display, viewer);
                    getNodesFromXMLString(concepts);
                }
                //            System.setProperty("statusMessage", count + " records returned");
            }
        }

        else {
            vocabData.setCategory(categoryKey);
            List folders = getNodes(vocabData, display, viewer);
            getNodesFromXMLString(folders);
        }
    }

    private void getNodesFromXMLString(List folders) {

        if (folders != null) {
            Iterator it = folders.iterator();

            while (it.hasNext()) {
                TreeData child = new TreeData((FolderType) it.next());
                TreeNode childNode = new TreeNode(child);
                // if the child is a folder/directory set it up with a leaf placeholder
                if ((child.getVisualAttributes().equals("FA")) || (child.getVisualAttributes().equals("CA"))) {
                    TreeNode placeholder = new TreeNode("working...", "working...", "LAO");
                    childNode.addChild(placeholder);
                } else if ((child.getVisualAttributes().equals("FH"))
                        || (child.getVisualAttributes().equals("CH"))) {
                    TreeNode placeholder = new TreeNode("working...", "working...", "LHO");
                    childNode.addChild(placeholder);
                }
                this.rootNode.addChild(childNode);
            }
        }
    }

    /*private void getNodesFromXMLString(List concepts){
       if(concepts != null){
     Iterator it = concepts.iterator();
        
     while(it.hasNext()){
        TreeData child = new TreeData((ConceptType) it.next());       
        TreeNode childNode = new TreeNode(child);
        // if the child is a folder/directory set it up with a leaf placeholder
        if((child.getVisualattributes().equals("FA")) || (child.getVisualattributes().equals("CA")))
        {
           TreeNode placeholder = new TreeNode(child.getLevel() + 1, "working...", "working...", "LA");
           placeholder.setOpen(true);
           childNode.addChild(placeholder);
        }
        this.rootNode.addChild(childNode);
     }
       }
    }*/

    private List getNodes(FindByChildType vocabData, Display theDisplay, final TreeViewer theViewer) {

        WorkplaceResponseMessage msg = new WorkplaceResponseMessage();
        StatusType procStatus = null;
        try {
            while (procStatus == null || !procStatus.getType().equals("DONE")) {
                String response = WorkplaceServiceDriver.getNameInfo(vocabData);

                //////////testing -- using get children of "wp1"///////
                //GetChildrenType parentType = new GetChildrenType();
                //parentType.setBlob(true);
                //parentType.setParent("\\\\demo"+"\\Kmx3tsrijobZ9DnYN4Od");
                //String response = WorkplaceServiceDriver.getChildren(parentType);
                /////////////////

                procStatus = msg.processResult(response);
                ;
                if (procStatus.getValue().equals("MAX_EXCEEDED")) {
                    log.info("MAX_EXCEEDED");
                    theDisplay.syncExec(new Runnable() {
                        public void run() {
                            MessageBox mBox = new MessageBox(theViewer.getTree().getShell(),
                                    SWT.ICON_QUESTION | SWT.YES | SWT.NO);
                            mBox.setText("Please Note ...");
                            mBox.setMessage("Max number of terms exceeded please try with a more specific query.\n"
                                    + "Populating the query results will be slow\n" + "Do you want to continue?");
                            result = mBox.open();
                        }
                    });
                    if (result == SWT.NO) {
                        procStatus.setType("DONE");
                    } else {
                        vocabData.setMax(null);
                        response = WorkplaceServiceDriver.getNameInfo(vocabData);

                        //////////testing -- using get children of "wp1"///////
                        //parentType = new GetChildrenType();
                        //parentType.setBlob(true);
                        //parentType.setParent("\\\\demo"+"\\Kmx3tsrijobZ9DnYN4Od");
                        //response = WorkplaceServiceDriver.getChildren(parentType);
                        /////////////////

                        procStatus = msg.processResult(response);
                    }
                } else if (procStatus.getType().equals("ERROR")) {
                    System.setProperty("statusMessage", procStatus.getValue());
                    theDisplay.syncExec(new Runnable() {
                        public void run() {
                            MessageBox mBox = new MessageBox(theViewer.getTree().getShell(),
                                    SWT.ICON_INFORMATION | SWT.OK);
                            mBox.setText("Please Note ...");
                            mBox.setMessage("Server reports: " + System.getProperty("statusMessage"));
                            int result = mBox.open();
                        }
                    });
                    this.stopRunning = true;
                    return null;
                } else
                    procStatus.setType("DONE");
            }

        } catch (AxisFault e) {
            theDisplay.syncExec(new Runnable() {
                public void run() {
                    MessageBox mBox = new MessageBox(theViewer.getTree().getShell(), SWT.ICON_INFORMATION | SWT.OK);
                    mBox.setText("Please Note ...");
                    mBox.setMessage("Unable to make a connection to the remote server\n"
                            + "This is often a network error, please try again");
                    int result = mBox.open();

                }
            });
            this.stopRunning = true;
            return null;
        } catch (Exception e) {
            theDisplay.syncExec(new Runnable() {
                public void run() {
                    // e.getMessage() == Incoming message input stream is null  -- for the case of connection down.
                    MessageBox mBox = new MessageBox(theViewer.getTree().getShell(), SWT.ICON_INFORMATION | SWT.OK);
                    mBox.setText("Please Note ...");
                    mBox.setMessage("Error message delivered from the remote server\n"
                            + "You may wish to retry your last action");
                    int result = mBox.open();
                }
            });
            this.stopRunning = true;
            return null;
        }
        FoldersType folders = msg.doReadFolders();
        if (folders == null)
            return null;
        List nodes = folders.getFolder();
        return nodes;////concepts;
    }

    public Thread getSchemeData(final String schemeKey, List schemes, String phrase, String match) {
        final Display theDisplay = Display.getCurrent();
        final FindViewNodeBrowser theBrowser = this;
        final TreeViewer theViewer = this.viewer;
        final String lookupPhrase = phrase;
        final String lookupKey = schemeKey;
        final String lookupStrategy = match;
        final List lookupSchemes = schemes;

        return new Thread() {
            public void run() {
                theBrowser.rootNode.getChildren().clear();
                theBrowser.findSchemeNodes(lookupKey, lookupSchemes, lookupPhrase, lookupStrategy, theDisplay,
                        theViewer);
                theDisplay.syncExec(new Runnable() {
                    public void run() {

                        if (theBrowser.rootNode.getChildren().size() == 0) {
                            TreeNode placeholder = new TreeNode("placeholder", "There were no matches", "C-UNDEF");
                            theBrowser.rootNode.addChild(placeholder);
                        }
                        theBrowser.refresh();
                    }
                });
            }
        };
    }

    private void findSchemeNodes(String key, List schemes, String phrase, String operator, Display display,
            TreeViewer viewer) {
        FindByChildType vocabData = new FindByChildType();

        MatchStrType match = new MatchStrType();
        match.setValue(phrase);

        if (operator.equals("Containing"))
            operator = "contains";
        else if (operator.equals("Starting with"))
            operator = "left";
        else if (operator.equals("Ending with"))
            operator = "right";
        else if (operator.equals("Exact"))
            operator = "exact";
        match.setStrategy(operator);

        vocabData.setType("core");
        //   vocabData.setBlob(false);
        vocabData.setBlob(true);
        vocabData.setMax(Integer.parseInt(System.getProperty("OntFindMax")));
        vocabData.setHiddens(Boolean.parseBoolean(System.getProperty("OntFindHiddens")));
        //vocabData.setSynonyms(Boolean.parseBoolean(System.getProperty("OntFindSynonyms")));

        if (key.equals("any")) {
            if (schemes != null) {
                Iterator schemesIterator = schemes.iterator();
                while (schemesIterator.hasNext() && this.stopRunning == false) {
                    vocabData.setCategory(null);
                    match.setValue(((ConceptType) schemesIterator.next()).getKey() + phrase);
                    vocabData.setMatchStr(match);
                    List concepts = getSchemeNodes(vocabData, display, viewer);
                    if ((concepts != null) && (concepts.isEmpty() == false)) {
                        //getNodesFromXMLString(concepts);
                        //      break;   // cycle through all schemes; dont stop at first hit
                    }
                }
            }
            //         System.setProperty("statusMessage", count + " records returned");
        }

        else {
            match.setValue(key + phrase);
            vocabData.setMatchStr(match);
            vocabData.setCategory(null);
            List concepts = getSchemeNodes(vocabData, display, viewer);
            if (concepts != null) {
                //getNodesFromXMLString(concepts);
            }
        }
    }

    private List getSchemeNodes(FindByChildType vocabData, Display theDisplay, final TreeViewer theViewer) {

        /*OntologyResponseMessage msg = new OntologyResponseMessage();
        StatusType procStatus = null;   
        try {
           while(procStatus == null || !procStatus.getType().equals("DONE")){
        String response = OntServiceDriver.getCodeInfo(vocabData, "FIND");         
        procStatus = msg.processResult(response);
        if(procStatus.getValue().equals("MAX_EXCEEDED")) {
           log.debug("MAX_EXCEEDED");
           theDisplay.syncExec(new Runnable() {
              public void run() {
                 MessageBox mBox = new MessageBox(theViewer.getTree().getShell(), 
                       SWT.ICON_QUESTION | SWT.YES | SWT.NO);
                 mBox.setText("Please Note ...");
                 mBox.setMessage("Max number of terms exceeded please try with a more specific query.\n"
                       + "Populating the query results will be slow\n"
                       +"Do you want to continue?");
                 result = mBox.open();
              }
           });
           if(result == SWT.NO) {
              procStatus.setType("DONE");
           }
           else {
              vocabData.setMax(null);
              response = OntServiceDriver.getCodeInfo(vocabData, "FIND");
              procStatus = msg.processResult(response);
           }
        }
        // other error cases  USER INVALID, TABLE ACCESS DENIED, DATABASE ERROR
        else if (procStatus.getType().equals("ERROR")){
           System.setProperty("statusMessage",  procStatus.getValue());            
           theDisplay.syncExec(new Runnable() {
              public void run() {
                 MessageBox mBox = new MessageBox(theViewer.getTree().getShell(), SWT.ICON_INFORMATION | SWT.OK);
                 mBox.setText("Please Note ...");
                 mBox.setMessage("Server reports: " +  System.getProperty("statusMessage"));
                 int result = mBox.open();
              }
           });
           this.stopRunning = true;
           return null;
        }      
        else
           procStatus.setType("DONE");
           }
            
        } catch (AxisFault e) {
           theDisplay.syncExec(new Runnable() {
        public void run() {
           // e.getMessage() == Incoming message input stream is null  -- for the case of connection down.
           MessageBox mBox = new MessageBox(theViewer.getTree().getShell(), SWT.ICON_INFORMATION | SWT.OK);
           mBox.setText("Please Note ...");
           mBox.setMessage("Unable to make a connection to the remote server\n" +  
           "This is often a network error, please try again");
           int result = mBox.open();
        }
           });
           this.stopRunning = true;
           return null;
        } catch (Exception e) {
           theDisplay.syncExec(new Runnable() {
        public void run() {
           // e.getMessage() == Incoming message input stream is null  -- for the case of connection down.
           MessageBox mBox = new MessageBox(theViewer.getTree().getShell(), SWT.ICON_INFORMATION | SWT.OK);
           mBox.setText("Please Note ...");
           mBox.setMessage("Error message delivered from the remote server\n" +  
           "You may wish to retry your last action");
           int result = mBox.open();
        }
           });   
           this.stopRunning = true;
           return null;
        }
        ConceptsType allConcepts = msg.doReadConcepts();          
        List concepts = allConcepts.getConcept();*/
        return null;////concepts;
    }

    public Thread getFindModifierData(final String type, String phrase, String match) {
        final Display theDisplay = Display.getCurrent();
        final FindViewNodeBrowser theBrowser = this;
        final TreeViewer theViewer = this.viewer;
        final String lookupPhrase = phrase;
        final String lookupOperator = match;
        final String lookupType = type;
        return new Thread() {
            public void run() {
                theBrowser.rootNode.getChildren().clear();

                theBrowser.findModifierNodes(lookupType, lookupPhrase, lookupOperator, theDisplay, theViewer);

                theDisplay.syncExec(new Runnable() {
                    public void run() {
                        if (theBrowser.rootNode.getChildren().size() == 0) {
                            TreeNode placeholder = new TreeNode("placeholder", "There were no matches", "C-UNDEF");
                            theBrowser.rootNode.addChild(placeholder);
                        }
                        theBrowser.refresh();
                    }
                });
            }
        };
    }

    private void findModifierNodes(String type, String phrase, String operator, Display display,
            TreeViewer viewer) {
        FindByChildType vocabData = new FindByChildType();

        MatchStrType match = new MatchStrType();
        match.setValue(phrase);
        if (operator.equals("Containing"))
            operator = "contains";
        else if (operator.equals("Starting with"))
            operator = "left";
        else if (operator.equals("Ending with"))
            operator = "right";
        else if (operator.equals("Exact"))
            operator = "exact";
        match.setStrategy(operator);
        vocabData.setMatchStr(match);
        vocabData.setType("core");
        vocabData.setBlob(true);
        vocabData.setMax(Integer.parseInt(System.getProperty("OntFindMax")));
        vocabData.setHiddens(Boolean.parseBoolean(System.getProperty("OntFindHiddens")));
        //vocabData.setSynonyms(Boolean.parseBoolean(System.getProperty("OntFindSynonyms")));
        //vocabData.setSelf(ModifierComposite.getInstance().getNodeKey());
        List modifiers = getModifierNodes(type, vocabData, display, viewer);
        //getModifierNodesFromXMLString(modifiers);

    }

    /*private void getModifierNodesFromXMLString(List<ModifierType> modifiers){
       if(!modifiers.isEmpty()){
     Iterator<ModifierType> it = modifiers.iterator();
        
     while(it.hasNext()){
        ConceptType child = rootNode.getData();
        TreeData data = new TreeData(child);
        data.setModifier(   (ModifierType)it.next());
        TreeNode childNode = new TreeNode(data);
        if((data.getModifier().getVisualattributes().startsWith("DA")) || (data.getModifier().getVisualattributes().startsWith("OA")))  
        {
           TreeNode placeholder = new TreeNode(child.getLevel() + 1, "working...", "working...", "RA");
           placeholder.setOpen(true);
           ModifierType modifier = new ModifierType();
           modifier.setName("working...");
           modifier.setVisualattributes("RA");
           placeholder.getData().setModifier(modifier);
           childNode.addChild(placeholder);
           rootNode.addChild(childNode);
        }
        else if   ((data.getModifier().getVisualattributes().startsWith("DH")) || (data.getModifier().getVisualattributes().startsWith("OH")))
        {
           TreeNode placeholder = new TreeNode(child.getLevel() + 1, "working...", "working...", "RH");
           placeholder.setOpen(true);
           ModifierType modifier = new ModifierType();
           modifier.setName("working...");
           modifier.setVisualattributes("RA");
           placeholder.getData().setModifier(modifier);
           childNode.addChild(placeholder);
           rootNode.addChild(childNode);
        }
        else if((data.getModifier().getVisualattributes().startsWith("R"))){
           rootNode.addChild(childNode);
        }   
     }
       }
    }*/

    private List getModifierNodes(String type, FindByChildType vocabData, Display theDisplay,
            final TreeViewer theViewer) {

        /*OntologyResponseMessage msg = new OntologyResponseMessage();
        StatusType procStatus = null;   
        try {
           while(procStatus == null || !procStatus.getType().equals("DONE")){
        String response = OntServiceDriver.getNameInfo(vocabData, "FIND");         
        procStatus = msg.processResult(response);;
        if(procStatus.getValue().equals("MAX_EXCEEDED")) {
           log.info("MAX_EXCEEDED");
           theDisplay.syncExec(new Runnable() {
              public void run() {
                 MessageBox mBox = new MessageBox(theViewer.getTree().getShell(), 
                       SWT.ICON_QUESTION | SWT.YES | SWT.NO);
                 mBox.setText("Please Note ...");
                 mBox.setMessage("Max number of terms exceeded please try with a more specific query.\n"
                       + "Populating the query results will be slow\n"
                       +"Do you want to continue?");
                 result = mBox.open();
              }
           });
           if(result == SWT.NO) {
              procStatus.setType("DONE");
           }
           else {
              vocabData.setMax(null);
              if(type.equals("name"))
                 response = OntServiceDriver.getModifierNameInfo(vocabData, "FIND");
              else
                 response = OntServiceDriver.getModifierCodeInfo(vocabData, "FIND");
              procStatus = msg.processResult(response);
           }
        }
        else if (procStatus.getType().equals("ERROR")){
           System.setProperty("statusMessage",  procStatus.getValue());            
           theDisplay.syncExec(new Runnable() {
              public void run() {
                 MessageBox mBox = new MessageBox(theViewer.getTree().getShell(), SWT.ICON_INFORMATION | SWT.OK);
                 mBox.setText("Please Note ...");
                 mBox.setMessage("Server reports: " +  System.getProperty("statusMessage"));
                 int result = mBox.open();
              }
           });
           this.stopRunning = true;
           return null;
        }      
        else
           procStatus.setType("DONE");
           }
            
        } catch (AxisFault e) {
           theDisplay.syncExec(new Runnable() {
        public void run() {
           MessageBox mBox = new MessageBox(theViewer.getTree().getShell(), SWT.ICON_INFORMATION | SWT.OK);
           mBox.setText("Please Note ...");
           mBox.setMessage("Unable to make a connection to the remote server\n" +  
           "This is often a network error, please try again");
           int result = mBox.open();
            
        }
           });
           this.stopRunning = true;
           return null;
        } catch (Exception e) {
           theDisplay.syncExec(new Runnable() {
        public void run() {
           // e.getMessage() == Incoming message input stream is null  -- for the case of connection down.
           MessageBox mBox = new MessageBox(theViewer.getTree().getShell(), SWT.ICON_INFORMATION | SWT.OK);
           mBox.setText("Please Note ...");
           mBox.setMessage("Error message delivered from the remote server\n" +  
           "You may wish to retry your last action");
           int result = mBox.open();
        }
           });   
           this.stopRunning = true;
           return null;
        }
        ModifiersType allModifiers = msg.doReadModifiers();       
        if(allModifiers == null)
           return null;
        List modifiers = allModifiers.getModifier();*/
        return null;//modifiers;
    }

    private MenuManager createModifierPopupMenu(Composite parent) {
        MenuManager allPopupMenu = null;
        /*if(parent == ModifierComposite.getInstance().getParent()){
           allPopupMenu = new MenuManager();
           allPopupMenu.add(new FindModifierAction());
           allPopupMenu.add(new JumpToTermAction());
           //      allPopupMenu.add(new RefreshAction());
        }
        else if(parent == ModifierComposite.getCodeInstance().getParent()){
           allPopupMenu = new MenuManager();
           allPopupMenu.add(new FindCodeModifierAction());
           allPopupMenu.add(new JumpToTermAction());
            
            
        }*/
        return allPopupMenu;

    }

    private class FindModifierAction extends Action {
        public FindModifierAction() {
            super("Find Modifier");
        }

        @Override
        public void run() {
            IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
            if (selection.size() != 1)
                return;

            TreeNode node = (TreeNode) selection.getFirstElement();
            //ModifierComposite.getInstance().enableComposite(node);
        }
    }

    private class FindCodeModifierAction extends Action {
        public FindCodeModifierAction() {
            super("Find Modifier");
        }

        @Override
        public void run() {
            IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
            if (selection.size() != 1)
                return;

            TreeNode node = (TreeNode) selection.getFirstElement();
            //ModifierComposite.getCodeInstance().enableComposite(node);
        }
    }

    private class JumpToTermAction extends Action {
        public JumpToTermAction() {
            super("Jump To Term in Tree");
        }

        @Override
        public void run() {
            IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
            IWorkbenchPage[] pages = windows[0].getPages();

            final ViewPart navTermsView = (ViewPart) pages[0]
                    .findView("edu.harvard.i2b2.eclipse.plugins.ontology.views.ontologyView");
            pages[0].activate(navTermsView);

            IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
            if (selection.size() != 1)
                return;
            TermSelectionProvider.getInstance().fireSelectionChanged(selection);

        }
    }

}
// Old select service base methods
/*   public Thread getFindData(final String lookup, final Document categories, String phrase, String match) {
  final Display theDisplay = Display.getCurrent();
  final NodeBrowser theBrowser = this;
  final String lookupPhrase = phrase;
  final String lookupOperator = match;
  final Document lookupCategories = categories;
  return new Thread() {
     public void run() {      
        String lookupTable = lookup;
        List tables = categories.getRootElement().getChildren("table");
        Iterator tableIterator = tables.iterator();      
        while(tableIterator.hasNext())
        {
           Element table = (org.jdom.Element) tableIterator.next();
           String name = table.getChild("name").getText();
           if (name.equals(lookup))
           {
              lookupTable = table.getChild("tableName").getText();
              break;
           }
//               String tableName = table.getChild("tableName").getText();
//               String status = table.getChild("status").getText();
//               String description = table.getChild("description").getText();
//               String lookupDB = table.getChild("lookupDB").getText();
//               String webserviceName = table.getChild("webserviceName").getText();               
        }
    
        theBrowser.rootNode.getChildren().clear();
        theBrowser.parseFind(lookupTable, lookupCategories, lookupPhrase, lookupOperator);
    
   /**         if(lookupTable.equals("Any Category"))
        {
           theBrowser.getFind("Demographics", lookupName, lookupOperator);                   
           theBrowser.getFind("Diagnoses", lookupName, lookupOperator);
           theBrowser.getFind("Encounters",lookupName, lookupOperator);                
           theBrowser.getFind("LabTests", lookupName, lookupOperator);
           theBrowser.getFind("Medications", lookupName, lookupOperator);                   
           theBrowser.getFind("Microbiology", lookupName, lookupOperator);
           theBrowser.getFind("Procedures", lookupName, lookupOperator);                
           theBrowser.getFind("Providers", lookupName, lookupOperator);
           theBrowser.getFind("Transfusions", lookupName, lookupOperator);                
           theBrowser.getFind("I2B2", lookupName, lookupOperator);
        }
        else
        {
           theBrowser.getFind(lookupTable, lookupName, lookupOperator);
        }
 */
/*            theDisplay.syncExec(new Runnable() {
           public void run() {
               if (theBrowser.rootNode.getChildren().size() == 0)
              {   
                  TreeNode placeholder = new TreeNode(1, "placeholder", "There were no matches", "C-UNDEF", "UNDEF","UNDEF", "UNDEF");
                 theBrowser.rootNode.addChild(placeholder);
                 }   
               theBrowser.refresh();
           }
        });
     }
  };
   }
    
   private void parseFind(String lookup, Document categories, String phrase, String operator)
   {
  int count = 0;
  if(categories == null)
  {
     slm.setMessage(System.getProperty("statusMessage"));
     slm.update(true);
     return;
  }
  if(lookup.equals("Any Category"))
  {
     List tables = categories.getRootElement().getChildren("table");
     Iterator tableIterator = tables.iterator();      
     while(tableIterator.hasNext())
     {
        Element table = (org.jdom.Element) tableIterator.next();
        String tableName = table.getChild("tableName").getText();
//            String name = table.getChild("name").getText();
//            String status = table.getChild("status").getText();
//            String description = table.getChild("description").getText();
        String lookupDB = table.getChild("lookupDB").getText();
        String webserviceName = table.getChild("webserviceName").getText();
        count = count + getFind(tableName, lookupDB, webserviceName, phrase, operator);
     }
     System.setProperty("statusMessage", count + " records returned");
  }
    
  else
  {
     List tables = categories.getRootElement().getChildren("table");
     Iterator tableIterator = tables.iterator();      
     while(tableIterator.hasNext())
     {
        Element table = (org.jdom.Element) tableIterator.next();
        String tableName = table.getChild("tableName").getText();
//            String name = table.getChild("name").getText();
//            String status = table.getChild("status").getText();
//            String description = table.getChild("description").getText();
        String lookupDB = table.getChild("lookupDB").getText();
        String webserviceName = table.getChild("webserviceName").getText();
        if(tableName.toUpperCase().equals(lookup.toUpperCase()))
        {
           count = getFind(tableName, lookupDB, webserviceName, phrase, operator);
           System.setProperty("statusMessage", count + " records returned");
        }
     }
  }      
   }
    
  private int getFind(String lookup, String lookupDB, String webserviceName, String phrase, String operator)
  {  
 // method to send web services message to obtain 
   //  find query result data
  try {
     // Make a service
     SelectService service = new SelectServiceLocator();
     // Use service to get stub that implement SDI
    java.net.URL endpoint = new java.net.URL(webserviceName);
   Select port = service.getSelect(endpoint);
    
     // Form the query
     org.w3c.dom.Document queryDoc = formFindQuery(lookup, lookupDB, phrase, operator);
    
     //System.out.println("Calling Web service");
     // Make the call
     org.w3c.dom.Document queryResultDoc  = port.getDataMartRecords(queryDoc);
    
     if (queryResultDoc == null)
     {
      System.setProperty("statusMessage", "WebService query is faulty");
        return 0;
     }
     return getNodesFromXML(queryResultDoc, lookup, lookupDB, webserviceName);
 }catch(Exception e)
 {          
    if(e.getMessage().contains("Not+Found"))
    {
       System.setProperty("statusMessage", "WebService " + webserviceName + " not found");
    }
    else
    {
       System.setProperty("statusMessage",e.getMessage());
    }
    return 0;
 }
  }
  private org.w3c.dom.Document formFindQuery(String lookup, String lookupDB, String name, String operator){
 org.w3c.dom.Document domDoc = null;
 try {
     org.jdom.Element selectElement = new org.jdom.Element("selectParameters");
     org.jdom.Document jqueryDoc = new org.jdom.Document(selectElement);
     org.jdom.Element dbElement = new org.jdom.Element("i2b2Mart");
     dbElement.setText(lookupDB);       
     selectElement.addContent(dbElement);
    
     org.jdom.Element table = new org.jdom.Element("table");
     table.setText(lookup);
     table.setAttribute("abbr", "l");
     table.setAttribute("numCols", "16");
     table.setAttribute("withBlob", "false");
     selectElement.addContent(table);
     org.jdom.Element where = new org.jdom.Element("where");
     String whereClause = "UPPER(l.c_name) ";
     if (operator.equals("Containing"))
        whereClause = whereClause + "LIKE '%" + name.toUpperCase() + "%'";
     else if (operator.equals("Starting with"))
        whereClause = whereClause + "LIKE '" + name.toUpperCase() + "%'";
     else if (operator.equals("Ending with"))
        whereClause = whereClause + "LIKE '%" + name.toUpperCase() + "'";
     else if (operator.equals("Exact"))
        whereClause = whereClause + "= '" + name.toUpperCase() + "'";
    
     where.setText(whereClause);
     selectElement.addContent(where);
    
     org.jdom.Element orderBy = new org.jdom.Element("orderBy");
     orderBy.setText("l.c_name");
     selectElement.addContent(orderBy);
 //    System.out.println((new XMLOutputter()).outputString(jqueryDoc));
     org.jdom.output.DOMOutputter convertor = new org.jdom.output.DOMOutputter();
     domDoc = convertor.output(jqueryDoc);
 }catch (Exception e){
    System.setProperty("statusMessage", e.getMessage());
 }
 return domDoc;   
  }
    
  private int getNodesFromXML(org.w3c.dom.Document resultDoc, String lookupTable,
                      String lookupDB, String webserviceName)
  {
 try {
     org.jdom.input.DOMBuilder builder = new org.jdom.input.DOMBuilder();
     org.jdom.Document jresultDoc = builder.build(resultDoc);
     org.jdom.Namespace ns = jresultDoc.getRootElement().getNamespace();
//System.out.println((new XMLOutputter()).outputString(jresultDoc));      
     Iterator iterator = jresultDoc.getRootElement().getChildren("patientData", ns).iterator();
     while (iterator.hasNext())
     {
        org.jdom.Element patientData = (org.jdom.Element) iterator.next();
           org.jdom.Element lookup = (org.jdom.Element) patientData.getChild(lookupTable.toLowerCase(), ns).clone();
    
//               modification of c_metadataxml tag to make it part of the xml document
             org.jdom.Element metaDataXml = (org.jdom.Element) lookup.getChild("c_metadataxml");
             String c_xml = metaDataXml.getText();
             if ((c_xml!=null)&&(c_xml.trim().length()>0)&&(!c_xml.equals("(null)")))
             {
              SAXBuilder parser = new SAXBuilder();
             String xmlContent = c_xml;
              java.io.StringReader xmlStringReader = new java.io.StringReader(xmlContent);
              org.jdom.Document tableDoc = parser.build(xmlStringReader);
              org.jdom.Element rootElement = (org.jdom.Element) tableDoc.getRootElement().clone();
              metaDataXml.setText("");
              metaDataXml.getChildren().add(rootElement);
             }
             //
    
           XMLOutputter fmt = new XMLOutputter();
        String XMLContents = fmt.outputString(lookup);
           //this.setXMLContents(XMLContents);             
        TreeData childData = new TreeData(XMLContents, lookupTable, lookupDB, webserviceName);
        if(!(childData.getVisualattributes().substring(1,2).equals("H")))
        {   
           TreeNode child = new TreeNode(childData);
        // if the child is a folder/directory set it up with a leaf placeholder
           if((childData.getVisualattributes().equals("FA")) || (childData.getVisualattributes().equals("CA")))
           {
              TreeNode placeholder = new TreeNode(childData.getLevel() + 1, "working...", "working...", "LAO", childData.getLookupTable(), "UNDEF", "UNDEF");
              child.addChild(placeholder);
           }
           this.rootNode.addChild(child);
        }
     }
   org.jdom.Element result = (org.jdom.Element) jresultDoc.getRootElement().getChild("result");
  String resultString = result.getChildTextTrim("resultString", ns);
  System.setProperty("statusMessage", resultString);
  int index = resultString.indexOf("records");
  return Integer.parseInt(resultString.substring(0,index-1).trim());
 }catch (Exception e) {
    System.setProperty("statusMessage", e.getMessage());
    return 0;
 }
  }
 */