001: /*
002: * Copyright (c) 2004 JETA Software, Inc. All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without modification,
005: * are permitted provided that the following conditions are met:
006: *
007: * o Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * o Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * o Neither the name of JETA Software nor the names of its contributors may
015: * be used to endorse or promote products derived from this software without
016: * specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
021: * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
022: * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
023: * INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
024: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
025: * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
026: * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
027: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
028: */
029:
030: package com.jeta.forms.store.support;
031:
032: import java.io.IOException;
033:
034: import com.jeta.forms.store.AbstractJETAPersistable;
035: import com.jeta.forms.store.JETAObjectInput;
036: import com.jeta.forms.store.JETAObjectOutput;
037:
038: /**
039: * A <code>Matrix</code> represents a storable grid of objects. The grid can
040: * grow or shrink by adding/removing rows or column.
041: *
042: * @author Jeff Tassin
043: */
044: public class Matrix extends AbstractJETAPersistable {
045: static final long serialVersionUID = -6465003684197543526L;
046:
047: /**
048: * The version of this class
049: */
050: public static final int VERSION = 1;
051:
052: /**
053: * An array of object[].
054: */
055: private Object[] m_rows;
056:
057: public Matrix() {
058: m_rows = new Object[0];
059: }
060:
061: /**
062: * ctor
063: */
064: public Matrix(int rows, int cols) {
065: m_rows = new Object[rows];
066: for (int row = 0; row < rows; row++) {
067: m_rows[row] = new Object[cols];
068: }
069: }
070:
071: /**
072: * @return the number of rows in the matrix
073: */
074: public int getRowCount() {
075: return (m_rows == null ? 0 : m_rows.length);
076: }
077:
078: /**
079: * @return the number of columns in the matrix
080: */
081: public int getColumnCount() {
082: if (m_rows == null || m_rows.length == 0)
083: return 0;
084:
085: Object[] row = (Object[]) m_rows[0];
086: if (row == null)
087: return 0;
088: else
089: return row.length;
090: }
091:
092: /**
093: * @return the value at the given row/column
094: */
095: public Object getValue(int row, int col) {
096: if (row >= 0 && row < getRowCount()) {
097: Object[] rowdata = (Object[]) m_rows[row];
098: if (rowdata != null && col >= 0 && col < rowdata.length) {
099: return rowdata[col];
100: }
101: }
102: return null;
103: }
104:
105: /**
106: * Sets the value at the given row/column
107: */
108: public void setValue(int row, int col, Object value) {
109: if (row >= 0 && row < getRowCount()) {
110: Object[] rowdata = (Object[]) m_rows[row];
111: if (rowdata != null && col >= 0 && col < rowdata.length) {
112: rowdata[col] = value;
113: }
114: }
115: }
116:
117: /**
118: * Inserts a row in the matrix
119: *
120: * @param row
121: * the 0-based row
122: */
123: public void insertRow(int row) {
124: if (row > m_rows.length)
125: row = m_rows.length;
126: if (row < 0)
127: row = 0;
128:
129: Object[] newdata = insertElement(m_rows, row);
130: newdata[row] = new Object[getColumnCount()];
131: m_rows = newdata;
132: }
133:
134: /**
135: * Inserts a column in the matrix
136: *
137: * @param col
138: * the 0-based column
139: */
140: public void insertColumn(int col) {
141: if (col > getColumnCount())
142: col = getColumnCount();
143: if (col < 0)
144: col = 0;
145:
146: for (int row = 0; row < m_rows.length; row++) {
147: Object[] newrow = insertElement((Object[]) m_rows[row], col);
148: m_rows[row] = newrow;
149: }
150: }
151:
152: /**
153: * Removes a column from the matrix
154: *
155: * @param col
156: * the 0-based column
157: */
158: public void removeColumn(int col) {
159: if (col > getColumnCount())
160: col = getColumnCount();
161: if (col < 0)
162: col = 0;
163:
164: for (int row = 0; row < m_rows.length; row++) {
165: Object[] newrow = deleteElement((Object[]) m_rows[row], col);
166: m_rows[row] = newrow;
167: }
168: }
169:
170: /**
171: * Removes a row from the matrix
172: *
173: * @param row
174: * the 0-based row
175: */
176: public void removeRow(int row) {
177: if (row > m_rows.length)
178: row = m_rows.length;
179: if (row < 0)
180: row = 0;
181:
182: Object[] newdata = deleteElement(m_rows, row);
183: m_rows = newdata;
184: }
185:
186: private Object[] insertElement(Object[] src, int index) {
187: Object[] newdata = new Object[src.length + 1];
188: System.arraycopy(src, 0, newdata, 0, index);
189: if (src.length - index > 0) {
190: System.arraycopy(src, index, newdata, index + 1, src.length
191: - index);
192: }
193: return newdata;
194: }
195:
196: private Object[] deleteElement(Object[] src, int index) {
197: if ((src.length - 1) < 0) {
198: assert (false);
199: }
200: Object[] newdata = new Object[src.length - 1];
201: System.arraycopy(src, 0, newdata, 0, index);
202: if ((src.length - index - 1) > 0) {
203: System.arraycopy(src, index + 1, newdata, index, src.length
204: - index - 1);
205: }
206: return newdata;
207: }
208:
209: /**
210: * JETAPersistable Implementation
211: */
212: public void read(JETAObjectInput in) throws ClassNotFoundException,
213: IOException {
214: int version = in.readVersion();
215: m_rows = (Object[]) in.readObject("rows");
216: }
217:
218: /**
219: * JETAPersistable Implementation
220: */
221: public void write(JETAObjectOutput out) throws IOException {
222: out.writeVersion(VERSION);
223: out.writeObject("rows", m_rows);
224: }
225:
226: }
|