com.byterefinery.rmbench.actions.ForeignKeyAction.java Source code

Java tutorial

Introduction

Here is the source code for com.byterefinery.rmbench.actions.ForeignKeyAction.java

Source

/*
 * created 13.08.2005
 *
 * Copyright 2009, ByteRefinery
 * 
 * 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
 * 
 * $Id: ForeignKeyAction.java 664 2007-09-28 17:28:39Z cse $
 */
package com.byterefinery.rmbench.actions;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.ui.actions.SelectionAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.ui.IWorkbenchPart;

import com.byterefinery.rmbench.RMBenchPlugin;
import com.byterefinery.rmbench.dialogs.TargetTableChooser;
import com.byterefinery.rmbench.editparts.ColumnEditPart;
import com.byterefinery.rmbench.editparts.DiagramEditPart;
import com.byterefinery.rmbench.editparts.TableEditPart;
import com.byterefinery.rmbench.model.Model;
import com.byterefinery.rmbench.model.diagram.Diagram;
import com.byterefinery.rmbench.model.schema.Column;
import com.byterefinery.rmbench.model.schema.Table;
import com.byterefinery.rmbench.operations.AddForeignKeyOperation;
import com.byterefinery.rmbench.operations.AddToDiagramOperation;
import com.byterefinery.rmbench.operations.CompoundOperation;
import com.byterefinery.rmbench.util.ImageConstants;

/**
 * an action that will create a foreign key based on the currently selected columns
 * in a diagram
 * 
 * @author cse
 */
public class ForeignKeyAction extends SelectionAction {

    public static final String ACTION_ID = "com.byterefinery.rmbench.create_foreignkey";

    private final GraphicalViewer viewer;
    private final Diagram diagram;
    private final Model model;

    private Column[] selectedColumnGroup;
    private Table groupTable;

    public ForeignKeyAction(IWorkbenchPart part, Diagram diagram, GraphicalViewer viewer) {
        super(part);
        setId(ACTION_ID);
        setImageDescriptor(RMBenchPlugin.getImageDescriptor(ImageConstants.FK_OUT));
        setText(Messages.ForeignKey_Label);
        setToolTipText(Messages.ForeignKey_Label);
        setDescription(Messages.ForeignKey_Description);

        this.viewer = viewer;
        this.diagram = diagram;
        this.model = diagram.getModel();
    }

    protected boolean calculateEnabled() {

        selectedColumnGroup = null;
        groupTable = null;

        ISelection sel = (ISelection) getSelection();
        if (!(sel instanceof IStructuredSelection))
            return false;

        IStructuredSelection selection = (IStructuredSelection) sel;
        List<Column> columnGroup = new ArrayList<Column>(selection.size());

        for (Iterator<?> it = selection.iterator(); it.hasNext();) {
            Object selected = it.next();
            if (!(selected instanceof ColumnEditPart)) {
                return false;
            } else {
                Column column = ((ColumnEditPart) selected).getColumn();
                if (groupTable == null)
                    groupTable = column.getTable();
                else if (groupTable != column.getTable()) {
                    return false;
                }
                columnGroup.add(column);
            }
        }
        selectedColumnGroup = (Column[]) columnGroup.toArray(new Column[columnGroup.size()]);
        return true;
    }

    public void run() {
        List<Table> matchingTables = model.findMatchingTables(selectedColumnGroup);

        if (matchingTables.isEmpty()) {
            MessageDialog.openInformation(getWorkbenchPart().getSite().getShell(), null,
                    Messages.No_PrimaryKey_matches);
        } else {
            TargetTableChooser chooser = new TargetTableChooser(getWorkbenchPart().getSite().getShell(),
                    matchingTables, diagram);

            if (chooser.open() == Window.OK) {
                //first create FK operation first, in case state gets recalculated
                AddForeignKeyOperation addFKOp = new AddForeignKeyOperation(groupTable);
                addFKOp.setTargetTable(chooser.getResultTable());
                addFKOp.setColumns(selectedColumnGroup);

                if (chooser.getDoImport()) {
                    //execute the table import first
                    TableEditPart tablePart = (TableEditPart) viewer.getEditPartRegistry().get(groupTable);
                    DiagramEditPart diagramPart = (DiagramEditPart) tablePart.getParent();

                    Point newLocation = tablePart.getLocation();
                    newLocation.translate(tablePart.getFigure().getSize().scale(1.5));

                    AddToDiagramOperation addTableOp = new AddToDiagramOperation(diagramPart,
                            new Object[] { chooser.getResultTable() }, newLocation);
                    CompoundOperation compound = new CompoundOperation(addFKOp);
                    compound.addFirst(addTableOp);
                    compound.execute(this);
                } else {
                    //now execute the foreign key
                    addFKOp.execute(this);
                }
            }
        }
    }
}