_propertyTemplate = new HashMap<CellAddress, Map<String, Object>>();
}
+ /**
+ * Copy constructor
+ *
+ * Create a template from an existing template.
+ * Changes made to either template do not affect the other template.
+ * @since 3.15 beta 2
+ */
+ public BorderPropertyTemplate(BorderPropertyTemplate prototype) {
+ this();
+ // deep copy the _propertyTemplate map from prototype
+ for (Entry<CellAddress, Map<String, Object>> other : prototype._propertyTemplate.entrySet()) {
+ CellAddress cell = other.getKey();
+ Map<String, Object> otherMap = other.getValue();
+
+ // The keys in otherMap are immutable Strings
+ // The values in otherMap are immutable Shorts or BorderStyles
+ // Therefore, this map's data cannot be modified through protoype
+ Map<String, Object> map = new HashMap<String, Object>(otherMap);
+
+ // CellAddress is an immutable class, therefore it is ok to reference the same instance
+ _propertyTemplate.put(cell, map);
+ }
+ }
+
/**
* Add a group of cell borders for a cell range to the border property template.
* The borders are not applied to the cells at this time, just the template is drawn
package org.apache.poi.ss.util;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
import java.io.IOException;
private static final short BLUE = IndexedColors.BLUE.getIndex();
private static final short AUTOMATIC = IndexedColors.AUTOMATIC.getIndex();
+ @Test
+ public void createTemplateFromExisting() throws IOException {
+ CellRangeAddress a1a1 = new CellRangeAddress(0, 0, 0, 0); //A1:A1
+ CellRangeAddress b2b2 = new CellRangeAddress(1, 1, 1, 1); //B2:B2
+ CellRangeAddress c3c3 = new CellRangeAddress(2, 2, 2, 2); //C3:C3
+ CellAddress a1 = new CellAddress(0, 0); //A1
+ CellAddress b2 = new CellAddress(1, 1); //B2
+ CellAddress c3 = new CellAddress(2, 2); //C3
+
+ BorderPropertyTemplate pt1 = new BorderPropertyTemplate();
+ pt1.drawBorders(a1a1, BorderStyle.THIN, RED, BorderExtent.TOP);
+
+ // check to make sure borders were copied
+ BorderPropertyTemplate pt2 = new BorderPropertyTemplate(pt1);
+ assertEquals(1, pt2.getNumBorders(a1));
+ assertThin(pt2.getTemplateProperty(a1, CellUtil.BORDER_TOP));
+ assertRed(pt2.getTemplateProperty(a1, CellUtil.TOP_BORDER_COLOR));
+
+ // Changes to original template should not affect copied template.
+ pt1.drawBorders(b2b2, BorderStyle.THIN, RED, BorderExtent.TOP);
+ assertEquals(0, pt2.getNumBorders(b2));
+ assertNull(pt2.getTemplateProperty(b2, CellUtil.BORDER_TOP));
+ assertNull(pt2.getTemplateProperty(b2, CellUtil.TOP_BORDER_COLOR));
+
+ // Changes to copied template should not affect original template
+ pt2.drawBorders(c3c3, BorderStyle.THIN, RED, BorderExtent.TOP);
+ assertEquals(0, pt1.getNumBorders(c3));
+ assertNull(pt1.getTemplateProperty(c3, CellUtil.BORDER_TOP));
+ assertNull(pt1.getTemplateProperty(c3, CellUtil.TOP_BORDER_COLOR));
+ }
+
@Test
public void getNumBorders() throws IOException {
CellRangeAddress a1a1 = new CellRangeAddress(0, 0, 0, 0); //A1:A1