org.jboss.tools.ws.ui.views.RequestBodyComposite.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.ws.ui.views.RequestBodyComposite.java

Source

/******************************************************************************* 
 * Copyright (c) 2017 Red Hat, Inc. and others. 
 * Distributed under license by Red Hat, Inc. All rights reserved. 
 * This program is made available under the terms of the 
 * Eclipse Public License v1.0 which accompanies this distribution, 
 * and is available at http://www.eclipse.org/legal/epl-v10.html 
 * 
 * Contributors: 
 * Red Hat, Inc. - initial API and implementation 
 ******************************************************************************/
package org.jboss.tools.ws.ui.views;

import java.util.Stack;

import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.ScrolledPageBook;
import org.jboss.tools.ws.ui.JBossWSUIPlugin;
import org.jboss.tools.ws.ui.messages.JBossWSUIMessages;
import org.jboss.tools.ws.ui.utils.XMLParser;
import org.jboss.tools.ws.ui.utils.TreeParent;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/**
 * @since 2.0
 */
public class RequestBodyComposite {

    public static final String PAGE1_KEY = "page1"; //$NON-NLS-1$
    public static final String PAGE2_KEY = "page2"; //$NON-NLS-1$
    private static final String[] TREE_COLUMNS = new String[] { "name", "value" }; //$NON-NLS-1$ //$NON-NLS-2$

    private Text bodyText;
    private TreeViewer treeRequestBody;

    public void createControl(WebServicesTestView view, Composite parent) {
        ExpandableComposite bodyComposite = view.getToolkit().createExpandableComposite(parent,
                ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT | ExpandableComposite.EXPANDED);
        bodyComposite.setText(JBossWSUIMessages.JAXRSWSTestView2_BodyText_Section);
        ScrolledPageBook requestPageBook = view.getToolkit().createPageBook(bodyComposite, SWT.NONE);

        createRequestToolbar(requestPageBook, bodyComposite);

        Composite page1 = requestPageBook.createPage(PAGE1_KEY);
        page1.setLayout(new GridLayout());
        bodyText = view.getToolkit().createText(page1, "", SWT.BORDER | SWT.WRAP | SWT.V_SCROLL); //$NON-NLS-1$
        GridData gd7 = new GridData(SWT.FILL, SWT.FILL, true, true);
        // gd7.minimumHeight = 100;
        gd7.heightHint = 1;
        bodyText.setLayoutData(gd7);

        requestPageBook.showPage(PAGE1_KEY);

        Composite page2 = requestPageBook.createPage(PAGE2_KEY);
        page2.setLayout(new GridLayout());
        treeRequestBody = new TreeViewer(page2, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.FULL_SELECTION);
        treeRequestBody.setAutoExpandLevel(TreeViewer.ALL_LEVELS);
        GridData gd11 = new GridData(SWT.FILL, SWT.FILL, true, true);
        gd11.heightHint = 1;
        // gd10.minimumHeight = 100;
        view.getToolkit().adapt(treeRequestBody.getTree());
        treeRequestBody.getTree().setLayoutData(gd11);
        treeRequestBody.getTree().setHeaderVisible(true);
        TreeColumn nameColumn = new TreeColumn(treeRequestBody.getTree(), SWT.LEFT);
        nameColumn.setText(JBossWSUIMessages.JAXRSWSTestView2_Name_column);
        nameColumn.setWidth(200);
        TreeColumn valueColumn = new TreeColumn(treeRequestBody.getTree(), SWT.LEFT);
        valueColumn.setText(JBossWSUIMessages.JAXRSWSTestView2_Value_column);
        valueColumn.setWidth(200);

        treeRequestBody.setColumnProperties(TREE_COLUMNS);

        treeRequestBody.setLabelProvider(new ITableLabelProvider() {

            @Override
            public void addListener(ILabelProviderListener listener) {
            }

            @Override
            public void dispose() {
            }

            @Override
            public boolean isLabelProperty(Object element, String property) {
                if (element instanceof TreeParent && property.equalsIgnoreCase("name")) { //$NON-NLS-1$
                    return true;
                } else if (element instanceof TreeParent && property.equalsIgnoreCase("value")) { //$NON-NLS-1$
                    return true;
                }
                return false;
            }

            @Override
            public void removeListener(ILabelProviderListener listener) {
            }

            @Override
            public Image getColumnImage(Object element, int columnIndex) {
                return null;
            }

            @Override
            public String getColumnText(Object element, int columnIndex) {
                if (element instanceof TreeParent && columnIndex == 0) {
                    return ((TreeParent) element).getName();
                } else if (element instanceof TreeParent && columnIndex == 1) {
                    TreeParent tp = (TreeParent) element;
                    if (tp.getData() != null && tp.getData() instanceof Element) {
                        Element tpelement = (Element) tp.getData();
                        if (tpelement.getChildNodes() != null && tpelement.getChildNodes().getLength() > 0) {
                            Node node = tpelement.getChildNodes().item(0);
                            if (node.getNodeType() == Node.TEXT_NODE) {
                                return node.getTextContent();
                            }
                        }
                    }
                }
                return null;
            }
        });

        treeRequestBody.setContentProvider(new ITreeContentProvider() {

            String text;
            TreeParent tree;

            @Override
            public void dispose() {
            }

            @Override
            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                if (newInput instanceof String) {
                    text = (String) newInput;

                    XMLParser parser = new XMLParser();
                    parser.parseXmlFile(text);
                    if (parser.getRoot().getChildren().length > 0)
                        tree = (TreeParent) parser.getRoot().getChildren()[0];
                    else
                        tree = null;
                }
            }

            @Override
            public Object[] getElements(Object inputElement) {
                if (inputElement instanceof String && tree != null) {
                    return new Object[] { this.tree };
                } else if (inputElement instanceof TreeParent) {
                    return ((TreeParent) inputElement).getChildren();
                }
                return null;
            }

            @Override
            public Object[] getChildren(Object parentElement) {
                if (parentElement == null && tree != null) {
                    return new Object[] { this.tree };
                } else if (parentElement instanceof TreeParent && ((TreeParent) parentElement).hasChildren()) {
                    return ((TreeParent) parentElement).getChildren();
                }
                return null;
            }

            @Override
            public Object getParent(Object element) {
                if (element instanceof TreeParent) {
                    return ((TreeParent) element).getParent();
                }
                return null;
            }

            @Override
            public boolean hasChildren(Object element) {
                if (element instanceof TreeParent) {
                    return ((TreeParent) element).hasChildren();
                }
                return false;
            }
        });

        treeRequestBody.setCellModifier(new ICellModifier() {

            /*
             * (non-Javadoc)
             * 
             * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object,
             * java.lang.String)
             */
            public boolean canModify(Object element, String property) {
                if (element instanceof TreeParent && property.equalsIgnoreCase("value")) {//$NON-NLS-1$
                    TreeParent tp = (TreeParent) element;
                    if (tp.getData() != null && tp.getData() instanceof Element) {
                        Element tpelement = (Element) tp.getData();
                        if (tpelement.getChildNodes() != null && tpelement.getChildNodes().getLength() > 0) {
                            Node node = tpelement.getChildNodes().item(0);
                            if (node.getNodeType() == Node.TEXT_NODE && node.getNodeValue().trim().length() > 0) {
                                return true;
                            }
                        }
                    }
                }
                return false;
            }

            /*
             * (non-Javadoc)
             * 
             * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object,
             * java.lang.String)
             */
            public Object getValue(Object element, String property) {
                TreeParent tp = (TreeParent) element;
                if (tp.getData() != null && tp.getData() instanceof Element) {
                    Element tpelement = (Element) tp.getData();
                    if (tpelement.getChildNodes() != null && tpelement.getChildNodes().getLength() > 0) {
                        Node node = tpelement.getChildNodes().item(0);
                        return node.getTextContent();
                    }
                }
                return null;
            }

            /*
             * (non-Javadoc)
             * 
             * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object,
             * java.lang.String, java.lang.Object)
             */
            public void modify(Object element, String property, Object value) {
                TreeItem ti = (TreeItem) element;
                TreeParent tp = (TreeParent) ti.getData();
                if (tp.getData() != null && tp.getData() instanceof Element) {
                    Element tpelement = (Element) tp.getData();
                    if (tpelement.getChildNodes() != null && tpelement.getChildNodes().getLength() > 0) {
                        Node node = tpelement.getChildNodes().item(0);
                        if (node.getNodeType() == Node.TEXT_NODE) {
                            node.setTextContent((String) value);
                            treeRequestBody.update(tp, null);
                            XMLParser parser = new XMLParser();
                            String updatedOut = parser.updateValue((String) treeRequestBody.getInput(), tp,
                                    (String) value);
                            if (updatedOut != null && updatedOut.trim().length() > 0) {
                                Stack<String> pathStack = new Stack<String>();
                                pathStack.push(ti.getText());
                                TreeItem tiPath = ti;
                                while (tiPath.getParentItem() != null) {
                                    tiPath = tiPath.getParentItem();
                                    pathStack.push(tiPath.getText());
                                }
                                setBodyText(updatedOut);
                                treeRequestBody.setAutoExpandLevel(TreeViewer.ALL_LEVELS);
                                while (!pathStack.isEmpty()) {
                                    TreeItem[] items = treeRequestBody.getTree().getItems();
                                    String find = pathStack.pop();
                                    /* boolean found = */ findTreeItem(treeRequestBody, find, items);
                                }
                            }
                        }
                    }
                }
            }

        });
        treeRequestBody.setCellEditors(new CellEditor[] { null, new TextCellEditor(treeRequestBody.getTree()) });

        requestPageBook.showPage(PAGE1_KEY);

        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); // GridData.FILL_HORIZONTAL);
        gd.heightHint = 1;
        gd.minimumHeight = 100;
        requestPageBook.setLayoutData(gd);

        requestPageBook.showPage(PAGE1_KEY);
        bodyComposite.setClient(requestPageBook);
        GridData gd9 = new GridData(SWT.FILL, SWT.FILL, true, true);
        gd9.minimumHeight = 200;
        bodyComposite.setLayoutData(gd9);
        bodyComposite.addExpansionListener(new FormExpansionAdapter(view));
    }

    private void createRequestToolbar(ScrolledPageBook requestPageBook, ExpandableComposite parent) {

        // create a couple of actions for toggling views
        ShowRawAction rawRequestAction = new ShowRawAction(requestPageBook, PAGE1_KEY);
        rawRequestAction.setChecked(true);
        ShowInTreeAction treeAction = new ShowInTreeAction(requestPageBook);

        ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
        ToolBar toolbar = toolBarManager.createControl(parent);

        toolBarManager.add(rawRequestAction);
        toolBarManager.add(treeAction);

        toolBarManager.update(true);

        parent.setTextClient(toolbar);
    }

    private boolean findTreeItem(TreeViewer treeRequestBody, String name, TreeItem[] treeItems) {
        for (TreeItem treeItem : treeItems) {
            for (int i = 0; i < treeRequestBody.getTree().getColumnCount(); i++) {
                String text = treeItem.getText(i);
                if ((text.toUpperCase().contains(name.toUpperCase()))) {
                    treeRequestBody.getTree().setSelection(treeItem);
                    return true;
                }
                if (treeItem.getItemCount() > 0) {
                    return findTreeItem(treeRequestBody, name, treeItem.getItems());
                }
            }
        }
        return false;
    }

    public void setBodyText(String text) {
        bodyText.setText(text);
        treeRequestBody.setInput(text);
    }

    public String getBodyText() {
        return bodyText.getText();
    }

    class ShowInTreeAction extends ToggleAction {

        private ScrolledPageBook requestPageBook;

        public ShowInTreeAction(ScrolledPageBook requestPageBook) {
            this.requestPageBook = requestPageBook;
        }

        public void run() {
            requestPageBook.showPage(PAGE2_KEY);
        }

        @Override
        public String getToolTipText() {
            return JBossWSUIMessages.JAXRSWSTestView2_ShowRequestTree_toolbar_btn;
        }

        @Override
        public ImageDescriptor getImageDescriptor() {
            return JBossWSUIPlugin.getImageDescriptor(JBossWSUIPlugin.IMG_DESC_SHOWTREE);
        }
    }

}