From fd1b5c87cf7ec8aad5905c844dcba1e95f9bbc17 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Wed, 17 Nov 2021 13:00:09 +0000 Subject: [PATCH] try to make comments table more extensible git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1895104 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/xssf/model/CommentsTable.java | 36 ++++++++++++++++++ .../poi/xssf/usermodel/XSSFDrawing.java | 24 +----------- .../apache/poi/xssf/usermodel/XSSFSheet.java | 5 ++- .../poi/xssf/usermodel/XSSFVMLDrawing.java | 7 +++- poi/src/main/java9/module-info.class | Bin 3385 -> 3421 bytes 5 files changed, 46 insertions(+), 26 deletions(-) diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/model/CommentsTable.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/model/CommentsTable.java index 016eb2c3b8..876339f2fa 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/model/CommentsTable.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/model/CommentsTable.java @@ -25,11 +25,16 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import com.microsoft.schemas.vml.CTShape; import org.apache.poi.ooxml.POIXMLDocumentPart; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.ss.util.CellAddress; import org.apache.poi.util.Internal; +import org.apache.poi.util.Units; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFComment; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFVMLDrawing; import org.apache.xmlbeans.XmlException; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTComment; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCommentList; @@ -168,6 +173,37 @@ public class CommentsTable extends POIXMLDocumentPart implements Comments { return commentRefs.keySet().iterator(); } + /** + * Create a new comment and add to the CommentTable. + * @param sheet sheet to add comment to + * @param clientAnchor the anchor for this comment + * @return new XSSFComment + * @since POI 5.2.0 + */ + public XSSFComment createNewComment(XSSFSheet sheet, XSSFClientAnchor clientAnchor) { + XSSFVMLDrawing vml = sheet.getVMLDrawing(true); + com.microsoft.schemas.vml.CTShape vmlShape = vml.newCommentShape(); + if (clientAnchor.isSet()) { + // convert offsets from emus to pixels since we get a + // DrawingML-anchor + // but create a VML Drawing + int dx1Pixels = clientAnchor.getDx1() / Units.EMU_PER_PIXEL; + int dy1Pixels = clientAnchor.getDy1() / Units.EMU_PER_PIXEL; + int dx2Pixels = clientAnchor.getDx2() / Units.EMU_PER_PIXEL; + int dy2Pixels = clientAnchor.getDy2() / Units.EMU_PER_PIXEL; + String position = clientAnchor.getCol1() + ", " + dx1Pixels + ", " + clientAnchor.getRow1() + ", " + dy1Pixels + ", " + + clientAnchor.getCol2() + ", " + dx2Pixels + ", " + clientAnchor.getRow2() + ", " + dy2Pixels; + vmlShape.getClientDataArray(0).setAnchorArray(0, position); + } + CellAddress ref = new CellAddress(clientAnchor.getRow1(), clientAnchor.getCol1()); + + if (findCellComment(ref) != null) { + throw new IllegalArgumentException("Multiple cell comments in one cell are not allowed, cell: " + ref); + } + + return new XSSFComment(this, newComment(ref), vmlShape); + } + /** * Refresh Map commentRefs cache, * Calls that use the commentRefs cache will perform in O(1) diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java index ee953ba50c..99a0bed281 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java @@ -42,7 +42,6 @@ import org.apache.poi.openxml4j.opc.PackagingURIHelper; import org.apache.poi.openxml4j.opc.TargetMode; import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.ss.usermodel.Drawing; -import org.apache.poi.ss.util.CellAddress; import org.apache.poi.ss.util.ImageUtils; import org.apache.poi.util.Internal; import org.apache.poi.util.Units; @@ -384,29 +383,8 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements DrawingAg`xBE`vuUP2&C0t7+~gbrHy+SXc@ge2Qp>e74fy?35~ zKX?Ehgva188aL%y+3Y#{*}gM(H091*{qx^ne*-v(KTEjZz`{z{j$JkB`O3iZR#=5u9y0N;iAPL4YT_{ynd*M4JYkhhOqp;^ zR0)buBh(2Ef=8GpGzmVTMF5%O8B*e-%9wsgg*={$|cFb$}p~5 zPUN@^WksQv{To=2<<6RN63*$CoPry+T49h_Zs_~UO+EfTVPI{cMpd~6Ruzc6(7=*` zrIwR64j5QmiJUl5hrP6-(lagkVZH7Jb&EeIrdd;5>n{#|R#nnW!^pt0>1xwz2T41M z!Z=k`154QhyBD7=v1Kmh7VMrUy*S6$?RKJKPMGoy>?+(j(y(h`kS4v9<}FpLwO&a1 zMRhuj9XAbQ1EyxT5hc7~Q^Bg8+f^vx*Oq!+NzEnc<$$cIx$5)tyvv zwF({R>$#k%6&6eP?6UO)6|*D24P`P zxiS^n8OrU3@*@>Gz()qr8yy&Mke{rV(Zy{ zd&&!(cqVoy49unGO3s{!=h==qtR<-vRGsW7>K%}G>vYzrdNz6r(mlnFNc+?{pkyXV zRcrhd^ep5xiqqP1+&C<#M{j?Sja0qlJy8^gT*-9Cz{bKHBs_tfI-i);nmF<8YV35! z>)aREbro_zy1OjRHLpHxSn9RpaRvK^$IrkD-5CyjY)6uRl3to5;b|Q6?P5TmAbnBW z=PO@N+DK+QDc>jh%*)BSX|tol575s|PDyo~f{Q~_$UJRkchwwEtF;5UZ^zGa&e%Yy zV5;S`qO?9|;O*?XD#&)OK6*c~^`Ue$JjRX`Ysu)yUMccZCELyd+vVG<>-f#_%d2?g zbfeK@4eZve4$q-|WN_D>h{KLoRou#ZH03iQIK}mt3d80|eXp+WkDhE-e70F>gx!(8 zJ`M&=b1XakCsn{cWM1fIM=l?CykO||q`W9_50^DJdgFNThGHMBR3-<$5BKP48Mwml zS}i9!!=YKg;8*M3-#pCYFY|C7&gbQSae*u^#Qa&HgbU@@g8o|eu}Hoz7A|2f#WH3I z%Y`e1hp>`A0aHlARl?Q6HNv&Rb;9++4Z@AWO~TE>EyAtBZNlxs9m1W$UBZim7Yi>D zUMk!zyiB-9xL0TiZQ(v)S-4+#KsX^hD7;*Fh44z@Rl=)<*9fl_UMIX>c!The@J8Wb z;Z4Gug-3*w!drw#g~x=q3U3qME<7&0LwKj~gzzpQxSA(X!QHrrD|?dbeJ}qqaEgB$ GxbJ^K=i(&* literal 3385 zcmai$_nzBC5XXNTAV)4e-t^umA(3*)C3FIT90?EzF%UZJNo!kYSrU?L$JC?u-XZkP zBk%_gz*F!fd>D;f6iasQ^SQ5W?ab_yomu_!-(PXYIW!1D1_)hX)!Xkl1iKsEFA~LaX>aelj zI8ee8fvp*N%WpJ%FET9Ob+r{c^nJR7WdiF8g=}q=utH#U!K&kzuu5QQ&tyZzwSy%{ zfhFZYg^@n$#AO|qu;zU0u3xP>Ue%z_={fTBfH5^~OqH;n6gh&fKnWXrPi!64V?QWi zv%vB>yKXeSs2K!)7;9T%tH3hy&rDNdQaU8Ir#@$%nW>)=JJXEhm&|6QLrT4NC3Xw! zKHp|ne;{O5d@qh9E>A0xwP)KEi7V5vv(NR}I8;{bhZ0u_l!i8_1re$36WCm^U}kj9 z5h88vx^>TQdlFLx=A*>?L4hs9=4rvyE$zkK;13Dx7%7uU($xaSh2>1U*=Te^ZTTS; z>)Ha}dH+Fbt`}HeWVY+wjRG5rmU}xK$(OE{?2xXTs#*sEnn zqjxi{nhIlyV*=a9NpaUn+@3#rS=TH&P!cCDU@Pndu`hAw_%H*f<;Ss_b+yFF5n*OZ zdCv%IeG#*!-9U$ww0raCnuBP@4mD0$VB=6Gs39v+zy0pdm#-_31SWANpYY5&m5)ZG z#6tqRinmFun6r+j!cJ&SOFS}O(&BWgfM&*H0z1dpjAG^4DmlYXA!9y~MuY-3(jI>rUUBpd_z%C$(m`={n=J-UE<69^_gma zo%gXF4BiPQ@QuKpp`+G6#^$l!C3hBrSAWd*n>w&M$f61NToV$LohM!!I(O3H&B7HRMlv zAM|55UM|n{;^?dWkxx|5Cwg&gsNg)$<^e%3&*|R+Ttr_M;9^`tkN?F&emsdw=YdHq z=3h&h%b6>gCFW}4TC5{ZVgqv%^9Z)kC$NpVgSm@&8S@I}9_C)A!Q9V0z?^0tW?sX* zj(G#~Cg#n|qs-fwGtA@6JD7Jd?`EE2o@U<1e1Q2N^I_(r%*UBeGH01Kv%;(~=a??j zV+PES88chVv&^TN&oZB9&NE+PzQTNs`3CbX<~z*ym>)1dVt&H>jQIugD<-It=kP7Q V$B$Imb5!Y{>6gH-^jqNf{{aAB*t!4!