Remove more JSLib cruft.
1 #include "nsWritableDataMatrix.h"
2 #include "nsServiceManagerUtils.h"
3 #include "nsMemoryArray.h"
5 NS_IMPL_ISUPPORTS2_CI(nsWritableDataMatrix,
9 nsWritableDataMatrix::nsWritableDataMatrix() :
12 // do nothing, we take care of everything in Init().
16 nsWritableDataMatrix::Init()
21 nsWritableDataMatrix::~nsWritableDataMatrix()
26 NS_IMETHODIMP // nsIDataMatrix
27 nsWritableDataMatrix::GetRowCount(PRUint32 *aRowCount)
29 *aRowCount = matrix.Length();
33 NS_IMETHODIMP // nsIDataMatrix
34 nsWritableDataMatrix::GetColumnCount(PRUint32 *aColumnCount)
36 *aColumnCount = mColumnCount;
40 NS_IMETHODIMP // nsIDataMatrix
41 nsWritableDataMatrix::GetRow(PRUint32 rowNumber,
42 PRUint32 *columnCount,
43 nsISupports ***columns)
45 if (rowNumber >= matrix.Length())
46 return NS_ERROR_INVALID_ARG;
48 MatrixRow* row = matrix.ElementAt(rowNumber);
51 nsMemoryRefArray<nsISupports*> mem(mColumnCount, rv);
52 NS_ENSURE_SUCCESS(rv, rv);
54 for (PRUint32 i = 0; i < mColumnCount; i++)
55 mem.setIndex(i, row->SafeElementAt(i));
57 mem.Finalize(columnCount, columns);
61 NS_IMETHODIMP // nsIDataMatrix
62 nsWritableDataMatrix::GetColumn(PRUint32 columnNumber,
66 if (columnNumber > mColumnCount)
67 return NS_ERROR_INVALID_ARG;
69 PRUint32 count = matrix.Length();
72 nsMemoryRefArray<nsISupports*> mem(count, rv);
73 NS_ENSURE_SUCCESS(rv, rv);
75 for (PRUint32 i = 0; i < count; i++)
77 MatrixRow* row = matrix.ElementAt(i);
78 mem.setIndex(i, row->SafeElementAt(columnNumber));
81 mem.Finalize(rowCount, rows);
85 NS_IMETHODIMP // nsIDataMatrix
86 nsWritableDataMatrix::GetCell(PRUint32 rowNumber,
87 PRUint32 columnNumber,
88 nsISupports **_retval)
90 if (rowNumber >= matrix.Length())
91 return NS_ERROR_INVALID_ARG;
92 if (columnNumber > mColumnCount)
93 return NS_ERROR_INVALID_ARG;
95 MatrixRow* row = matrix.ElementAt(rowNumber);
96 if (row->Length() <= columnNumber) {
101 NS_IF_ADDREF(*_retval = row->ElementAt(columnNumber));
106 nsWritableDataMatrix::EnsureColumnCount(PRUint32 columnCount)
108 if (columnCount > mColumnCount)
109 mColumnCount = columnCount;
113 nsWritableDataMatrix::GetEnsuredRow(PRUint32 rowIndex,
116 while (matrix.Length() <= rowIndex)
118 MatrixRow* emptyRow = new MatrixRow;
120 return NS_ERROR_OUT_OF_MEMORY;
121 MatrixRow* insertedRow = matrix.AppendElement(emptyRow)->get();
122 NS_ENSURE_TRUE(insertedRow, NS_ERROR_OUT_OF_MEMORY);
123 NS_ENSURE_TRUE(insertedRow == emptyRow, NS_ERROR_UNEXPECTED);
126 *row = matrix.ElementAt(rowIndex);
130 NS_IMETHODIMP // nsIWritableDataMatrix
131 nsWritableDataMatrix::InsertRow(PRUint32 rowNumber,
132 PRUint32 columnCount,
133 nsISupports **columns)
137 nsresult rv = GetEnsuredRow(rowNumber - 1, &oldRow);
138 NS_ENSURE_SUCCESS(rv, rv);
141 MatrixRow* newRow = new MatrixRow;
142 NS_ENSURE_TRUE(newRow, NS_ERROR_OUT_OF_MEMORY);
144 for (PRUint32 i = 0; i < columnCount; i++)
146 newRow->AppendElement(columns[i]);
147 NS_IF_ADDREF(columns[i]);
150 MatrixRow* insertedRow = matrix.InsertElementAt(rowNumber, newRow)->get();
151 NS_ENSURE_TRUE(insertedRow, NS_ERROR_OUT_OF_MEMORY);
152 NS_ENSURE_TRUE(insertedRow == newRow, NS_ERROR_UNEXPECTED);
153 EnsureColumnCount(columnCount);
157 NS_IMETHODIMP // nsIWritableDataMatrix
158 nsWritableDataMatrix::DeleteRow(PRUint32 rowNumber)
160 if (!(rowNumber < matrix.Length()))
161 return NS_ERROR_INVALID_ARG;
163 MatrixRow* row = matrix.ElementAt(rowNumber);
164 PRUint32 columnCount = row->Length();
165 for (PRUint32 i = 0; i < columnCount; i++)
167 nsISupports* cell = row->ElementAt(i);
170 matrix.RemoveElementAt(rowNumber);
174 NS_IMETHODIMP // nsIWritableDataMatrix
175 nsWritableDataMatrix::ReplaceRow(PRUint32 rowNumber,
176 PRUint32 columnCount,
177 nsISupports **columns)
179 if (!(rowNumber < matrix.Length()))
180 return NS_ERROR_INVALID_ARG;
182 nsresult rv = DeleteRow(rowNumber);
187 return InsertRow(rowNumber, columnCount, columns);
191 EnsureRowHasColumn(MatrixRow* row, PRUint32 columnIndex)
193 while (row->Length() <= columnIndex) {
194 nsISupports** elem = row->AppendElement();
195 NS_ENSURE_TRUE(elem, NS_ERROR_OUT_OF_MEMORY);
202 nsWritableDataMatrix::TruncateExtraColumns()
204 PRUint32 rowCount = matrix.Length();
205 for (PRUint32 i = 0; i < rowCount; i++)
207 MatrixRow* row = matrix.ElementAt(i);
208 while (row->Length() > mColumnCount)
210 NS_ERROR("Truncating row (how did we need this?)");
212 nsISupports* cell = row->ElementAt(mColumnCount);
213 NS_ASSERTION(!cell, "Truncating a non-null value? Loss of data!");
215 row->RemoveElementAt(mColumnCount);
221 InsertCell(MatrixRow* row,
225 if ((index == row->Length() - 1) &&
226 (row->ElementAt(index) == nsnull))
228 row->ElementAt(index) = cell;
232 nsISupports** insert = row->InsertElementAt(index, cell);
233 NS_ENSURE_TRUE(*insert == cell, NS_ERROR_UNEXPECTED);
237 NS_IMETHODIMP // nsIWritableDataMatrix
238 nsWritableDataMatrix::InsertColumn(PRUint32 columnNumber,
242 MatrixRow* lastRow = nsnull;
243 nsresult rv = GetEnsuredRow(rowCount - 1, &lastRow);
244 NS_ENSURE_SUCCESS(rv, rv);
245 NS_ENSURE_TRUE(lastRow, NS_ERROR_OUT_OF_MEMORY);
247 for (PRUint32 rowIndex = 0; rowIndex < rowCount; rowIndex++)
249 MatrixRow* matrixRow = matrix.ElementAt(rowIndex);
250 rv = EnsureRowHasColumn(matrixRow, columnNumber);
254 nsISupports* cell = rows[rowIndex];
255 rv = InsertCell(matrixRow, columnNumber, cell);
262 for (PRUint32 rowIndex = rowCount; rowIndex < matrix.Length(); rowIndex++)
264 MatrixRow* matrixRow = matrix.ElementAt(rowIndex);
265 rv = EnsureRowHasColumn(matrixRow, columnNumber);
269 rv = InsertCell(matrixRow, columnNumber, nsnull);
274 mColumnCount = PR_MAX(mColumnCount, columnNumber) + 1;
275 TruncateExtraColumns();
279 NS_IMETHODIMP // nsIWritableDataMatrix
280 nsWritableDataMatrix::DeleteColumn(PRUint32 columnNumber)
282 if (!(columnNumber < mColumnCount))
283 return NS_ERROR_INVALID_ARG;
285 PRUint32 rowCount = matrix.Length();
286 for (PRUint32 rowIndex = 0; rowIndex < rowCount; rowIndex++)
288 MatrixRow* row = matrix.ElementAt(rowIndex);
289 if (row->Length() <= columnNumber)
292 nsISupports* cell = row->ElementAt(columnNumber);
294 PRUint32 oldLength = row->Length();
296 row->RemoveElementAt(columnNumber);
297 NS_ASSERTION(oldLength == row->Length() + 1, "Didn't really remove, did we?");
302 TruncateExtraColumns();
306 NS_IMETHODIMP // nsIWritableDataMatrix
307 nsWritableDataMatrix::ReplaceColumn(PRUint32 columnNumber,
311 if (!(columnNumber < mColumnCount))
312 return NS_ERROR_INVALID_ARG;
314 nsresult rv = DeleteColumn(columnNumber);
318 return InsertColumn(columnNumber, rowCount, rows);
321 NS_IMETHODIMP // nsIWritableDataMatrix
322 nsWritableDataMatrix::SetCell(PRUint32 rowNumber,
323 PRUint32 columnNumber,
324 nsISupports *cellValue)
326 // Remove the old entry.
327 if ((rowNumber < matrix.Length()) &&
328 (columnNumber < mColumnCount)) {
329 MatrixRow* row = matrix.ElementAt(rowNumber);
330 NS_ENSURE_TRUE(row, NS_ERROR_UNEXPECTED);
331 if (columnNumber < row->Length()) {
332 nsISupports* oldCell = row->SafeElementAt(columnNumber);
333 NS_IF_RELEASE(oldCell);
337 // Set the new entry.
339 MatrixRow* row = nsnull;
340 nsresult rv = GetEnsuredRow(rowNumber, &row);
344 rv = EnsureRowHasColumn(row, columnNumber);
349 rv = InsertCell(row, columnNumber, cellValue);
352 NS_ADDREF(cellValue);
356 EnsureColumnCount(columnNumber + 1);
357 TruncateExtraColumns();
361 NS_IMETHODIMP // nsIWritableDataMatrix
362 nsWritableDataMatrix::Clear()
364 PRUint32 rowCount = matrix.Length();
365 for (PRUint32 i = 0; i < rowCount; i++)
367 MatrixRow* row = matrix.ElementAt(i);
368 PRUint32 colCount = row->Length();
369 for (PRUint32 j = 0; j < colCount; j++)
370 NS_IF_RELEASE(row->ElementAt(j));