es.cv.gvcase.mdt.db.properties.sections.IndexesPropertySection.java Source code

Java tutorial

Introduction

Here is the source code for es.cv.gvcase.mdt.db.properties.sections.IndexesPropertySection.java

Source

/*******************************************************************************
 * Copyright (c) 2008 Conselleria de Infraestructuras y Transporte, Generalitat 
 * de la Comunitat Valenciana. 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: Mario Cervera Ubeda (Prodevelop) - initial API and implementation
 *
 ******************************************************************************/
package es.cv.gvcase.mdt.db.properties.sections;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;

import org.eclipse.datatools.modelbase.sql.constraints.Index;
import org.eclipse.datatools.modelbase.sql.constraints.IndexMember;
import org.eclipse.datatools.modelbase.sql.constraints.SQLConstraintsFactory;
import org.eclipse.datatools.modelbase.sql.constraints.SQLConstraintsPackage;
import org.eclipse.datatools.modelbase.sql.schema.SQLSchemaPackage;
import org.eclipse.datatools.modelbase.sql.tables.Column;
import org.eclipse.datatools.modelbase.sql.tables.Table;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.ECollections;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.DeleteCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;

import es.cv.gvcase.mdt.common.composites.DetailComposite;
import es.cv.gvcase.mdt.common.composites.MembersComposite;
import es.cv.gvcase.mdt.common.composites.TableMembersComposite;
import es.cv.gvcase.mdt.common.sections.AbstractDetailedContainedObjectsPropertySection;
import es.cv.gvcase.mdt.db.properties.composites.ExpressionComposite;
import es.cv.gvcase.mdt.db.properties.composites.NameComposite;
import es.cv.gvcase.mdt.db.properties.composites.SQLObjectTableComposite;
import es.cv.gvcase.mdt.db.properties.providers.SQLObjectLabelProvider;

public class IndexesPropertySection extends AbstractDetailedContainedObjectsPropertySection {

    @Override
    protected void createWidgets(Composite composite) {

        this.parent = composite;

        setTable(new SQLObjectTableComposite(composite, SWT.NONE, getWidgetFactory(), this, getFeature(),
                getTableName()) {
            public void updateSelectedObject(EObject newObject) {
                for (Composite c : getComposites()) {
                    if (c instanceof DetailComposite) {
                        ((DetailComposite) c).setElement(newObject);
                    }
                }
                refresh();
            }
        });
        getTable().setFeatureClass(getTableElementsClass());
        getTable().setLabelProvider(getLabelProvider());

        setGroupDetails(getWidgetFactory().createGroup(composite, getLabelText()));
        GridLayout gl = new GridLayout();
        getGroupDetails().setLayout(gl);

    }

    @Override
    protected EStructuralFeature getFeature() {
        return SQLSchemaPackage.eINSTANCE.getSchema_Indices();
    }

    @Override
    protected String getLabelText() {
        return "Indexes details";
    }

    @Override
    protected EClass getTableElementsClass() {
        return SQLConstraintsPackage.eINSTANCE.getIndex();
    }

    @Override
    protected EList<DetailComposite> createComposites(Composite parent) {

        EList<DetailComposite> composites = new BasicEList<DetailComposite>();

        NameComposite nc = new NameComposite(parent, parent.getStyle());
        ExpressionComposite ec = new ExpressionComposite(parent, parent.getStyle());
        MembersComposite mc = new TableMembersComposite(parent, parent.getStyle(), this.getWidgetFactory(),
                SQLConstraintsPackage.eINSTANCE.getIndex_Members(), "Index members") {
            /* (non-Javadoc)
             * @see es.cv.gvcase.mdt.common.composites.MembersComposite#getMemberElements()
             */
            @Override
            protected EList<EObject> getMemberElements() {
                EList<EObject> members = new BasicEList<EObject>();
                EList<EObject> originalMembers = super.getMemberElements();
                if (originalMembers == null) {
                    return ECollections.emptyEList();
                }
                for (EObject eo : originalMembers) {
                    if (eo instanceof IndexMember) {
                        members.add(((IndexMember) eo).getColumn());
                    }
                }
                return members;
            }

            public void handleAddButtonSelected() {

                if (this.getCandidateElementsViewer().getSelection() instanceof StructuredSelection) {
                    StructuredSelection selection = (StructuredSelection) this.getCandidateElementsViewer()
                            .getSelection();

                    if (!selection.isEmpty()) {
                        Iterator iterator = selection.iterator();
                        while (iterator.hasNext()) {
                            Object next = iterator.next();
                            if (next instanceof Column && getElement() instanceof Index) {
                                if (!containsColumn((Index) getElement(), (Column) next)) {
                                    executeAddCommand(next);
                                }
                            }
                        }
                        refresh();
                    }
                }
            }

            private boolean containsColumn(Index index, Column column) {

                if (index == null || column == null)
                    return false;

                for (IndexMember im : index.getMembers()) {
                    if (im.getColumn() != null && im.getColumn().equals(column)) {
                        return true;
                    }
                }

                return false;
            }

            public void handleRemoveButtonSelected() {

                if (this.getMemberElementsViewer().getSelection() instanceof StructuredSelection) {
                    StructuredSelection selection = (StructuredSelection) this.getMemberElementsViewer()
                            .getSelection();

                    if (!selection.isEmpty()) {
                        Iterator iterator = selection.iterator();
                        while (iterator.hasNext()) {
                            executeRemoveCommand(iterator.next());
                        }
                        refresh();
                    }

                }

            }

            private void executeAddCommand(Object objectToAdd) {

                if (getEMFEditDomain() == null || !(objectToAdd instanceof Column))
                    return;

                IndexMember im = SQLConstraintsFactory.eINSTANCE.createIndexMember();
                Column col = (Column) objectToAdd;
                String colName = "";
                if (col.getName() != null)
                    colName = col.getName();

                CompoundCommand cc = new CompoundCommand();

                cc.append(SetCommand.create(getEMFEditDomain(), im, EcorePackage.eINSTANCE.getENamedElement_Name(),
                        colName));

                cc.append(SetCommand.create(getEMFEditDomain(), im,
                        SQLConstraintsPackage.eINSTANCE.getIndexMember_Column(), col));

                cc.append(AddCommand.create(getEMFEditDomain(), getElement(),
                        SQLConstraintsPackage.eINSTANCE.getIndex_Members(), im));

                getEMFEditDomain().getCommandStack().execute(cc);

            }

            private void executeRemoveCommand(Object objectToRemove) {

                if (getEMFEditDomain() == null || !(objectToRemove instanceof Column)
                        || !(getElement() instanceof Index))
                    return;

                Index index = (Index) getElement();
                Column column = (Column) objectToRemove;
                IndexMember imToRemove = getIndexMember(index, column);

                Command command = DeleteCommand.create(getEMFEditDomain(), imToRemove);

                getEMFEditDomain().getCommandStack().execute(command);
            }

            private IndexMember getIndexMember(Index index, Column column) {

                if (index == null || column == null)
                    return null;

                for (IndexMember im : index.getMembers()) {
                    if (im.getColumn() != null && im.getColumn().equals(column)) {
                        return im;
                    }
                }

                return null;
            }

        };
        mc.setLabelProvider(getLabelProvider());
        mc.setEnableOrdering(true);
        if (getCandidateElements() != null) {
            mc.setCandidateElements(getCandidateElements());
        }

        composites.add(nc);
        composites.add(ec);
        composites.add(mc);

        return composites;
    }

    private Collection<?> getCandidateElements() {
        EObject eo = this.getSelectedEObject();
        if (eo == null || !(eo instanceof Index))
            return Collections.emptyList();

        Index idx = (Index) eo;
        Collection<Object> result = new ArrayList<Object>();
        Table table = idx.getTable();
        if (table != null) {
            result.addAll(table.getColumns());
        }

        return result;
    }

    @Override
    protected String getTableName() {
        return "Indexes";
    }

    @Override
    protected IBaseLabelProvider getLabelProvider() {

        return new SQLObjectLabelProvider();
    }

}