From d7ded9b2ebcb98c8dba53cafd10282f0fba8b66f Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sun, 6 Feb 2011 10:01:24 +0000 Subject: [PATCH] "by series" branch --- assets/resources/application/en.xml | 3 + .../network/NetworkBookItemComparator.java | 2 - .../litres/LitResAuthenticationManager.java | 6 +- .../litres/LitResBookshelfItem.java | 100 +++++++++++++++++- 4 files changed, 101 insertions(+), 10 deletions(-) diff --git a/assets/resources/application/en.xml b/assets/resources/application/en.xml index a38d2d94f..219907539 100644 --- a/assets/resources/application/en.xml +++ b/assets/resources/application/en.xml @@ -55,6 +55,9 @@ + + + diff --git a/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java b/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java index eaf162871..db8981e73 100644 --- a/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java +++ b/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java @@ -22,9 +22,7 @@ package org.geometerplus.fbreader.network; import java.util.Comparator; import java.util.LinkedList; - public final class NetworkBookItemComparator implements Comparator { - public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) { final boolean item0isABook = item0 instanceof NetworkBookItem; final boolean item1isABook = item1 instanceof NetworkBookItem; diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java index eba9ed973..9553cc2a4 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java @@ -361,11 +361,11 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { } private void loadPurchasedBooksOnSuccess(LitResNetworkRequest purchasedBooksRequest) { - LitResXMLReader reader = (LitResXMLReader) purchasedBooksRequest.Reader; + LitResXMLReader reader = (LitResXMLReader)purchasedBooksRequest.Reader; myPurchasedBooks.clear(); for (NetworkLibraryItem item: reader.Books) { if (item instanceof NetworkBookItem) { - NetworkBookItem book = (NetworkBookItem) item; + NetworkBookItem book = (NetworkBookItem)item; myPurchasedBooks.put(book.Id, book); } } @@ -390,7 +390,7 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager { } private void loadAccountOnSuccess(LitResNetworkRequest accountRequest) { - LitResPurchaseXMLReader reader = (LitResPurchaseXMLReader) accountRequest.Reader; + LitResPurchaseXMLReader reader = (LitResPurchaseXMLReader)accountRequest.Reader; myAccount = BuyBookReference.price(reader.Account, "RUB"); } diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java index c2f7478ae..62c7418ac 100644 --- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java +++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java @@ -26,12 +26,29 @@ import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.fbreader.network.*; -class SortedCatalogItem extends NetworkCatalogItem { +abstract class SortedCatalogItem extends NetworkCatalogItem { private final List myChildren = new LinkedList(); private SortedCatalogItem(NetworkCatalogItem parent, ZLResource resource, List children) { super(parent.Link, resource.getValue(), resource.getResource("summary").getValue(), "", parent.URLByType); - myChildren.addAll(children); + for (NetworkLibraryItem child : children) { + if (accepts(child)) { + myChildren.add(child); + } + } + final Comparator comparator = getComparator(); + if (comparator != null) { + Collections.sort(myChildren, comparator); + } + } + + public boolean isEmpty() { + return myChildren.isEmpty(); + } + + protected abstract Comparator getComparator(); + protected boolean accepts(NetworkLibraryItem item) { + return item instanceof NetworkBookItem; } public SortedCatalogItem(NetworkCatalogItem parent, String resourceKey, List children) { @@ -51,6 +68,75 @@ class SortedCatalogItem extends NetworkCatalogItem { } } +class ByAuthorCatalogItem extends SortedCatalogItem { + ByAuthorCatalogItem(NetworkCatalogItem parent, List children) { + super(parent, "byAuthor", children); + } + + @Override + protected Comparator getComparator() { + return new NetworkBookItemComparator(); + } +} + +class ByTitleCatalogItem extends SortedCatalogItem { + ByTitleCatalogItem(NetworkCatalogItem parent, List children) { + super(parent, "byTitle", children); + } + + @Override + protected Comparator getComparator() { + return new Comparator() { + public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) { + return item0.Title.compareTo(item1.Title); + } + }; + } +} + +class ByDateCatalogItem extends SortedCatalogItem { + ByDateCatalogItem(NetworkCatalogItem parent, List children) { + super(parent, "byDate", children); + } + + @Override + protected Comparator getComparator() { + return new Comparator() { + public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) { + return 0; + } + }; + } +} + +class BySeriesCatalogItem extends SortedCatalogItem { + BySeriesCatalogItem(NetworkCatalogItem parent, List children) { + super(parent, "bySeries", children); + } + + @Override + protected Comparator getComparator() { + return new Comparator() { + public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) { + final NetworkBookItem book0 = (NetworkBookItem)item0; + final NetworkBookItem book1 = (NetworkBookItem)item1; + int diff = book0.SeriesTitle.compareTo(book1.SeriesTitle); + if (diff == 0) { + diff = book0.IndexInSeries - book1.IndexInSeries; + } + return diff != 0 ? diff : book0.Title.compareTo(book1.Title); + } + }; + } + + @Override + protected boolean accepts(NetworkLibraryItem item) { + return + item instanceof NetworkBookItem && + ((NetworkBookItem)item).SeriesTitle != null; + } +} + public class LitResBookshelfItem extends NetworkCatalogItem { private boolean myForceReload; @@ -87,9 +173,13 @@ public class LitResBookshelfItem extends NetworkCatalogItem { listener.onNewItem(Link, item); } } else { - listener.onNewItem(Link, new SortedCatalogItem(this, "byDate", children)); - listener.onNewItem(Link, new SortedCatalogItem(this, "byAuthor", children)); - listener.onNewItem(Link, new SortedCatalogItem(this, "byTitle", children)); + listener.onNewItem(Link, new ByDateCatalogItem(this, children)); + listener.onNewItem(Link, new ByAuthorCatalogItem(this, children)); + listener.onNewItem(Link, new ByTitleCatalogItem(this, children)); + final BySeriesCatalogItem bySeries = new BySeriesCatalogItem(this, children); + if (!bySeries.isEmpty()) { + listener.onNewItem(Link, bySeries); + } } listener.commitItems(Link); }