Allow merging consecutive filters for caption

This commit is contained in:
drdev
2015-09-06 17:48:50 +00:00
parent 3b6afdf1db
commit add2828592
2 changed files with 34 additions and 1 deletions

View File

@@ -118,6 +118,7 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
Forge.openScreen(editScreen); Forge.openScreen(editScreen);
} }
@SuppressWarnings("unchecked")
private void updateLabel() { private void updateLabel() {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
builder.append("Filter: "); builder.append("Filter: ");
@@ -125,10 +126,31 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
builder.append("(none)"); builder.append("(none)");
} }
else { else {
int prevFilterEndIdx = -1;
AdvancedSearch.Filter<T> filter, prevFilter = null;
for (Object piece : expression) { for (Object piece : expression) {
if (piece instanceof AdvancedSearch.Filter) {
filter = (AdvancedSearch.Filter<T>)piece;
if (filter.canMergeCaptionWith(prevFilter)) {
//convert boolean operators between filters to lowercase
builder.replace(prevFilterEndIdx, builder.length(), builder.substring(prevFilterEndIdx).toLowerCase());
//append only values for filter
builder.append(filter.extractValuesFromCaption());
}
else {
builder.append(filter);
}
prevFilter = filter;
prevFilterEndIdx = builder.length();
}
else {
if (piece.equals(Operator.OPEN_PAREN) || piece.equals(Operator.CLOSE_PAREN)) {
prevFilter = null; //prevent merging filters with parentheses in between
}
builder.append(piece); builder.append(piece);
} }
} }
}
label.setText(builder.toString()); label.setText(builder.toString());
} }

View File

@@ -808,6 +808,17 @@ public class AdvancedSearch {
predicate = predicate0; predicate = predicate0;
} }
public boolean canMergeCaptionWith(Filter<T> filter) {
return filter != null && option == filter.option && operator == filter.operator;
}
public String extractValuesFromCaption() {
//build empty caption to determine index where values would begin
String emptyCaption = operator.formatStr.replace("%1$s", option.name);
emptyCaption = emptyCaption.replaceAll("'?%\\d\\$[sd]'?", ""); //strip other arguments
return caption.substring(emptyCaption.length());
}
public Predicate<T> getPredicate() { public Predicate<T> getPredicate() {
return predicate; return predicate;
} }