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

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

?? threadedemails.java

?? 手機(jī)郵箱撒的方式方式方式的
?? JAVA
?? 第 1 頁 / 共 3 頁
字號:
        return messageHeader;
    }

    /**
     * Removes all messages from structure.
     */
    public void removeAllMessages() {
        children.clear();
        parents.clear();
        rootMessages.removeAllElements();
        size = 0;
    }

    /**
     * <p>Removes message at the i-th position.</p>
     * <p>
     * Note: This structure is not designed to add/remove messages one by one.
     *   This method is a little bit more difficult than just removing message
     *   from {@link Vector}. Message have to be removed first and than
     *   messages in structure have to be resorted (new threads created).
     * </p>
     */
    public void removeMessageAt(final int index) {
        if (DEBUG) { System.out.println("DEBUG ThreadedEmails.removeMessageAt(int index="+ index + ")"); }
        final Enumeration messages = getEnumeration();
        final Vector remainingMessages = new Vector();
        MessageHeader messageHeader;
        int i = 0;
        while ( messages.hasMoreElements() ) {
            messageHeader = (MessageHeader)messages.nextElement();
            if ( i != index ) {
                remainingMessages.addElement( messageHeader );
            } else {
                if (DEBUG) { System.out.println("DEBUG ThreadedEmails.removeMessageAt  removing MH=" + messageHeader); }
            }
            ++i;
        }

        createNewStructure(remainingMessages);
    }

    /**
     * <p>Removes message equal to passed message.</p>
     * <p>
     * Note: This structure is not designed to add/remove messages one by one.
     *   This method is a little bit more difficult than just removing message
     *   from {@link Vector}. Message have to be removed first and than
     *   messages in structure have to be resorted (new threads created).
     * </p>
     */
    public void removeMessage(final MessageHeader messageToRemove) {
          if (DEBUG) System.out.println("DEBUG ThreadedEmails.removeMessage(MessageHeader=" + messageToRemove + ")");
        final Enumeration messages = getEnumeration();
        final Vector remainingMessages = new Vector();
        MessageHeader messageHeader;
        while ( messages.hasMoreElements() ) {
            messageHeader = (MessageHeader)messages.nextElement();
            if ( messageToRemove.equals( messageHeader ) ) {
                continue;
            }
            remainingMessages.addElement(messageHeader);
        }

        createNewStructure(remainingMessages);
          if (DEBUG) System.out.println("removeMessage(MessageHeader) - end");
    }

    /**
     * Method recreates structure from passed messages.
     * 
     * @param messages messages to build this structure from
     */
    private void createNewStructure(final Vector messages) {
        ThreadedEmails newStructure = Algorithm.getAlgorithm().invoke( messages );
        this.rootMessages = newStructure.rootMessages;
        this.children = newStructure.children;
        this.parents = newStructure.parents;
        this.size = newStructure.size;
    }

    /**
     * <p>Adds message to structure.</p>
     * 
     * <p>
     * Note: This structure is not designed to add/remove messages one by one.
     *   This method is a little bit more difficult than just adding message
     *   to {@link Vector}. Message have to be added first and than
     *   messages in structure have to be resorted (new threads created).
     * </p>
     */
    public void addMessage(final MessageHeader newMessageHeader) {
        if ( newMessageHeader.getThreadingMessageID() == null ) {
            throw new IllegalArgumentException( "message have to have threading ID set" );
        }
        final Enumeration messages = getEnumeration();
        final Vector newMessages = new Vector();
        MessageHeader messageHeader;
        while ( messages.hasMoreElements() ) {
            messageHeader = (MessageHeader)messages.nextElement();
            newMessages.addElement( messageHeader );
        }
        newMessages.addElement( newMessageHeader );

        createNewStructure( newMessages );
    }

    public void sort(Comparator comparator) {
        if (DEBUG) {
            //#ifdef MUJMAIL_DEVELOPMENT
//#             printToConsole();
            //#endif
            System.out.println("comparator: " + comparator);
            System.out.println("sorting rootMessages...");
        }
        Functions.sort(rootMessages, comparator);
        MessageHeader messageHeader;
        //Vector/*<MessageHeader>*/ childMessages;
        for ( int i = 0; i < rootMessages.size(); ++i ) {
            messageHeader = (MessageHeader)rootMessages.elementAt( i );
            sortChildren( (Vector)children.get( messageHeader.getThreadingMessageID() ), comparator );
        }
    }

    private void sortChildren( Vector v, Comparator c ) {
        if ( v == null ) {
            return;
        }
        Functions.sort(v, c);
        for ( int i = 0; i < v.size(); ++i ) {
            sortChildren( (Vector)children.get( v.elementAt(i) ), c);
        }
    }

    public boolean isRootMessage(final MessageHeader messageHeader) {
        return rootMessages.contains( messageHeader );
    }

    /**
     * Returns level of the message in message tree.
     * 
     * @param messageThreadingID threading message ID for which find the level
     * @return level n which the message is stored in tree
     */
    public int getLevel(final String messageThreadingID ) {
        int level = 0;

        String childMessageThreadingID = messageThreadingID;
        MessageHeader parentMessage = (MessageHeader)parents.get( childMessageThreadingID );
        while ( parentMessage != null ) {
              // if there is parent increment level
            ++level;
              // find grant parent - parent of previous parent message
            parentMessage = (MessageHeader)parents.get( parentMessage.getThreadingMessageID() );
        }

        return level;
    }

    public boolean hasChildren(final MessageHeader messageHeader) {
        if ( !isRootMessage(messageHeader) ) {
            return false;
        }
        Object o = children.get( messageHeader.getThreadingMessageID() );
        if (o instanceof Vector) {
            Vector v = (Vector)o;
            return !v.isEmpty();
        } else {
            if (DEBUG) { System.out.println( "DEBUG ThreadedEmails.hasChildren(MessageHeader) " + o.getClass() ); } // TODO: remove 
        }
        return false;
    }

    /**
     * Returns number of empty root messages.
     * In ThreadedEmails structure only root messages can be empty. This method
     * iterate over these headers and return number of the empy ones.
     * 
     * @return number of empty root messages
     */
    public int getEmptyRootsNumber() {
    	int result = 0;
    	final int rootMessagesCount = rootMessages.size();
    	for ( int i = 0; i < rootMessagesCount; ++i) {
    		if ( ((MessageHeader)rootMessages.elementAt( i )).isEmpty() ) {
    			++result;
    		}
    	}
    	return result;
    }

    /**
     * When empty message have child which is empty, it moves children
     * of this child to the empty parent message.<br>
     * Example:
     * <pre>
     * --1 (empty)
     *   \--10 (empty)
     *      |--A (not empty)
     *      \--B (not empty)
     * </pre> 
     * Result should be:
     * <pre>
     * --1
     *   |--A
     *   \--B
     * </pre>
     * At the end it removes all empty root messages without no children.
     */
    public void removeUnnecessaryEmptyMessages() {
    	  if ( DEBUG ) {
    		  System.out.println( "DEBUG ThreadedEmails.removeUnnecessaryEmptyMessages()" );
              //#ifdef MUJMAIL_DEVELOPMENT
//#     		  printToConsole();
    		  //#endif
    	  }
    	final int rootsCount = rootMessages.size();
        MessageHeader messageHeader;
        Vector childVector;
    	for (int i = 0; i < rootsCount; ++i ) {
            messageHeader = (MessageHeader)rootMessages.elementAt( i );
            childVector = (Vector)children.get( messageHeader.getThreadingMessageID() );
            removeEmptyMessages( childVector );
    	}

    	for ( int i = rootsCount - 1; i >= 0; --i ) {
    	    messageHeader = (MessageHeader)rootMessages.elementAt( i );
    	    if ( messageHeader.isEmpty() ) {
    	        childVector = (Vector)children.get( messageHeader.getThreadingMessageID() );
    	        if ( childVector == null || childVector.size() == 0 ) {
    	            rootMessages.removeElementAt( i );
    	            --size;
    	        }
    	        if ( childVector != null && childVector.size() == 1 ) {
    	            children.remove( messageHeader.getThreadingMessageID() );
    	            rootMessages.removeElementAt( i );
    	            MessageHeader child =  (MessageHeader)childVector.elementAt( 0 );
    	            child.setParentID(null);
    	            parents.remove( child.getThreadingMessageID() );
    	            rootMessages.addElement( child );
    	            --size;
    	        }
    	    }
    	}
    }

    private void removeEmptyMessages(final Vector messages) {
        if ( messages == null ) {
            return;
        }
        final int vectorSize = messages.size();
        MessageHeader messageHeader;
        MessageHeader messageParent;
        Vector childVector;
        for ( int i = vectorSize - 1; i >= 0; --i ) {
            messageHeader = (MessageHeader)messages.elementAt( i );
            messageParent = (MessageHeader)parents.get( messageHeader.getThreadingMessageID() );
            childVector = (Vector)children.get( messageHeader.getThreadingMessageID() );
            removeEmptyMessages( childVector );
            if ( messageHeader.isEmpty() ) {
                final int childCount = (childVector == null)?0:childVector.size();
                MessageHeader child;
                for ( int j = childCount - 1; j >= 0; --j ) {
                    child = (MessageHeader)childVector.elementAt(j); // child vector cannot be null here because size is greater than zero
                    childVector.removeElement( child );
                    child.setParentID( messageHeader.getParentID() );
                    parents.put( child.getThreadingMessageID(), messageParent );
                    messages.addElement( child );
                }
                children.remove( messageHeader.getThreadingMessageID() );
                parents.remove( messageHeader.getThreadingMessageID() );
                messages.removeElementAt( i );
                --size;
            }
        }
    }

    //#ifdef MUJMAIL_DEVELOPMENT
//#     public void printToConsole() {
//#           if (!DEBUG) return;
//#         System.out.println("ThreadedEmails.printConsole()");
//#         System.out.println("size: " + size );
//#         System.out.println("=== alternative ===");
//#         Enumeration enumeration = this.getEnumeration();
//#         while ( enumeration.hasMoreElements() ) {
//#             MessageHeader mh = (MessageHeader)enumeration.nextElement();
//#             System.out.println( "msg: " + mh.toString() );
//#         }
//#     }
    //#endif


    /* *******************
     *    inner class    *
     *********************/

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区中文视频| 日韩女优制服丝袜电影| 国产精品高潮呻吟久久| 高清视频一区二区| 中文字幕久久午夜不卡| av激情综合网| 一区二区三区成人| 欧美色视频在线| 美女视频黄免费的久久 | 美女一区二区三区在线观看| 欧美一区日本一区韩国一区| 另类小说色综合网站| 久久久久久久久一| 91福利在线看| 狠狠色狠狠色综合系列| 欧美经典一区二区| 91久久人澡人人添人人爽欧美| 亚洲在线一区二区三区| 日韩久久久久久| 成人激情午夜影院| 日韩精品91亚洲二区在线观看| 日韩久久久精品| 99精品视频中文字幕| 三级不卡在线观看| 欧美激情在线免费观看| 欧美日韩成人在线| 不卡一区二区在线| 免费精品视频最新在线| 最新日韩av在线| 日韩午夜在线观看| 91在线一区二区| 久久99蜜桃精品| 亚洲精品成人悠悠色影视| 日韩一区二区三区视频| 91在线观看视频| 狠狠色丁香九九婷婷综合五月| 亚洲免费观看高清完整版在线观看熊| 亚洲一区二区三区激情| 久久综合九色综合欧美就去吻| 99re这里只有精品首页| 精品亚洲porn| 亚洲国产日产av| 中文字幕亚洲欧美在线不卡| 91精品国产丝袜白色高跟鞋| 99久久久精品| 国产黑丝在线一区二区三区| 日韩不卡免费视频| 亚洲高清三级视频| 1000部国产精品成人观看| 精品少妇一区二区三区在线视频| 色婷婷激情久久| 国产不卡高清在线观看视频| 精品在线观看视频| 水蜜桃久久夜色精品一区的特点| 中文字幕中文乱码欧美一区二区| 精品国产三级电影在线观看| 7777精品伊人久久久大香线蕉的| 99热99精品| 成人黄色在线看| 国产乱一区二区| 狠狠色综合色综合网络| 麻豆国产欧美日韩综合精品二区| 日韩成人一区二区三区在线观看| 一区二区三区日韩在线观看| 日韩美女精品在线| 国产精品美女久久久久aⅴ国产馆| 久久久高清一区二区三区| 精品欧美乱码久久久久久1区2区| 欧美日韩成人综合| 欧美乱妇20p| 欧美精品自拍偷拍动漫精品| 欧美日韩免费高清一区色橹橹| 日本伦理一区二区| 91久久精品网| 欧美在线你懂得| 欧美日韩成人综合| 欧美一二三区在线| 亚洲精品在线三区| 国产亚洲制服色| 亚洲国产精品ⅴa在线观看| 中文字幕欧美日韩一区| 中文字幕成人网| 中文字幕日韩一区| 一区二区三区四区五区视频在线观看| 怡红院av一区二区三区| 亚洲第一精品在线| 另类调教123区| 国产精品一线二线三线| 波多野洁衣一区| 在线观看国产91| 日韩精品一区二区三区蜜臀 | 国产一区二区福利视频| 精品国产免费久久| 久久婷婷色综合| 国产精品久久久久精k8| 亚洲免费观看高清完整版在线 | 国产精品羞羞答答xxdd| 97久久精品人人做人人爽 | 精品一区免费av| 国产成人亚洲综合a∨婷婷| 成人av片在线观看| 欧美日韩日本视频| 2021中文字幕一区亚洲| 最新热久久免费视频| 午夜视频一区二区| 国产综合色在线视频区| 97精品国产露脸对白| 欧美日韩国产综合一区二区三区| 日韩欧美一区电影| 欧美国产一区二区| 亚洲成人激情自拍| 国产成人一级电影| 欧美日韩在线免费视频| 26uuu国产在线精品一区二区| 国产精品国产自产拍在线| 亚洲成人资源在线| 粉嫩久久99精品久久久久久夜| 日本久久一区二区| 精品播放一区二区| 亚洲精品国产成人久久av盗摄 | 综合中文字幕亚洲| 青娱乐精品视频| va亚洲va日韩不卡在线观看| 欧美日韩另类国产亚洲欧美一级| 久久综合九色综合97婷婷女人| 亚洲黄色片在线观看| 久久99热这里只有精品| 在线观看一区不卡| 国产欧美一区二区三区沐欲| 亚洲国产一区二区a毛片| 国产精品系列在线播放| 3atv在线一区二区三区| 亚洲欧美综合另类在线卡通| 日本在线播放一区二区三区| 不卡区在线中文字幕| 精品国产精品网麻豆系列| 一区二区免费在线播放| 粉嫩aⅴ一区二区三区四区五区| 7777精品伊人久久久大香线蕉超级流畅| 中文字幕av一区二区三区高| 免费观看日韩av| 精品视频一区二区不卡| 中文字幕色av一区二区三区| 国产一区二区女| 欧美一区二区三区四区在线观看| 亚洲色图清纯唯美| 国产精品一线二线三线| 精品国产乱码久久久久久闺蜜| 午夜精品影院在线观看| 色婷婷亚洲综合| 国产精品国产三级国产普通话99| 久久国产麻豆精品| 91精品在线麻豆| 午夜日韩在线电影| 欧美视频自拍偷拍| 亚洲国产美国国产综合一区二区| 国产欧美一区视频| 国产精品亚洲综合一区在线观看| 日韩精品中午字幕| 久久超级碰视频| 日韩精品在线网站| 麻豆国产精品视频| 久久综合色8888| 国产精品一级片| 欧美高清在线一区| 成人精品视频一区二区三区| 久久你懂得1024| 国产超碰在线一区| 亚洲国产精品ⅴa在线观看| 成人精品一区二区三区四区 | 精品久久免费看| 国产一区二区三区视频在线播放| 日韩欧美国产小视频| 美女www一区二区| 精品国产成人在线影院| 国产精品一区在线观看你懂的| 2023国产精品自拍| 从欧美一区二区三区| 国产精品乱码一区二区三区软件| 成人开心网精品视频| 亚洲精品欧美激情| 精品视频一区三区九区| 乱一区二区av| 国产欧美日韩卡一| 色噜噜狠狠成人网p站| 亚洲成av人片一区二区梦乃| 日韩一区二区影院| 国产伦精品一区二区三区在线观看| 久久精品免费在线观看| 成人自拍视频在线| 亚洲五码中文字幕| 精品国产sm最大网站免费看| 成人午夜激情视频| 亚洲一区二区三区在线| 精品少妇一区二区三区| 成人v精品蜜桃久久一区| 亚洲在线观看免费| 2024国产精品| 欧美中文字幕久久| 九色综合狠狠综合久久|