| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* $Id$ */ |
| |
| package org.apache.fop.render.rtf.rtflib.rtfdoc; |
| |
| /* |
| * This file is part of the RTF library of the FOP project, which was originally |
| * created by Bertrand Delacretaz <bdelacretaz@codeconsult.ch> and by other |
| * contributors to the jfor project (www.jfor.org), who agreed to donate jfor to |
| * the FOP project. |
| */ |
| |
| import java.io.IOException; |
| import java.io.Writer; |
| |
| import org.apache.fop.apps.FOPException; |
| |
| /** |
| * <p>Creates an hyperlink. |
| * This class belongs to the <fo:basic-link> tag processing.</p> |
| * |
| * <p>This work was authored by Andreas Putz (a.putz@skynamics.com).</p> |
| */ |
| public class RtfHyperLink |
| extends RtfContainer |
| implements IRtfTextContainer, |
| IRtfTextrunContainer { |
| |
| ////////////////////////////////////////////////// |
| // @@ Members |
| ////////////////////////////////////////////////// |
| |
| /** The url of the image */ |
| protected String url; |
| |
| /** RtfText */ |
| protected RtfText mText; |
| |
| ////////////////////////////////////////////////// |
| // @@ Construction |
| ////////////////////////////////////////////////// |
| |
| |
| /** |
| * A constructor. |
| * |
| * @param parent a <code>RtfContainer</code> value |
| * @param writer a <code>Writer</code> value |
| * @param str text of the link |
| * @param attr a <code>RtfAttributes</code> value |
| * @throws IOException for I/O problems |
| */ |
| public RtfHyperLink(IRtfTextContainer parent, Writer writer, String str, RtfAttributes attr) |
| throws IOException { |
| super((RtfContainer) parent, writer, attr); |
| new RtfText(this, writer, str, attr); |
| } |
| |
| /** |
| * A constructor. |
| * |
| * @param parent a <code>RtfContainer</code> value |
| * @param writer a <code>Writer</code> value |
| * @param attr a <code>RtfAttributes</code> value |
| * @throws IOException for I/O problems |
| */ |
| public RtfHyperLink(RtfTextrun parent, Writer writer, RtfAttributes attr) |
| throws IOException { |
| super((RtfContainer) parent, writer, attr); |
| } |
| |
| |
| ////////////////////////////////////////////////// |
| // @@ RtfElement implementation |
| ////////////////////////////////////////////////// |
| |
| /** |
| * Writes the RTF content to m_writer. |
| * |
| * @exception IOException On error |
| */ |
| public void writeRtfPrefix() throws IOException { |
| super.writeGroupMark(true); |
| super.writeControlWord("field"); |
| |
| super.writeGroupMark(true); |
| super.writeStarControlWord("fldinst"); |
| |
| writer.write("HYPERLINK \"" + url + "\" "); |
| super.writeGroupMark(false); |
| |
| super.writeGroupMark(true); |
| super.writeControlWord("fldrslt"); |
| |
| // start a group for this paragraph and write our own attributes if needed |
| if (attrib != null && attrib.isSet("cs")) { |
| writeGroupMark(true); |
| writeAttributes(attrib, new String [] {"cs"}); |
| } |
| } |
| |
| /** |
| * Writes the RTF content to m_writer. |
| * |
| * @exception IOException On error |
| */ |
| public void writeRtfSuffix() throws IOException { |
| if (attrib != null && attrib.isSet("cs")) { |
| writeGroupMark(false); |
| } |
| super.writeGroupMark(false); |
| super.writeGroupMark(false); |
| } |
| |
| |
| ////////////////////////////////////////////////// |
| // @@ IRtfContainer implementation |
| ////////////////////////////////////////////////// |
| |
| /** |
| * close current text run if any and start a new one with default attributes |
| * @param str if not null, added to the RtfText created |
| * @throws IOException for I/O problems |
| * @return new RtfText object |
| */ |
| public RtfText newText(String str) throws IOException { |
| return newText(str, null); |
| } |
| |
| /** |
| * close current text run if any and start a new one |
| * @param str if not null, added to the RtfText created |
| * @param attr attributes of text to add |
| * @throws IOException for I/O problems |
| * @return the new RtfText object |
| */ |
| public RtfText newText(String str, RtfAttributes attr) throws IOException { |
| closeAll(); |
| mText = new RtfText(this, writer, str, attr); |
| return mText; |
| } |
| |
| /** |
| * IRtfTextContainer requirement: |
| * @return a copy of our attributes |
| * @throws FOPException if attributes cannot be cloned |
| */ |
| public RtfAttributes getTextContainerAttributes() throws FOPException { |
| if (attrib == null) { |
| return null; |
| } |
| try { |
| return (RtfAttributes) this.attrib.clone(); |
| } catch (CloneNotSupportedException e) { |
| throw new FOPException(e); |
| } |
| } |
| |
| |
| /** |
| * add a line break |
| * @throws IOException for I/O problems |
| */ |
| public void newLineBreak() throws IOException { |
| new RtfLineBreak(this, writer); |
| } |
| |
| |
| ////////////////////////////////////////////////// |
| // @@ Common container methods |
| ////////////////////////////////////////////////// |
| |
| private void closeCurrentText() throws IOException { |
| if (mText != null) { |
| mText.close(); |
| } |
| } |
| |
| private void closeAll() throws IOException { |
| closeCurrentText(); |
| } |
| |
| |
| ////////////////////////////////////////////////// |
| // @@ Member access |
| ////////////////////////////////////////////////// |
| |
| /** |
| * Sets the url of the external link. |
| * |
| * @param url Link url like "http://..." |
| */ |
| public void setExternalURL(String url) { |
| this.url = url; |
| } |
| |
| /** |
| * Sets the url of the external link. |
| * |
| * @param jumpTo Name of the text mark |
| */ |
| public void setInternalURL(String jumpTo) { |
| int now = jumpTo.length(); |
| int max = RtfBookmark.MAX_BOOKMARK_LENGTH; |
| this.url = "#" + jumpTo.substring(0, now > max ? max : now); |
| this.url = this.url.replace('.', RtfBookmark.REPLACE_CHARACTER); |
| this.url = this.url.replace(' ', RtfBookmark.REPLACE_CHARACTER); |
| } |
| |
| /** |
| * |
| * @return false (always) |
| */ |
| public boolean isEmpty() { |
| return false; |
| } |
| |
| /** |
| * @return a text run |
| * @throws IOException if not caught |
| */ |
| public RtfTextrun getTextrun() throws IOException { |
| RtfTextrun textrun = RtfTextrun.getTextrun(this, writer, null); |
| return textrun; |
| } |
| } |