Copyright (C) 1999, 2000, Geert Vernaeve
package gve.calc.formula; import java.awt.*; import awt.Button; import java.awt.event.*; public class Matrix extends Tabular { private Part [][] elements; public Matrix(int height,int width) { if (height <= 0) throw new Error("invalid matrix height"); if (width <= 0) throw new Error("invalid matrix width"); elements = new Part[height][width]; for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) { elements[i][j] = new Identifier(""); elements[i][j].parent = this; } } public int getHeight() { return elements.length; } public int getWidth() { return elements[0].length; } public Part elementAt(int i,int j) { return elements[i][j]; } public void setElementAt(int i,int j,Part el) { elements[i][j] = el; el.setParent(this); } public Object clone() { int h = getHeight(); int w = getWidth(); Matrix result = new Matrix(h,w); for (int i = 0; i < h; i++) for (int j = 0; j < w; j++) { result.elements[i][j] = (Part)elements[i][j].clone(); } return result; } public Part evaluate(Evaluator ev) { return (Part)clone(); }
pos is the index of the new to be created row
public void insertRow(int pos) { int w = getWidth(), h = getHeight(); Part [][] newel = new Part[h+1][w]; for (int i = 0; i < h; i++) { if (i < pos) System.arraycopy(elements[i],0,newel[i],0,w); else System.arraycopy(elements[i],0,newel[i+1],0,w); } elements = newel; for (int j = 0; j < w; j++) setElementAt(pos,j,new Identifier()); super.insertRow(pos); } public void insertCol(int pos) { int w = getWidth(), h = getHeight(); Part [][] newel = new Part[h][w+1]; for (int j = 0; j < w; j++) { int jtarget = j<pos ? j : j+1; for (int i = 0; i < h; i++) newel[i][jtarget] = elements[i][j]; } elements = newel; for (int i = 0; i < h; i++) setElementAt(i,pos,new Identifier("")); super.insertCol(pos); } public void removeRow(int pos) { int w = getWidth(), h = getHeight(); Part [][] newel = new Part[h-1][w]; for (int i = 0; i < h; i++) { if (i < pos) System.arraycopy(elements[i],0,newel[i],0,w); else if (i == pos) ; else System.arraycopy(elements[i],0,newel[i-1],0,w); } elements = newel; super.removeRow(pos); } public Component createView(FormulaView view) { return new MatrixView(this,view); } }