diff --git a/htroot/Table_API_p.java b/htroot/Table_API_p.java index 17a51a124..07f6e3a88 100644 --- a/htroot/Table_API_p.java +++ b/htroot/Table_API_p.java @@ -261,6 +261,7 @@ public class Table_API_p { final List table = new ArrayList(maximumRecords); int count = 0; int tablesize = 0; + int filteredSize = 0; try { tablesize = sb.tables.size(WorkTables.TABLE_API_NAME); final Iterator plainIterator = sb.tables.iterator(WorkTables.TABLE_API_NAME); @@ -268,9 +269,12 @@ public class Table_API_p { Tables.Row r; boolean dark = true; boolean scheduledactions = false; - int c = 0; + int matchCount = 0; byte[] typeb, commentb, urlb; String type, comment, url; + final boolean hasFilter = typefilter != QueryParams.catchall_pattern + || query != QueryParams.catchall_pattern; + // first prepare a list while (mapIterator.hasNext()) { r = mapIterator.next(); @@ -287,10 +291,21 @@ public class Table_API_p { if (urlb == null) continue; url = UTF8.String(urlb); if (!query.matcher(url).matches()) continue; - if (c >= startRecord) table.add(r); - c++; - if (table.size() >= maximumRecords) break; + if (matchCount >= startRecord && table.size() < maximumRecords) { + table.add(r); + } + matchCount++; + if (table.size() >= maximumRecords && !hasFilter) { + /* When a filter is defined, we must continue iterating over the table to get the total count of matching items */ + break; + } + } + if(hasFilter) { + filteredSize = matchCount; + } else { + filteredSize = tablesize; } + // then work on the list for (final Tables.Row row : table) { final Date now = new Date(); @@ -435,7 +450,7 @@ public class Table_API_p { prop.put("showtable_navigation", 1); prop.put("showtable_navigation_startRecord", startRecord); prop.put("showtable_navigation_to", Math.min(tablesize, startRecord + maximumRecords)); - prop.put("showtable_navigation_of", tablesize); + prop.put("showtable_navigation_of", filteredSize); prop.put("showtable_navigation_left", startRecord == 0 ? 0 : 1); prop.put("showtable_navigation_left_startRecord", Math.max(0, startRecord - maximumRecords)); prop.put("showtable_navigation_left_maximumRecords", maximumRecords); @@ -443,8 +458,8 @@ public class Table_API_p { prop.put("showtable_navigation_left_filter", typefilter.pattern()); prop.put("showtable_navigation_left", startRecord == 0 ? 0 : 1); prop.put("showtable_navigation_filter", typefilter.pattern()); - prop.put("showtable_navigation_right", startRecord + maximumRecords >= tablesize ? 0 : 1); - prop.put("showtable_navigation_right_startRecord", Math.min(tablesize - maximumRecords, startRecord + maximumRecords)); + prop.put("showtable_navigation_right", startRecord + maximumRecords >= filteredSize ? 0 : 1); + prop.put("showtable_navigation_right_startRecord", Math.min(filteredSize - maximumRecords, startRecord + maximumRecords)); prop.put("showtable_navigation_right_maximumRecords", maximumRecords); prop.put("showtable_navigation_right_inline", (inline) ? 1 : 0); prop.put("showtable_navigation_right_filter", typefilter.pattern());