package org.dbflute.erflute.editor.controller.editpart.element.node;

import java.beans.PropertyChangeEvent;

import org.dbflute.erflute.editor.controller.command.category.ChangeWalkerGroupNameCommand;
import org.dbflute.erflute.editor.controller.editpolicy.element.node.DiagramWalkerComponentEditPolicy;
import org.dbflute.erflute.editor.model.diagram_contents.element.node.DiagramWalker;
import org.dbflute.erflute.editor.model.diagram_contents.element.node.Location;
import org.dbflute.erflute.editor.model.diagram_contents.element.node.ermodel.WalkerGroup;
import org.dbflute.erflute.editor.view.figure.WalkerGroupFigure;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;

/**
 * @author modified by jflute (originated in ermaster)
 */
public class WalkerGroupEditPart extends DiagramWalkerEditPart implements IResizable {

    public WalkerGroupEditPart() {
        super();
    }

    @Override
    protected IFigure createFigure() {
        final WalkerGroup group = (WalkerGroup) getModel();
        return new WalkerGroupFigure(group.getName());
    }

    @Override
    public void doPropertyChange(PropertyChangeEvent event) {
        if (event.getPropertyName().equals(WalkerGroup.PROPERTY_CHANGE_WALKER_GROUP)) {
            refreshChildren();
            refreshVisuals();
        }
        super.doPropertyChange(event);
    }

    @Override
    protected Rectangle getRectangle() {
        final Rectangle rectangle = super.getRectangle();
        final WalkerGroup group = (WalkerGroup) getModel();
        final EditPart contents = getRoot().getContents();
        for (final Object child : contents.getChildren()) {
            if (child instanceof DiagramWalkerEditPart) {
                final DiagramWalkerEditPart editPart = (DiagramWalkerEditPart) child;
                if (group.contains((DiagramWalker) editPart.getModel())) {
                    final Rectangle bounds = editPart.getFigure().getBounds();
                    if (bounds.x + bounds.width > rectangle.x + rectangle.width) {
                        rectangle.width = bounds.x + bounds.width - rectangle.x;
                    }
                    if (bounds.y + bounds.height > rectangle.y + rectangle.height) {
                        rectangle.height = bounds.y + bounds.height - rectangle.y;
                    }
                    if (rectangle.width != group.getWidth() || rectangle.height != group.getHeight()) {
                        group.setLocation(new Location(group.getX(), group.getY(), rectangle.width, rectangle.height));
                    }
                }
            }
        }
        return rectangle;
    }

    @Override
    protected void createEditPolicies() {
        installEditPolicy(EditPolicy.COMPONENT_ROLE, new DiagramWalkerComponentEditPolicy());
        super.createEditPolicies();
    }

    @Override
    public void performRequestOpen() {
        final WalkerGroup group = (WalkerGroup) getModel();
        final Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
        final InputDialog dialog = new InputDialog(shell, "Group Name Setting", "Input group name", group.getName(), null);
        if (dialog.open() == IDialogConstants.OK_ID) {
            final CompoundCommand command = new CompoundCommand();
            command.add(new ChangeWalkerGroupNameCommand(group, dialog.getValue()));
            executeCommand(command.unwrap());
        }
    }
}