edu.harvard.i2b2.eclipse.plugins.workplace.views.NodeBrowser.java Source code

Java tutorial

Introduction

Here is the source code for edu.harvard.i2b2.eclipse.plugins.workplace.views.NodeBrowser.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;

import java.util.ArrayList;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.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.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
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.widgets.Composite;
import org.eclipse.swt.widgets.Display;
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.TreeItem;

import edu.harvard.i2b2.eclipse.UserInfoBean;
import edu.harvard.i2b2.eclipse.plugins.workplace.util.XmlUtil;
import edu.harvard.i2b2.eclipse.plugins.workplace.ws.AddChildRequestMessage;

public class NodeBrowser extends ApplicationWindow {
    private Log log = LogFactory.getLog(NodeBrowser.class.getName());
    private TreeViewer viewer;
    private TreeData currentData;
    public TreeNode rootNode;
    private ImageRegistry imageRegistry;
    private Menu menu;
    private Menu folderMenu;
    private Menu caseMenu;
    private IAction protectAction;

    public NodeBrowser(Composite parent, int inputFlag, StatusLineManager slm) {
        super(null);

        ArrayList<String> roles = (ArrayList<String>) UserInfoBean.getInstance().getProjectRoles();
        for (String param : roles) {
            if (param.equalsIgnoreCase("manager")) {
                System.setProperty("WPManager", String.valueOf(true));
                break;
            }
        }

        imageRegistry = new ImageRegistry();
        createImageRegistry();
        //dont allow multi-selection for now
        createTreeViewer(parent, SWT.BORDER, inputFlag);
        //    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.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();
        protectAction = new ProtectedAction();
        popupMenu.add(renameAction);
        popupMenu.add(annotateAction);
        popupMenu.add(deleteAction);
        popupMenu.add(exportAction);
        //if (UserInfoBean.getInstance().isRoleInProject("DATA_LDS"/*"DATA_PROT"*/)) {
        //popupMenu.add(protectAction);
        // }
        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);
        //if (UserInfoBean.getInstance().isRoleInProject("DATA_LDS"/*"DATA_PROT"*/)) {
        //folderPopupMenu.add(protectAction);
        //}
        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((((TreeNode)element).getData().getProtectedAccess() != null) &&
                //Boolean.parseBoolean(((TreeNode)element).getData().getProtectedAccess())) {
                if ((((TreeNode) element).getData().getProtectedAccess() != null)
                        && (((TreeNode) element).getData().getProtectedAccess().equalsIgnoreCase("Y"))) {//protected_access()) {            
                    Color color = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_MAGENTA);
                    item.setForeground(color);
                } else {
                    Color color = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
                    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 version = System.getProperty("wkplServerVersion");
        double vernum = Double.parseDouble(version);
        if ((vernum >= 1.6/*1.7*/) && UserInfoBean.getInstance().isRoleInProject("DATA_LDS"/*"DATA_PROT"*/)) {
            popupMenu.add(protectAction);
            folderPopupMenu.add(protectAction);
        }

        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().getProtectedAccess() != null
                                && node.getData().getProtectedAccess().equalsIgnoreCase("Y")) {
                            protectAction.setText("Clear PHI Access");
                        } else {
                            protectAction.setText("Set PHI Access");
                        }

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

    public void refresh() {
        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 ProtectedAction extends Action {
        public ProtectedAction() {
            super("Set PHI Access");
        }

        @Override
        public void setText(String text) {
            // TODO Auto-generated method stub
            super.setText(text);
        }

        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_INFORMATION | SWT.OK);
                //     mBox.setText("Protect Node Dialog");
                //     mBox.setMessage("Can't perform this action on a folder for now.");
                //     result = mBox.open();
                // }
                // else{
                MessageBox mBox = new MessageBox(Display.getCurrent().getActiveShell(),
                        SWT.ICON_QUESTION | SWT.YES | SWT.NO);
                mBox.setText("Protect Node Dialog");
                mBox.setMessage("Protect node \"" + node.getData().getName() + "\"?\n");
                result = mBox.open();
                // }
                if (result == SWT.NO) {
                    return;
                } else {
                    node.protectNode(viewer).start();
                }
            } else {
                MessageBox mBox = new MessageBox(Display.getCurrent().getActiveShell(),
                        SWT.ICON_INFORMATION | SWT.OK);
                mBox.setText("Protect Node Message");
                mBox.setMessage("You do not have permission to protect this node");
                int result = mBox.open();
            }

        }
    }

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

}