edu.harvard.i2b2.eclipse.plugins.ontology.views.find.ModifierComposite.java Source code

Java tutorial

Introduction

Here is the source code for edu.harvard.i2b2.eclipse.plugins.ontology.views.find.ModifierComposite.java

Source

/*
 * Copyright (c) 2006-2015 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.ontology.views.find;

import java.util.Iterator;
import java.util.List;

import org.apache.axis2.AxisFault;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;

import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
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.TreeItem;

import edu.harvard.i2b2.eclipse.plugins.ontology.util.StringUtil;
import edu.harvard.i2b2.eclipse.plugins.ontology.ws.GetModifiersResponseMessage;
import edu.harvard.i2b2.eclipse.plugins.ontology.ws.OntServiceDriver;
import edu.harvard.i2b2.eclipse.plugins.ontology.ws.OntologyResponseMessage;
import edu.harvard.i2b2.ontclient.datavo.i2b2message.StatusType;
import edu.harvard.i2b2.ontclient.datavo.vdo.ConceptType;
import edu.harvard.i2b2.ontclient.datavo.vdo.ConceptsType;
import edu.harvard.i2b2.ontclient.datavo.vdo.GetModifiersType;
import edu.harvard.i2b2.ontclient.datavo.vdo.MatchStrType;
import edu.harvard.i2b2.ontclient.datavo.vdo.ModifierType;
import edu.harvard.i2b2.ontclient.datavo.vdo.ModifiersType;
import edu.harvard.i2b2.ontclient.datavo.vdo.VocabRequestType;

public class ModifierComposite //extends Composite
{
    private Log log = LogFactory.getLog(ModifierComposite.class.getName());
    private Tree tree;
    private TreeViewer viewer;
    private ImageRegistry imageRegistry;
    //   private List<String> list = new ArrayList();;
    private Label findLabel;

    private String findText = null;

    private String match;
    private Button findButton;

    private static ModifierComposite instance;
    private static ModifierComposite codeInstance;
    private TreeNode currentNode;
    //   private TreeData currentData;
    private TreeNode rootNode;
    private Group compositeFind = null;
    private Composite compositeLabel = null;
    private TreeNode conceptNode;
    private int result;

    private Composite parent;

    public static final String OS = System.getProperty("os.name").toLowerCase();

    public static void setInstance(Composite composite) {
        instance = new ModifierComposite(composite);
    }

    public static ModifierComposite getInstance() {
        return instance;
    }

    public static void setCodeInstance(Composite composite) {
        codeInstance = new ModifierComposite(composite);
    }

    public static ModifierComposite getCodeInstance() {
        return codeInstance;
    }

    public Composite getParent() {
        return parent;
    }

    public String getNodeKey() {
        return conceptNode.getData().getKey();
    }

    private ModifierComposite(Composite composite) {
        //   super(composite, SWT.NONE); 
        parent = composite;

    }

    public void disableComposite() {
        if ((compositeFind != null) && (!compositeFind.isDisposed())) {
            compositeFind.dispose();
            compositeLabel.dispose();
            parent.layout(true);
        }
    }

    public void enableComposite(TreeNode concept) {
        if ((compositeLabel != null) && (!compositeLabel.isDisposed())) {
            conceptNode = concept;
            findLabel.setText("Find associated modifiers for: " + concept.getData().getName());
            //      findLabel.redraw();
            findLabel.pack(true);
            //   findLabel.setVisible(true);
            //   compositeFind.setEnabled(true);
            compositeLabel.redraw();
        }

        else {
            conceptNode = concept;
            compositeFind = new Group(parent, SWT.NONE);
            compositeFind.setText("Modifier Search");

            GridData fromTreeGridData = new GridData(GridData.FILL_BOTH);
            fromTreeGridData.grabExcessHorizontalSpace = true;
            fromTreeGridData.grabExcessVerticalSpace = true;
            fromTreeGridData.horizontalSpan = 2;
            compositeFind.setLayoutData(fromTreeGridData);
            GridLayout gridLayout = new GridLayout(2, false);
            compositeFind.setLayout(gridLayout);

            compositeLabel = new Composite(compositeFind, SWT.NONE);
            GridData labelData = new GridData(GridData.FILL_HORIZONTAL);
            labelData.grabExcessHorizontalSpace = true;
            //   labelData.grabExcessVerticalSpace = true;
            labelData.horizontalSpan = 2;

            compositeLabel.setLayoutData(labelData);
            //      GridLayout gridLayout2 = new GridLayout(1, false);
            //      compositeFind.setLayout(gridLayout2);
            findLabel = new Label(compositeLabel, SWT.NONE);
            findLabel.setText("Find associated modifiers for: " + concept.getData().getName());
            findLabel.pack(true);

            //      new Label (compositeFind, SWT.NONE);

            imageRegistry = new ImageRegistry();
            createImageRegistry();

            //   First Set up the match combo box
            final Combo matchCombo = new Combo(compositeFind, SWT.READ_ONLY);

            matchCombo.add("Starting with");
            matchCombo.add("Ending with");
            matchCombo.add("Containing");
            matchCombo.add("Exact");

            // set default category
            matchCombo.setText("Containing");
            match = "Containing";

            matchCombo.addSelectionListener(new SelectionListener() {
                public void widgetSelected(SelectionEvent e) {
                    // Item in list has been selected
                    match = matchCombo.getItem(matchCombo.getSelectionIndex());
                }

                public void widgetDefaultSelected(SelectionEvent e) {
                    // this is not an option (text cant be entered)
                }
            });

            // Then set up the Find text combo box    
            final Combo findCombo = new Combo(compositeFind, SWT.DROP_DOWN);
            GridData findComboData = new GridData(GridData.FILL_HORIZONTAL);
            //      findComboData.widthHint = 200;
            findComboData.horizontalSpan = 1;
            findCombo.setLayoutData(findComboData);
            findCombo.addModifyListener(new ModifyListener() {
                public void modifyText(ModifyEvent e) {
                    // Text Item has been entered
                    // Does not require 'return' to be entered
                    findText = findCombo.getText();
                }
            });

            findCombo.addSelectionListener(new SelectionListener() {
                public void widgetSelected(SelectionEvent e) {
                }

                public void widgetDefaultSelected(SelectionEvent e) {
                    findText = findCombo.getText();
                    if (findCombo.indexOf(findText) < 0) {
                        findCombo.add(findText);
                    }
                    rootNode.getChildren().clear();
                    //               System.setProperty("statusMessage", "Calling WebService");
                    TreeNode placeholder = new TreeNode(1, "placeholder", "working...", "C-UNDEF");
                    ModifierType placeholderModifier = new ModifierType();
                    placeholderModifier.setName("working");
                    placeholderModifier.setVisualattributes("C-UNDEF");
                    placeholder.getData().setModifier(placeholderModifier);
                    rootNode.addChild(placeholder);
                    viewer.refresh();

                    getFindModifierData("name", findText, match).start();

                    // can only run query via the find buttons now.
                }
            });

            final Composite buttonComp = new Composite(compositeFind, SWT.NONE);

            GridLayout buttonLayout = new GridLayout();
            buttonLayout.horizontalSpacing = 10;
            //   buttonLayout.makeColumnsEqualWidth = true;
            buttonLayout.numColumns = 3;

            buttonComp.setLayout(buttonLayout);
            GridData buttonData = new GridData(GridData.FILL_HORIZONTAL);
            buttonData.horizontalSpan = 2;
            //      buttonData.grabExcessHorizontalSpace = true;
            buttonComp.setLayoutData(buttonData);

            // Next include 'Find Name' Button
            findButton = new Button(buttonComp, SWT.PUSH);
            findButton.setText("Find Name");
            GridData findButtonData = new GridData(GridData.FILL_HORIZONTAL);
            if (OS.startsWith("mac"))
                findButtonData.widthHint = 120;
            else
                findButtonData.widthHint = 80;
            findButton.setLayoutData(findButtonData);
            findButton.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseDown(MouseEvent e) {
                    // Add item to findCombo drop down list if not already there
                    if (findText == null) {
                        return;
                    }
                    if (findCombo.indexOf(findText) < 0) {
                        findCombo.add(findText);
                    }
                    if (findButton.getText().equals("Find Name")) {
                        rootNode.getChildren().clear();
                        //               System.setProperty("statusMessage", "Calling WebService");
                        TreeNode placeholder = new TreeNode(1, "placeholder", "working...", "C-UNDEF");
                        ModifierType placeholderModifier = new ModifierType();
                        placeholderModifier.setName("working");
                        placeholderModifier.setVisualattributes("C-UNDEF");
                        placeholder.getData().setModifier(placeholderModifier);
                        rootNode.addChild(placeholder);
                        viewer.refresh();

                        getFindModifierData("name", findText, match).start();
                        //            findButton.setText("Cancel");
                    } else {
                        //            System.setProperty("statusMessage", "Canceling WebService call");
                        viewer.refresh();
                        //         browser.stopRunning = true;
                        findButton.setText("Find Name");
                    }
                }
            });

            // Next include 'Find Code' Button
            final Button findButton2 = new Button(buttonComp, SWT.PUSH);
            findButton2.setText("Find Code");

            findButton2.setLayoutData(findButtonData);
            findButton2.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseDown(MouseEvent e) {
                    // Add item to findCombo drop down list if not already there
                    if (findText == null) {
                        return;
                    }
                    if (findCombo.indexOf(findText) < 0) {
                        findCombo.add(findText);
                    }
                    if (findButton2.getText().equals("Find Code")) {
                        //                browser.flush();
                        rootNode.getChildren().clear();
                        TreeNode placeholder = new TreeNode(1, "placeholder", "working...", "C-UNDEF");
                        ModifierType placeholderModifier = new ModifierType();
                        placeholderModifier.setName("working");
                        placeholderModifier.setVisualattributes("C-UNDEF");
                        placeholder.getData().setModifier(placeholderModifier);
                        rootNode.addChild(placeholder);
                        viewer.refresh();

                        getFindModifierData("code", findText, match).start();
                        //            findButton2.setText("Cancel");
                    } else {
                        //   System.setProperty("statusMessage", "Canceling WebService call");
                        viewer.refresh();
                        //      browser.stopRunning = true;
                        findButton2.setText("Find Code");
                    }
                }
            });

            final Button findButton3 = new Button(buttonComp, SWT.PUSH);
            findButton3.setText("Get All");

            findButton3.setLayoutData(findButtonData);
            findButton3.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseDown(MouseEvent e) {
                    if (findButton3.getText().equals("Get All")) {
                        findCombo.setText("");
                        findCombo.clearSelection();
                        findText = null;
                        rootNode.getChildren().clear();
                        TreeNode placeholder = new TreeNode(1, "placeholder", "working...", "C-UNDEF");
                        ModifierType placeholderModifier = new ModifierType();
                        placeholderModifier.setName("working");
                        placeholderModifier.setVisualattributes("C-UNDEF");
                        placeholder.getData().setModifier(placeholderModifier);
                        rootNode.addChild(placeholder);
                        viewer.refresh();
                        getAllModXMLData(viewer).start();

                        //            findButton.setText("Cancel");
                    } else {
                        //   System.setProperty("statusMessage", "Canceling WebService call");
                        viewer.refresh();
                        //      browser.stopRunning = true;
                        findButton3.setText("Get All");
                    }
                }
            });

            tree = new Tree(compositeFind, SWT.MULTI | SWT.BORDER);
            GridData gridData = new GridData(GridData.FILL_BOTH);
            gridData.horizontalSpan = 2;
            gridData.heightHint = 100;
            gridData.grabExcessHorizontalSpace = true;
            //   gridData.grabExcessVerticalSpace = true;
            tree.setLayoutData(gridData);

            createTreeViewer();
            Transfer[] types = new Transfer[] { TextTransfer.getInstance() };

            viewer.addDragSupport(DND.DROP_COPY, types, new NodeDragListener(this.viewer));
            parent.layout(true);
            //   parent.pack(true);
            //   parent.redraw();
            //  browser = new NodeBrowser(compositeFind, 1, findButton, slm);
        }
    }

    private void createImageRegistry() {
        ImageDescriptor imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/modifier_small.png");
        this.imageRegistry.put("modifier", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/modifierFolder.png");
        this.imageRegistry.put("modifierFolder", imageDescriptor);
        imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/modifierContainer.png");
        this.imageRegistry.put("modifierContainer", imageDescriptor);

        //     imageDescriptor = ImageDescriptor.createFromFile(getClass(), "icons/xyz.jpg");
        //     this.imageRegistry.put("error", imageDescriptor);
    }

    private void createTreeViewer() {

        //     table = new Table(composite, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
        this.viewer = new TreeViewer(tree);

        this.viewer.setLabelProvider(new LabelProvider() {
            @Override

            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(element));
                Color defaultColor = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
                item.setForeground(defaultColor);
                String tooltip = ((TreeNode) element).getData().getTooltip();

                if (((TreeNode) element).getData().getModifier() != null) {
                    tooltip = ((TreeNode) element).getData().getModifier().getTooltip();
                    //                  if(System.getProperty("shortToolTip").equals("true"))
                    //                     tooltip = ((TreeNode)element).getData().getModifier().getName();
                }
                if ((tooltip == null) || (tooltip.equals(""))) {
                    tooltip = ((TreeNode) element).toString();
                }
                tooltip = " " + tooltip + " ";

                /*              if(System.getProperty("showConceptCodes").equals("true")){
                     if(    ((TreeNode)element).getData().getModifier() != null ){
                if ((((TreeNode)element).getData().getModifier().getBasecode() != null) && (!((TreeNode)element).getData().getModifier().getBasecode().equals("null")) ) {
                   tooltip = tooltip + "(" + ((TreeNode)element).getData().getBasecode() + ")";
                }
                     }
                     else if ((((TreeNode)element).getData().getBasecode() != null) && (!((TreeNode)element).getData().getBasecode().equals("null")) ) {
                       tooltip = tooltip + "(" + ((TreeNode)element).getData().getBasecode() + ")";
                    }
                  }
                 */
                item.setData("TOOLTIP", tooltip);

                // if element is Inactive; print label in gray
                if (((TreeNode) element).getData().getModifier() != null) {

                    if (((TreeNode) element).getData().getModifier().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().getModifier().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().getModifier().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().getModifier().getSynonymCd() != null) {
                        if (((TreeNode) element).getData().getModifier().getSynonymCd().equals("Y")) {
                            Color color = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE);
                            item.setForeground(color);
                        }
                    }

                }
                return ((TreeNode) element).getData().getModifier().getName();
                //            return ((TreeNode)element).toString();
            }

            @Override
            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) {
            }
        });

        rootNode = new TreeNode(0, "Standard Modifier Items", "Standard Modifier Items", "CA");
        this.viewer.setInput(rootNode);

        this.viewer.addTreeListener(new ITreeViewerListener() {
            public void treeExpanded(TreeExpansionEvent event) {
                final TreeNode node = (TreeNode) event.getElement();
                node.setOpen(true);

                // check to see if child is a placeholder ('working...')
                //   if so, make Web Service call to update children of node
                //   leaves that are placeholders have open==true
                if (node.getChildren().size() == 1) {
                    TreeNode child = (TreeNode) (node.getChildren().get(0));
                    if ((child.getData().getModifier().getVisualattributes().startsWith("R")) && child.isOpen()) {
                        // child is a placeholder, so remove from list 
                        //   update list with real children  
                        node.getModXMLData(viewer, null).start();
                    }
                    //            }
                }

                viewer.refresh();
                viewer.expandToLevel(node, 1);
            }

            public void treeCollapsed(TreeExpansionEvent event) {
                final TreeNode node = (TreeNode) event.getElement();
                node.setOpen(false);
                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;
                String visualAttribute = node.getData().getModifier().getVisualattributes();
                if ((visualAttribute.startsWith("D")) || (visualAttribute.startsWith("O")))
                    if (node.isOpen()) {
                        // collapsing node
                        node.setOpen(false);
                        viewer.collapseToLevel(node, 1);
                        viewer.refresh();
                    } else // expanding node
                    {
                        node.setOpen(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() == 1) {
                            TreeNode child = (TreeNode) (node.getChildren().get(0));
                            if ((child.getData().getModifier().getVisualattributes().startsWith("R"))
                                    && (child.isOpen())) {
                                // child is a placeholder, so remove from list 
                                //   update list with real children  
                                node.getModXMLData(viewer, null).start();
                            }
                        }
                        viewer.refresh();
                    }
            }

        });

        //    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.MouseMove:
                case SWT.MouseExit: {
                    if (tip == null)
                        break;
                    tip.dispose();
                    tip = null;
                    label = null;
                    break;
                }
                case SWT.MouseDown:
                    /*            if(event.button == 3) // right click
                    {
                       IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
                       if (selection.size() != 1)
                          return;
                        
                       TreeNode node =  (TreeNode) selection.getFirstElement();
                       setCurrentNode(node);
                       if(node.getData().getModifier().getVisualattributes().substring(2).equals("E")){                     
                        
                          if   ((node.getData().getModifier().getVisualattributes().startsWith("O"))
                       || (node.getData().getModifier().getVisualattributes().startsWith("D"))){
                    lockedMenu.setVisible(false);
                    modAllMenu.setVisible(true);
                    modItemMenu.setVisible(false);
                        
                          }
                          else if   ((node.getData().getModifier().getVisualattributes().startsWith("R"))){
                    modAllMenu.setVisible(false);
                    modItemMenu.setVisible(true);
                    lockedMenu.setVisible(false);
                          }
                        
                          else{
                    lockedMenu.setVisible(false);
                    modAllMenu.setVisible(false);
                    modItemMenu.setVisible(false);
                          }
                        
                       }
                       else{
                          modAllMenu.setVisible(false);
                          modItemMenu.setVisible(false);
                          lockedMenu.setVisible(true);
                       }
                    } */

                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);

        //      MetadataRecord.getInstance().registerModifierViewer(viewer);
    }

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

    public void refresh() {
        this.viewer.refresh();
    }

    public void refreshNode() {
        //      currentNode.getData().getModifier().setName(MetadataRecord.getInstance().getMetadata().getModifier().getName());
        this.viewer.refresh(currentNode);
    }

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

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

                theDisplay.syncExec(new Runnable() {
                    public void run() {
                        if (rootNode.getChildren().size() == 0) {
                            ModifierType modifier = new ModifierType();
                            modifier.setName("There were no matches");
                            modifier.setVisualattributes("C-UNDEF");
                            TreeNode placeholder = new TreeNode(1, "placeholder", "There were no matches",
                                    "C-UNDEF");
                            placeholder.getData().setModifier(modifier);
                            rootNode.addChild(placeholder);
                        }
                        theViewer.refresh();
                    }
                });
            }
        };
    }

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

        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());
        vocabData.setSelf(getNodeKey());
        List modifiers = getModifierNodes(type, vocabData, display, viewer);
        getModifierNodesFromXMLString(modifiers);

    }

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

        OntologyResponseMessage msg = new OntologyResponseMessage();
        StatusType procStatus = null;
        try {
            while (procStatus == null || !procStatus.getType().equals("DONE")) {
                String response = null;
                if (type.equals("name"))
                    response = OntServiceDriver.getModifierNameInfo(vocabData, "FIND");
                else
                    response = OntServiceDriver.getModifierCodeInfo(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 (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 modifiers;
    }

    public void getModifierNodesFromXMLString(List<ModifierType> modifiers) {
        if (!modifiers.isEmpty()) {
            Iterator<ModifierType> it = modifiers.iterator();

            while (it.hasNext()) {
                ConceptType child = conceptNode.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(data.getModifier().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);
                    //         if(childNode.getData().getModifier().getLevel() == 1)
                    rootNode.addChild(childNode);
                    //         else
                    //            currentNode.addChild(childNode);
                } else if ((data.getModifier().getVisualattributes().startsWith("DH"))
                        || (data.getModifier().getVisualattributes().startsWith("OH"))) {
                    TreeNode placeholder = new TreeNode(data.getModifier().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);
                    //         if(childNode.getData().getModifier().getLevel() == 1)
                    rootNode.addChild(childNode);
                    //         else
                    //            currentNode.addChild(childNode);
                } else if ((data.getModifier().getVisualattributes().startsWith("R"))) {
                    //      if(childNode.getData().getModifier().getLevel() == 1)
                    rootNode.addChild(childNode);
                    //      else
                    //         currentNode.addChild(childNode);
                }
            }
        }

    }

    public Thread getAllModXMLData(TreeViewer viewer) {
        final TreeViewer theViewer = viewer;
        final Display theDisplay = Display.getCurrent();
        return new Thread() {
            @Override
            public void run() {
                try {
                    updateModifiers(theDisplay, theViewer);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    //            System.setProperty("statusMessage", e.getMessage());               
                }
                theDisplay.syncExec(new Runnable() {
                    public void run() {
                        //   theViewer.expandToLevel(theNode, 1);
                        theViewer.refresh(rootNode);
                    }
                });
            }
        };
    }

    public void updateModifiers(final Display theDisplay, final TreeViewer theViewer) {
        String path = StringUtil.getPath(conceptNode.getData().getKey());
        String tableCd = StringUtil.getTableCd(conceptNode.getData().getKey());
        //   getChildren().clear();
        //      while (path.length()>3){
        GetModifiersType nodeType = new GetModifiersType();

        nodeType.setBlob(false);
        nodeType.setSelf("\\\\" + tableCd + path);
        nodeType.setType("core");

        GetModifiersResponseMessage msg = new GetModifiersResponseMessage();
        StatusType procStatus = null;
        while (procStatus == null || !procStatus.getType().equals("DONE")) {
            String response = OntServiceDriver.getModifiers(nodeType, "FIND");
            // case where server is at pre-1.6 version
            // ignore the response and continue
            if (response == null) {
                rootNode.getChildren().clear();
                return;
            }
            procStatus = msg.processResult(response);

            //            else if  other error codes
            //            TABLE_ACCESS_DENIED and USER_INVALID and DATABASE ERRORS
            if (procStatus.getType().equals("ERROR")) {
                System.setProperty("errorMessage", 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("errorMessage"));
                        int result = mBox.open();
                    }
                });
                rootNode.getChildren().clear();
                return;
            }
        }
        rootNode.getChildren().clear();
        ModifiersType allModifiers = msg.doReadModifiers();
        ConceptsType concepts = new ConceptsType();
        if (allModifiers != null) {
            // convert list of modifiers to list of concepts
            List<ModifierType> modifiers = allModifiers.getModifier();
            getModifierNodesFromXMLString(modifiers);
        }

    }
}