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.

TestShapeGroup.java 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. package org.apache.poi.hssf.usermodel;
  2. import junit.framework.TestCase;
  3. import org.apache.poi.ddf.EscherContainerRecord;
  4. import org.apache.poi.ddf.EscherSpgrRecord;
  5. import org.apache.poi.hssf.HSSFTestDataSamples;
  6. import org.apache.poi.hssf.record.EscherAggregate;
  7. import org.apache.poi.hssf.record.ObjRecord;
  8. import java.lang.reflect.Field;
  9. import java.util.Arrays;
  10. import java.util.HashMap;
  11. import java.util.Map;
  12. /**
  13. * @author Evgeniy Berlog
  14. * @date 29.06.12
  15. */
  16. public class TestShapeGroup extends TestCase{
  17. public void testSetGetCoordinates(){
  18. HSSFWorkbook wb = new HSSFWorkbook();
  19. HSSFSheet sh = wb.createSheet();
  20. HSSFPatriarch patriarch = sh.createDrawingPatriarch();
  21. HSSFShapeGroup group = patriarch.createGroup(new HSSFClientAnchor());
  22. assertEquals(group.getX1(), 0);
  23. assertEquals(group.getY1(), 0);
  24. assertEquals(group.getX2(), 1023);
  25. assertEquals(group.getY2(), 255);
  26. group.setCoordinates(1,2,3,4);
  27. assertEquals(group.getX1(), 1);
  28. assertEquals(group.getY1(), 2);
  29. assertEquals(group.getX2(), 3);
  30. assertEquals(group.getY2(), 4);
  31. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  32. sh = wb.getSheetAt(0);
  33. patriarch = sh.getDrawingPatriarch();
  34. group = (HSSFShapeGroup) patriarch.getChildren().get(0);
  35. assertEquals(group.getX1(), 1);
  36. assertEquals(group.getY1(), 2);
  37. assertEquals(group.getX2(), 3);
  38. assertEquals(group.getY2(), 4);
  39. }
  40. public void testAddToExistingFile(){
  41. HSSFWorkbook wb = new HSSFWorkbook();
  42. HSSFSheet sh = wb.createSheet();
  43. HSSFPatriarch patriarch = sh.createDrawingPatriarch();
  44. HSSFShapeGroup group1 = patriarch.createGroup(new HSSFClientAnchor());
  45. HSSFShapeGroup group2 = patriarch.createGroup(new HSSFClientAnchor());
  46. group1.setCoordinates(1,2,3,4);
  47. group2.setCoordinates(5,6,7,8);
  48. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  49. sh = wb.getSheetAt(0);
  50. patriarch = sh.getDrawingPatriarch();
  51. assertEquals(patriarch.getChildren().size(), 2);
  52. HSSFShapeGroup group3 = patriarch.createGroup(new HSSFClientAnchor());
  53. group3.setCoordinates(9,10,11,12);
  54. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  55. sh = wb.getSheetAt(0);
  56. patriarch = sh.getDrawingPatriarch();
  57. assertEquals(patriarch.getChildren().size(), 3);
  58. }
  59. public void testModify() throws Exception {
  60. HSSFWorkbook wb = new HSSFWorkbook();
  61. // create a sheet with a text box
  62. HSSFSheet sheet = wb.createSheet();
  63. HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
  64. HSSFShapeGroup group1 = patriarch.createGroup(new
  65. HSSFClientAnchor(0,0,0,0,
  66. (short)0, 0, (short)15, 25));
  67. group1.setCoordinates(0, 0, 792, 612);
  68. HSSFTextbox textbox1 = group1.createTextbox(new
  69. HSSFChildAnchor(100, 100, 300, 300));
  70. HSSFRichTextString rt1 = new HSSFRichTextString("Hello, World!");
  71. textbox1.setString(rt1);
  72. // write, read back and check that our text box is there
  73. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  74. sheet = wb.getSheetAt(0);
  75. patriarch = sheet.getDrawingPatriarch();
  76. assertEquals(1, patriarch.getChildren().size());
  77. group1 = (HSSFShapeGroup)patriarch.getChildren().get(0);
  78. assertEquals(1, group1.getChildren().size());
  79. textbox1 = (HSSFTextbox)group1.getChildren().get(0);
  80. assertEquals("Hello, World!", textbox1.getString().getString());
  81. // modify anchor
  82. assertEquals(new HSSFChildAnchor(100, 100, 300, 300),
  83. textbox1.getAnchor());
  84. HSSFChildAnchor newAnchor = new HSSFChildAnchor(200,200, 400, 400);
  85. textbox1.setAnchor(newAnchor);
  86. // modify text
  87. textbox1.setString(new HSSFRichTextString("Hello, World! (modified)"));
  88. // add a new text box
  89. HSSFTextbox textbox2 = group1.createTextbox(new
  90. HSSFChildAnchor(400, 400, 600, 600));
  91. HSSFRichTextString rt2 = new HSSFRichTextString("Hello, World-2");
  92. textbox2.setString(rt2);
  93. assertEquals(2, group1.getChildren().size());
  94. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  95. sheet = wb.getSheetAt(0);
  96. patriarch = sheet.getDrawingPatriarch();
  97. assertEquals(1, patriarch.getChildren().size());
  98. group1 = (HSSFShapeGroup)patriarch.getChildren().get(0);
  99. assertEquals(2, group1.getChildren().size());
  100. textbox1 = (HSSFTextbox)group1.getChildren().get(0);
  101. assertEquals("Hello, World! (modified)",
  102. textbox1.getString().getString());
  103. assertEquals(new HSSFChildAnchor(200,200, 400, 400),
  104. textbox1.getAnchor());
  105. textbox2 = (HSSFTextbox)group1.getChildren().get(1);
  106. assertEquals("Hello, World-2", textbox2.getString().getString());
  107. assertEquals(new HSSFChildAnchor(400, 400, 600, 600),
  108. textbox2.getAnchor());
  109. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  110. sheet = wb.getSheetAt(0);
  111. patriarch = sheet.getDrawingPatriarch();
  112. group1 = (HSSFShapeGroup)patriarch.getChildren().get(0);
  113. textbox1 = (HSSFTextbox)group1.getChildren().get(0);
  114. textbox2 = (HSSFTextbox)group1.getChildren().get(1);
  115. HSSFTextbox textbox3 = group1.createTextbox(new
  116. HSSFChildAnchor(400,200, 600, 400));
  117. HSSFRichTextString rt3 = new HSSFRichTextString("Hello, World-3");
  118. textbox3.setString(rt3);
  119. }
  120. public void testAddShapesToGroup(){
  121. HSSFWorkbook wb = new HSSFWorkbook();
  122. // create a sheet with a text box
  123. HSSFSheet sheet = wb.createSheet();
  124. HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
  125. HSSFShapeGroup group = patriarch.createGroup(new HSSFClientAnchor());
  126. int index = wb.addPicture(new byte[]{1,2,3}, HSSFWorkbook.PICTURE_TYPE_JPEG);
  127. group.createPicture(new HSSFChildAnchor(), index);
  128. HSSFPolygon polygon = group.createPolygon(new HSSFChildAnchor());
  129. polygon.setPoints(new int[]{1,100, 1}, new int[]{1, 50, 100});
  130. group.createTextbox(new HSSFChildAnchor());
  131. group.createShape(new HSSFChildAnchor());
  132. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  133. sheet = wb.getSheetAt(0);
  134. patriarch = sheet.getDrawingPatriarch();
  135. assertEquals(1, patriarch.getChildren().size());
  136. assertTrue(patriarch.getChildren().get(0) instanceof HSSFShapeGroup);
  137. group = (HSSFShapeGroup) patriarch.getChildren().get(0);
  138. assertEquals(group.getChildren().size(), 4);
  139. assertTrue(group.getChildren().get(0) instanceof HSSFPicture);
  140. assertTrue(group.getChildren().get(1) instanceof HSSFPolygon);
  141. assertTrue(group.getChildren().get(2) instanceof HSSFTextbox);
  142. assertTrue(group.getChildren().get(3) instanceof HSSFSimpleShape);
  143. HSSFShapeGroup group2 = patriarch.createGroup(new HSSFClientAnchor());
  144. index = wb.addPicture(new byte[]{2,2,2}, HSSFWorkbook.PICTURE_TYPE_JPEG);
  145. group2.createPicture(new HSSFChildAnchor(), index);
  146. polygon = group2.createPolygon(new HSSFChildAnchor());
  147. polygon.setPoints(new int[]{1,100, 1}, new int[]{1, 50, 100});
  148. group2.createTextbox(new HSSFChildAnchor());
  149. group2.createShape(new HSSFChildAnchor());
  150. group2.createShape(new HSSFChildAnchor());
  151. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  152. sheet = wb.getSheetAt(0);
  153. patriarch = sheet.getDrawingPatriarch();
  154. assertEquals(2, patriarch.getChildren().size());
  155. group = (HSSFShapeGroup) patriarch.getChildren().get(1);
  156. assertEquals(group.getChildren().size(), 5);
  157. assertTrue(group.getChildren().get(0) instanceof HSSFPicture);
  158. assertTrue(group.getChildren().get(1) instanceof HSSFPolygon);
  159. assertTrue(group.getChildren().get(2) instanceof HSSFTextbox);
  160. assertTrue(group.getChildren().get(3) instanceof HSSFSimpleShape);
  161. assertTrue(group.getChildren().get(4) instanceof HSSFSimpleShape);
  162. group.getShapeId();
  163. }
  164. public void testSpgrRecord(){
  165. HSSFWorkbook wb = new HSSFWorkbook();
  166. // create a sheet with a text box
  167. HSSFSheet sheet = wb.createSheet();
  168. HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
  169. HSSFShapeGroup group = patriarch.createGroup(new HSSFClientAnchor());
  170. assertSame(((EscherContainerRecord)group.getEscherContainer().getChild(0)).getChildById(EscherSpgrRecord.RECORD_ID), getSpgrRecord(group));
  171. }
  172. private static EscherSpgrRecord getSpgrRecord(HSSFShapeGroup group) {
  173. Field spgrField = null;
  174. try {
  175. spgrField = group.getClass().getDeclaredField("_spgrRecord");
  176. spgrField.setAccessible(true);
  177. return (EscherSpgrRecord) spgrField.get(group);
  178. } catch (NoSuchFieldException e) {
  179. e.printStackTrace();
  180. } catch (IllegalAccessException e) {
  181. e.printStackTrace();
  182. }
  183. return null;
  184. }
  185. public void testClearShapes(){
  186. HSSFWorkbook wb = new HSSFWorkbook();
  187. HSSFSheet sheet = wb.createSheet();
  188. HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
  189. HSSFShapeGroup group = patriarch.createGroup(new HSSFClientAnchor());
  190. group.createShape(new HSSFChildAnchor());
  191. group.createShape(new HSSFChildAnchor());
  192. EscherAggregate agg = HSSFTestHelper.getEscherAggregate(patriarch);
  193. assertEquals(agg.getShapeToObjMapping().size(), 5);
  194. assertEquals(agg.getTailRecords().size(), 0);
  195. assertEquals(group.getChildren().size(), 2);
  196. group.clear();
  197. assertEquals(agg.getShapeToObjMapping().size(), 1);
  198. assertEquals(agg.getTailRecords().size(), 0);
  199. assertEquals(group.getChildren().size(), 0);
  200. wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
  201. sheet = wb.getSheetAt(0);
  202. patriarch = sheet.getDrawingPatriarch();
  203. group = (HSSFShapeGroup) patriarch.getChildren().get(0);
  204. assertEquals(agg.getShapeToObjMapping().size(), 1);
  205. assertEquals(agg.getTailRecords().size(), 0);
  206. assertEquals(group.getChildren().size(), 0);
  207. }
  208. }