org.opentravel.schemas.views.ContextsView.java Source code

Java tutorial

Introduction

Here is the source code for org.opentravel.schemas.views.ContextsView.java

Source

/**
 * Copyright (C) 2014 OpenTravel Alliance (info@opentravel.org)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.opentravel.schemas.views;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerDropAdapter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.FillLayout;
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.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.opentravel.schemas.actions.AddContextAction;
import org.opentravel.schemas.actions.CloneContextAction;
import org.opentravel.schemas.actions.MergeContextAction;
import org.opentravel.schemas.actions.SetContextAsDefaultAction;
import org.opentravel.schemas.controllers.ContextController;
import org.opentravel.schemas.node.ContextNode;
import org.opentravel.schemas.node.INode;
import org.opentravel.schemas.node.Node;
import org.opentravel.schemas.properties.ExternalizedStringProperties;
import org.opentravel.schemas.properties.Messages;
import org.opentravel.schemas.stl2developer.MainWindow;
import org.opentravel.schemas.stl2developer.OtmRegistry;
import org.opentravel.schemas.trees.context.ContextTreeContentProvider;
import org.opentravel.schemas.trees.context.ContextTreeLabelProvider;
import org.opentravel.schemas.widgets.ButtonBarManager;
import org.opentravel.schemas.widgets.WidgetFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * Manage the context view.
 * 
 * @author Agnieszka Janowska
 * 
 */
public class ContextsView extends OtmAbstractView
        implements ISelectionListener, ISelectionChangedListener, ITreeViewerListener {

    private static final Logger LOGGER = LoggerFactory.getLogger(ContextsView.class);
    public static String VIEW_ID = "org.opentravel.schemas.stl2Developer.ContextsView";

    private FormToolkit toolkit;
    private ScrolledForm form;
    private TreeViewer viewer;
    private Text appCtxText;
    private Text ctxIdText;
    private Text ctxDescriptionText;

    private List<ContextNode> expansionState = new LinkedList<ContextNode>();

    private INode currentNode;
    private INode previousNode;

    private ContextController controller;

    private Action addContextAction;
    private Action cloneContextAction;
    private Action mergeContextAction;
    private Action setContextAsDefaultAction;

    private ContextNode currentTypeRoot;

    public ContextsView() {
        // controller = new DefaultContextController(OtmRegistry.getMainWindow(), this);
    }

    @Override
    public void createPartControl(final Composite parent) {
        LOGGER.info("Initializing part control of " + this.getClass());

        OtmRegistry.registerContextsView(this);

        getSite().getPage().addSelectionListener("org.opentravel.schemas.stl2Developer.ModelNavigatorView", this);

        final MainWindow mainWindow = OtmRegistry.getMainWindow();

        toolkit = WidgetFactory.createFormToolkit(parent.getDisplay());
        form = toolkit.createScrolledForm(parent);

        final FillLayout layout = new FillLayout();
        form.getBody().setLayout(layout);

        final GridLayout layoutLeft = new GridLayout(2, false);
        layoutLeft.marginBottom = 10;
        layoutLeft.marginLeft = 10;
        layoutLeft.marginTop = 10;
        layoutLeft.marginRight = 10;

        final GridData textGD = new GridData();
        textGD.grabExcessHorizontalSpace = true;
        textGD.horizontalAlignment = SWT.FILL;

        final GridData contextGD = new GridData();
        contextGD.horizontalAlignment = SWT.FILL;
        contextGD.grabExcessHorizontalSpace = true;
        contextGD.horizontalSpan = 2;

        final GridData viewerGD = new GridData();
        viewerGD.grabExcessHorizontalSpace = true;
        viewerGD.grabExcessVerticalSpace = true;
        viewerGD.horizontalAlignment = SWT.FILL;
        viewerGD.verticalAlignment = SWT.FILL;
        viewerGD.horizontalSpan = 2;

        GridData bbGD = new GridData();
        bbGD.horizontalSpan = 2;
        bbGD.horizontalIndent = 0;
        bbGD.verticalIndent = 0;

        Composite compLeft = form.getBody();
        compLeft.setLayout(layoutLeft);

        String txt = Messages.getString("context.label.applicationContext.text");
        toolkit.createLabel(compLeft, txt, SWT.NONE);

        appCtxText = toolkit.createText(compLeft, "", SWT.BORDER);
        appCtxText.setToolTipText(Messages.getString("context.label.applicationContext.tooltip"));
        appCtxText.setLayoutData(textGD);
        appCtxText.addModifyListener(new ModifyListener() {

            @Override
            public void modifyText(ModifyEvent e) {
                modifyApplicationContext();
            }

        });

        // Local Name
        txt = Messages.getString("context.label.contextID.text");
        toolkit.createLabel(compLeft, txt, SWT.NONE);

        ctxIdText = toolkit.createText(compLeft, "", SWT.BORDER);
        txt = Messages.getString("context.label.contextID.tooltip");
        ctxIdText.setToolTipText(txt);
        ctxIdText.setLayoutData(textGD);

        ctxIdText.addModifyListener(new ModifyListener() {

            @Override
            public void modifyText(ModifyEvent e) {
                modifyContextId();
            }
        });

        toolkit.createLabel(compLeft, "Description", SWT.NONE);

        ctxDescriptionText = toolkit.createText(compLeft, "", SWT.BORDER);
        ctxDescriptionText.setLayoutData(textGD);

        ctxDescriptionText.addModifyListener(new ModifyListener() {

            @Override
            public void modifyText(ModifyEvent e) {
                modifyDescription();
            }
        });

        addContextAction = new AddContextAction(mainWindow, new ExternalizedStringProperties("action.addContext"));
        cloneContextAction = new CloneContextAction(mainWindow,
                new ExternalizedStringProperties("action.cloneContext"));
        mergeContextAction = new MergeContextAction(mainWindow,
                new ExternalizedStringProperties("action.mergeContext"));
        setContextAsDefaultAction = new SetContextAsDefaultAction(mainWindow,
                new ExternalizedStringProperties("action.setContextAsDefault"));

        ButtonBarManager bbManager = new ButtonBarManager(SWT.FLAT);
        bbManager.add(addContextAction);
        bbManager.add(cloneContextAction);
        bbManager.add(mergeContextAction);
        bbManager.add(setContextAsDefaultAction);

        Composite bb = bbManager.createControl(toolkit, compLeft);
        bb.setLayoutData(bbGD);

        viewer = initializeTreeViewer(compLeft);
        viewer.getTree().setLayoutData(viewerGD);
        viewer.addSelectionChangedListener(this);
        viewer.addTreeListener(this);

        setCurrentNode(mc.getCurrentNode_NavigatorView());
        postContexts(true);
    }

    private TreeViewer initializeTreeViewer(Composite parent) {
        final TreeViewer viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        viewer.setContentProvider(new ContextTreeContentProvider());
        viewer.setLabelProvider(new ContextTreeLabelProvider());

        viewer.addDragSupport(DND.DROP_COPY | DND.DROP_MOVE, new Transfer[] { TextTransfer.getInstance() },
                new DragSourceListener() {

                    @Override
                    public void dragStart(DragSourceEvent event) {
                        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();

                        Object firstElement = selection.getFirstElement();
                        if (firstElement instanceof ContextNode) {
                            if (((ContextNode) firstElement).isContextItem()) {
                                event.doit = true;
                                return;
                            }
                        }
                        event.doit = false;
                    }

                    @Override
                    public void dragSetData(DragSourceEvent event) {
                        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();

                        Object firstElement = selection.getFirstElement();
                        if (firstElement instanceof ContextNode) {
                            event.data = ((ContextNode) firstElement).getContextId();
                        }
                    }

                    @Override
                    public void dragFinished(DragSourceEvent event) {

                    }

                });
        viewer.addDropSupport(DND.DROP_COPY | DND.DROP_MOVE, new Transfer[] { TextTransfer.getInstance() },
                new ViewerDropAdapter(viewer) {

                    @Override
                    public boolean performDrop(Object data) {
                        if (data != null) {
                            getContextController().copyContext();
                            return true;
                        }
                        return false;
                    }

                    @Override
                    public void drop(DropTargetEvent event) {
                        Object target = determineTarget(event);
                        if (target instanceof ContextNode) {
                            setSelectedTypeRoot(((ContextNode) target).getOwningLibraryRoot());
                        } else {
                            setSelectedTypeRoot(null);
                        }
                        super.drop(event);
                    }

                    @Override
                    public boolean validateDrop(Object target, int operation, TransferData transferType) {
                        if (target instanceof ContextNode) {
                            return true;
                        }
                        return false;
                    }

                });

        return viewer;
    }

    @Override
    public void setFocus() {
        refreshAllViews();
    }

    public void setFocus(ContextNode node) {
        select(node);
        appCtxText.setFocus();
    }

    public void select(ContextNode node) {
        viewer.setSelection(new StructuredSelection(node), true);
    }

    @Override
    public void refreshAllViews() {
        viewer.refresh(true);
        updateFields(getSelectedContextNode());
        // on starting type view can be null
        if (OtmRegistry.getTypeView() != null) {
            OtmRegistry.getTypeView().refresh();
        }
    }

    /**
     * Create then post a complete tree starting with the model root.
     * 
     * @param forceRefresh
     */
    public void postContexts(final boolean forceRefresh) {
        final MainWindow mainWindow = OtmRegistry.getMainWindow();
        if (mainWindow == null)
            throw new IllegalArgumentException("Main window not accessible.");
        if (controller == null)
            controller = mc.getContextController();
        if (forceRefresh) {
            controller.refreshContexts();
        }

        viewer.setInput(controller.getRoot());
        restoreExpansionState();
        refreshAllViews();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart,
     * org.eclipse.jface.viewers.ISelection)
     */
    @Override
    public void selectionChanged(final IWorkbenchPart part, final ISelection selection) {
        final IStructuredSelection iss = (IStructuredSelection) selection;
        // the data should be the first element selected and it should be a Node
        final Object object = iss.getFirstElement();
        INode curNode = null;
        if (object instanceof Node) {
            curNode = (INode) object;
        }
        setCurrentNode(curNode);
        postContexts(false);
    }

    @Override
    public INode getCurrentNode() {
        return currentNode;
    }

    @Override
    public INode getPreviousNode() {
        return previousNode;
    }

    @Override
    public void setCurrentNode(final INode node) {
        previousNode = currentNode;
        currentNode = node;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.ITreeViewerListener#treeCollapsed(org.eclipse.jface.viewers.
     * TreeExpansionEvent)
     */
    @Override
    public void treeCollapsed(TreeExpansionEvent event) {
        Object collapsed = event.getElement();
        if (collapsed instanceof ContextNode) {
            ContextNode doc = (ContextNode) collapsed;
            removeRecursivelyFromExpansionState(doc);
        }
    }

    private void removeRecursivelyFromExpansionState(ContextNode doc) {
        for (ContextNode child : doc.getChildren()) {
            removeRecursivelyFromExpansionState(child);
        }
        expansionState.remove(doc);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.ITreeViewerListener#treeExpanded(org.eclipse.jface.viewers.
     * TreeExpansionEvent)
     */
    @Override
    public void treeExpanded(TreeExpansionEvent event) {
        Object expanded = event.getElement();
        if (expanded instanceof ContextNode) {
            expansionState.add((ContextNode) expanded);
        }
    }

    private void restoreExpansionState() {
        viewer.expandAll();
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers
     * .SelectionChangedEvent)
     */
    @Override
    public void selectionChanged(SelectionChangedEvent event) {
        final IStructuredSelection iss = (IStructuredSelection) viewer.getSelection();
        final Object object = iss.getFirstElement();
        if ((object != null) && (object instanceof ContextNode)) {
            ContextNode docItem = (ContextNode) object;
            updateActions(docItem);
            updateFields(docItem);
        } else {
            updateActions(null);
            updateFields(null);
        }
    }

    private void updateActions(ContextNode context) {
        boolean enabled = false;
        if (context != null) {
            enabled = context.getLibraryNode().isEditable();
        }
        addContextAction.setEnabled(enabled);
        cloneContextAction.setEnabled(enabled);
        mergeContextAction.setEnabled(enabled);
        setContextAsDefaultAction.setEnabled(enabled);
    }

    private void updateFields(ContextNode context) {
        if (context != null) {
            appCtxText.setData(context);
            ctxIdText.setData(context);
            ctxDescriptionText.setData(context);
            appCtxText.setText(context.getApplicationContext());
            ctxIdText.setText(context.getContextId());
            ctxDescriptionText.setText(context.getDescription());
            retrieveDefaultContext(context);
        } else {
            appCtxText.setData(null);
            ctxIdText.setData(null);
            ctxDescriptionText.setData(null);
            appCtxText.setText("");
            ctxIdText.setText("");
            ctxDescriptionText.setText("");
        }
        boolean enabled = false;
        if (context != null && context.getLibraryNode().isEditable())
            enabled = true;
        appCtxText.setEnabled(enabled);
        ctxIdText.setEnabled(enabled);
        ctxDescriptionText.setEnabled(enabled);
    }

    /**
     * ???
     * 
     * @param context
     */
    private void retrieveDefaultContext(ContextNode context) {
        String contextId = controller.getDefaultContextId();
        for (ContextNode ctx : context.getOwningLibraryRoot().getChildren()) {
            if (ctx.getContextId().equals(contextId)) {
                setDefaultContextNode(ctx);
            }
        }
    }

    public void modifyApplicationContext() {
        Object data = appCtxText.getData();
        if (data instanceof ContextNode) {
            ContextNode context = (ContextNode) data;
            context.setApplicationContext(appCtxText.getText());
            viewer.refresh(context, true);
        }
    }

    public void modifyContextId() {
        Object data = ctxIdText.getData();
        if (data instanceof ContextNode) {
            ContextNode context = (ContextNode) data;
            context.setContextId(ctxIdText.getText());
            viewer.refresh(context, true);
        }
    }

    public void modifyDescription() {
        Object data = ctxDescriptionText.getData();
        if (data instanceof ContextNode) {
            ContextNode context = (ContextNode) data;
            context.setDescription(ctxDescriptionText.getText());
            viewer.refresh(context, true);
        }
    }

    public ContextNode getSelectedContextNode() {
        if (viewer == null)
            return null; // In case the view is not activated.
        StructuredSelection selection = (StructuredSelection) viewer.getSelection();
        Object object = selection.getFirstElement();
        if (object != null && object instanceof ContextNode) {
            return (ContextNode) object;
        }
        // LOGGER.debug("getSelectedContextNode is returning null.\t" + this.getClass());
        return null;
    }

    public List<ContextNode> getSelectedContextNodes() {
        if (viewer == null)
            return null; // In case the view is not activated.
        StructuredSelection selection = (StructuredSelection) viewer.getSelection();
        List<ContextNode> nodes = new ArrayList<ContextNode>();
        for (Object object : selection.toArray()) {
            if (object != null && object instanceof ContextNode) {
                nodes.add((ContextNode) object);
            }
        }
        return nodes;
    }

    /**
     * Set the default context node to the passed node.
     * 
     * @param selected
     */
    public void setDefaultContextNode(ContextNode selected) {
        viewer.refresh(true);
    }

    /**
     * @return
     */
    public ContextController getContextController() {
        return controller;
    }

    public void setSelectedTypeRoot(ContextNode node) {
        this.currentTypeRoot = node;
    }

    public ContextNode getSelectedLibraryRoot() {
        return currentTypeRoot;
    }

    /**
     * @return the text in the application context field.
     */
    public String getApplicationText() {
        return appCtxText.getText();
    }

    /**
     * @return the text in the context name (id) field.
     */
    public String getContextIdText() {
        return ctxIdText.getText();
    }

    /**
     * @return the text in the context description field.
     */
    public String getDescriptionText() {
        return ctxDescriptionText.getText();
    }

    @Override
    public List<Node> getSelectedNodes() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getViewID() {
        return VIEW_ID;
    }

    @Override
    public void refresh() {
        if (viewer != null) {
            viewer.refresh(true);
            updateFields(getSelectedContextNode());
        }
    }

    @Override
    public void refresh(INode node) {
        viewer.refresh(true);
        postContexts(true);
        // TODO - select the context node that matches the passed node
    }
}