Skip to content

Commit d4feb38

Browse files
Fix #438: setWidth() fails for columns inside header columns
1 parent c0306d2 commit d4feb38

2 files changed

Lines changed: 52 additions & 3 deletions

File tree

odfdom/src/main/java/org/odftoolkit/odfdom/doc/table/OdfTableColumn.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,11 @@ public void setWidth(long width) {
182182
// column
183183
void splitRepeatedColumns() {
184184
OdfTable table = getTable();
185-
TableTableElement tableEle = table.getOdfElement();
186185
int repeateNum = getColumnsRepeatedNumber();
187186
if (repeateNum > 1) {
187+
// Use the actual parent node of the column element, which may be
188+
// a <table:table-header-columns> element rather than the table itself
189+
Node columnParent = maColumnElement.getParentNode();
188190
// change this repeated column to several single columns
189191
TableTableColumnElement ownerColumnElement = null;
190192
int repeatedColumnIndex = mnRepeatedIndex;
@@ -206,7 +208,7 @@ void splitRepeatedColumns() {
206208
if (originalRelWidth != null && originalRelWidth.length() > 0) {
207209
newColumn.setProperty(OdfTableColumnProperties.RelColumnWidth, originalRelWidth);
208210
}
209-
tableEle.insertBefore(newColumn, refElement);
211+
columnParent.insertBefore(newColumn, refElement);
210212
refElement = newColumn;
211213
if (repeatedColumnIndex == i) {
212214
ownerColumnElement = newColumn;
@@ -215,7 +217,7 @@ void splitRepeatedColumns() {
215217
}
216218
}
217219
// remove this column element
218-
tableEle.removeChild(maColumnElement);
220+
columnParent.removeChild(maColumnElement);
219221

220222
if (ownerColumnElement != null) {
221223
table.updateColumnRepository(maColumnElement, mnRepeatedIndex, ownerColumnElement, 0);

odfdom/src/test/java/org/odftoolkit/odfdom/doc/table/TableTest.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,6 +1209,53 @@ public void testTableInHeaderFooter() {
12091209
}
12101210
}
12111211

1212+
@Test
1213+
public void testNewTableWithPartialColumnWidth() {
1214+
try {
1215+
OdfTextDocument document =
1216+
OdfTextDocument.loadDocument(
1217+
ResourceUtilities.getAbsoluteInputPath(mOdtTestFileName + ".odt"));
1218+
1219+
// Create a new table with 1 row, 3 columns, 1 header row, 3 header columns
1220+
OdfTable myTable = OdfTable.newTable(document, 1, 3, 1, 3);
1221+
Assert.assertNotNull(myTable);
1222+
Assert.assertEquals(1, myTable.getRowCount());
1223+
Assert.assertEquals(3, myTable.getColumnCount());
1224+
Assert.assertEquals(1, myTable.getHeaderRowCount());
1225+
Assert.assertEquals(3, myTable.getHeaderColumnCount());
1226+
1227+
// Only set the width for the first 2 columns
1228+
for (int column = 0; column < 2; column++) {
1229+
myTable.getColumnByIndex(column).setWidth(20);
1230+
}
1231+
1232+
// Verify the widths were set correctly
1233+
Assert.assertEquals(20, myTable.getColumnByIndex(0).getWidth());
1234+
Assert.assertEquals(20, myTable.getColumnByIndex(1).getWidth());
1235+
1236+
// Save and reload to verify persistence
1237+
String outputFileName = "TestNewTableWithPartialColumnWidth.odt";
1238+
document.save(ResourceUtilities.getTestOutputFile(outputFileName));
1239+
document.close();
1240+
1241+
// Reload and verify the table and column widths survived the round-trip
1242+
document =
1243+
OdfTextDocument.loadDocument(
1244+
ResourceUtilities.getAbsoluteOutputPath(outputFileName));
1245+
List<OdfTable> tableList = document.getTableList(true);
1246+
OdfTable reloadedTable = tableList.get(tableList.size() - 1);
1247+
Assert.assertNotNull(reloadedTable);
1248+
Assert.assertEquals(1, reloadedTable.getRowCount());
1249+
Assert.assertEquals(3, reloadedTable.getColumnCount());
1250+
Assert.assertEquals(20, reloadedTable.getColumnByIndex(0).getWidth());
1251+
Assert.assertEquals(20, reloadedTable.getColumnByIndex(1).getWidth());
1252+
document.close();
1253+
} catch (Exception e) {
1254+
LOG.log(Level.SEVERE, null, e);
1255+
Assert.fail(e.getMessage());
1256+
}
1257+
}
1258+
12121259
private Map<String, StyleMasterPageElement> getMasterPages(OdfDocument doc) throws Exception {
12131260

12141261
OdfStylesDom stylesDoc = doc.getStylesDom();

0 commit comments

Comments
 (0)