Skip to content

Commit

Permalink
'#39 Add support for disable Filterer on Filterers tree via its checkbox
Browse files Browse the repository at this point in the history
without removing its defined filters, which are restored when checkbox
is checked again.
  • Loading branch information
patrickdalla committed Apr 19, 2024
1 parent 75c0b8c commit d6cd081
Show file tree
Hide file tree
Showing 9 changed files with 180 additions and 125 deletions.
4 changes: 2 additions & 2 deletions iped-app/src/main/java/iped/app/ui/App.java
Original file line number Diff line number Diff line change
Expand Up @@ -1980,7 +1980,7 @@ public boolean hasFilters() {

@Override
public boolean hasFiltersApplied() {
return false;
return hasFilters();
}

@Override
Expand Down Expand Up @@ -2098,7 +2098,7 @@ public boolean hasFilters() {

@Override
public boolean hasFiltersApplied() {
return false;
return filter != null;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ public String toString() {

@Override
public boolean hasFiltersApplied() {
return false;
return categoryList.size() > 0;
}

public String toString() {
Expand Down
122 changes: 122 additions & 0 deletions iped-app/src/main/java/iped/app/ui/ComboFilterer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
package iped.app.ui;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JComboBox;

import org.apache.lucene.search.Query;

import iped.engine.search.MultiSearchResult;
import iped.engine.search.QueryBuilder;
import iped.exception.ParseException;
import iped.exception.QueryNodeException;
import iped.search.IMultiSearchResult;
import iped.viewers.api.IFilter;
import iped.viewers.api.IMutableFilter;
import iped.viewers.api.IQueryFilter;
import iped.viewers.api.IQueryFilterer;
import iped.viewers.api.IResultSetFilter;
import iped.viewers.api.IResultSetFilterer;

public class ComboFilterer implements IQueryFilterer, IResultSetFilterer {
private JComboBox<String> comboFilter;
FilterManager fm;

public ComboFilterer(FilterManager fm, JComboBox<String> comboFilter) {
this.comboFilter = comboFilter;
this.fm = fm;
}

@Override
public List<IFilter> getDefinedFilters() {
List<IFilter> result = new ArrayList<IFilter>();
if (comboFilter.getSelectedIndex() != -1 && !App.FILTRO_TODOS.equals(comboFilter.getSelectedItem())) {
if (!App.FILTRO_SELECTED.equals(comboFilter.getSelectedItem())) {
result.add(new IQueryFilter() {
String filterName = (String) comboFilter.getSelectedItem();
String filterExpression = fm.getFilterExpression((String) comboFilter.getSelectedItem());
private Query query;

@Override
public Query getQuery() {
if (query == null) {
try {
query = new QueryBuilder(App.get().appCase).getQuery(filterExpression);
} catch (ParseException | QueryNodeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return query;
}

@Override
public String toString() {
return filterName;
}
});
} else {
result.add(getFilter());
}
}
return result;
}

class CheckedFilter implements IResultSetFilter, IMutableFilter {
@Override
public IMultiSearchResult filterResult(IMultiSearchResult src)
throws ParseException, QueryNodeException, IOException {
return (MultiSearchResult) App.get().appCase.getMultiBookmarks().filterChecked(src);
}

public String toString() {
return App.FILTRO_SELECTED;
}
}

@Override
public IFilter getFilter() {
if (App.FILTRO_SELECTED.equals(comboFilter.getSelectedItem())) {
return new CheckedFilter();
}
return null;
}

@Override
public boolean hasFiltersApplied() {
return comboFilter.getSelectedIndex() > 0;
}

@Override
public Query getQuery() {
if (comboFilter.getSelectedIndex() == -1 || App.FILTRO_TODOS.equals(comboFilter.getSelectedItem())
|| App.FILTRO_SELECTED.equals(comboFilter.getSelectedItem())) {
return null;
}

Query result = null;
try {
result = new QueryBuilder(App.get().appCase)
.getQuery(fm.getFilterExpression((String) comboFilter.getSelectedItem()));
} catch (ParseException | QueryNodeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return result;
}

@Override
public boolean hasFilters() {
return comboFilter.getSelectedIndex() != -1 && !App.FILTRO_TODOS.equals(comboFilter.getSelectedItem());
}

@Override
public void clearFilter() {
App.get().appletListener.clearAllFilters = true;
App.get().filterComboBox.setSelectedIndex(0);
App.get().appletListener.clearAllFilters = false;
}
}
105 changes: 2 additions & 103 deletions iped-app/src/main/java/iped/app/ui/FilterManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,26 +34,22 @@
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import org.apache.lucene.search.Query;
import org.roaringbitmap.RoaringBitmap;

import iped.data.IItemId;
import iped.engine.data.IPEDMultiSource;
import iped.engine.search.MultiSearchResult;
import iped.engine.search.QueryBuilder;
import iped.exception.ParseException;
import iped.exception.QueryNodeException;
import iped.search.IMultiSearchResult;
import iped.utils.UTF8Properties;
import iped.viewers.api.IFilter;
import iped.viewers.api.IFilterManager;
import iped.viewers.api.IFilterer;
import iped.viewers.api.IMutableFilter;
import iped.viewers.api.IQueryFilter;
import iped.viewers.api.IQueryFilterer;
import iped.viewers.api.IResultSetFilter;
import iped.viewers.api.IResultSetFilterer;

public class FilterManager implements ActionListener, ListSelectionListener {
public class FilterManager implements ActionListener, ListSelectionListener, IFilterManager {
HashMap<IFilter, RoaringBitmap[]> cachedFilterBitsets = new HashMap<IFilter, RoaringBitmap[]>();
boolean useCachedBitmaps = false;

Expand Down Expand Up @@ -405,100 +401,3 @@ public RoaringBitmap[] getCachedBitmaps(IResultSetFilter rsFilter) {
}
}

class ComboFilterer implements IQueryFilterer, IResultSetFilterer {
private JComboBox<String> comboFilter;
FilterManager fm;

public ComboFilterer(FilterManager fm, JComboBox<String> comboFilter) {
this.comboFilter = comboFilter;
this.fm = fm;
}

@Override
public List<IFilter> getDefinedFilters() {
List<IFilter> result = new ArrayList<IFilter>();
if (comboFilter.getSelectedIndex() != -1 && !App.FILTRO_TODOS.equals(comboFilter.getSelectedItem())) {
if (!App.FILTRO_SELECTED.equals(comboFilter.getSelectedItem())) {
result.add(new IQueryFilter() {
String filterName = (String) comboFilter.getSelectedItem();
String filterExpression = fm.getFilterExpression((String) comboFilter.getSelectedItem());
private Query query;

@Override
public Query getQuery() {
if (query == null) {
try {
query = new QueryBuilder(App.get().appCase).getQuery(filterExpression);
} catch (ParseException | QueryNodeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return query;
}

@Override
public String toString() {
return filterName;
}
});
} else {
result.add(getFilter());
}
}
return result;
}

class CheckedFilter implements IResultSetFilter, IMutableFilter {
@Override
public IMultiSearchResult filterResult(IMultiSearchResult src) throws ParseException, QueryNodeException, IOException {
return (MultiSearchResult) App.get().appCase.getMultiBookmarks().filterChecked(src);
}

public String toString() {
return App.FILTRO_SELECTED;
}
}

@Override
public IFilter getFilter() {
if (App.FILTRO_SELECTED.equals(comboFilter.getSelectedItem())) {
return new CheckedFilter();
}
return null;
}

@Override
public boolean hasFiltersApplied() {
return comboFilter.getSelectedIndex() != -1;
}

@Override
public Query getQuery() {
if (comboFilter.getSelectedIndex() == -1 || App.FILTRO_TODOS.equals(comboFilter.getSelectedItem()) || App.FILTRO_SELECTED.equals(comboFilter.getSelectedItem())) {
return null;
}

Query result = null;
try {
result = new QueryBuilder(App.get().appCase).getQuery(fm.getFilterExpression((String) comboFilter.getSelectedItem()));
} catch (ParseException | QueryNodeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return result;
}

@Override
public boolean hasFilters() {
return comboFilter.getSelectedIndex() != -1 && !App.FILTRO_TODOS.equals(comboFilter.getSelectedItem());
}

@Override
public void clearFilter() {
App.get().appletListener.clearAllFilters = true;
App.get().filterComboBox.setSelectedIndex(0);
App.get().appletListener.clearAllFilters = false;
}
}
38 changes: 31 additions & 7 deletions iped-app/src/main/java/iped/app/ui/FiltersPanel.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package iped.app.ui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
Expand Down Expand Up @@ -82,23 +85,27 @@ public void install(FilterManager filterManager) {
this.filterManager = filterManager;
filtersTree = new JTree();

CheckBoxTreeCellRenderer treeCellRenderer = new CheckBoxTreeCellRenderer(filtersTree, new Predicate<Object>() {
Predicate filtererEnabledPredicate = new Predicate<Object>() {
@Override
public boolean test(Object t) {
if (t instanceof IFilterer) {
return filterManager.isFiltererEnabled((IFilterer) t);
return filterManager.isFiltererEnabled((IFilterer) t) && (((IFilterer) t).hasFiltersApplied());
}
return false;
}
}, new Predicate<Object>() {
};
};

Predicate filtererVisiblePredicate = new Predicate<Object>() {
@Override
public boolean test(Object t) {
if (t instanceof IFilterer) {
return ((IFilterer) t).hasFilters();
return true;
}
return false;
}
}) {
};
};
CheckBoxTreeCellRenderer treeCellRenderer = new CheckBoxTreeCellRenderer(filtersTree,
filtererEnabledPredicate, filtererVisiblePredicate) {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
Expand All @@ -109,9 +116,26 @@ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean
((JComponent)result).setToolTipText(toolTip);
}

if (value instanceof IFilterer) {
result.setBackground((((IFilterer) value).hasFiltersApplied()) ? ENABLED_BK_COLOR : Color.white);
}

return result;
}
};
treeCellRenderer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
IFilterer filterer = (IFilterer) e.getSource();
if (filterer.hasFiltersApplied()) {
filterManager.setFilterEnabled(filterer, !filterManager.isFiltererEnabled(filterer));
App.get().filtersPanel.updateUI();
App.get().getAppListener().updateFileListing();
} else {
App.get().filtersPanel.updateUI();
}
}
});
filtersTree.setCellRenderer(treeCellRenderer);
filtersTree.setCellEditor(treeCellRenderer);
filtersTree.setEditable(true);
Expand Down
2 changes: 1 addition & 1 deletion iped-app/src/main/java/iped/app/ui/TimelineListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ public boolean hasFilters() {

@Override
public boolean hasFiltersApplied() {
return false;
return isTimelineViewEnabled();
}

}
Loading

0 comments on commit d6cd081

Please sign in to comment.