diff --git a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java index c986c10aaa9..7572a0d4087 100644 --- a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java @@ -143,6 +143,7 @@ public abstract class ItemManager extends FContainer im public void handleEvent(FEvent e) { if (advancedSearchFilter == null) { advancedSearchFilter = createAdvancedSearchFilter(); + ItemManager.this.add(advancedSearchFilter.getWidget()); } advancedSearchFilter.edit(); } @@ -363,6 +364,9 @@ public abstract class ItemManager extends FContainer im helper.include(btnView, viewButtonWidth, fieldHeight); helper.include(btnAdvancedSearchOptions, viewButtonWidth, fieldHeight); helper.newLine(); + if (advancedSearchFilter != null && advancedSearchFilter.getWidget().isVisible()) { + helper.fillLine(advancedSearchFilter.getWidget(), fieldHeight); + } if (!hideFilters) { for (ItemFilter filter : filters) { helper.include(filter.getWidget(), filter.getPreferredWidth(helper.getRemainingLineWidth(), fieldHeight), fieldHeight); @@ -792,15 +796,7 @@ public abstract class ItemManager extends FContainer im protected abstract AdvancedSearchFilter createAdvancedSearchFilter(); public void addFilter(final ItemFilter filter) { - addFilter(-1, filter); - } - public void addFilter(int index, final ItemFilter filter) { - if (index == -1) { - filters.add(filter); - } - else { - filters.add(index, filter); - } + filters.add(filter); add(filter.getWidget()); boolean visible = !hideFilters; @@ -812,8 +808,19 @@ public abstract class ItemManager extends FContainer im } //apply filters and focus existing filter's main component if filtering not locked - private void applyNewOrModifiedFilter(final ItemFilter filter) { + public void applyNewOrModifiedFilter(final ItemFilter filter) { if (lockFiltering) { return; } + + if (filter == advancedSearchFilter) { + //handle update the visibility of the advanced search filter + boolean empty = filter.isEmpty(); + ItemFilter.Widget widget = filter.getWidget(); + if (widget.isVisible() == empty) { + widget.setVisible(!empty); + revalidate(); + } + } + applyFilters(); } @@ -837,6 +844,11 @@ public abstract class ItemManager extends FContainer im searchFilter.reset(); if (advancedSearchFilter != null) { advancedSearchFilter.reset(); + ItemFilter.Widget widget = advancedSearchFilter.getWidget(); + if (widget.isVisible()) { + widget.setVisible(false); + revalidate(); + } } lockFiltering = false; @@ -862,6 +874,9 @@ public abstract class ItemManager extends FContainer im if (!searchFilter.isEmpty()) { predicates.add(searchFilter.buildPredicate(genericType)); } + if (advancedSearchFilter != null && !advancedSearchFilter.isEmpty()) { + predicates.add(advancedSearchFilter.buildPredicate(genericType)); + } Predicate newFilterPredicate = predicates.size() == 0 ? null : Predicates.and(predicates); if (filterPredicate == newFilterPredicate) { return false; } diff --git a/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java b/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java index 8b97a4d92ac..f0a3e3b195f 100644 --- a/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java +++ b/forge-gui-mobile/src/forge/itemmanager/filters/AdvancedSearchFilter.java @@ -10,7 +10,6 @@ import com.google.common.base.Predicates; import forge.FThreads; import forge.Forge; import forge.item.InventoryItem; -import forge.itemmanager.BooleanExpression.Operator; import forge.itemmanager.AdvancedSearch; import forge.itemmanager.ItemManager; import forge.menu.FTooltip; @@ -23,13 +22,13 @@ import forge.toolbox.FScrollPane; import forge.toolbox.FTextField; import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FLabel; +import forge.util.Callback; public class AdvancedSearchFilter extends ItemFilter { private final List expression = new ArrayList(); private FiltersLabel label; - private boolean isAdded; private EditScreen editScreen; public AdvancedSearchFilter(ItemManager itemManager0) { @@ -92,7 +91,7 @@ public class AdvancedSearchFilter extends ItemFilter continue; } else { - predPiece = ((ItemFilter) piece).buildPredicate(); + predPiece = ((AdvancedSearch.Filter) piece).getPredicate(); } if (applyNot) { predPiece = Predicates.not(predPiece); @@ -117,14 +116,6 @@ public class AdvancedSearchFilter extends ItemFilter editScreen = new EditScreen(); } Forge.openScreen(editScreen); - /*if (!isAdded) { - isAdded = true; - itemManager.addFilter(0, this); - } - else { - itemManager.removeFilter(this); - isAdded = false; - }*/ } private void updateLabel() { @@ -134,9 +125,8 @@ public class AdvancedSearchFilter extends ItemFilter builder.append("(none)"); } else { - builder.append(expression.get(0)); - for (int i = 1; i < expression.size(); i++) { - builder.append(", " + expression.get(i)); + for (Object piece : expression) { + builder.append(piece); } } label.setText(builder.toString()); @@ -146,10 +136,18 @@ public class AdvancedSearchFilter extends ItemFilter if (expression.isEmpty()) { return ""; } StringBuilder builder = new StringBuilder(); - builder.append(expression.get(0)); + builder.append("Filters:\n"); - for (int i = 1; i < expression.size(); i++) { - builder.append("\n" + expression.get(i)); + String indent = ""; + + for (Object piece : expression) { + if (piece.equals(Operator.CLOSE_PAREN) && !indent.isEmpty()) { + indent = indent.substring(2); //trim an indent level when a close paren is hit + } + builder.append("\n" + indent + piece.toString().trim()); + if (piece.equals(Operator.OPEN_PAREN)) { + indent += " "; //add an indent level when an open paren is hit + } } return builder.toString(); } @@ -161,6 +159,11 @@ public class AdvancedSearchFilter extends ItemFilter @Override public void reset() { + expression.clear(); + editScreen = null; + if (label != null) { + updateLabel(); + } } @Override @@ -168,6 +171,7 @@ public class AdvancedSearchFilter extends ItemFilter label = new FiltersLabel(); updateLabel(); widget.add(label); + widget.setVisible(!isEmpty()); } @Override @@ -211,6 +215,48 @@ public class AdvancedSearchFilter extends ItemFilter scroller.add(new Filter()); } + @Override + @SuppressWarnings("unchecked") + public void onClose(Callback canCloseCallback) { + //build expression when closing screen + expression.clear(); + + for (FDisplayObject child : scroller.getChildren()) { + Filter filter = (Filter)child; + if (filter.filter == null) { continue; } //skip any blank filters + + if (filter.btnNotBeforeParen.isSelected()) { + expression.add(Operator.NOT); + } + if (filter.btnOpenParen.isSelected()) { + expression.add(Operator.OPEN_PAREN); + } + if (filter.btnNotAfterParen.isSelected()) { + expression.add(Operator.NOT); + } + + expression.add(filter.filter); + + if (filter.btnCloseParen.isSelected()) { + expression.add(Operator.CLOSE_PAREN); + } + if (filter.btnAnd.isSelected()) { + expression.add(Operator.AND); + } + else if (filter.btnOr.isSelected()) { + expression.add(Operator.OR); + } + } + + if (label != null) { + updateLabel(); + } + + itemManager.applyNewOrModifiedFilter(AdvancedSearchFilter.this); + + super.onClose(canCloseCallback); + } + @Override protected void doLayout(float startY, float width, float height) { scroller.setBounds(0, startY, width, height - startY); @@ -329,4 +375,22 @@ public class AdvancedSearchFilter extends ItemFilter } } } + + private enum Operator { + AND(" AND "), + OR(" OR "), + NOT(" NOT "), + OPEN_PAREN("("), + CLOSE_PAREN(")"); + + private final String token; + + private Operator(String token0) { + token = token0; + } + + public String toString() { + return token; + } + } }