⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 txtreadercanvas.java

📁 很好的基于java的手机文本阅读器anyview 2.0源码,
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
            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 + -