1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include
"nsISupports.idl"
13 [scriptable
, builtinclass
, uuid(4805e684
-49b9
-11d3
-9ce4
-ed60bd6cb5bc
)]
14 interface nsITableEditor
: nsISupports
16 const short eNoSearch
= 0;
17 const short ePreviousColumn
= 1;
18 const short ePreviousRow
= 2;
21 * insertTableCell() inserts <td> elements before or after a cell element
22 * containing first selection range. I.e., if the cell spans columns and
23 * aInsertPosition is true, new columns will be inserted after the
24 * right-most column which contains the cell. Note that this simply
25 * inserts <td> elements, i.e., colspan and rowspan around the cell
26 * containing selection are not modified. So, for example, adding a cell
27 * to rectangular table changes non-rectangular table. And if a cell
28 * containing selection is at left of row-spanning cell, it may be moved to
29 * right side of the row-spanning cell after inserting some cell elements
30 * before it. Similarly, colspan won't be adjusted for keeping table
32 * If first selection range is not in table cell element, this does nothing
35 * @param aNumberOfCellssToInsert Number of cells to insert.
36 * @param aInsertAfterSelectedCell true if new cells should be inserted
37 * before current cell. Otherwise, will
38 * be inserted after the cell.
41 void insertTableCell
(in long aNumberOfColumnsToInsert
,
42 in boolean aInsertAfterSelectedCell
);
45 * insertTableColumn() inserts columns before or after a cell element
46 * containing first selection range. I.e., if the cell spans columns and
47 * aInsertAfterSelectedCell is tre, new columns will be inserted after the
48 * right-most column which contains the cell. If first selection range is
49 * not in table cell element, this does nothing without exception.
51 * @param aNumberOfColumnsToInsert Number of columns to insert.
52 * @param aInsertAfterSelectedCell true if new columns will be inserted
53 * before current cell. Otherwise, will
54 * be inserted after the cell.
57 void insertTableColumn
(in long aNumberOfColumnsToInsert
,
58 in boolean aInsertAfterSelectedCell
);
61 * insertTableRow() inserts <tr> elements before or after a <td> element
62 * containing first selection range. I.e., if the cell spans rows and
63 * aInsertAfterSelectedCell is true, new rows will be inserted after the
64 * bottom-most row which contains the cell. If first selection range is
65 * not in table cell element, this does nothing without exception.
67 * @param aNumberOfRowsToInsert Number of rows to insert.
68 * @param aInsertAfterSelectedCell true if new rows will be inserted
69 * before current cell. Otherwise, will
70 * be inserted after the cell.
73 void insertTableRow
(in long aNumberOfRowsToInsert
,
74 in boolean aInsertAfterSelectedCell
);
76 /** Delete table methods
77 * Delete starting at the selected cell or the
78 * cell (or table) enclosing the selection anchor
79 * The selection is collapsed and is left in the
80 * cell at the same row,col location as
81 * the previous selection anchor, if possible,
82 * else in the closest neighboring cell
84 * @param aNumber Number of items to insert/delete
90 * deleteTableCellContents() removes any contents in cell elements. If two
91 * or more cell elements are selected, this removes all selected cells'
92 * contents. Otherwise, this removes contents of a cell which contains
93 * first selection range. This does nothing without exception if selection
94 * is not in cell element.
97 void deleteTableCellContents
();
100 * deleteTableCell() removes table cell elements. If two or more cell
101 * elements are selected, this removes all selected cell elements.
102 * Otherwise, this removes some cell elements starting from selected cell
103 * element or a cell containing first selection range. When this removes
104 * last cell element in <tr> or <table>, this removes the <tr> or the
105 * <table> too. Note that when removing a cell causes number of its row
106 * becomes less than the others, this method does NOT fill the place with
107 * rowspan nor colspan. This does nothing without exception if selection is
108 * not in cell element.
110 * @param aNumberOfCellsToDelete Number of cells to remove. This is ignored
111 * if 2 or more cells are selected.
114 void deleteTableCell
(in long aNumberOfCellsToDelete
);
117 * deleteTableColumn() removes cell elements which belong to same columns
118 * of selected cell elements.
119 * If only one cell element is selected or first selection range is
120 * in a cell, removes cell elements which belong to same column.
121 * If 2 or more cell elements are selected, removes cell elements which
122 * belong to any of all selected columns. In this case,
123 * aNumberOfColumnsToDelete is ignored.
124 * If there is no selection ranges, throws exception.
125 * If selection is not in a cell element, just does nothing without
126 * throwing exception.
127 * WARNING: This does not remove <col> nor <colgroup> elements.
129 * @param aNumberOfColumnsToDelete Number of columns to remove. This is
130 * ignored if 2 ore more cells are
134 void deleteTableColumn
(in long aNumberOfColumnsToDelete
);
137 * deleteTableRow() removes <tr> elements.
138 * If only one cell element is selected or first selection range is
139 * in a cell, removes <tr> elements starting from a <tr> element
140 * containing the selected cell or first selection range.
141 * If 2 or more cell elements are selected, all <tr> elements
142 * which contains selected cell(s). In this case, aNumberOfRowsToDelete
144 * If there is no selection ranges, throws exception.
145 * If selection is not in a cell element, just does nothing without
146 * throwing exception.
148 * @param aNumberOfRowsToDelete Number of rows to remove. This is ignored
149 * if 2 or more cells are selected.
152 void deleteTableRow
(in long aNumberOfRowsToDelete
);
154 /** Table Selection methods
155 * Selecting a row or column actually
156 * selects all cells (not TR in the case of rows)
159 void selectTableCell
();
162 void selectTableRow
();
164 void selectTableColumn
();
168 void selectAllTableCells
();
170 /** Create a new TD or TH element, the opposite type of the supplied aSourceCell
171 * 1. Copy all attributes from aSourceCell to the new cell
172 * 2. Move all contents of aSourceCell to the new cell
173 * 3. Replace aSourceCell in the table with the new cell
175 * @param aSourceCell The cell to be replaced
176 * @return The new cell that replaces aSourceCell
179 Element switchTableCellHeaderType
(in Element aSourceCell
);
181 /** Merges contents of all selected cells
182 * for selected cells that are adjacent,
183 * this will result in a larger cell with appropriate
184 * rowspan and colspan, and original cells are deleted
185 * The resulting cell is in the location of the
186 * cell at the upper-left corner of the adjacent
187 * block of selected cells
189 * @param aMergeNonContiguousContents:
191 * Non-contiguous cells are not deleted,
192 * but their contents are still moved
193 * to the upper-left cell
194 * If false: contiguous cells are ignored
196 * If there are no selected cells,
197 * and selection or caret is in a cell,
198 * that cell and the one to the right
202 void joinTableCells
(in boolean aMergeNonContiguousContents
);
204 /** Split a cell that has rowspan and/or colspan > 0
205 * into cells such that all new cells have
206 * rowspan = 1 and colspan = 1
207 * All of the contents are not touched --
208 * they will appear to be in the upper-left cell
211 void splitTableCell
();
213 /** Scan through all rows and add cells as needed so
214 * all locations in the cellmap are occupied.
215 * Used after inserting single cells or pasting
216 * a collection of cells that extend past the
217 * previous size of the table
218 * If aTable is null, it uses table enclosing the selection anchor
219 * This doesn't doesn't change the selection,
220 * thus it can be used to fixup all tables
221 * in a page independent of the selection
224 void normalizeTable
(in Element aTable
);
227 * getCellIndexes() computes row index and column index of a table cell.
228 * Note that this depends on layout information. Therefore, all pending
229 * layout should've been flushed before calling this.
231 * @param aCellElement If not null, this computes indexes of the cell.
232 * If null, this computes indexes of a cell which
233 * contains anchor of Selection.
234 * @param aRowIndex Must be an object, whose .value will be set
235 * to row index of the cell. 0 is the first row.
236 * If rowspan is set to 2 or more, the start
238 * @param aColumnIndex Must be an object, whose .value will be set
239 * to column index of the cell. 0 is the first
240 * column. If colspan is set to 2 or more, the
241 * start column index is used.
244 void getCellIndexes
(in Element aCellElement
,
245 out long aRowIndex
, out long aColumnIndex
);
248 * getTableSize() computes number of rows and columns.
249 * Note that this depends on layout information. Therefore, all pending
250 * layout should've been flushed before calling this.
252 * @param aTableOrElementInTable If a <table> element, this computes number
253 * of rows and columns of it.
254 * If another element and in a <table>, this
255 * computes number of rows and columns of
256 * the nearest ancestor <table> element.
257 * If element is not in <table> element,
258 * throwing an exception.
259 * If null, this looks for nearest ancestor
260 * <table> element containing anchor of
261 * Selection. If found, computes the number
262 * of rows and columns of the <table>.
263 * Otherwise, throwing an exception.
264 * @param aRowCount Number of *actual* row count.
265 * I.e., rowspan does NOT increase this value.
266 * @param aColumnCount Number of column count.
267 * I.e., if colspan is specified with bigger
268 * number than actual, the value is used
271 void getTableSize
(in Element aTableOrElementInTable
,
272 out long aRowCount
, out long aColCount
);
275 * getCellAt() returns a <td> or <th> element in a <table> if there is a
276 * cell at the indexes.
278 * @param aTableElement If not null, must be a <table> element.
279 * If null, looks for the nearest ancestor <table>
280 * to look for a cell.
281 * @param aRowIndex Row index of the cell.
282 * @param aColumnIndex Column index of the cell.
283 * @return Returns a <td> or <th> element if there is.
284 * Otherwise, returns null without throwing
286 * If aTableElement is not null and not a <table>
287 * element, throwing an exception.
288 * If aTableElement is null and anchor of Selection
289 * is not in any <table> element, throwing an
292 Element getCellAt
(in Element aTableElement
,
293 in long aRowIndex
, in long aColumnIndex
);
296 * Get cell element and its various information from <table> element and
297 * indexes in it. If aTableElement is null, this looks for an ancestor
298 * <table> element of anchor of Selection. If there is no <table> element
299 * at that point, this throws exception. Note that this requires layout
300 * information. So, you need to flush the layout after changing the DOM
302 * If there is no cell element at the indexes, this throws exception.
303 * XXX Perhaps, this is wrong behavior, this should return null without
304 * exception since the caller cannot distinguish whether the exception
305 * is caused by "not found" or other unexpected situation.
307 * @param aTableElement A <table> element. If this is null, this
308 * uses ancestor of anchor of Selection.
309 * @param aRowIndex Row index in aTableElement. Starting from 0.
310 * @param aColumnIndex Column index in aTableElement. Starting from
312 * @param aCellElement [OUT] The cell element at the indexes.
313 * @param aStartRowIndex [OUT] First row index which contains
314 * aCellElement. E.g., if the cell's rowspan is
315 * not 1, this returns its first row index.
316 * I.e., this can be smaller than aRowIndex.
317 * @param aStartColumnIndex [OUT] First column index which contains the
318 * aCellElement. E.g., if the cell's colspan is
319 * larger than 1, this returns its first column
320 * index. I.e., this can be smaller than
322 * @param aRowSpan [OUT] rowspan attribute value in most cases.
323 * If the specified value is invalid, this
324 * returns 1. Only when the document is written
325 * in HTML5 or later, this can be 0.
326 * @param aColSpan [OUT] colspan attribute value in most cases.
327 * If the specified value is invalid, this
329 * @param aEffectiveRowSpan [OUT] Effective rowspan value at aRowIndex.
331 * aRowSpan - (aRowIndex - aStartRowIndex)
332 * @param aEffectiveColSpan [OUT] Effective colspan value at aColumnIndex.
334 * aColSpan - (aColumnIndex - aStartColumnIndex)
335 * @param aIsSelected [OUT] Returns true if aCellElement or its
336 * <tr> or <table> element is selected.
337 * Otherwise, e.g., aCellElement just contains
338 * selection range, returns false.
340 void getCellDataAt
(in Element aTableElement
,
341 in long aRowIndex
, in long aColumnIndex
,
342 out Element aCellElement
,
343 out long aStartRowIndex
, out long aStartColumnIndex
,
344 out long aRowSpan
, out long aColSpan
,
345 out long aEffectiveRowSpan
, out long aEffectiveColSpan
,
346 out boolean aIsSelected
);
349 * getFirstRow() returns first <tr> element in a <table> element.
351 * @param aTableOrElementInTable If a <table> element, returns its first
353 * If another element, looks for nearest
354 * ancestor <table> element first. Then,
355 * return its first <tr> element.
356 * @return <tr> element in the <table> element.
357 * If <table> element is not found, this
358 * throws an exception.
359 * If there is a <table> element but it
360 * does not have <tr> elements, returns
361 * null without throwing exception.
362 * Note that this may return anonymous <tr>
363 * element if <table> has one or more cells
364 * but <tr> element is not in the source.
366 Element getFirstRow
(in Element aTableElement
);
368 /** Preferred direction to search for neighboring cell
369 * when trying to locate a cell to place caret in after
370 * a table editing action.
371 * Used for aDirection param in SetSelectionAfterTableEdit
375 * getSelectedOrParentTableElement() returns a <td>, <th>, <tr> or <table>.
376 * If first selection range selects a <td> or <th>, returns it. aTagName
377 * is set to "td" even if the result is a <th> and aCount is set to
378 * Selection.rangeCount.
379 * If first selection range does not select <td> nor <th>, but selection
380 * anchor refers <table>, returns it. aTagName is set to "table" and
381 * aCount is set to 1.
382 * If first selection range does not select <td> nor <th>, but selection
383 * anchor refers <tr>, returns it. aTagName is set to "tr" and aCount is
385 * If first selection range does not select <td> nor <th>, but selection
386 * anchor refers <td> (not include <th>!), returns it. aTagName is set to
387 * "td" and aCount is set to 0.
388 * Otherwise, if container of selection anchor is in a <td> or <th>,
389 * returns it. aTagName is set to "td" but aCount is set to 0.
390 * Otherwise, returns null, aTagName is set to empty string and aCount is
391 * set to 0. I.e., does not throw exception even if a cell is not found.
392 * NOTE: Calling this resets internal counter of getFirstSelectedCell()
393 * and getNextSelectedCell(). I.e., getNextSelectedCell() will
394 * return second selected cell element.
396 Element getSelectedOrParentTableElement
(out AString aTagName
,
399 /** Generally used after GetSelectedOrParentTableElement
400 * to test if selected cells are complete rows or columns
402 * @param aElement Any table or cell element or any element
404 * Used to get enclosing table.
405 * If null, selection's anchorNode is used
408 * 0 aCellElement was not a cell
409 * (returned result = NS_ERROR_FAILURE)
410 * TableSelectionMode::Cell There are 1 or more cells selected but
411 * complete rows or columns are not selected
412 * TableSelectionMode::Row All cells are in 1 or more rows
413 * and in each row, all cells selected
414 * Note: This is the value if all rows
415 * (thus all cells) are selected
416 * TableSelectionMode::Column All cells are in 1 or more columns
417 * and in each column, all cells are selected
420 uint32_t getSelectedCellsType
(in Element aElement
);
423 * getFirstSelectedCell() returns a <td> or <th> element if first range of
424 * Selection selects only one table cell element (i.e., startContainer and
425 * endContainer are same <tr> element and startOffset + 1 equals endOffset).
426 * If first range of Selection does not select a table cell element, this
427 * returns null. However, if Selection has no range, this throws an
430 * @param aFirstRangeOfSelection [OUT] Returns the first range of Selection
431 * only when this returns a <td> or <th>
432 * element. Otherwise, returns null.
433 * @return A <td> or <th> element if first range of
434 * Selection selects only one table cell
437 Element getFirstSelectedCell
(out Range aFirstRangeOfSelection
);
440 * getFirstSelectedCellInTable() returns a cell element, its row index and
441 * its column index if first range of Selection selects a cell. Note that
442 * that "selects a cell" means that the range container is a <tr> element
443 * and endOffset is startOffset + 1. So, even if first range of Selection
444 * is in a cell element, this treats the range does not select a cell.
445 * NOTE: Calling this resets internal counter of getFirstSelectedCell()
446 * and getNextSelectedCell(). I.e., getNextSelectedCell() will
447 * return second selected cell element.
449 * @param aRowIndex [OUT} Returns row index of the found cell. If not
451 * @param aColumnIndex [OUT] Returns column index of the found cell. If
452 * not found, returns 0.
453 * @return The cell element which is selected by the first
454 * range of Selection. Even if this is not found,
455 * this returns null, not throwing exception.
458 Element getFirstSelectedCellInTable
(out long aRowIndex
, out long aColIndex
);
461 * getNextSelectedCell() is a stateful method to retrieve selected table
462 * cell elements which are selected by 2nd or later ranges of Selection.
463 * When you call getFirstSelectedCell(), it resets internal counter of
464 * this method. Then, following calls of getNextSelectedCell() scans the
465 * remaining ranges of Selection. If a range selects a <td> or <th>
466 * element, returns the cell element. If a range selects an element but
467 * neither <td> nor <th> element, this ignores the range. If a range is
468 * in a text node, returns null without throwing exception, but stops
469 * scanning the remaining ranges even you call this again.
470 * Note that this may cross <table> boundaries since this method just
471 * scans all ranges of Selection. Therefore, returning cells which
472 * belong to different <table> elements.
474 * @param aNextSelectedCellRange [OUT] Returns null if this method returns
475 * null. Otherwise, i.e., found a range which
476 * selects a <td> or <th> element, returns the
478 * @return A <td> or <th> element if one of remaining
479 * ranges selects a <td> or <th> element unless
480 * this does not meet a range in a text node.
482 Element getNextSelectedCell
(out Range aNextSelectedCellRange
);