ar.com.fluxit.jqa.wizard.page.LayersDefinitionWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for ar.com.fluxit.jqa.wizard.page.LayersDefinitionWizardPage.java

Source

/*******************************************************************************
 * Copyright (c) 2013 Flux IT.
 * 
 * This file is part of JQA (http://github.com/fluxitsoft/jqa).
 * 
 * JQA is free software: you can redistribute it and/or modify it 
 * under the terms of the GNU Lesser General Public License as 
 * published by the Free Software Foundation, either version 3 of 
 * the License, or (at your option) any later version.
 * 
 * JQA is distributed in the hope that it will be useful, but WITHOUT 
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 
 * Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public 
 * License along with JQA. If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/
package ar.com.fluxit.jqa.wizard.page;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.corext.refactoring.reorg.JavaElementTransfer;
import org.eclipse.jdt.ui.JavaElementComparator;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.ViewForm;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.ToolBar;

import ar.com.fluxit.jqa.actions.EditLayerAction;
import ar.com.fluxit.jqa.actions.NewLayerAction;
import ar.com.fluxit.jqa.actions.RemoveLayerAction;
import ar.com.fluxit.jqa.entities.Layer;
import ar.com.fluxit.jqa.viewer.Holder;
import ar.com.fluxit.jqa.viewer.LayerCellModifier;
import ar.com.fluxit.jqa.viewer.LayersListTableDropListener;
import ar.com.fluxit.jqa.viewer.TargetPackagesDragListener;

/**
 * TODO javadoc
 * TODO see restrictions
 * 
 * @author Juan Ignacio Barisich
 */
@SuppressWarnings("restriction")
public class LayersDefinitionWizardPage extends AbstractWizardPage {

    public static final String PAGE_NAME = "LayersDefinitionWizardPage";
    private TableViewer layerPackagesTable;
    private TableViewer targetPackagesTable;
    private final Transfer[] transferTypes;
    private final Holder<Viewer> viewerHolder;
    private final Holder<Collection<IJavaElement>> inputHolder;

    public LayersDefinitionWizardPage() {
        super(PAGE_NAME);
        setTitle("Layers definition");
        setDescription("Define the layers of the target application");
        transferTypes = new Transfer[] { JavaElementTransfer.getInstance() };
        inputHolder = new Holder<Collection<IJavaElement>>();
        viewerHolder = new Holder<Viewer>();
    }

    private List<IJavaElement> collectNonEmptyPackages() {
        try {
            List<IJavaElement> result = new ArrayList<IJavaElement>();
            for (IProject project : getWizard().getTargetProjects()) {
                final IJavaProject javaProject = JavaCore.create(project);
                for (IPackageFragment packageFragment : javaProject.getPackageFragments()) {
                    if (packageFragment.containsJavaResources()
                            && packageFragment.getKind() == IPackageFragmentRoot.K_SOURCE) {
                        result.add(packageFragment);
                    }
                }
            }
            return result;
        } catch (JavaModelException e) {
            throw new IllegalStateException("An error has occurred while collection Java packages", e);
        }
    }

    @Override
    public void createControl(Composite parent) {
        Composite container = new Composite(parent, SWT.NULL);
        GridLayout layout = new GridLayout();
        layout.numColumns = 1;
        container.setLayout(layout);
        setControl(container);
        SashForm sash = new SashForm(container, SWT.SMOOTH);
        sash.setOrientation(SWT.HORIZONTAL);
        sash.setLayoutData(new GridData(GridData.FILL_BOTH));
        createTargetPackagesGroup(sash);
        createLayersGroup(sash);
        createLayerPackagesGroup(sash);
    }

    private void createLayerPackagesGroup(SashForm sash) {
        final Group layerPackagesGroup = new Group(sash, SWT.NONE);
        layerPackagesGroup.setText("Layer packages");
        layerPackagesGroup.setLayout(new GridLayout());
        ILabelProvider targetPackagesLabelProvider = new JavaElementLabelProvider(
                JavaElementLabelProvider.SHOW_DEFAULT);
        layerPackagesTable = new TableViewer(layerPackagesGroup,
                SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI);
        layerPackagesTable.setLabelProvider(targetPackagesLabelProvider);
        layerPackagesTable.setContentProvider(ArrayContentProvider.getInstance());
        layerPackagesTable.setComparator(new JavaElementComparator());
        layerPackagesTable.setInput(Collections.emptySet());
        layerPackagesTable.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
        layerPackagesTable.addDragSupport(DND.DROP_MOVE, getTransferTypes(),
                new TargetPackagesDragListener(layerPackagesTable, getDragViewerHolder(), getDragInputHolder()));
    }

    private void createLayersGroup(SashForm sash) {
        final Group layersGroup = new Group(sash, SWT.NONE);
        final GridLayout layersGroupGridLayout = new GridLayout();
        layersGroupGridLayout.verticalSpacing = -1;
        layersGroup.setLayout(layersGroupGridLayout);
        layersGroup.setText("Layers");
        ViewForm viewForm = new ViewForm(layersGroup, SWT.FLAT | SWT.BORDER);
        viewForm.setLayout(layersGroupGridLayout);
        ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
        ToolBar toolBar = toolBarManager.createControl(viewForm);
        toolBar.setBackground(layersGroup.getBackground());
        viewForm.setTopLeft(toolBar);
        viewForm.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        TableViewer layersTable = new TableViewer(layersGroup,
                SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
        layersTable.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
        layersTable.setContentProvider(ArrayContentProvider.getInstance());
        layersTable.setInput(getWizard().getLayers());
        layersTable.setLabelProvider(new ColumnLabelProvider() {

            @Override
            public String getText(Object element) {
                Layer layer = (Layer) element;
                String result = layer.getName();
                if (!layer.getPackages().isEmpty()) {
                    result += " (" + layer.getPackages().size() + ")";
                }
                return result;
            }
        });
        layersTable.setCellEditors(new CellEditor[] { new TextCellEditor(layersTable.getTable()) });
        layersTable.setCellModifier(new LayerCellModifier(layersTable));
        layersTable.setColumnProperties(new String[] { "layer" });
        toolBarManager.add(new NewLayerAction(getWizard().getLayers(), layersTable));
        final EditLayerAction editLayerAction = new EditLayerAction(layersTable);
        editLayerAction.setEnabled(false);
        toolBarManager.add(editLayerAction);
        final RemoveLayerAction removeLayerAction = new RemoveLayerAction(getWizard().getLayers(), layersTable,
                targetPackagesTable, getContainer());
        removeLayerAction.setEnabled(false);
        toolBarManager.add(removeLayerAction);
        toolBarManager.update(true);
        layersTable.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent paramSelectionChangedEvent) {
                layerSelectionChanged(paramSelectionChangedEvent.getSelection(), editLayerAction,
                        removeLayerAction);
            }
        });
        layersTable.addDropSupport(DND.DROP_MOVE, getTransferTypes(), new LayersListTableDropListener(layersTable,
                targetPackagesTable, getDragViewerHolder(), getDragInputHolder(), getContainer()));
    }

    private Group createTargetPackagesGroup(SashForm sash) {
        final Group targetPackagesGroup = new Group(sash, SWT.NONE);
        targetPackagesGroup.setLayout(new GridLayout());
        targetPackagesGroup.setText("Target packages");
        ILabelProvider targetPackagesLabelProvider = new JavaElementLabelProvider(
                JavaElementLabelProvider.SHOW_DEFAULT);
        targetPackagesTable = new TableViewer(targetPackagesGroup,
                SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI);
        targetPackagesTable.setLabelProvider(targetPackagesLabelProvider);
        targetPackagesTable.setContentProvider(ArrayContentProvider.getInstance());
        targetPackagesTable.setComparator(new JavaElementComparator());
        List<IJavaElement> targetPackages = collectNonEmptyPackages();
        targetPackagesTable.setInput(targetPackages);
        targetPackagesTable.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
        targetPackagesTable.addDragSupport(DND.DROP_MOVE, getTransferTypes(),
                new TargetPackagesDragListener(targetPackagesTable, getDragViewerHolder(), getDragInputHolder()));
        // FIXME delete
        targetPackagesTable.setSelection(new StructuredSelection(targetPackages));
        return targetPackagesGroup;
    }

    private Holder<Collection<IJavaElement>> getDragInputHolder() {
        return inputHolder;
    }

    private Holder<Viewer> getDragViewerHolder() {
        return viewerHolder;
    }

    public Transfer[] getTransferTypes() {
        return transferTypes;
    }

    @Override
    public boolean isPageComplete() {
        return targetPackagesTable.getTable().getItemCount() == 0;
    }

    private void layerSelectionChanged(ISelection selection, EditLayerAction editLayerAction,
            RemoveLayerAction removeLayerAction) {
        boolean selectionIsNotEmpty = !selection.isEmpty();
        editLayerAction.setEnabled(selectionIsNotEmpty);
        removeLayerAction.setEnabled(selectionIsNotEmpty);
        updateLayerPackagesGroup(selection);
    }

    private void updateLayerPackagesGroup(ISelection selection) {
        Set<IJavaElement> input;
        if (selection.isEmpty()) {
            input = Collections.emptySet();
        } else {
            input = ((Layer) ((StructuredSelection) selection).getFirstElement()).getPackages();
        }
        layerPackagesTable.setInput(input);
    }

}