org.eclipse.rcptt.ctx.debug.ui.DebugContextEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.rcptt.ctx.debug.ui.DebugContextEditor.java

Source

/*******************************************************************************
 * Copyright (c) 2009, 2016 Xored Software Inc and others.
 * All rights reserved. This program and the accompanying materials
 * are 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:
 *     Xored Software Inc - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.rcptt.ctx.debug.ui;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.databinding.EMFObservables;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.rcptt.core.model.ModelException;
import org.eclipse.rcptt.core.scenario.Context;
import org.eclipse.rcptt.debug.Collection;
import org.eclipse.rcptt.debug.DebugContext;
import org.eclipse.rcptt.debug.DebugFactory;
import org.eclipse.rcptt.debug.DebugPackage;
import org.eclipse.rcptt.debug.MapValue;
import org.eclipse.rcptt.debug.PrimitiveValue;
import org.eclipse.rcptt.ecl.runtime.BoxedValues;
import org.eclipse.rcptt.internal.ui.Messages;
import org.eclipse.rcptt.internal.ui.Q7UIPlugin;
import org.eclipse.rcptt.ui.context.BaseContextEditor;
import org.eclipse.rcptt.ui.controls.AbstractEmbeddedComposite;
import org.eclipse.rcptt.ui.controls.SectionWithComposite;
import org.eclipse.rcptt.ui.controls.SectionWithToolbar;
import org.eclipse.rcptt.ui.editors.EditorHeader;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchSite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;

public class DebugContextEditor extends BaseContextEditor {
    TreeViewer viewer;

    public DebugContext getContextElement() {
        try {
            return (DebugContext) super.getElement().getNamedElement();
        } catch (ModelException e) {
            Q7UIPlugin.log(e);
            return null;
        }
    }

    @Override
    public void copyContentFrom(Context context, IProgressMonitor monitor) throws CoreException {
        super.copyContentFrom(context, monitor);
        viewer.getControl().getDisplay().asyncExec(new Runnable() {
            public void run() {
                viewer.refresh(true);
            }
        });
    }

    public Control create(Composite parent, FormToolkit toolkit, IWorkbenchSite site, EditorHeader header) {
        Section section = new SectionWithComposite("Options",
                Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED).grabVertical(false).create(parent, toolkit);
        GridDataFactory.fillDefaults().grab(true, false).applyTo(section);

        Composite composite = (Composite) section.getClient();
        GridLayoutFactory.fillDefaults().numColumns(1).applyTo(composite);
        Button noLaunches = toolkit.createButton(composite, "Terminate existing launches", SWT.CHECK);
        dbc.bindValue(SWTObservables.observeSelection(noLaunches),
                EMFObservables.observeValue(getContextElement(), DebugPackage.Literals.DEBUG_CONTEXT__NO_LAUNCHES));

        toolkit.createLabel(composite, "Do not terminate launches of following configurations:");
        Text exceptions = toolkit.createText(composite, "", SWT.BORDER);

        GridDataFactory.fillDefaults().hint(300, SWT.DEFAULT).applyTo(exceptions);
        dbc.bindValue(SWTObservables.observeText(exceptions, SWT.Modify), EMFObservables
                .observeValue(getContextElement(), DebugPackage.Literals.DEBUG_CONTEXT__LAUNCH_EXCEPTIONS));
        dbc.bindValue(SWTObservables.observeEnabled(exceptions), SWTObservables.observeSelection(noLaunches));

        Button noLaunchShortcuts = toolkit.createButton(composite, "Clear launch configurations", SWT.CHECK);

        dbc.bindValue(SWTObservables.observeSelection(noLaunchShortcuts), EMFObservables
                .observeValue(getContextElement(), DebugPackage.Literals.DEBUG_CONTEXT__NO_LAUNCH_SHORTCUTS));

        GridDataFactory.fillDefaults().grab(true, false).applyTo(composite);
        toolkit.createLabel(composite, "Do not delete following configurations:");
        exceptions = toolkit.createText(composite, "", SWT.BORDER);
        GridDataFactory.fillDefaults().grab(true, false).applyTo(exceptions);
        dbc.bindValue(SWTObservables.observeText(exceptions, SWT.Modify), EMFObservables.observeValue(
                getContextElement(), DebugPackage.Literals.DEBUG_CONTEXT__LAUNCH_SHORTCUT_EXCEPTIONS));
        dbc.bindValue(SWTObservables.observeEnabled(exceptions),
                SWTObservables.observeSelection(noLaunchShortcuts));
        Button noBreakpoints = toolkit.createButton(composite, "Clear breakpoints", SWT.CHECK);
        GridDataFactory.fillDefaults().span(2, 1).applyTo(noBreakpoints);

        dbc.bindValue(SWTObservables.observeSelection(noBreakpoints), EMFObservables
                .observeValue(getContextElement(), DebugPackage.Literals.DEBUG_CONTEXT__NO_BREAKPOINTS));
        Section section5 = new SectionWithToolbar(new EditableTree("Launch configurations", new ContentProvider()),
                Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED).create(parent, toolkit);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(section5);
        return section;
    }

    private class EditableTree extends AbstractEmbeddedComposite {
        final String name;
        final Image image;
        Tree tree;
        final ContentProvider contentProvider;

        public EditableTree(String name, ContentProvider contentProvider) {
            this.name = name;
            this.contentProvider = contentProvider;
            this.image = null;
        }

        public String getName() {
            return name;
        }

        private final Action addTool = new Action() {
            {
                // TODO: is this label adequate?
                setText(Messages.EObjectTable_Add);
                setImageDescriptor(
                        PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_ADD));
                setEnabled(false);
            }

            @Override
            public void run() {
                Collection expandable = getSelectedExpandable();
                if (expandable == null)
                    return;
                PrimitiveValue value = DebugFactory.eINSTANCE.createPrimitiveValue();
                if (expandable instanceof MapValue)
                    value.setName("New element");
                value.setValue(BoxedValues.box(""));
                expandable.getEntries().add(value);
                viewer.refresh(expandable, true);
                viewer.editElement(value, 1);
            }
        };
        private final Action removeTool = new Action() {
            {
                // TODO: is this label adequate?
                setText(Messages.EObjectTable_Remove);
                setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
                        .getImageDescriptor(ISharedImages.IMG_ETOOL_DELETE));
                setDisabledImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
                        .getImageDescriptor(ISharedImages.IMG_ETOOL_DELETE_DISABLED));
                setEnabled(false);
            }

            @Override
            public void run() {
                IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
                Object toSelect = null;
                for (Object o : selection.toList()) {
                    if (contentProvider.isRemovable(o)) {
                        Object parent = contentProvider.getParent(o);
                        // Look for object to be selected instead of removed one
                        // Convenient for sequential removals
                        toSelect = parent;
                        if (parent != null) {
                            Object[] children = contentProvider.getChildren(parent);
                            for (int position = 0; position < children.length; position++) {
                                if (children[position] == o) {
                                    if (position - 1 >= 0) {
                                        toSelect = children[position - 1];
                                    } else if (position + 1 < children.length) {
                                        toSelect = children[position + 1];
                                    }
                                    break;
                                }
                            }
                        }
                        contentProvider.remove(o);
                        viewer.refresh();
                    }
                }
                if (toSelect != null)
                    viewer.setSelection(new StructuredSelection(toSelect));
            }
        };

        private Collection getSelectedExpandable() {
            IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
            Object o = selection.getFirstElement();
            while (o != null) {
                if (o instanceof Collection)
                    return (Collection) o;
                o = contentProvider.getParent(o);
            }
            return null;
        }

        public void createControl(Composite parent) {
            final Tree tree = new Tree(parent, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
            tree.setHeaderVisible(true);
            tree.setLinesVisible(true);
            // toolkit.adapt(tree);
            GridDataFactory.fillDefaults().grab(true, true).applyTo(tree);

            viewer = new TreeViewer(tree);
            contentProvider.install(viewer);
            viewer.setInput(getContextElement());
            viewer.addSelectionChangedListener(new ISelectionChangedListener() {

                public void selectionChanged(SelectionChangedEvent event) {
                    addTool.setEnabled(getSelectedExpandable() != null);
                    boolean removable = false;
                    if (event.getSelection() instanceof IStructuredSelection) {
                        IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                        for (Object o : selection.toList()) {
                            if (contentProvider.isRemovable(o)) {
                                removable = true;
                                break;
                            }
                        }
                    }
                    removeTool.setEnabled(removable);
                }
            });
        }

        public Control getControl() {
            return tree;
        }

        @Override
        protected void fillActions(IToolBarManager manager) {
            manager.add(addTool);
            manager.add(removeTool);

        }

        public Image getImage() {
            return image;
        }
    }
}