package org.insightech.er.editor.controller.editpart.element.node.column;

import java.util.List;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.IFigure;
import org.insightech.er.editor.controller.editpart.element.node.TableViewEditPart;
import org.insightech.er.editor.model.ERDiagram;
import org.insightech.er.editor.model.diagram_contents.element.node.table.column.Column;
import org.insightech.er.editor.model.diagram_contents.not_element.group.ColumnGroup;
import org.insightech.er.editor.model.settings.Settings;
import org.insightech.er.editor.model.tracking.UpdatedNodeElement;
import org.insightech.er.editor.view.figure.table.TableFigure;
import org.insightech.er.editor.view.figure.table.column.GroupColumnFigure;

public class GroupColumnEditPart extends ColumnEditPart {

    private boolean selected;

    @Override
    protected IFigure createFigure() {
        final GroupColumnFigure figure = new GroupColumnFigure();
        return figure;
    }

    @Override
    public void refreshTableColumns(final UpdatedNodeElement updated) {
        final ERDiagram diagram = getDiagram();

        final GroupColumnFigure columnFigure = (GroupColumnFigure) getFigure();

        final TableViewEditPart parent = (TableViewEditPart) getParent();
        parent.getContentPane().add(figure);

        final int notationLevel = diagram.getDiagramContents().getSettings().getNotationLevel();

        final Column column = (Column) getModel();

        if (notationLevel != Settings.NOTATION_LEVLE_TITLE) {
            final TableFigure tableFigure = (TableFigure) parent.getFigure();

            boolean isAdded = false;
            boolean isUpdated = false;
            if (updated != null) {
                isAdded = updated.isAdded(column);
                isUpdated = updated.isUpdated(column);
            }

            if ((notationLevel == Settings.NOTATION_LEVLE_KEY)) {
                columnFigure.clearLabel();
                return;
            }

            addGroupColumnFigure(diagram, tableFigure, columnFigure, column, isAdded, isUpdated, false);

            if (selected) {
                columnFigure.setBackgroundColor(ColorConstants.titleBackground);
                columnFigure.setForegroundColor(ColorConstants.titleForeground);
            }

        } else {
            columnFigure.clearLabel();
            return;
        }
    }

    public static void addGroupColumnFigure(final ERDiagram diagram, final TableFigure tableFigure, final GroupColumnFigure columnFigure, final Column column, final boolean isAdded, final boolean isUpdated, final boolean isRemoved) {

        final ColumnGroup groupColumn = (ColumnGroup) column;

        tableFigure.addColumnGroup(columnFigure, diagram.getDiagramContents().getSettings().getViewMode(), diagram.filter(groupColumn.getName()), isAdded, isUpdated, isRemoved);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setSelected(final int value) {
        final GroupColumnFigure figure = (GroupColumnFigure) getFigure();

        if (value != 0 && getParent() != null && getParent().getParent() != null) {
            final List selectedEditParts = getViewer().getSelectedEditParts();

            if (selectedEditParts != null && selectedEditParts.size() == 1) {
                figure.setBackgroundColor(ColorConstants.titleBackground);
                figure.setForegroundColor(ColorConstants.titleForeground);
                selected = true;

                super.setSelected(value);
            }

        } else {
            figure.setBackgroundColor(null);
            figure.setForegroundColor(null);
            selected = false;

            super.setSelected(value);
        }

    }
}