blob: 58d93e45d9533e64838cfed7a315d6e7ad6be53e [file] [log] [blame]
/*
* 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;
}
}