//import MagicSquare;

public class SinglyEvenOrderMagicSquare extends MagicSquare {

public SinglyEvenOrderMagicSquare(int startValue, int n) {

        super(startValue, n);
        int m = n/2;
        OddOrderMagicSquare magicSquare00 = new OddOrderMagicSquare(startValue, m); 
        OddOrderMagicSquare magicSquare01 = new OddOrderMagicSquare(startValue+2*m*m, m); 
        OddOrderMagicSquare magicSquare10 = new OddOrderMagicSquare(startValue+3*m*m, m); 
        OddOrderMagicSquare magicSquare11 = new OddOrderMagicSquare(startValue+m*m, m); 
        adjustLeft(magicSquare00, magicSquare10);
        adjustRight(magicSquare01, magicSquare11);
        combine(magicSquare00, magicSquare01, magicSquare10, magicSquare11);

}

private void adjustLeft(OddOrderMagicSquare magicSquare00,

OddOrderMagicSquare magicSquare10) {

        int m = magicSquare00.getOrder();
        int middleRow = m/2;
        int startCol;
        int endCol;
        for (int row=0; row<m; row++)
        {
            if (row == middleRow)
            {
                startCol = 1;
                endCol = middleRow;
            }
            else
            {
                startCol = 0;
                endCol = middleRow-1;
            }
            for (int col=startCol; col<=endCol; col++)
            {
                int cell00 = magicSquare00.getCell(row, col);
                int cell10 = magicSquare10.getCell(row, col);
                magicSquare00.setCell(row, col, cell10);
                magicSquare10.setCell(row, col, cell00);
            }
        }

}

private void adjustRight(OddOrderMagicSquare magicSquare01,

OddOrderMagicSquare magicSquare11) {

        int m = magicSquare01.getOrder();
        int cols = m/2-1;
        int startCol = m-1;
        for (int row=0; row<m; row++)
        {
            for (int col=startCol; col>startCol-cols; col--)
            {
                int cell01 = magicSquare01.getCell(row, col);
                int cell11 = magicSquare11.getCell(row, col);
                magicSquare01.setCell(row, col, cell11);
                magicSquare11.setCell(row, col, cell01);
            }
        }

}

private void combine(OddOrderMagicSquare magicSquare00,

        OddOrderMagicSquare magicSquare01, OddOrderMagicSquare magicSquare10,
        OddOrderMagicSquare magicSquare11)
    {
        int n = getOrder();
        int m = magicSquare00.getOrder();
        for (int row=0; row<m; row++)
        {
            for (int col=0; col<m; col++)
            {
                setCell(row, col, magicSquare00.getCell(row, col));
            }
            for (int col=m; col<n; col++)
            {
                setCell(row, col, magicSquare01.getCell(row, col-m));
            }
        }
        for (int row=m; row<n; row++)
        {
            for (int col=0; col<m; col++)
            {
                setCell(row, col, magicSquare10.getCell(row-m, col));
            }
            for (int col=m; col<n; col++)
            {
                setCell(row, col, magicSquare11.getCell(row-m, col-m));
            }
        }

}

public static void main(String[] args) {

        MagicSquare magicSquare;
        for (int i=1; i<4; i++)
        {
            int n = 4*i+2;
            System.out.println/(n+" by "+n+" magic square:");
            magicSquare = MagicSquareFactory.create(1, n);
            System.out.println/(magicSquare);
        }

}
}