com.nextep.designer.beng.ui.views.DeliveriesView.java Source code

Java tutorial

Introduction

Here is the source code for com.nextep.designer.beng.ui.views.DeliveriesView.java

Source

/*******************************************************************************
 * Copyright (c) 2011 neXtep Software and contributors.
 * All rights reserved.
 *
 * This file is part of neXtep designer.
 *
 * NeXtep designer is free software: you can redistribute it 
 * and/or modify it under the terms of the GNU General Public 
 * License as published by the Free Software Foundation, either 
 * version 3 of the License, or any later version.
 *
 * NeXtep designer 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Contributors:
 *     neXtep Softwares - initial API and implementation
 *******************************************************************************/
package com.nextep.designer.beng.ui.views;

import java.util.Iterator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
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.DropTargetListener;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.part.ViewPart;
import com.nextep.datadesigner.Designer;
import com.nextep.datadesigner.dbgm.services.DBGMHelper;
import com.nextep.datadesigner.model.ChangeEvent;
import com.nextep.datadesigner.model.IElementType;
import com.nextep.datadesigner.model.IEventListener;
import com.nextep.datadesigner.model.IObservable;
import com.nextep.datadesigner.model.ITypedObject;
import com.nextep.datadesigner.sqlgen.impl.VersionedSQLScript;
import com.nextep.datadesigner.sqlgen.model.ISQLScript;
import com.nextep.designer.beng.BengPlugin;
import com.nextep.designer.beng.model.DeliveryType;
import com.nextep.designer.beng.model.IDeliveryItem;
import com.nextep.designer.beng.model.IDeliveryModule;
import com.nextep.designer.beng.services.IDeliveryService;
import com.nextep.designer.beng.ui.jface.DeliveriesContentProvider;
import com.nextep.designer.beng.ui.jface.DeliveriesLabelProvider;
import com.nextep.designer.beng.ui.model.DeliveryTypeItem;
import com.nextep.designer.core.model.DBVendor;
import com.nextep.designer.ui.factories.UIControllerFactory;
import com.nextep.designer.vcs.VCSPlugin;
import com.nextep.designer.vcs.model.IVersionContainer;
import com.nextep.designer.vcs.model.IVersionable;
import com.nextep.designer.vcs.model.IWorkspace;

/**
 * A view for deliveries navigation
 * 
 * @author Christophe Fondacci
 */
public class DeliveriesView extends ViewPart implements DropTargetListener, DragSourceListener {

    private static final Log log = LogFactory.getLog(DeliveriesView.class);
    public static final String VIEW_ID = "com.nextep.designer.beng.ui.views.DeliveriesView"; //$NON-NLS-1$
    private Tree deliveriesTree;
    private TreeViewer treeViewer;

    /**
     * This is a callback that will allow us to create the viewer and initialize it.
     */
    public void createPartControl(Composite parent) {
        deliveriesTree = new Tree(parent, SWT.MULTI);
        treeViewer = new TreeViewer(deliveriesTree);
        treeViewer.setLabelProvider(new DeliveriesLabelProvider());
        treeViewer.setContentProvider(new DeliveriesContentProvider());
        treeViewer.addDoubleClickListener(new IDoubleClickListener() {

            @Override
            public void doubleClick(DoubleClickEvent event) {
                final IStructuredSelection s = (IStructuredSelection) treeViewer.getSelection();
                if (s.size() == 1) {
                    final Object o = s.getFirstElement();
                    ITypedObject objectToOpen = null;
                    if (o instanceof IDeliveryModule) {
                        objectToOpen = (ITypedObject) o;
                    } else if (o instanceof IDeliveryItem<?>) {
                        Object content = ((IDeliveryItem<?>) o).getContent();
                        if (content instanceof ITypedObject) {
                            objectToOpen = (ITypedObject) content;
                        }
                    } else if (o instanceof ITypedObject) {
                        objectToOpen = (ITypedObject) o;
                    }
                    if (objectToOpen != null) {
                        UIControllerFactory.getController(objectToOpen).defaultOpen(objectToOpen);
                    }
                }
            }
        });
        getSite().setSelectionProvider(treeViewer);

        // Target of drop operations
        treeViewer.addDropSupport(DND.DROP_COPY | DND.DROP_LINK | DND.DROP_MOVE,
                new Transfer[] { LocalSelectionTransfer.getTransfer() }, this);
        // We allow dragging from the navigator
        treeViewer.addDragSupport(DND.DROP_COPY | DND.DROP_LINK | DND.DROP_MOVE,
                new Transfer[] { LocalSelectionTransfer.getTransfer() }, this);
        registerContextMenu(treeViewer);

        // Registering listener on every root container of this view
        IWorkspace view = VCSPlugin.getViewService().getCurrentWorkspace();
        for (IVersionable<?> v : view.getContents()) {
            if (v.getType() == IElementType.getInstance(IVersionContainer.TYPE_ID)) {
                Designer.getListenerService().registerListener(deliveriesTree, v, new IEventListener() {

                    @Override
                    public void handleEvent(ChangeEvent event, IObservable source, Object data) {
                        if (event == ChangeEvent.CHECKOUT || event == ChangeEvent.UPDATES_LOCKED
                                || event == ChangeEvent.UPDATES_UNLOCKED) {
                            refresh();
                        }
                    }
                });
            }
        }
        treeViewer.setInput(view);
    }

    public void refresh() {
        treeViewer.refresh();
    }

    private void registerContextMenu(ISelectionProvider provider) {
        MenuManager contextMenu = new MenuManager();
        contextMenu.setRemoveAllWhenShown(true);

        // this is to work around complaints about missing standard groups.
        contextMenu.addMenuListener(new IMenuListener() {

            public void menuAboutToShow(IMenuManager manager) {
                manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
            }
        });

        getSite().registerContextMenu(contextMenu, provider);
        Menu menu = contextMenu.createContextMenu(deliveriesTree);
        deliveriesTree.setMenu(menu);
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    public void setFocus() {
        deliveriesTree.setFocus();
    }

    public void refreshModule(IVersionContainer module) {
        treeViewer.refresh();
    }

    @Override
    public void dragEnter(DropTargetEvent e) {
        log.debug("DeliveriesView: Drop enter"); //$NON-NLS-1$
        for (int i = 0; i < e.dataTypes.length; i++) {
            if (LocalSelectionTransfer.getTransfer().isSupportedType(e.dataTypes[i])) {
                e.currentDataType = e.dataTypes[i];
            }
        }
    }

    @Override
    public void dragLeave(DropTargetEvent arg0) {
    }

    @Override
    public void dragOperationChanged(DropTargetEvent arg0) {
    }

    @Override
    public void dragOver(DropTargetEvent e) {
        for (int i = 0; i < e.dataTypes.length; i++) {
            final ISelection s = LocalSelectionTransfer.getTransfer().getSelection();
            if (s instanceof IStructuredSelection && !s.isEmpty()) {
                final IStructuredSelection sel = (IStructuredSelection) s;
                // Only accepting tables or containers
                final Iterator<?> selIt = sel.iterator();
                while (selIt.hasNext()) {
                    Object elt = selIt.next();
                    // If not a table and not a container we deny the drop action
                    if (!(elt instanceof ISQLScript)
                            && (!(elt instanceof IDeliveryItem) || (elt instanceof IDeliveryModule))) {
                        return;
                    }
                }
                // Only accepting the drop to delivery types
                TreeItem item = (TreeItem) e.item;
                if (item != null && item.getData() instanceof DeliveryTypeItem) {
                    e.currentDataType = e.dataTypes[i];
                    e.detail = DND.DROP_LINK;
                } else {
                    e.detail = DND.DROP_NONE;
                }
            }
        }
    }

    @Override
    public void drop(DropTargetEvent e) {

        if (e.data instanceof IStructuredSelection) {
            final IDeliveryService deliveryService = BengPlugin.getService(IDeliveryService.class);
            final IStructuredSelection s = (IStructuredSelection) e.data;
            final Iterator<?> selIt = s.iterator();
            while (selIt.hasNext()) {

                Object draggedObj = selIt.next();
                if (draggedObj instanceof ISQLScript
                        || (draggedObj instanceof IDeliveryItem && !(draggedObj instanceof IDeliveryModule))) {

                    TreeItem i = (TreeItem) e.item;
                    if (i != null && i.getData() instanceof DeliveryTypeItem) {
                        final DeliveryTypeItem typeItem = (DeliveryTypeItem) i.getData();
                        final DeliveryType type = typeItem.getType();
                        final IDeliveryModule module = typeItem.getModule();

                        IDeliveryItem<?> addedItem = null;
                        if (draggedObj instanceof VersionedSQLScript) {
                            final VersionedSQLScript vs = (VersionedSQLScript) draggedObj;
                            // Dropping a script on a JDBC module require specific processing
                            // as this script should be executed for all vendors. We do this
                            // by setting a null vendor, interpreted by the installer as "any"
                            // vendor
                            DBVendor vendor = vs.getContainer().getDBVendor();
                            if (vendor == DBVendor.JDBC) {
                                vendor = null;
                            }
                            addedItem = deliveryService.createDeliveryScript(type, vs.getSqlScript());
                            addedItem.setDBVendor(vendor);
                            module.addDeliveryItem(addedItem);
                        } else if (draggedObj instanceof ISQLScript) {
                            // Dropping a script on a JDBC module require specific processing
                            // as this script should be executed for all vendors. We do this
                            // by setting a null vendor, interpreted by the installer as "any"
                            // vendor
                            DBVendor vendor = DBGMHelper.getCurrentVendor();
                            if (vendor == DBVendor.JDBC) {
                                vendor = null;
                            }
                            addedItem = deliveryService.createDeliveryScript(type, (ISQLScript) draggedObj);
                            addedItem.setDBVendor(vendor);
                            module.addDeliveryItem(addedItem);
                        } else if (draggedObj instanceof IDeliveryItem) {
                            final IDeliveryItem<?> dlv = (IDeliveryItem<?>) draggedObj;
                            module.removeDeliveryItem(dlv);
                            dlv.setDeliveryType(type);
                            module.addDeliveryItem(dlv);
                            addedItem = dlv;
                        }
                        treeViewer.expandToLevel(addedItem, 1);
                    } else {
                        log.error("Unable to drop this SQL script here, please target a valid delivery container."); //$NON-NLS-1$
                    }
                } else {
                    log.error("Deliveries only accept SQL scripts drag / drop sources."); //$NON-NLS-1$
                }
            }
        }
    }

    @Override
    public void dropAccept(DropTargetEvent arg0) {
    }

    @Override
    public void dragSetData(DragSourceEvent e) {

        LocalSelectionTransfer.getTransfer().setSelection(treeViewer.getSelection());
        e.doit = true;
        e.data = treeViewer.getSelection();
    }

    @Override
    public void dragStart(DragSourceEvent event) {
        ISelection s = treeViewer.getSelection();
        if (!s.isEmpty()) {
            event.doit = true;
        }

    }

    @Override
    public void dragFinished(DragSourceEvent arg0) {
        // Nothing
        log.debug("TreeNavigator: Drag finished."); //$NON-NLS-1$
    }
}