You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TestDrawingShapes.java 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. package org.apache.poi.hssf.model;
  2. import junit.framework.TestCase;
  3. import org.apache.poi.ddf.*;
  4. import org.apache.poi.hssf.HSSFTestDataSamples;
  5. import org.apache.poi.hssf.record.CommonObjectDataSubRecord;
  6. import org.apache.poi.hssf.record.EscherAggregate;
  7. import org.apache.poi.hssf.record.ObjRecord;
  8. import org.apache.poi.hssf.usermodel.*;
  9. import org.apache.poi.util.HexDump;
  10. import java.io.IOException;
  11. import static junit.framework.Assert.assertEquals;
  12. /**
  13. * @author Evgeniy Berlog
  14. * date: 12.06.12
  15. */
  16. public class TestDrawingShapes extends TestCase{
  17. /**
  18. * HSSFShape tree bust be built correctly
  19. * Check file with such records structure:
  20. * -patriarch
  21. * --shape
  22. * --group
  23. * ---group
  24. * ----shape
  25. * ----shape
  26. * ---shape
  27. * ---group
  28. * ----shape
  29. * ----shape
  30. */
  31. public void testDrawingGroups(){
  32. HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls");
  33. HSSFSheet sheet = wb.getSheet("groups");
  34. HSSFPatriarch patriarch = sheet.getDrawingPatriarch();
  35. assertEquals(patriarch.getChildren().size(), 2);
  36. HSSFShapeGroup group = (HSSFShapeGroup) patriarch.getChildren().get(1);
  37. assertEquals(3, group.getChildren().size());
  38. HSSFShapeGroup group1 = (HSSFShapeGroup) group.getChildren().get(0);
  39. assertEquals(2, group1.getChildren().size());
  40. group1 = (HSSFShapeGroup) group.getChildren().get(2);
  41. assertEquals(2, group1.getChildren().size());
  42. }
  43. public void testHSSFShapeCompatibility() {
  44. HSSFShape shape = new HSSFSimpleShape(null, new HSSFClientAnchor());
  45. assertEquals(0x08000040, shape.getLineStyleColor());
  46. assertEquals(0x08000009, shape.getFillColor());
  47. assertEquals(HSSFShape.LINEWIDTH_DEFAULT, shape.getLineWidth());
  48. assertEquals(HSSFShape.LINESTYLE_SOLID, shape.getLineStyle());
  49. assertFalse(shape.isNoFill());
  50. AbstractShape sp = AbstractShape.createShape(shape, 1);
  51. EscherContainerRecord spContainer = sp.getSpContainer();
  52. EscherOptRecord opt =
  53. spContainer.getChildById(EscherOptRecord.RECORD_ID);
  54. assertEquals(7, opt.getEscherProperties().size());
  55. assertEquals(true,
  56. ((EscherBoolProperty)opt.lookup(EscherProperties.TEXT__SIZE_TEXT_TO_FIT_SHAPE)).isTrue());
  57. assertEquals(0x00000004,
  58. ((EscherSimpleProperty)opt.lookup(EscherProperties.GEOMETRY__SHAPEPATH)).getPropertyValue());
  59. assertEquals(0x08000009,
  60. ((EscherSimpleProperty)opt.lookup(EscherProperties.FILL__FILLCOLOR)).getPropertyValue());
  61. assertEquals(true,
  62. ((EscherBoolProperty)opt.lookup(EscherProperties.FILL__NOFILLHITTEST)).isTrue());
  63. assertEquals(0x08000040,
  64. ((EscherSimpleProperty)opt.lookup(EscherProperties.LINESTYLE__COLOR)).getPropertyValue());
  65. assertEquals(true,
  66. ((EscherBoolProperty)opt.lookup(EscherProperties.LINESTYLE__NOLINEDRAWDASH)).isTrue());
  67. assertEquals(true,
  68. ((EscherBoolProperty)opt.lookup(EscherProperties.GROUPSHAPE__PRINT)).isTrue());
  69. }
  70. public void testDefaultPictureSettings(){
  71. HSSFPicture picture = new HSSFPicture(null, new HSSFClientAnchor());
  72. assertEquals(picture.getLineWidth(), HSSFShape.LINEWIDTH_DEFAULT);
  73. assertEquals(picture.getFillColor(), HSSFShape.FILL__FILLCOLOR_DEFAULT);
  74. assertEquals(picture.getLineStyle(), HSSFShape.LINESTYLE_SOLID);
  75. assertEquals(picture.getLineStyleColor(), HSSFShape.LINESTYLE__COLOR_DEFAULT);
  76. assertEquals(picture.isNoFill(), false);
  77. assertEquals(picture.getPictureIndex(), -1);//not set yet
  78. }
  79. /**
  80. * No NullPointerException should appear
  81. */
  82. public void testDefaultSettingsWithEmptyContainer(){
  83. EscherContainerRecord container = new EscherContainerRecord();
  84. EscherOptRecord opt = new EscherOptRecord();
  85. opt.setRecordId(EscherOptRecord.RECORD_ID);
  86. container.addChildRecord(opt);
  87. ObjRecord obj = new ObjRecord();
  88. CommonObjectDataSubRecord cod = new CommonObjectDataSubRecord();
  89. cod.setObjectType(HSSFSimpleShape.OBJECT_TYPE_PICTURE);
  90. obj.addSubRecord(cod);
  91. HSSFPicture picture = new HSSFPicture(container, obj);
  92. assertEquals(picture.getLineWidth(), HSSFShape.LINEWIDTH_DEFAULT);
  93. assertEquals(picture.getFillColor(), HSSFShape.FILL__FILLCOLOR_DEFAULT);
  94. assertEquals(picture.getLineStyle(), HSSFShape.LINESTYLE_DEFAULT);
  95. assertEquals(picture.getLineStyleColor(), HSSFShape.LINESTYLE__COLOR_DEFAULT);
  96. assertEquals(picture.isNoFill(), HSSFShape.NO_FILL_DEFAULT);
  97. assertEquals(picture.getPictureIndex(), -1);//not set yet
  98. }
  99. /**
  100. * create a rectangle, save the workbook, read back and verify that all shape properties are there
  101. */
  102. public void testReadWriteRectangle() throws IOException {
  103. HSSFWorkbook wb = new HSSFWorkbook();
  104. HSSFSheet sheet = wb.createSheet();
  105. HSSFPatriarch drawing = sheet.createDrawingPatriarch();
  106. HSSFClientAnchor anchor = new HSSFClientAnchor(10, 10, 200, 200, (short)2, 2, (short)15, 15);
  107. anchor.setAnchorType(2);
  108. assertEquals(anchor.getAnchorType(), 2);
  109. HSSFSimpleShape rectangle = drawing.createSimpleShape(anchor);
  110. rectangle.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);
  111. rectangle.setLineWidth(10000);
  112. rectangle.setFillColor(777);
  113. assertEquals(rectangle.getFillColor(), 777);
  114. assertEquals(10000, rectangle.getLineWidth());
  115. rectangle.setLineStyle(10);
  116. assertEquals(10, rectangle.getLineStyle());
  117. rectangle.setLineStyleColor(1111);
  118. rectangle.setNoFill(true);
  119. assertEquals(rectangle.getLineStyleColor(), 1111);
  120. assertEquals(rectangle.isNoFill(), true);
  121. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  122. sheet = wb.getSheetAt(0);
  123. drawing = sheet.getDrawingPatriarch();
  124. assertEquals(1, drawing.getChildren().size());
  125. HSSFSimpleShape rectangle2 =
  126. (HSSFSimpleShape)drawing.getChildren().get(0);
  127. assertEquals(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE,
  128. rectangle2.getShapeType());
  129. assertEquals(10000, rectangle2.getLineWidth());
  130. assertEquals(10, rectangle2.getLineStyle());
  131. assertEquals(anchor, rectangle2.getAnchor());
  132. assertEquals(rectangle2.getLineStyleColor(), 1111);
  133. assertEquals(rectangle2.getFillColor(), 777);
  134. assertEquals(rectangle2.isNoFill(), true);
  135. rectangle2.setFillColor(3333);
  136. rectangle2.setLineStyle(9);
  137. rectangle2.setLineStyleColor(4444);
  138. rectangle2.setNoFill(false);
  139. rectangle2.setLineWidth(77);
  140. rectangle2.getAnchor().setDx1(2);
  141. rectangle2.getAnchor().setDx2(3);
  142. rectangle2.getAnchor().setDy1(4);
  143. rectangle2.getAnchor().setDy2(5);
  144. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  145. sheet = wb.getSheetAt(0);
  146. drawing = sheet.getDrawingPatriarch();
  147. assertEquals(1, drawing.getChildren().size());
  148. rectangle2 = (HSSFSimpleShape)drawing.getChildren().get(0);
  149. assertEquals(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE, rectangle2.getShapeType());
  150. assertEquals(77, rectangle2.getLineWidth());
  151. assertEquals(9, rectangle2.getLineStyle());
  152. assertEquals(rectangle2.getLineStyleColor(), 4444);
  153. assertEquals(rectangle2.getFillColor(), 3333);
  154. assertEquals(rectangle2.getAnchor().getDx1(), 2);
  155. assertEquals(rectangle2.getAnchor().getDx2(), 3);
  156. assertEquals(rectangle2.getAnchor().getDy1(), 4);
  157. assertEquals(rectangle2.getAnchor().getDy2(), 5);
  158. assertEquals(rectangle2.isNoFill(), false);
  159. HSSFSimpleShape rect3 = drawing.createSimpleShape(new HSSFClientAnchor());
  160. rect3.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);
  161. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  162. drawing = wb.getSheetAt(0).getDrawingPatriarch();
  163. assertEquals(drawing.getChildren().size(), 2);
  164. }
  165. public void testReadExistingImage(){
  166. HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls");
  167. HSSFSheet sheet = wb.getSheet("pictures");
  168. HSSFPatriarch drawing = sheet.getDrawingPatriarch();
  169. assertEquals(1, drawing.getChildren().size());
  170. HSSFPicture picture = (HSSFPicture) drawing.getChildren().get(0);
  171. assertEquals(picture.getPictureIndex(), 1);
  172. assertEquals(picture.getLineStyleColor(), HSSFShape.LINESTYLE__COLOR_DEFAULT);
  173. assertEquals(picture.getFillColor(), 0x5DC943);
  174. assertEquals(picture.getLineWidth(), HSSFShape.LINEWIDTH_DEFAULT);
  175. assertEquals(picture.getLineStyle(), HSSFShape.LINESTYLE_DEFAULT);
  176. assertEquals(picture.isNoFill(), true);
  177. }
  178. /* assert shape properties when reading shapes from a existing workbook */
  179. public void testReadExistingRectangle() {
  180. HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls");
  181. HSSFSheet sheet = wb.getSheet("rectangles");
  182. HSSFPatriarch drawing = sheet.getDrawingPatriarch();
  183. assertEquals(1, drawing.getChildren().size());
  184. for(HSSFShape shape : drawing.getChildren()){
  185. assertEquals(shape.isNoFill(), true);
  186. assertEquals(shape.getLineStyle(), HSSFShape.LINESTYLE_DASHDOTGEL);
  187. assertEquals(shape.getLineStyleColor(), 0x616161);
  188. assertEquals(HexDump.toHex(shape.getFillColor()), shape.getFillColor(), 0x2CE03D);
  189. assertEquals(shape.getLineWidth(), HSSFShape.LINEWIDTH_ONE_PT*2);
  190. }
  191. }
  192. public void testShapeIds() {
  193. HSSFWorkbook wb = new HSSFWorkbook();
  194. HSSFSheet sheet1 = wb.createSheet();
  195. HSSFPatriarch patriarch1 = sheet1.createDrawingPatriarch();
  196. for(int i = 0; i < 2; i++) {
  197. patriarch1.createSimpleShape(new HSSFClientAnchor());
  198. }
  199. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  200. sheet1 = wb.getSheetAt(0);
  201. patriarch1 = sheet1.getDrawingPatriarch();
  202. EscherAggregate agg1 = HSSFTestHelper.getEscherAggregate(patriarch1);
  203. // last shape ID cached in EscherDgRecord
  204. EscherDgRecord dg1 =
  205. agg1.getEscherContainer().getChildById(EscherDgRecord.RECORD_ID);
  206. assertEquals(1026, dg1.getLastMSOSPID());
  207. // iterate over shapes and check shapeId
  208. EscherContainerRecord spgrContainer =
  209. agg1.getEscherContainer().getChildContainers().get(0);
  210. // root spContainer + 2 spContainers for shapes
  211. assertEquals(3, spgrContainer.getChildRecords().size());
  212. EscherSpRecord sp0 =
  213. ((EscherContainerRecord)spgrContainer.getChild(0)).getChildById(EscherSpRecord.RECORD_ID);
  214. assertEquals(1024, sp0.getShapeId());
  215. EscherSpRecord sp1 =
  216. ((EscherContainerRecord)spgrContainer.getChild(1)).getChildById(EscherSpRecord.RECORD_ID);
  217. assertEquals(1025, sp1.getShapeId());
  218. EscherSpRecord sp2 =
  219. ((EscherContainerRecord)spgrContainer.getChild(2)).getChildById(EscherSpRecord.RECORD_ID);
  220. assertEquals(1026, sp2.getShapeId());
  221. }
  222. /**
  223. * Test get new id for shapes from existing file
  224. * File already have for 1 shape on each sheet, because document must contain EscherDgRecord for each sheet
  225. */
  226. public void testAllocateNewIds(){
  227. HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("empty.xls");
  228. HSSFSheet sheet = wb.getSheetAt(0);
  229. HSSFPatriarch patriarch = sheet.getDrawingPatriarch();
  230. /**
  231. * 2048 - main SpContainer id
  232. * 2049 - existing shape id
  233. */
  234. assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 2050);
  235. assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 2051);
  236. assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 2052);
  237. sheet = wb.getSheetAt(1);
  238. patriarch = sheet.getDrawingPatriarch();
  239. /**
  240. * 3072 - main SpContainer id
  241. * 3073 - existing shape id
  242. */
  243. assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 3074);
  244. assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 3075);
  245. assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 3076);
  246. sheet = wb.getSheetAt(2);
  247. patriarch = sheet.getDrawingPatriarch();
  248. assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 1026);
  249. assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 1027);
  250. assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 1028);
  251. }
  252. }