/******************************************************************************* * Copyright (c) 2004, 2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ui.internal.layout; import org.eclipse.swt.widgets.Control; /** * Computes and the positions of controls in a CellLayout, based on their span. */ class GridInfo { private int cols = 0; private int rows = 0; private int[] gridInfo; int[] controlRow; int[] controlCol; private CellData[] cellData; Control[] controls; /** * Initialize the grid * * @param newControls * @param cols */ public void initGrid(Control[] newControls, CellLayout layout) { cols = layout.getColumns(); controls = newControls; int area = 0; int totalWidth = 0; controlRow = new int[controls.length]; controlCol = new int[controls.length]; // Get the CellData objects for each control, and compute // the total number of cells spanned by controls in this layout. cellData = new CellData[controls.length]; for (int idx = 0; idx < controls.length; idx++) { if (controls[idx] == null) { continue; } CellData next = CellLayoutUtil.getData(controls[idx]); cellData[idx] = next; area += next.horizontalSpan * next.verticalSpan; totalWidth += next.horizontalSpan; } // Compute the number of columns if (cols == 0) { cols = totalWidth; } // Compute the number of rows rows = area / cols; if (area % cols > 0) { // Ensure we count any partial rows rows++; } area = rows * cols; // Allocate the gridInfo array gridInfo = new int[area]; for (int idx = 0; idx < area; idx++) { gridInfo[idx] = -1; } int infoIdx = 0; // Compute the positions of each control for (int idx = 0; idx < controls.length; idx++) { CellData data = cellData[idx]; // Find an empty position to insert the control while (gridInfo[infoIdx] >= 0) { infoIdx++; } controlRow[idx] = infoIdx / cols; controlCol[idx] = infoIdx % cols; // Insert the new control here for (int rowIdx = 0; rowIdx < data.verticalSpan; rowIdx++) { for (int colIdx = 0; colIdx < data.horizontalSpan; colIdx++) { gridInfo[infoIdx + rowIdx * cols + colIdx] = idx; } } infoIdx += data.horizontalSpan; } } public int getRows() { return rows; } public int getStartPos(int control, boolean row) { if (row) { return controlRow[control]; } else { return controlCol[control]; } } /** * Returns the number of rows or columns * * @param isRow if true, returns the number of rows. If false, returns the number of columns * @return */ public int getNumRows(boolean isRow) { if (isRow) { return rows; } else { return cols; } } public void getRow(int[] result, int rowId, boolean horizontal) { if (horizontal) { int prev = -1; for (int colIdx = 0; colIdx < cols; colIdx++) { int next = gridInfo[cols * rowId + colIdx]; if (prev == next) { result[colIdx] = -1; } else { result[colIdx] = next; } prev = next; } } else { int prev = -1; for (int rowIdx = 0; rowIdx < rows; rowIdx++) { int next = gridInfo[cols * rowIdx + rowId]; if (prev == next) { result[rowIdx] = -1; } else { result[rowIdx] = next; } prev = next; } } } public CellData getCellData(int controlId) { return cellData[controlId]; } public int getCols() { return cols; } }