package org.insightech.er.editor.view.action.line;

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

import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.commands.Command;
import org.eclipse.swt.widgets.Event;
import org.insightech.er.Activator;
import org.insightech.er.ImageKey;
import org.insightech.er.ResourceString;
import org.insightech.er.editor.ERDiagramEditor;
import org.insightech.er.editor.controller.command.diagram_contents.element.node.MoveElementCommand;
import org.insightech.er.editor.controller.editpart.element.node.ERTableEditPart;
import org.insightech.er.editor.controller.editpart.element.node.IResizable;
import org.insightech.er.editor.controller.editpart.element.node.NodeElementEditPart;
import org.insightech.er.editor.controller.editpart.element.node.NoteEditPart;
import org.insightech.er.editor.model.diagram_contents.element.node.NodeElement;
import org.insightech.er.editor.view.action.AbstractBaseSelectionAction;

public class ResizeModelAction extends AbstractBaseSelectionAction {

	public static final String ID = ResizeModelAction.class.getName();

	public ResizeModelAction(ERDiagramEditor editor) {
		super(ID, ResourceString.getResourceString("action.title.auto.resize"),
				editor);
		this.setImageDescriptor(Activator.getImageDescriptor(ImageKey.RESIZE));
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected List<Command> getCommand(EditPart editPart, Event event) {
		List<Command> commandList = new ArrayList<Command>();

		if (editPart instanceof IResizable) {
			NodeElement nodeElement = (NodeElement) editPart.getModel();

			MoveElementCommand command = new MoveElementCommand(this
					.getDiagram(), ((NodeElementEditPart) editPart).getFigure()
					.getBounds(), nodeElement.getX(), nodeElement.getY(), -1,
					-1, nodeElement);

			commandList.add(command);
		}

		return commandList;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected boolean calculateEnabled() {
		GraphicalViewer viewer = this.getGraphicalViewer();

		for (Object object : viewer.getSelectedEditParts()) {
			if (object instanceof NodeElementEditPart) {
				NodeElementEditPart nodeElementEditPart = (NodeElementEditPart) object;

				if (nodeElementEditPart instanceof ERTableEditPart
						|| nodeElementEditPart instanceof NoteEditPart) {
					return true;
				}
			}
		}

		return false;
	}
}