eu.aniketos.wp1.ststool.analysis.ui.ResultView.java Source code

Java tutorial

Introduction

Here is the source code for eu.aniketos.wp1.ststool.analysis.ui.ResultView.java

Source

/*
* ResultView.java
*
* This file is part of the STS-Tool project.
* Copyright (c) 2011-2012 "University of Trento - DISI" All rights reserved.
*
* Is strictly forbidden to remove this copyright notice from this source code.
*
* Disclaimer of Warranty:
* STS-Tool (this software) is provided "as-is" and without warranty of any kind, 
* express, implied or otherwise, including without limitation, any warranty of 
* merchantability or fitness for a particular purpose.
* In no event shall the copyright holder or contributors be liable for any direct,
* indirect, incidental, special, exemplary, or consequential damages
* including, but not limited to, procurement of substitute goods or services;
* loss of use, data, or profits; or business interruption) however caused and on
* any theory of liability, whether in contract, strict liability, or tort (including
* negligence or otherwise) arising in any way out of the use of this software, even 
* if advised of the possibility of such damage.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3
* as published by the Free Software Foundation with the addition of the
* following permission added to Section 15 as permitted in Section 7(a):
* FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY 
* "University of Trento - DISI","University of Trento - DISI" DISCLAIMS THE
* WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
*
* See the GNU Affero General Public License for more details.
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, see http://www.gnu.org/licenses or write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA, 02110-1301 USA, or download the license from the following URL:
* http://www.sts-tool.eu/License.php
*
* For more information, please contact STS-Tool group at this
* address: ststool@disi.unitn.it
*
*/
package eu.aniketos.wp1.ststool.analysis.ui;

import static eu.aniketos.wp1.ststool.analysis.Messages.ResultView_ClearError_Action_Text;
import static eu.aniketos.wp1.ststool.analysis.Messages.ResultView_Column_1_Titile;
import static eu.aniketos.wp1.ststool.analysis.Messages.ResultView_Column_2_Titile;
import static eu.aniketos.wp1.ststool.analysis.Messages.getMessage;
import java.util.List;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.IParameter;
import org.eclipse.core.commands.Parameterization;
import org.eclipse.core.commands.ParameterizedCommand;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.part.ViewPart;
import eu.aniketos.wp1.ststool.analysis.Activator;
import eu.aniketos.wp1.ststool.analysis.internal.DiagramObserver;
import eu.aniketos.wp1.ststool.analysis.results.IResult;
import eu.aniketos.wp1.ststool.analysis.results.ResultsManager;
import eu.aniketos.wp1.ststool.analysis.ui.ResultViewDataProvider.TreeNode;
import eu.aniketos.wp1.ststool.diagram.custom.part.CustomStsToolDiagramDocumentEditor;
import eu.aniketos.wp1.ststool.diagram.custom.view.ViewsManager;

public class ResultView extends ViewPart implements DisposeListener, ISelectionChangedListener {

    public final static String ID = "eu.aniketos.wp1.ststool.analysis.analysisresultviewID"; //$NON-NLS-1$

    private final FormToolkit toolkit = new FormToolkit(Display.getCurrent());

    private TreeViewer treeViewer;
    private Label statusLabel;
    private Text descriptionText;

    public ResultView() {

    }

    /**
     * Create contents of the view part.
     * 
     * @param parent
     */
    @Override
    public void createPartControl(Composite parent) {

        parent.addDisposeListener(this);
        Composite container = toolkit.createComposite(parent, SWT.NONE);
        toolkit.paintBordersFor(container);

        container.setLayout(new FormLayout());

        Composite compositeResults = new Composite(container, SWT.NONE);
        FormData fd_composite = new FormData();
        fd_composite.left = new FormAttachment(0);
        fd_composite.top = new FormAttachment(0);
        fd_composite.bottom = new FormAttachment(100, -30);
        fd_composite.right = new FormAttachment(100);
        compositeResults.setLayoutData(fd_composite);
        compositeResults.setLayout(new FillLayout());

        Composite compositeStatusBar = new Composite(container, SWT.BORDER);
        FormData fd_composite_1 = new FormData();
        fd_composite_1.right = new FormAttachment(100);
        fd_composite_1.left = new FormAttachment(0);
        fd_composite_1.bottom = new FormAttachment(100);
        fd_composite_1.top = new FormAttachment(compositeResults);
        compositeStatusBar.setLayoutData(fd_composite_1);
        compositeStatusBar.setLayout(new FormLayout());

        SashForm sashForm = new SashForm(compositeResults, SWT.SMOOTH | SWT.VERTICAL);
        sashForm.setSashWidth(2);
        toolkit.paintBordersFor(sashForm);

        TreeViewer treeViewer = new TreeViewer(sashForm, SWT.BORDER | SWT.FULL_SELECTION);
        treeViewer.addPostSelectionChangedListener(this);
        Tree tree = treeViewer.getTree();
        tree.setLinesVisible(true);
        tree.setHeaderVisible(true);
        tree.setSortDirection(SWT.UP);
        toolkit.paintBordersFor(tree);

        Composite composite_1 = new Composite(sashForm, SWT.NONE);
        composite_1.setLayout(new FormLayout());

        Label lblDescription = new Label(composite_1, SWT.NONE);
        FormData fd_lblDescription = new FormData();
        fd_lblDescription.right = new FormAttachment(100, -10);
        fd_lblDescription.top = new FormAttachment(0, 10);
        fd_lblDescription.left = new FormAttachment(0, 10);
        lblDescription.setLayoutData(fd_lblDescription);
        lblDescription.setText("Description:");

        Composite composite_2 = new Composite(composite_1, SWT.NONE);
        FormData fd_composite_2 = new FormData();
        fd_composite_2.bottom = new FormAttachment(100, -10);
        fd_composite_2.right = new FormAttachment(100, -10);
        fd_composite_2.top = new FormAttachment(lblDescription, 6);
        fd_composite_2.left = new FormAttachment(0, 10);
        composite_2.setLayoutData(fd_composite_2);

        composite_2.setLayout(new FormLayout());
        composite_2.addPaintListener(new BorderPainter());

        descriptionText = new Text(composite_2, SWT.NONE | SWT.WRAP | SWT.V_SCROLL);
        descriptionText.setBackground(descriptionText.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
        FormData fd_text = new FormData();
        int x = 3;
        fd_text.bottom = new FormAttachment(100, -x);
        fd_text.right = new FormAttachment(100, -x);
        fd_text.top = new FormAttachment(0, x);
        fd_text.left = new FormAttachment(0, x);
        descriptionText.setLayoutData(fd_text);
        descriptionText.setEditable(false);

        sashForm.setWeights(new int[] { 55, 45 });

        TreeViewerColumn treeViewerColumn = new TreeViewerColumn(treeViewer, SWT.CENTER);
        treeViewerColumn.getColumn().setText(getMessage(ResultView_Column_1_Titile));
        treeViewerColumn.getColumn().setWidth(700);

        TreeViewerColumn treeViewerColumn2 = new TreeViewerColumn(treeViewer, SWT.LEFT);
        treeViewerColumn2.getColumn().setText(getMessage(ResultView_Column_2_Titile));
        treeViewerColumn2.getColumn().setWidth(500);

        statusLabel = new Label(compositeStatusBar, SWT.HORIZONTAL | SWT.SHADOW_NONE);
        FormData fd_lblNewLabel = new FormData();
        fd_lblNewLabel.right = new FormAttachment(100, -3);
        fd_lblNewLabel.top = new FormAttachment(0, 6);
        fd_lblNewLabel.left = new FormAttachment(3);
        statusLabel.setLayoutData(fd_lblNewLabel);
        statusLabel.setForeground(ColorConstants.red);

        container.addControlListener(new TableCompositeAdapter(container, treeViewer.getTree(),
                treeViewerColumn.getColumn(), treeViewerColumn2.getColumn()));
        new ResultViewDataProvider(treeViewer, treeViewerColumn, treeViewerColumn2, statusLabel);

        createActions();
        initializeToolBar();
        initializeMenu();
    }

    @Override
    public void dispose() {
        toolkit.dispose();
        super.dispose();
    }

    /**
     * Create the actions.
     */
    private void createActions() {

        // Create the actions
    }

    /**
     * Initialize the toolbar.
     */
    private void initializeToolBar() {

        IToolBarManager tbm = getViewSite().getActionBars().getToolBarManager();
        tbm.add(new ClearAction());
    }

    /**
     * Initialize the menu.
     */
    private void initializeMenu() {
        IMenuManager manager = getViewSite().getActionBars().getMenuManager();
        manager.add(new ClearAction());
    }

    @Override
    public void setFocus() {

        if (treeViewer != null)
            treeViewer.getTree().setFocus();
    }

    @Override
    public void widgetDisposed(DisposeEvent e) {
        toolkit.dispose();
    }

    private Object lastSelected = null;
    private int count = 0;

    @Override
    public void selectionChanged(SelectionChangedEvent event) {
        IStructuredSelection sel = (IStructuredSelection) event.getSelection();
        if (!sel.isEmpty()) {
            Object o = ((TreeNode) sel.getFirstElement()).getValue();
            if (o == lastSelected) {
                count++;
            } else {
                lastSelected = o;
                count = 0;
            }
            if (o instanceof IResult) {
                descriptionText.setText(((IResult) o).getDescription());
                if (((IResult) o).getObjects() != null && DiagramObserver.getEditor() != null) {
                    CustomStsToolDiagramDocumentEditor editor = DiagramObserver.getEditor();
                    switchView(((IResult) o).getView(), editor);
                    List<EObject> oList = ((IResult) o).getObjects();
                    int index = count - ((count / oList.size()) * oList.size());
                    EObject obj = ((IResult) o).getObjects().get(index);
                    editor.focusObject(obj);
                }
            } else {
                descriptionText.setText("");
            }
        } else {
            descriptionText.setText("");
        }
    }

    private void switchView(int view, CustomStsToolDiagramDocumentEditor editor) {

        if ((view == ViewsManager.SOCIAL_VIEW || view == ViewsManager.RESOURCE_VIEW
                || view == ViewsManager.AUTHORIZATION_VIEW)
                && (view != editor.getViewsManager().getCurrentIntView())) {
            try {
                ICommandService cmdService = (ICommandService) getSite().getService(ICommandService.class);
                Command switchView = cmdService.getCommand("eu.aniketos.wp1.ststool.diagram.command.switchView"); //$NON-NLS-1$
                String v = null; //$NON-NLS-1$
                switch (view) {
                case ViewsManager.SOCIAL_VIEW:
                    v = "social"; //$NON-NLS-1$
                    break;
                case ViewsManager.RESOURCE_VIEW:
                    v = "information"; //$NON-NLS-1$
                    break;
                case ViewsManager.AUTHORIZATION_VIEW:
                    v = "authorisation"; //$NON-NLS-1$
                    break;
                }

                IParameter param = switchView.getParameter("org.eclipse.ui.commands.radioStateParameter"); //$NON-NLS-1$

                Parameterization parm = new Parameterization(param, v);
                ParameterizedCommand parmCommand = new ParameterizedCommand(switchView,
                        new Parameterization[] { parm });

                IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
                handlerService.executeCommand(parmCommand, null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private class ClearAction extends Action {

        public ClearAction() {
            setText(getMessage(ResultView_ClearError_Action_Text));
            setImageDescriptor(
                    Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "resources/icons/view/clear.gif")); //$NON-NLS-1$
        }

        @Override
        public void run() {
            ResultsManager.getInstance().cleanCategoriesAndResults();
        }
    }

    /**
     * Manage the table column resizing
     */
    private class TableCompositeAdapter extends ControlAdapter {

        private Composite composite;
        private Tree table;
        TreeColumn col1;
        TreeColumn col2;

        public TableCompositeAdapter(Composite composite, Tree tree, TreeColumn treeColumn,
                TreeColumn treeColumn2) {
            super();
            this.composite = composite;
            this.table = tree;
            this.col1 = treeColumn;
            this.col2 = treeColumn2;
        }

        @Override
        public void controlResized(ControlEvent e) {
            Rectangle area = composite.getClientArea();
            Point preferredSize = table.computeSize(SWT.DEFAULT, SWT.DEFAULT);
            int width = area.width - 2 * table.getBorderWidth();
            if (preferredSize.y > area.height + table.getHeaderHeight()) {
                Point vBarSize = table.getVerticalBar().getSize();
                width -= vBarSize.x;
            }
            Point oldSize = table.getSize();

            int col1size = col1.getWidth();
            int col2size = width - col1size;

            if (oldSize.x > area.width) {
                col1.setWidth(col1size);
                col2.setWidth(col2size);
                table.setSize(area.width, area.height);
            } else {
                table.setSize(area.width, area.height);
                col1.setWidth(col1size);
                col2.setWidth(col2size);
            }
        }
    }

    private class BorderPainter implements PaintListener {

        public void paintControl(PaintEvent e) {
            GC gc = e.gc;
            Rectangle rect = new Rectangle(e.x, e.y, e.width - 1, e.height - 1);
            int lineS = gc.getLineStyle();
            int lined[] = gc.getLineDash();
            Color c = gc.getForeground();

            gc.setLineStyle(SWT.LINE_DASH);
            gc.setLineDash(new int[] { 3, 2 });
            gc.setForeground(ColorConstants.darkGray);

            gc.drawRectangle(rect);

            gc.setLineStyle(lineS);
            gc.setLineDash(lined);
            gc.setForeground(c);

        }
    }
}