Files
HRMS/hrmsEjb/jxl/read/biff/HyperlinkRecord.java
2025-07-28 13:56:49 +05:30

190 lines
5.8 KiB
Java

package jxl.read.biff;
import common.Logger;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import jxl.CellReferenceHelper;
import jxl.Hyperlink;
import jxl.Range;
import jxl.Sheet;
import jxl.WorkbookSettings;
import jxl.biff.IntegerHelper;
import jxl.biff.RecordData;
import jxl.biff.SheetRangeImpl;
import jxl.biff.StringHelper;
public class HyperlinkRecord extends RecordData implements Hyperlink {
private static Logger logger = Logger.getLogger(HyperlinkRecord.class);
private int firstRow;
private int lastRow;
private int firstColumn;
private int lastColumn;
private URL url;
private File file;
private String location;
private SheetRangeImpl range;
private LinkType linkType;
private static class LinkType {
private LinkType() {}
}
private static final LinkType urlLink = new LinkType();
private static final LinkType fileLink = new LinkType();
private static final LinkType workbookLink = new LinkType();
private static final LinkType unknown = new LinkType();
HyperlinkRecord(Record t, Sheet s, WorkbookSettings ws) {
super(t);
this.linkType = unknown;
byte[] data = getRecord().getData();
this.firstRow = IntegerHelper.getInt(data[0], data[1]);
this.lastRow = IntegerHelper.getInt(data[2], data[3]);
this.firstColumn = IntegerHelper.getInt(data[4], data[5]);
this.lastColumn = IntegerHelper.getInt(data[6], data[7]);
this.range = new SheetRangeImpl(s, this.firstColumn, this.firstRow, this.lastColumn, this.lastRow);
int options = IntegerHelper.getInt(data[28], data[29], data[30], data[31]);
boolean description = ((options & 0x14) != 0);
int startpos = 32;
int descbytes = 0;
if (description) {
int descchars = IntegerHelper.getInt(data[startpos], data[startpos + 1], data[startpos + 2], data[startpos + 3]);
descbytes = descchars * 2 + 4;
}
startpos += descbytes;
boolean targetFrame = ((options & 0x80) != 0);
int targetbytes = 0;
if (targetFrame) {
int targetchars = IntegerHelper.getInt(data[startpos], data[startpos + 1], data[startpos + 2], data[startpos + 3]);
targetbytes = targetchars * 2 + 4;
}
startpos += targetbytes;
if ((options & 0x3) == 3) {
this.linkType = urlLink;
if (data[startpos] == 3)
this.linkType = fileLink;
} else if ((options & 0x1) != 0) {
this.linkType = fileLink;
if (data[startpos] == -32)
this.linkType = urlLink;
} else if ((options & 0x8) != 0) {
this.linkType = workbookLink;
}
if (this.linkType == urlLink) {
String urlString = null;
try {
startpos += 16;
int bytes = IntegerHelper.getInt(data[startpos], data[startpos + 1], data[startpos + 2], data[startpos + 3]);
urlString = StringHelper.getUnicodeString(data, bytes / 2 - 1, startpos + 4);
this.url = new URL(urlString);
} catch (MalformedURLException e) {
logger.warn("URL " + urlString + " is malformed. Trying a file");
try {
this.linkType = fileLink;
this.file = new File(urlString);
} catch (Exception e3) {
logger.warn("Cannot set to file. Setting a default URL");
try {
this.linkType = urlLink;
this.url = new URL("http://www.andykhan.com/jexcelapi/index.html");
} catch (MalformedURLException e2) {}
}
} catch (Throwable e) {
StringBuffer sb1 = new StringBuffer();
StringBuffer sb2 = new StringBuffer();
CellReferenceHelper.getCellReference(this.firstColumn, this.firstRow, sb1);
CellReferenceHelper.getCellReference(this.lastColumn, this.lastRow, sb2);
sb1.insert(0, "Exception when parsing URL ");
sb1.append('"').append(sb2.toString()).append("\". Using default.");
logger.warn(sb1, e);
try {
this.url = new URL("http://www.andykhan.com/jexcelapi/index.html");
} catch (MalformedURLException e2) {}
}
} else if (this.linkType == fileLink) {
try {
startpos += 16;
int upLevelCount = IntegerHelper.getInt(data[startpos], data[startpos + 1]);
int chars = IntegerHelper.getInt(data[startpos + 2], data[startpos + 3], data[startpos + 4], data[startpos + 5]);
String fileName = StringHelper.getString(data, chars - 1, startpos + 6, ws);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < upLevelCount; i++)
sb.append("..\\");
sb.append(fileName);
this.file = new File(sb.toString());
} catch (Throwable e) {
e.printStackTrace();
logger.warn("Exception when parsing file " + e.getClass().getName() + ".");
this.file = new File(".");
}
} else if (this.linkType == workbookLink) {
int chars = IntegerHelper.getInt(data[32], data[33], data[34], data[35]);
this.location = StringHelper.getUnicodeString(data, chars - 1, 36);
} else {
logger.warn("Cannot determine link type");
return;
}
}
public boolean isFile() {
return (this.linkType == fileLink);
}
public boolean isURL() {
return (this.linkType == urlLink);
}
public boolean isLocation() {
return (this.linkType == workbookLink);
}
public int getRow() {
return this.firstRow;
}
public int getColumn() {
return this.firstColumn;
}
public int getLastRow() {
return this.lastRow;
}
public int getLastColumn() {
return this.lastColumn;
}
public URL getURL() {
return this.url;
}
public File getFile() {
return this.file;
}
public Record getRecord() {
return super.getRecord();
}
public Range getRange() {
return (Range)this.range;
}
public String getLocation() {
return this.location;
}
}