📄 txtreadercanvas.java
字号:
if (index == 8) {
break;
}
if (i == currentBookMarkIndex) {
continue;
}
record.addRecord(allBookMarks[i].getBytes());
index++;
}
Mark m = new Mark(0, currentOffset, new byte[0]);
currentMarks.insertElementAt(m, 0);
Mark[] ms = new Mark[currentMarks.size()];
for (int i = ms.length - 1; i > -1; i--) {
ms[i] = (Mark) currentMarks.elementAt(i);
}
BookMark bmtemp = new BookMark();
bmtemp.write(filename, txtLenght, ms);
//写入当前书签
record.addRecord(bmtemp.getBytes());
record.close();
}
/**
* 从RMS中寻找所有的BookMark,并且找到当前的BookMark和Mark项
*/
void openRec() {
Record r = new Record("avbookmark");
r.open();
int num = r.getNumRecords();
if (num < 1) { //没有任何记录
currentOffset = 0;
r.close();
return;
}
allBookMarks = new BookMark[num];
//寻找符合当前文件的书签
for (int i = 0; i < num; i++) {
byte[] b = r.getRecord(1 + i); //RecordStore的RecordID总是从1开始
BookMark ibm = new BookMark();
if (!ibm.decodeBookMark(b)) {
continue;
}
allBookMarks[i] = ibm;
if (ibm.getFilename().endsWith(filename) &&
ibm.getFileLenght() == txtLenght) { //找到当前书签后,从书签列表中删除
currentBookMarkIndex = i;
}
}
r.close();
if (currentBookMarkIndex == -1) { //没有当前书签
currentOffset = 0;
return;
}
//找到当前的Mark项
Mark[] marks = allBookMarks[currentBookMarkIndex].getMarks();
for (int i = 0; i < marks.length; i++) {
currentMarks.addElement(marks[i]);
}
currentOffset = ((Mark) currentMarks.elementAt(0)).offset; //第一项为最后阅读的位置
currentMarks.removeElementAt(0); //删除最后阅读位置,因为并非用户定义的书签
}
//根据屏幕方式映射按键
private int mapKey(int keyCode) {
if (AnyView.readType == 1) { //横屏
switch (keyCode) {
case -1: //up
return -4; //right
case -2: //down
return -3; //left
case -3: //left
return -1; //up
case -4: //right
return -2; //down
}
}
return keyCode;
}
private void readInfo() {
long usedTime = System.currentTimeMillis() -
AnyView.StartTime;
String[] msg = new String[6];
long hour = usedTime / 3600000L;
usedTime -= hour * 3600000L;
long min = usedTime / 60000L;
usedTime -= min * 60000L;
long sec = usedTime / 1000L;
msg[1] = "软件使用: " + hour + "小时" + min + "分" + sec + "秒";
Calendar calendar = Calendar.getInstance();
hour = calendar.get(Calendar.HOUR);
min = calendar.get(Calendar.MINUTE);
sec = calendar.get(Calendar.SECOND);
int pm = calendar.get(Calendar.AM_PM);
hour = pm == 1 ? hour + 12 : hour;
msg[0] = "当前时间: " + hour + "点" + min + "分" + sec + "秒";
msg[2] = "当前位置: " + (100 * currentOffset / txtLenght) +
"%";
msg[3] = "定义书签: " + currentMarks.size() + "个";
msg[4] = " ";
msg[5] = "请按任意键继续……";
message.showMessage("阅读信息", msg);
currentWindow = null;
menu = null;
showMenu = false;
msg = null;
}
private void selectBookMark() {
selector = null;
currentWindow = null;
System.gc();
byte[][] selectbmitems = new byte[currentMarks.size()][];
for (int i = 0; i < selectbmitems.length; i++) {
selectbmitems[i] = ((Mark) currentMarks.elementAt(i)).
data;
}
selector = new Selector("选择书签", selectbmitems, 0);
currentWindow = selector;
selectbmitems = null;
}
private void addBookMark() {
int start = ((TxtLine) mylines.elementAt(0)).offset;
int len = start + bufferTxt.length - currentOffset;
len = len > 24 ? 24 : len;
byte[] b = new byte[len];
System.arraycopy(bufferTxt, currentOffset - start, b, 0,
b.length);
Mark mark = new Mark(0, currentOffset, b);
currentMarks.insertElementAt(mark, 0);
b = null;
mark = null;
System.gc();
message.showMessage("添加书签", new String[] {"添加书签成功!",
" ", "按任意键继续……"});
currentWindow = null;
menu = null;
showMenu = false;
}
private void deleteBookMark() {
selector = null;
currentWindow = null;
System.gc();
byte[][] deletebmitems = new byte[currentMarks.size()][];
for (int i = 0; i < deletebmitems.length; i++) {
deletebmitems[i] = ((Mark) currentMarks.elementAt(i)).
data;
}
selector = new Selector("删除书签", deletebmitems, 0);
currentWindow = selector;
}
private void freeJump() {
if (txtLenght < 16384) { //小于16K的文档不允许跳转
message.showMessage("提示", new String[] {"自由跳转功能对小",
"于16K的文档无效!", " ", "按任意键继续……"});
currentWindow = null;
menu = null;
showMenu = false;
repaint();
return;
} else {
selector = null;
currentWindow = null;
System.gc();
int percent = 100 * currentOffset / txtLenght;
currentWindow = new Progress(percent);
}
}
private void shareTxt() {
TxtLine txt;
txt = (TxtLine) mylines.elementAt(0);
int off = txt.offset;
txt = (TxtLine) mylines.elementAt(currentLine);
int start = txt.offset - off;
txt = (TxtLine) mylines.elementAt(currentLine + lineOfPage);
int end = txt.offset - off;
byte[] b = new byte[end - start];
//message.showMessage("ti", new String[] {"" + start, "" + end});
System.arraycopy(bufferTxt, start, b, 0, b.length);
String str = AnyView.cf.byte2unicode(b);
b = null;
showMenu = false;
AnyView.av.display.setCurrent(new SMSText(this, str));
}
private void showSearch() {
/*if (!menu.getTouchEvent()) {
return;
}
selector = null;
currentWindow = null;
System.gc();
search = new Input("Search", "请输入要搜索的文字", "搜索功能暂不可用!");
currentWindow = search;*/
showMenu = false;
AnyView.av.display.setCurrent(new Search(this, searchStr));
}
public boolean search(String str, boolean start) {
if (null == str) {
return false;
}
boolean flag = false;
finds.removeAllElements();
byte[] abyte = AnyView.cf.str2bytes(str);
searchStrLenght = abyte.length;
if (searchStrLenght < 3) {
return false;
}
searchStr = str;
needsearch = true;
AnyView.cf.setColor(0xFFFFFF -
ColorSelector.colors[AnyView.frontColor]);
Image temp = AnyView.cf.buildImage(str);
serachImage = Image.createImage(temp.getWidth(), temp.getHeight());
Graphics g = serachImage.getGraphics();
g.setColor(ColorSelector.colors[AnyView.frontColor]);
g.fillRect(0, 0, temp.getWidth(), temp.getHeight());
g.drawImage(temp, 0, 0, ANCHOR);
int oldCurrentOffset = ((TxtLine) mylines.elementAt(0)).offset;
int oldCurrentLine = currentLine;
byte[] oldbufferbuffer = new byte[bufferbuffer.length];
System.arraycopy(bufferbuffer, 0, oldbufferbuffer, 0,
bufferbuffer.length);
boolean canbreak = false;
//是否需要从当前阅读位置开始查找
if (!start) {
if (abyte.length > bufferTxt.length) { //要查找的内容比缓冲区还大,返回
return flag;
}
int pos = ((TxtLine) mylines.elementAt(currentLine)).offset -
oldCurrentOffset;
int len = bufferTxt.length - pos - abyte.length;
for (int i = 0; i < len; i++) { //尝试从当前位置开始查找
if (ismatch(abyte, bufferTxt, i + pos)) {
finds.addElement(new Integer(oldCurrentOffset + pos + i));
canbreak = true;
i += searchStrLenght - 1;
}
}
if (canbreak) { //已经从当前位置找到
//仅仅定位到当前行,而不重置缓冲
pos = ((Integer) finds.elementAt(0)).intValue();
for (int i = 0; i < mylines.size(); i++) {
if (((TxtLine) mylines.elementAt(i)).offset >= pos) {
break;
}
currentLine = i;
}
prepareNextImage();
repaint();
return true;
}
}
if (start) {
currentOffset = 0;
currentLine = 0;
bufferbuffer = new byte[0];
fsa.locate(0);
} else {
currentOffset = oldCurrentOffset + bufferTxt.length;
currentLine = 0;
}
readNextBuffer();
while (true) {
if (abyte.length > bufferTxt.length) {
return flag;
}
int len = bufferTxt.length - abyte.length + 1;
for (int i = 0; i < len; i++) {
if (ismatch(abyte, bufferTxt, i)) {
finds.addElement(new Integer(currentOffset + i));
canbreak = true;
i += searchStrLenght - 1;
}
}
if (canbreak || eof) {
break;
} else {
currentOffset += bufferTxt.length;
readNextBuffer();
}
}
/*for (int i = 0; i < finds.size(); i++) {
System.out.println(Integer.toHexString(((Integer) finds.elementAt(i)).
intValue()));
}*/
if (finds.size() > 0) { //搜索到内容
needsearch = true;
analysisBuffer();
int pos = ((Integer) finds.elementAt(0)).intValue();
for (int i = 0; i < mylines.size(); i++) {
if (((TxtLine) mylines.elementAt(i)).offset >=
pos) {
break;
}
currentLine = i;
}
} else {
currentOffset = oldCurrentOffset;
needsearch = false;
fsa.locate(oldCurrentOffset);
/*bufferbuffer = new byte[oldbufferbuffer.length];
System.arraycopy(oldbufferbuffer, 0, bufferbuffer, 0,
bufferbuffer.length);*/
bufferbuffer = new byte[0];
readNextBuffer();
analysisBuffer();
currentLine = oldCurrentLine;
}
prepareNextImage();
if (finds.size() == 0) { //搜索到内容
message.showMessage("Sorry!", new String[] {"未能搜索到任何内容!"});
}
repaint();
/*System.out.println("currentOffset=" + currentOffset + ", currentLine=" +
currentLine);*/
return flag;
}
private boolean ismatch(byte[] src, byte[] des, int off) {
for (int i = 0; i < src.length; i++) {
if (src[i] != des[off + i]) {
return false;
}
}
return true;
}
protected void showNotify() {
setFullScreenMode(true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -