From: Yegor Kozlov Date: Wed, 24 Oct 2012 12:11:31 +0000 (+0000) Subject: support links to slides in HSLF X-Git-Tag: 3.10-beta1~118 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=ef3a0c8ae9cd0b0ad24f7d53cc634675e1ee39a4;p=poi.git support links to slides in HSLF git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1401642 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java b/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java index 010bf6d6b8..0aa8db32de 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java +++ b/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java @@ -33,22 +33,39 @@ public final class CreateHyperlink { public static void main(String[] args) throws Exception { SlideShow ppt = new SlideShow(); - Slide slide = ppt.createSlide(); + Slide slideA = ppt.createSlide(); + Slide slideB = ppt.createSlide(); + Slide slideC = ppt.createSlide(); - TextBox shape = new TextBox(); - shape.setText("Apache POI"); - Rectangle anchor = new Rectangle(100, 100, 200, 50); - shape.setAnchor(anchor); + // link to a URL + TextBox textBox1 = new TextBox(); + textBox1.setText("Apache POI"); + textBox1.setAnchor(new Rectangle(100, 100, 200, 50)); - String text = shape.getText(); + String text = textBox1.getText(); Hyperlink link = new Hyperlink(); link.setAddress("http://www.apache.org"); - link.setTitle(shape.getText()); + link.setTitle(textBox1.getText()); int linkId = ppt.addHyperlink(link); - shape.setHyperlink(linkId, 0, text.length()); + // apply link to the text + textBox1.setHyperlink(linkId, 0, text.length()); - slide.addShape(shape); + slideA.addShape(textBox1); + + // link to another slide + TextBox textBox2 = new TextBox(); + textBox2.setText("Go to slide #3"); + textBox2.setAnchor(new Rectangle(100, 300, 200, 50)); + + Hyperlink link2 = new Hyperlink(); + link2.setAddress(slideC); + ppt.addHyperlink(link2); + + // apply link to the whole shape + textBox2.setHyperlink(link2); + + slideA.addShape(textBox2); FileOutputStream out = new FileOutputStream("hyperlink.ppt"); ppt.write(out); diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java b/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java index 5c33d807ee..fbdd2e7aee 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java @@ -37,6 +37,7 @@ public final class Hyperlink { public static final byte LINK_PREVIOUSSLIDE = InteractiveInfoAtom.LINK_PreviousSlide; public static final byte LINK_FIRSTSLIDE = InteractiveInfoAtom.LINK_FirstSlide; public static final byte LINK_LASTSLIDE = InteractiveInfoAtom.LINK_LastSlide; + public static final byte LINK_SLIDENUMBER = InteractiveInfoAtom.LINK_SlideNumber; public static final byte LINK_URL = InteractiveInfoAtom.LINK_Url; public static final byte LINK_NULL = InteractiveInfoAtom.LINK_NULL; @@ -76,6 +77,8 @@ public final class Hyperlink { title = "LAST"; address = "1,-1,LAST"; break; + case LINK_SLIDENUMBER: + break; default: title = ""; address = ""; @@ -92,6 +95,13 @@ public final class Hyperlink { return address; } + public void setAddress(Slide slide) { + String href = slide._getSheetNumber() + ","+slide.getSlideNumber()+",Slide " + slide.getSlideNumber(); + setAddress(href);; + setTitle("Slide " + slide.getSlideNumber()); + setType(Hyperlink.LINK_SLIDENUMBER); + } + public void setAddress(String str) { address = str; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java index 8e3b9d2701..1a4ae896b3 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java @@ -401,7 +401,12 @@ public abstract class SimpleShape extends Shape { infoAtom.setJump(InteractiveInfoAtom.JUMP_NONE); infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_Url); break; - } + case Hyperlink.LINK_SLIDENUMBER: + infoAtom.setAction(InteractiveInfoAtom.ACTION_HYPERLINK); + infoAtom.setJump(InteractiveInfoAtom.JUMP_NONE); + infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_SlideNumber); + break; + } infoAtom.setHyperlinkID(link.getId()); diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/ExHyperlink.java b/src/scratchpad/src/org/apache/poi/hslf/record/ExHyperlink.java index 3ea5b0159d..92245598f6 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/ExHyperlink.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/ExHyperlink.java @@ -67,6 +67,13 @@ public class ExHyperlink extends RecordContainer { linkDetailsB.setText(url); } } + public void setLinkURL(String url, int options) { + if(linkDetailsB != null) { + linkDetailsB.setText(url); + linkDetailsB.setOptions(options); + } + } + public void setLinkTitle(String title) { if(linkDetailsA != null) { linkDetailsA.setText(title); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java index 8061cc8176..4561f8e4d3 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java @@ -1062,7 +1062,11 @@ public final class SlideShow { ExHyperlink ctrl = new ExHyperlink(); ExHyperlinkAtom obj = ctrl.getExHyperlinkAtom(); obj.setNumber(objectId); - ctrl.setLinkURL(link.getAddress()); + if(link.getType() == Hyperlink.LINK_SLIDENUMBER) { + ctrl.setLinkURL(link.getAddress(), 0x30); + } else { + ctrl.setLinkURL(link.getAddress()); + } ctrl.setLinkTitle(link.getTitle()); lst.addChildAfter(ctrl, objAtom); link.setId(objectId);