package org.insightech.er.editor.controller.editpolicy.element.node;

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

import org.eclipse.draw2d.PositionConstants;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Handle;
import org.eclipse.gef.editpolicies.ResizableEditPolicy;
import org.eclipse.gef.handles.NonResizableHandleKit;
import org.eclipse.gef.handles.ResizableHandleKit;
import org.eclipse.gef.handles.ResizeHandle;
import org.insightech.er.editor.model.ERDiagram;
import org.insightech.er.editor.model.ERModelUtil;
import org.insightech.er.editor.model.ViewableModel;
import org.insightech.er.editor.model.diagram_contents.element.node.NodeElement;
import org.insightech.er.editor.model.diagram_contents.element.node.category.Category;
import org.insightech.er.editor.model.diagram_contents.element.node.model_properties.ModelProperties;
import org.insightech.er.editor.model.diagram_contents.element.node.table.ERTable;
import org.insightech.er.editor.model.diagram_contents.element.node.table.ERVirtualTable;
import org.insightech.er.editor.view.figure.handle.ERDiagramMoveHandle;
import org.insightech.er.editor.view.figure.handle.ERDiagramResizeHandle;

public class NodeElementSelectionEditPolicy extends ResizableEditPolicy {

	@SuppressWarnings("unchecked")
	@Override
	protected List createSelectionHandles() {
		List selectedEditParts = this.getHost().getViewer()
				.getSelectedEditParts();
		if (selectedEditParts.size() == 1) {
			ViewableModel currentElement = (ViewableModel) getHost().getModel();
			if (!(currentElement instanceof Category)
					&& !(currentElement instanceof ModelProperties)) {
				ERDiagram diagram = ERModelUtil.getDiagram(getHost().getRoot().getContents());

				ViewableModel targetElement = currentElement;
				if (currentElement instanceof ERVirtualTable) {
					// �r���[��ł̓e�[�u�����̂�X�V����
					targetElement = ((ERVirtualTable)currentElement).getRawTable();
				}
				List<NodeElement> nodeElementList = diagram
						.getDiagramContents().getContents()
						.getNodeElementList();
				nodeElementList.remove(targetElement);
				nodeElementList.add((NodeElement) targetElement);
				getHost().getRoot().getContents().refresh();
			}
		}

		List list = new ArrayList();

		int directions = this.getResizeDirections();

		if (directions == 0) {
//			NonResizableHandleKit.addHandles((GraphicalEditPart) getHost(),
//					list);

		} else if (directions != -1) {
			// 0
			list.add(new ERDiagramMoveHandle((GraphicalEditPart) getHost()));

			// 1
			if ((directions & PositionConstants.EAST) != 0) {
				ResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.EAST);
			} else {
				NonResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.EAST);
			}

			// 2
			if ((directions & PositionConstants.SOUTH_EAST) == PositionConstants.SOUTH_EAST) {
				ResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.SOUTH_EAST);
			} else {
				NonResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.SOUTH_EAST);
			}

			// 3
			if ((directions & PositionConstants.SOUTH) != 0) {
				ResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.SOUTH);
			} else {
				NonResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.SOUTH);
			}

			// 4
			if ((directions & PositionConstants.SOUTH_WEST) == PositionConstants.SOUTH_WEST) {
				ResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.SOUTH_WEST);
			} else {
				NonResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.SOUTH_WEST);
			}

			// 5
			if ((directions & PositionConstants.WEST) != 0) {
				ResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.WEST);
			} else {
				NonResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.WEST);
			}

			// 6
			if ((directions & PositionConstants.NORTH_WEST) == PositionConstants.NORTH_WEST) {
				ResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.NORTH_WEST);
			} else {
				NonResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.NORTH_WEST);
			}

			// 7
			if ((directions & PositionConstants.NORTH) != 0) {
				ResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.NORTH);
			} else {
				NonResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.NORTH);
			}

			// 8
			if ((directions & PositionConstants.NORTH_EAST) == PositionConstants.NORTH_EAST) {
				ResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.NORTH_EAST);
			} else {
				NonResizableHandleKit.addHandle((GraphicalEditPart) getHost(),
						list, PositionConstants.NORTH_EAST);
			}

		} else {
			addHandles((GraphicalEditPart) getHost(), list);
		}

		return list;
	}

	@SuppressWarnings("unchecked")
	public static void addHandles(GraphicalEditPart part, List handles) {
		handles.add(new ERDiagramMoveHandle(part));
		handles.add(createHandle(part, PositionConstants.EAST));
		handles.add(createHandle(part, PositionConstants.SOUTH_EAST));
		handles.add(createHandle(part, PositionConstants.SOUTH));
		handles.add(createHandle(part, PositionConstants.SOUTH_WEST));
		handles.add(createHandle(part, PositionConstants.WEST));
		handles.add(createHandle(part, PositionConstants.NORTH_WEST));
		handles.add(createHandle(part, PositionConstants.NORTH));
		handles.add(createHandle(part, PositionConstants.NORTH_EAST));
	}

	static Handle createHandle(GraphicalEditPart owner, int direction) {
		ResizeHandle handle = new ERDiagramResizeHandle(owner, direction);
		return handle;
	}

}