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

📄 walktag.java

📁 这是学习Java必须读懂两套源代码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        }
	WalkData nw = null;
        if( stack.size() <= thread_depth ) {
          nw = new WalkData();
          stack.addLast((Object)nw);
        } else {
	  // Object reuse is good!
	  nw = (WalkData)stack.get(thread_depth);
	  nw.valid = true;
	  nw.setChildIndex(0);
        }
        cm = tw.getChild(cm,0);
        nw.setMessage(tw,cm);
        wd.setChildIndex(wd.getChildIndex()+1);
        wd = nw;
	message_num++;
        return EVAL_BODY_TAG;
      }
//      System.out.println("See if Parent has more children");
      // See if the parent message has any more children
      if( wd.getChildIndex() < wd.getChildCount() ) {
//	System.out.println("Parent has another sibling");
        cm = tw.getChild(wd.getMessage(),wd.getChildIndex());
        wd.setChildIndex(wd.getChildIndex()+1);
	message_num++;
        return EVAL_BODY_TAG;
      } else {
        wd.valid = false;
      }
    }
//    System.out.println("Walk back up the message tree.");

    // Parent has no more children or exceeded items_per_page,
    // so reduce message depth by one
    cm = null;

    if( thread_depth < 1 ) {
//      System.out.println(nextItem());
	is_exit = true;
	return EVAL_BODY_TAG;
    }

    if( is_total ) {
      thread_depth--;
      shallower++;
      is_total = false;
      return EVAL_BODY_TAG;
    }

    if( message_num < js.getItemsPerPage() ) {
      wd = (WalkData)stack.get(thread_depth-1);
//      System.out.println("Back to parent message: " + wd.getMessage().getID() );
      if( wd.getChildIndex() < wd.getChildCount() ) {
//        System.out.println("Now Parent has a sibling");
        cm = tw.getChild(wd.getMessage(),wd.getChildIndex());
        wd.setChildIndex(wd.getChildIndex()+1);
        WalkData nw = null;
        if( stack.size() <= thread_depth ) {
          nw = new WalkData();
          stack.addLast((Object)nw);
        } else {
          // Object reuse is good!
          nw = (WalkData)stack.get(thread_depth);
	  nw.valid = true;
	  nw.setChildIndex(0);
        }
        nw.setMessage(tw,cm);
        wd = nw;
	message_num++;
        return EVAL_BODY_TAG;
      } else {
	wd.valid = false;
      }
    }
    thread_depth--;
    shallower++;
//    System.out.println("thread_depth=" + thread_depth +
//	" valid=" + ((WalkData)stack.get(0)).valid);
    if( thread_depth == 0 && stack.size() > 0 && ((WalkData)stack.get(0)).valid) {
//      System.out.println("WalkTag page = true");
      is_exit = next_page = true;
      nextHref();
    }

    return EVAL_BODY_TAG;
  }

  /**
   * Method called at end of walk Tag to output content
   *
   * @return EVAL_PAGE
   */
  public final int doEndTag() throws JspException
  {
    try
    {
      if(bodyContent != null)
        bodyContent.writeOut(bodyContent.getEnclosingWriter());
    } catch(java.io.IOException e)
    {
      throw new JspException("IO Error: " + e.getMessage());
    }
    return EVAL_PAGE;
  }

  /**
   * Maintains state information while walking a thread tree of
   * messages.
   */
  public final class WalkData
  {
    ForumMessage mes = null;
    int child_count = 0;
    int child_index = 0;
    boolean valid = true;

    /**
     * Set the message this WalkData represents
     */
    public final void setMessage(TreeWalker tw, ForumMessage wm) {
      mes = wm;
      child_count = tw.getChildCount(wm);
    }

    /**
     * Get the message this WalkData represents
     *
     * @return ForumMessage
     */
    public final ForumMessage getMessage() {
      return mes;
    }

    /**
     * Number of children this message has
     *
     * @return total number of child messages this message has
     */
    public final int getChildCount() {
      return child_count;
    }

    /**
     * Get current index into a messages children we are looking at,
     * used for iterating through a messages children.
     *
     * @return current index into messages children
     */
    public final int getChildIndex() {
      return child_index;
    }

    /**
     * Set the current index into a messages children,
     * used for iterating through a messages children.
     */
    public final void setChildIndex(int i) {
      child_index = i;
    }

  }

  /**
   * Used by message tag to get current message
   *
   * @return current ForumMessage
   */
  public final ForumMessage getMessage()
  {
    return cm;
  }

  /**
   * Used by current_depth, while_child, and while_parent tags
   * to get current depth while walking thread
   *
   * @return String - current message depth in thread
   */
  public final int getDepth()
  {
    return thread_depth;
  }

  /**
   * Used by while_new_child tag to flag a new depth in the thread
   *
   * @return true if thread depth is deeper, false if it isn't any more deeper
   */
  public final boolean isDeeper()
  {
    if( deeper > 0 ) {
      deeper--;
      return true;
    }
    return false;
  }

  /**
   * Used by while_new_parent tag to flag walking back to a
   * shallower message depth.
   *
   * @return true if thread depth is shallower, false if it isn't any more shallow
   */
  public final boolean isShallower()
  {
    if( shallower > 0 ) {
      shallower--;
      return true;
    }
    return false;
  }

  /**
   * Used by is_parent tag to detect if this is a parent message of
   * the first new message to display after paging to a subsequent
   * page.
   *
   * @return true if this is a parent, false if not
   */
  public final boolean isParent()
  {
    if( parent_done )
      return false;
    return true;
  }

  /**
   * Used by is_message tag to detect if this is a new message
   * below the users messageDepth preference.
   *
   * @return true if this is a message below messageDepth, false if not
   */
  public final boolean isMessage()
  {
    if( !parent_done )
      return false;
    if( thread_depth < js.getMessageDepth() )
      return true;
    return false;
  }

  /**
   * Used by is_summar tag to detect if this is a new message
   * greater than or equal to the users messageDepth preference,
   * but below the users threadDepth preference.
   *
   * @return true if this is a message greater than or equal to the users messageDepth preference, but below the users threadDepth preference; false if not
   */
  public final boolean isSummary()
  {
    if( !parent_done )
      return false;
    if( thread_depth < js.getMessageDepth() )
      return false;
    if( thread_depth >= js.getThreadDepth() )
      return false;
    return true;
  }

  /**
   * Used by is_total tag to detect if this is a new message
   * greater than or equal to the users threadDepth preference.
   *
   * @return true if this is a new message greater than or equal to the users threadDepth preference, false if not
   */
  public final boolean isTotal()
  {
    if( !parent_done )
      return false;
    if( thread_depth >= js.getThreadDepth() &&
	thread_depth >= js.getMessageDepth() )
      return true;
    return false;
  }

  /**
   * Used by message tag to get the total number of child messages
   * (replies) to the current message.
   *
   * @return number of child messages (replies)
   */
  public final int getTotal()
  {
    return tw.getRecursiveChildCount(cm);
  }

  /**
   * Used by <b>on_entry</b> tag to detect if this is the first iteration
   * of the loop.
   *
   * @return true or false
   */
  public final boolean isEntry()
  {
    return is_entry;
  }

  /**
   * Used by <b>on_exit</b> tag to detect if this is the last iteration
   * of the loop.
   *
   * @return true or false
   */
  public final boolean isExit()
  {
    return is_exit;
  }

  /**
   * Used by <b>next_page</b> tag to detect if walk could continue
   * on another page.
   *
   * @return true or false
   */
  public final boolean isNextPage()
  {
    return next_page;
  }

  /**
   * Used by <b>prev_page</b> tag to detect if message listing
   * has a previous page.
   *
   * @return true or false
   */
  public final boolean isPrevPage()
  {
    return prev_page;
  }

  /**
   * Used by <b>next_item</b> tag to return query portion of an HTML GET href
   * for paging to next list of messages to walk in thread.
   *
   * @return String - query portion of an HTML GET href
   */
  public final String nextItem()
  {
    return next_href;
  }

  private void nextHref()
  {
    StringBuffer args = new StringBuffer();
    if( next_page ) {
      int num = stack.size();
      WalkData nw;
      WalkData pw;
      boolean back_walk = true;
      for( int i = num-1; i > 0; i-- ) {
	nw = (WalkData)stack.get(i);
//	System.out.println("i: " + i + " ID: " + nw.getMessage().getID() +
//	  " valid=" + nw.valid + " back_walk=" + back_walk +
//	  " Index: " + nw.getChildIndex() + " Count: " + nw.getChildCount());
	if( nw.valid ) {
	  if( back_walk ) {
	    if( nw.getChildIndex() >= nw.getChildCount() ) {
	      pw = (WalkData)stack.get(i-1);
//        System.out.println("previous: " + i + " ID: " + pw.getMessage().getID() +
//          " valid=" + pw.valid + " back_walk=" + back_walk +
//          " Index: " + pw.getChildIndex() + " Count: " + pw.getChildCount());
	      if( pw.getChildIndex() < pw.getChildCount() ) {
		args.append("walk_back=true&");
		args.append("walk_" + i + "=" + nw.getMessage().getID() + "&");
		back_walk = false;
	      }
	    } else {
	      back_walk = false;
              args.append("walk_" + i + "=" + nw.getMessage().getID() + "&");
	    }
	  } else {
	    args.append("walk_" + i + "=" + nw.getMessage().getID() + "&");
	  }
	}
      }
    }
    if( args.length() > 0 ) {
      args.setLength(args.length()-1);
    }
//    System.out.println("WalkTag page args: " + args);
    next_href = args.toString();
    if( current_href != null ) {
      js.addMessagePage(current_href,next_href);
    }
  }

  /**
   * Used by <b>prev_item</b> tag to return query portion of an HTML GET href
   * for paging to previous list of messages.
   *
   * @return String - query portion of an HTML GET href
   */
  public final String prevItem()
  {
    if( current_href != null ) {
      String tmp = null;
      tmp = js.getMessagePage(current_href);
      if( tmp != null )
	return tmp;
    }
    return "";
  }

  /**
   * Set name of thread id to use
   */
  public final void setThread(String tid)
  {
    thread = tid;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -