first commit
This commit is contained in:
189
hrmsEjb/jxl/read/biff/HyperlinkRecord.java
Normal file
189
hrmsEjb/jxl/read/biff/HyperlinkRecord.java
Normal file
@@ -0,0 +1,189 @@
|
||||
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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user