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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? threadedemails.java

?? 手機(jī)郵箱撒的方式方式方式的
?? 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();

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲精久久久久久| 欧美日韩国产不卡| 国产精品视频在线看| 国产精品一区二区免费不卡| 国产亚洲人成网站| 欧美三级一区二区| 午夜激情久久久| 日韩精品综合一本久道在线视频| 免费亚洲电影在线| www一区二区| 成人免费的视频| 亚洲欧美成aⅴ人在线观看| 欧美综合一区二区三区| 日韩精品欧美精品| 久久九九久久九九| 99久久久国产精品| 亚洲国产精品久久不卡毛片| 精品久久久久久无| proumb性欧美在线观看| 亚洲国产另类精品专区| 精品国产一区二区亚洲人成毛片| 成人综合在线视频| 亚洲一区中文日韩| 亚洲精品一区二区三区四区高清| caoporn国产一区二区| 香港成人在线视频| 久久精品无码一区二区三区| 一本到三区不卡视频| 日韩av一二三| 最近日韩中文字幕| 精品国产欧美一区二区| 91在线一区二区| 麻豆精品一区二区三区| 国产精品激情偷乱一区二区∴| 欧美乱熟臀69xxxxxx| 成人国产一区二区三区精品| 天天av天天翘天天综合网色鬼国产| wwwwww.欧美系列| 欧美三级日韩在线| 成人国产精品免费观看视频| 日韩精品一级中文字幕精品视频免费观看 | 久久亚区不卡日本| 欧美三级三级三级爽爽爽| 国产精品一区二区黑丝| 亚州成人在线电影| 亚洲欧美福利一区二区| 欧美精品一区二区久久久| 欧美自拍偷拍一区| 波多野洁衣一区| 国产综合色视频| 亚洲成人一区二区| 亚洲欧美在线视频| 久久免费美女视频| 日韩一区二区三区电影| 欧美日韩一区不卡| 91在线小视频| 福利一区福利二区| 国产专区欧美精品| 另类欧美日韩国产在线| 午夜精品久久久久久不卡8050| 亚洲欧洲精品一区二区精品久久久| 日韩亚洲欧美综合| 91精品欧美一区二区三区综合在 | 欧美成人女星排名| 欧美精品丝袜中出| 欧美日韩三级一区| www.欧美精品一二区| 懂色一区二区三区免费观看| 精品亚洲成a人| 久久99精品国产麻豆不卡| 亚洲国产成人va在线观看天堂| 国产精品久久久久天堂| 亚洲国产精品激情在线观看| 久久婷婷久久一区二区三区| 亚洲精品一区二区三区在线观看| 日韩欧美在线影院| 日韩三级av在线播放| 欧美一区二区黄色| 91精品国产综合久久久久久| 6080午夜不卡| 69堂成人精品免费视频| 日韩欧美一区二区在线视频| 日韩一区二区在线看| 日韩三级免费观看| 亚洲精品一区二区三区福利| 精品成人a区在线观看| 欧美精品一区二区在线播放 | 国产女主播在线一区二区| 国产亚洲精品超碰| 国产精品久久久久三级| 日本一区二区视频在线观看| 国产精品久久久久一区二区三区共| 国产精品初高中害羞小美女文| 亚洲乱码中文字幕| 亚洲国产精品久久一线不卡| 日本成人在线一区| 国产美女视频一区| 久久精品一区二区三区四区| 久久人人97超碰com| 国产精品伦理一区二区| 一区二区三区产品免费精品久久75| 午夜日韩在线电影| 国产一区二区在线看| www.性欧美| 91精品国产欧美一区二区18 | 亚洲国产视频直播| 麻豆精品一区二区三区| 国产**成人网毛片九色| 在线免费观看成人短视频| 91麻豆精品国产自产在线观看一区| 日韩欧美不卡在线观看视频| 中文字幕精品一区二区三区精品 | 亚洲chinese男男1069| 久久精品国产亚洲高清剧情介绍| 成人丝袜18视频在线观看| 欧美日韩一区中文字幕| 久久久九九九九| 亚洲综合色噜噜狠狠| 激情另类小说区图片区视频区| 成人黄色av电影| 欧美一级久久久久久久大片| 欧美国产日韩在线观看| 亚洲成人免费在线| 成人激情av网| 精品久久一二三区| 亚洲综合无码一区二区| 国产一区91精品张津瑜| 欧美亚洲自拍偷拍| 国产欧美一区二区三区在线看蜜臀| 一区二区三区四区精品在线视频| 精品在线播放午夜| 欧美在线短视频| 国产精品天干天干在观线| 免费观看日韩电影| 91福利精品第一导航| 久久久99免费| 蜜桃91丨九色丨蝌蚪91桃色| 一本一道综合狠狠老| 久久免费视频色| 日本成人在线不卡视频| 在线看一区二区| 中文字幕一区av| 国产精品影视天天线| 制服丝袜亚洲精品中文字幕| 中文字幕色av一区二区三区| 经典三级在线一区| 欧美精品 国产精品| 亚洲精品视频一区| thepron国产精品| 国产亚洲一区二区在线观看| 久久99久久99精品免视看婷婷| 欧美日韩另类一区| 亚洲图片有声小说| 在线日韩一区二区| 亚洲精品日日夜夜| 一本色道**综合亚洲精品蜜桃冫| 国产精品成人一区二区艾草 | 免费观看一级特黄欧美大片| 欧美色图激情小说| 亚洲靠逼com| 91在线你懂得| 中文字幕一区二区日韩精品绯色| 国产精品夜夜嗨| 国产日韩综合av| 国产美女精品人人做人人爽| 久久久亚洲精华液精华液精华液| 久久9热精品视频| 欧美成人精品二区三区99精品| 理论电影国产精品| 精品国产91洋老外米糕| 久久国产剧场电影| 久久精品水蜜桃av综合天堂| 国产电影一区二区三区| 欧美国产激情二区三区| 大白屁股一区二区视频| 国产精品每日更新| 91色porny蝌蚪| 悠悠色在线精品| 欧美天堂一区二区三区| 日本成人在线看| 久久综合资源网| 成人av网站大全| 亚洲精品日产精品乱码不卡| 欧美日韩激情一区二区| 免费成人在线网站| 久久精品男人的天堂| 99久久99久久综合| 一个色妞综合视频在线观看| 欧美日韩成人综合天天影院| 奇米色777欧美一区二区| 久久精品亚洲乱码伦伦中文| av网站一区二区三区| 一区二区三区欧美视频| 91精品久久久久久久久99蜜臂| 久久不见久久见免费视频1| 国产欧美精品一区| 欧美视频一区二区三区四区| 久久99国内精品| 亚洲欧美日韩国产一区二区三区| 欧美午夜精品久久久久久超碰|