亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? threadedemails.java

?? 手機郵箱撒的方式方式方式的
?? JAVA
?? 第 1 頁 / 共 3 頁
字號:
package mujmail.threading;

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.NoSuchElementException;
import java.util.Vector;

import mujmail.util.Functions;
import mujmail.IStorage;
import mujmail.MessageHeader;
import mujmail.Settings;
import mujmail.ordering.Comparator;

/**
 * This class represents structure for threaded e-mail.
 * Structure contains vector of root messages and for each root message
 * it contains {@link Vector} of child messages. Child messages vectors
 * are stored in hash map, in which root message ID is the key.
 * 
 * {@link ThreadedEmails} structure is used also for other boxes too
 * (f.e. Outbox, Draft, ...). In these boxes we do not need threads, so
 * in these cases only root messages are used and, for memory saving,
 * there are not empty vectors, but nulls.
 * 
 * @author Betlista
 */
public class ThreadedEmails implements IStorage {

    /** Flag signals if we want to print debug prints */
    private static final boolean DEBUG = false;

    /* *
     * While Hashtable does not support adding nulls, we use this
     * constant to represent that there is nothing in hashtable stored under
     * some key.
     */
//    private static final Object NULL = new Object(); // why not Vector? Because Object is the simplest class.

    /** Root messages, threads (with or without children). */
    private Vector/*<MessageHeader>*/ rootMessages;

    /**
     * Child vectors mapped in map, in which parent message ID is key under
     * which child vector is stored.
     */
    private Hashtable/*< String (parentID - threadedMessageID), Vector<MessageHeader> >*/ children;

    /**
     * Mapping for getting parent for child ID.
     */
    private Hashtable/*< String (childID - threadedMessageID), MessageHeader>*/ parents;

    /**
     * Number of e-mail headers stored in structure.
     */
    int size;

    /**
     * Creates empty structure.
     */
    public ThreadedEmails() {
        children = new Hashtable();
        parents = new Hashtable();
        rootMessages = new Vector();
        size = 0;
        lastReturnedHeader = null;
        lastReturnedIndex = 0;
    }

    /**
     * <p>Returns the index at which the message is stored in vector.</p>
     * <p>
     * Invariant of this method is, that this condition have to be true:<br>
     * <code>
     *   // index is the index returned by this method<br>
     *   // messages and threadingMessageID are parameters<br>
     * threadingMessageID.equals( messages.elementAt(index).getThreadingMessageID() )
     * </code>
     * </p>
     * @param messages vector to be searched in
     * @param threadingMessageID message ID we are looking message for
     * @return index of the message in the vectors
     */
    private int indexOf(final Vector/*<MessageHeaders>*/ messages, final String threadingMessageID) {
        final int size = messages.size();
        MessageHeader header;
        for (int i = 0; i < size; ++i) {
            header = (MessageHeader)messages.elementAt( i );
            if ( threadingMessageID.equals( header.getThreadingMessageID() ) ) {
                return i;
            }
        }
        return -1;
    }
    /**
     * Adds root (new thread) to vector of root messages.
     * 
     * @param messageHeader e-mail header that represents thread parent
     *        message
     */
    public void addRoot(final MessageHeader messageHeader) {
          if (DEBUG) System.out.println("DEBUG ThreadedEmails.addRoot(MessageHeader) - message header: " + messageHeader );
          if (DEBUG) System.out.println("DEBUG ThreadedEmails.addRoot(MessageHeader) - size (start): " + size);
          // if the message is the empty root message and showing of these 
          //   messages is turned off, such message is skipped
//        if ( !Settings.rootsVisible && messageHeader.isEmpty() ) {
//        	return;
//        }
        final int index = indexOf(rootMessages, messageHeader.getThreadingMessageID() );
          if (DEBUG) System.out.println("DEBUG ThreadedEmails.addMessage(MessageHeader, MessageHeader) - index: " + index);
          // if there is not this message in root messages
        if ( index == -1 ) {
            rootMessages.addElement( messageHeader );
            //String messageID = messageHeader.getThreadingMessageID();
            //children.put(messageID, NULL); // have no children yet
            //parents.put(messageID, NULL); // have no parent too (it's root message)
            ++size;
        } else {
            MessageHeader header = (MessageHeader)rootMessages.elementAt( index );
            if ( header.isEmpty() ) {
                rootMessages.setElementAt( messageHeader, index);
            } else {
                  // this is here because we support multiple messages with same
                  //   threading message ID
                rootMessages.addElement( messageHeader );
                ++size;
            }
        }
          if (DEBUG) System.out.println("DEBUG ThreadedEmails.addRoot(MessageHeader) - size (end): " + size);
    }

    /**
     * Adds message to thread. rootMessageID could be different from
     * messageHeaders parent ID.
     * 
     * @param parentMessage e-mail header message ID of the parent message
     * @param messageHeader e-mail header to be added to the thread
     */
    public void addMessage( final MessageHeader parentMessage, final MessageHeader messageHeader ) {
          if (DEBUG) System.out.println("DEBUG ThreadedEmails.addMessage(MessageHeader, MessageHeader) - rootMessage: " + parentMessage + ", messageHeader: " + messageHeader);
          if (DEBUG) System.out.println("DEBUG ThreadedEmails.addMessage(MessageHeader, MessageHeader) - size (start): " + size);
          // when threading is not enabled - all messages are added to the root messages
        if ( ! Settings.threading ) {
        	addRoot( messageHeader );
        	return;
        }
          // roots are added yet
          // add to parents
        parents.put( messageHeader.getThreadingMessageID(), parentMessage );
          // add to children
        Object childVector = children.get( parentMessage.getThreadingMessageID() );
        if ( childVector instanceof Vector ) {
            ((Vector)childVector).addElement( messageHeader );
            ++size;
        } else {
            Vector v = new Vector();
            v.addElement( messageHeader );
            children.put( parentMessage.getThreadingMessageID(), v );
            ++size;
        }
    }

    /* ************************
     *    Interface methods   *
     **************************/

    /*
     * (non-Javadoc)
     * @see mujmail.IStorage#getEnumeration()
     */
    public Enumeration getEnumeration() {
        return new Enumerator();
    }

    /**
     * Simply returns number of e-mail headers in structure.
     * Number of messages is increased when
     * {@link #addMessage(MessageHeader, MessageHeader)} is called.
     * 
     * @return number of e-mail headers in structure.
     */
    public int getSize() {
        return size;
    }

    /**
     * Returns whether structure is empty.
     * 
     * @return true if structure is empty (size == 0), false when size > 0
     */
    public boolean isEmpty() {
        return size == 0;
    }

    private int lastReturnedIndex = 0;
    private MessageHeader lastReturnedHeader = null;

    //#ifdef MUJMAIL_TEST_GET_MESSAGE_AT
//#     public static int simpleNext = 0;
//#     public static int simplePrevious = 0;
//#     public static int nextFromZero = 0;
    //#endif

    /*
     * (non-Javadoc)
     * @see mujmail.IStorage#getMessageAt(int)
     */
    public MessageHeader getMessageAt(final int index) {
          if (DEBUG) { System.out.println("DEBUG ThreadedEmails.getMessageAt(" + index + ")" ); }
          //System.out.println("  lastReturnedIndex = " + lastReturnedIndex);
          //System.out.println("  lastReturnedHeader= " + lastReturnedHeader);

        /* TODO (Betlista): this implementation is really stupid, but
           *   this method should not be used, I want to remove usage of this
           *   method from the code
           */

          /* Betlista:
           * Previous comment is correct, but we can assume that when user uses
           * this method he wants with quite good possibility the next message
           * he wanted before - on this is based next solution:
           * 
           * I remember previously returned message and it's index and when user
           * request message with index i than:
           *   when i > lastReturnedIndex
           *     than it's called nextElement() until lastReturned == i
           *   when i < lastReturnedIndex && i > (lastReturnedIndex - i)
           *     than it's called previousElement() until lastReturned == i
           *   when i < lastReturnedIndex && i < (lastReturnedIndex - i)
           *     than it's called nextElement() for i times (from zero)
           * 
           * Note: lastReturnedIndex is shifted by one again current position
           *  lastReturnedIndex=5 means that we returned 4th position (position are conted from 0)
           */
        final Enumerator messages = new Enumerator();
        MessageHeader messageHeader = null;

        // Note: This guard has to be here because other 3 possibilities (noted above)
        //  moves index immediately
        // We want to know same position as in last call
        if (index == lastReturnedIndex - 1) { // -1 is shift between lastReturedIndex and real position
            return lastReturnedHeader;
        }
        
        if (index >= lastReturnedIndex) {
            //#ifdef MUJMAIL_TEST_GET_MESSAGE_AT
//#             ++simpleNext;
            //#endif
            messages.actual = lastReturnedHeader;
            messages.index = lastReturnedIndex;
            while ( messages.hasNextElement() ) {
                messageHeader = (MessageHeader)messages.nextElement();
                  //if (DEBUG) { System.out.println(" (" + (messages.index) + ") " + messageHeader); }
                if ( messages.index - 1 == index ) {
                    lastReturnedHeader = messages.actual;
                    lastReturnedIndex = messages.index;
                    break;
                }
            }
        } else if ( index < lastReturnedIndex ) {
            if ( index < lastReturnedIndex - index ) {
                //#ifdef MUJMAIL_TEST_GET_MESSAGE_AT
//#                 ++nextFromZero;
                //#endif
                while ( messages.hasNextElement() ) {
                    messageHeader = (MessageHeader)messages.nextElement();
                    //if (DEBUG) { System.out.println(" (" + (messages.index) + ") " + messageHeader); }
                    if ( messages.index - 1 == index ) {
                        lastReturnedHeader = messages.actual;
                        lastReturnedIndex = messages.index;
                        break;
                    }
                }
            } else {
                //#ifdef MUJMAIL_TEST_GET_MESSAGE_AT
//#                 ++simplePrevious;
                //#endif
                messages.actual = lastReturnedHeader;
                messages.index = lastReturnedIndex;
                while ( messages.hasPreviousElement() ) {
                    messageHeader = (MessageHeader)messages.previousElement();
                    //if (DEBUG) { System.out.println(" (" + (messages.index) + ") " + messageHeader); }
                    if ( messages.index - 1 == index ) {
                        lastReturnedHeader = messages.actual;
                        lastReturnedIndex = messages.index;
                        break;
                    }
                }
            }
        }
          //System.out.println("Result (" + index + ")=" + messageHeader);
          //System.out.println("  lastReturnedIndex = " + lastReturnedIndex);
          //System.out.println("  lastReturnedHeader= " + lastReturnedHeader);
          //System.out.println();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜久久福利影院| 91日韩在线专区| 风流少妇一区二区| 欧美日韩一区国产| 中文字幕乱码久久午夜不卡| 亚洲一区二区欧美日韩 | 99在线热播精品免费| 69堂亚洲精品首页| 亚洲私人黄色宅男| 国产美女视频一区| 欧美中文字幕一区二区三区| 欧美国产一区二区在线观看| 久久se这里有精品| 91精品蜜臀在线一区尤物| 亚洲视频综合在线| 成人性视频免费网站| 久久色中文字幕| 蜜臀a∨国产成人精品| 91久久线看在观草草青青 | 欧美一区二区不卡视频| 夜夜嗨av一区二区三区网页| 欧美性生活影院| 久久久久青草大香线综合精品| 无吗不卡中文字幕| 欧美综合天天夜夜久久| 亚洲欧洲成人精品av97| 成人在线一区二区三区| 日韩精品中文字幕一区| 美女视频黄a大片欧美| 欧美日韩情趣电影| 亚洲电影你懂得| 精品污污网站免费看| 日韩理论片网站| 一本色道久久综合狠狠躁的推荐| 国产欧美精品一区二区色综合朱莉| 美女脱光内衣内裤视频久久网站 | av高清久久久| 中文字幕日韩av资源站| 91丨九色porny丨蝌蚪| 国产精品久久久久久户外露出| 大白屁股一区二区视频| 久久精品夜色噜噜亚洲aⅴ| 国产一区二区不卡| 国产日韩精品一区二区三区在线| 国产精品一二三在| 亚洲国产精品成人综合| 国产91清纯白嫩初高中在线观看 | 欧美一区二区三区四区视频| 亚洲福利视频一区二区| 欧美精品在线观看一区二区| 日日夜夜精品免费视频| 欧美大片国产精品| 国产成人免费视频网站高清观看视频| 久久精品一区四区| 色综合久久天天综合网| 午夜电影网一区| 欧美成人在线直播| 成人在线综合网| 亚洲成人免费观看| 日韩免费性生活视频播放| 国产精品123区| 亚洲欧美韩国综合色| 欧美片网站yy| 国产资源在线一区| 亚洲精品国产无套在线观| 欧美精品久久一区| 国产黄人亚洲片| 亚洲靠逼com| 337p日本欧洲亚洲大胆精品 | 国产成人免费视频网站高清观看视频| 国产精品久久久久久久岛一牛影视 | 欧美日韩午夜在线视频| 蜜桃传媒麻豆第一区在线观看| 国产视频一区二区在线| 色哟哟国产精品| 国内欧美视频一区二区| 亚洲视频在线一区| 日韩欧美一级精品久久| av亚洲精华国产精华精华| 日本不卡的三区四区五区| 亚洲欧洲日产国码二区| 欧美成人官网二区| 91成人免费网站| 国产成人综合在线观看| 亚洲国产成人av| 久久青草国产手机看片福利盒子 | 成人国产亚洲欧美成人综合网| 亚洲午夜羞羞片| 国产精品国产精品国产专区不蜜 | 亚洲欧美另类小说| 337p日本欧洲亚洲大胆色噜噜| 色噜噜狠狠色综合中国| 国产精品一二三在| 美女任你摸久久| 亚洲va欧美va人人爽午夜| 一区在线播放视频| 久久久精品国产免大香伊| 欧美一区二区三区免费视频| 色噜噜狠狠一区二区三区果冻| 国产做a爰片久久毛片| 免费高清在线视频一区·| 亚洲午夜羞羞片| 亚洲欧美日韩在线不卡| 亚洲精品一区二区三区香蕉| 337p亚洲精品色噜噜狠狠| 91麻豆高清视频| 91在线播放网址| 成人黄色777网| 成人夜色视频网站在线观看| 国产成人在线观看| 国产精品一区二区不卡| 免费久久精品视频| 日韩精品91亚洲二区在线观看| 香蕉久久夜色精品国产使用方法 | 欧美精品vⅰdeose4hd| 91福利在线导航| 91成人网在线| 欧美日韩高清一区| 337p亚洲精品色噜噜噜| 日韩一区二区精品| 日韩你懂的电影在线观看| 亚洲精品在线电影| 久久久久国产成人精品亚洲午夜| 2020国产精品久久精品美国| 2017欧美狠狠色| 国产女主播一区| 亚洲少妇屁股交4| 亚洲一二三四在线| 亚洲国产精品综合小说图片区| 亚洲精品高清在线| 亚洲chinese男男1069| 强制捆绑调教一区二区| 国产一区二区免费看| 成人免费av网站| 91黄色激情网站| 3atv一区二区三区| 国产亚洲成aⅴ人片在线观看| 国产精品蜜臀av| 性久久久久久久| 国产麻豆午夜三级精品| 不卡高清视频专区| 欧美日韩中字一区| 精品国产乱码久久久久久图片| 国产人久久人人人人爽| 专区另类欧美日韩| 免费久久99精品国产| 国产不卡在线一区| 欧美中文字幕久久| 日韩精品中文字幕一区| 成人欧美一区二区三区视频网页 | 7777精品伊人久久久大香线蕉 | 亚洲一区二区黄色| 九色porny丨国产精品| 99视频精品全部免费在线| 欧美日韩国产综合一区二区 | 久久综合五月天婷婷伊人| 亚洲成人免费视| 久久国产精品免费| 91麻豆国产自产在线观看| 欧美一级精品在线| 亚洲欧美在线观看| 精品一区二区三区视频在线观看| 91美女片黄在线观看91美女| 欧美一级欧美三级在线观看| 国产精品久久久久一区二区三区 | 欧美日韩不卡一区| 国产午夜亚洲精品不卡| 亚洲三级电影全部在线观看高清| 丝袜a∨在线一区二区三区不卡| 成人免费毛片app| 91精品国产一区二区三区| 中文字幕五月欧美| 国产综合久久久久久鬼色| 欧美日韩一区三区四区| 亚洲欧美怡红院| 日韩高清不卡一区二区三区| 99久久精品久久久久久清纯| 精品国产欧美一区二区| 亚洲少妇30p| 成人黄色小视频| 久久久噜噜噜久久人人看 | 久久五月婷婷丁香社区| 五月天一区二区| 在线看国产一区二区| 国产精品美女久久久久高潮| 久久精品噜噜噜成人88aⅴ| 欧美日韩一区二区三区免费看| 亚洲欧美在线视频| 成人黄色在线网站| 中文子幕无线码一区tr| 精品无人码麻豆乱码1区2区| 欧美二区乱c少妇| 五月开心婷婷久久| 欧美自拍丝袜亚洲| 亚洲一区影音先锋| 色一情一乱一乱一91av| 亚洲欧美日本在线| 一本久道久久综合中文字幕| 国产精品福利影院| 97精品久久久久中文字幕|