| package org.wordpress.android.models; |
| |
| import java.util.ArrayList; |
| |
| public class ReaderCommentList extends ArrayList<ReaderComment> { |
| |
| private boolean commentIdExists(long commentId) { |
| return (indexOfCommentId(commentId) > -1); |
| } |
| |
| public int indexOfCommentId(long commentId) { |
| for (int i=0; i < this.size(); i++) { |
| if (commentId==this.get(i).commentId) |
| return i; |
| } |
| return -1; |
| } |
| |
| /* |
| * does passed list contain the same comments as this list? |
| */ |
| public boolean isSameList(ReaderCommentList comments) { |
| if (comments==null || comments.size()!=this.size()) |
| return false; |
| |
| for (ReaderComment comment: comments) { |
| if (!commentIdExists(comment.commentId)) |
| return false; |
| } |
| |
| return true; |
| } |
| |
| public boolean replaceComment(long commentId, ReaderComment newComment) { |
| if (newComment == null) { |
| return false; |
| } |
| |
| int index = indexOfCommentId(commentId); |
| if (index == -1) { |
| return false; |
| } |
| |
| // make sure the new comment has the same level as the old one |
| newComment.level = this.get(index).level; |
| |
| this.set(index, newComment); |
| return true; |
| } |
| |
| /* |
| * builds a new list from the passed one with child comments placed under their parents and indent levels applied |
| */ |
| public static ReaderCommentList getLevelList(ReaderCommentList thisList) { |
| if (thisList==null) |
| return new ReaderCommentList(); |
| |
| // first check if there are any child comments - if not, just return the passed list |
| boolean hasChildComments = false; |
| for (ReaderComment comment: thisList) { |
| if (comment.parentId!=0) { |
| hasChildComments = true; |
| break; |
| } |
| } |
| if (!hasChildComments) |
| return thisList; |
| |
| ReaderCommentList result = new ReaderCommentList(); |
| |
| // reset all levels, and add root comments to result |
| for (ReaderComment comment: thisList) { |
| comment.level = 0; |
| if (comment.parentId==0) |
| result.add(comment); |
| } |
| |
| // add child comments under their parents |
| boolean done; |
| do { |
| done = true; |
| for (ReaderComment comment: thisList) { |
| // only look at comments that have a parentId but no level assigned yet |
| if (comment.parentId!=0 && comment.level==0) { |
| int parentIndex = result.indexOfCommentId(comment.parentId); |
| if (parentIndex > -1) { |
| comment.level = result.get(parentIndex).level + 1; |
| |
| // insert this comment after the last comment of this level that has this parent |
| int commentIndex=parentIndex+1; |
| while (commentIndex < result.size()) { |
| if (result.get(commentIndex).level!=comment.level || result.get(commentIndex).parentId!=comment.parentId) |
| break; |
| commentIndex++; |
| } |
| result.add(commentIndex, comment); |
| |
| |
| done = false; |
| } |
| } |
| } |
| } while (!done); |
| |
| // handle orphans (child comments whose parents weren't found above) |
| for (ReaderComment comment: thisList) { |
| if (comment.level==0 && comment.parentId!=0) { |
| comment.level = 1; // give it a non-zero level so it's indented by ReaderCommentAdapter |
| result.add(comment); |
| } |
| } |
| |
| return result; |
| } |
| } |