Project

General

Profile

Download (5.77 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2019 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.taxeditor.view.search.facet;
10

    
11
import java.util.ArrayList;
12
import java.util.Collections;
13
import java.util.Comparator;
14
import java.util.HashSet;
15
import java.util.List;
16
import java.util.Map;
17
import java.util.Map.Entry;
18
import java.util.Set;
19
import java.util.TreeMap;
20

    
21
import org.eclipse.jface.layout.GridDataFactory;
22
import org.eclipse.swt.SWT;
23
import org.eclipse.swt.events.KeyEvent;
24
import org.eclipse.swt.events.KeyListener;
25
import org.eclipse.swt.events.SelectionEvent;
26
import org.eclipse.swt.events.SelectionListener;
27
import org.eclipse.swt.layout.GridLayout;
28
import org.eclipse.swt.widgets.Composite;
29
import org.eclipse.swt.widgets.Group;
30

    
31
import eu.etaxonomy.taxeditor.model.MessagingUtils;
32

    
33
/**
34
 * @author pplitzner
35
 * @since Jan 22, 2019
36
 *
37
 */
38
public abstract class SearchController<S extends SearchResult<T>, T> implements KeyListener, SelectionListener{
39

    
40
    private SearchComposite composite;
41
    private List<S> searchResults = new ArrayList<>();
42
    private Set<Facet> appliedFacets = new HashSet<>();
43
    private List<CheckBoxSearchResultComposite<T, S>> searchResultComposites = new ArrayList<>();
44

    
45
    public SearchController(SearchComposite composite) {
46
        this.composite = composite;
47
        composite.getTxtSearch().addKeyListener(this);
48
        composite.getBtnSearchButton().addSelectionListener(this);
49
    }
50

    
51
    protected abstract List<S> searchResults(String searchString);
52

    
53
    protected abstract CheckBoxSearchResultComposite<T, S> createResultComposite(S result, Composite parent);
54

    
55
    protected abstract Comparator<S> getResultComparator(String searchString);
56

    
57
    protected abstract List<S> getSelectedResults();
58

    
59
    private void search(String searchString){
60
        searchResults.clear();
61
        searchResultComposites.clear();
62

    
63
        searchResults = searchResults(searchString);
64
        if(searchResults.size()>500){
65
            MessagingUtils.warningDialog("Specify your search", this, "The following search has too many results. Please enter a more specific search query.");
66
            return;
67
        }
68

    
69
        Collections.sort(searchResults, getResultComparator(searchString));
70

    
71
        Set<Facet> facets = createResults(searchResults);
72

    
73
        createFilterButtons(facets);
74

    
75
        composite.refresh();
76
    }
77

    
78
    private void createFilterButtons(Set<Facet> facets) {
79
        Map<String, List<Facet>> categoryToFacetsMap = new TreeMap<>();//(String o1, String o2)->o1.compareTo(o2));
80
        for (Facet facet : facets) {
81
            String category = facet.getCategory();
82
            if(category==null){
83
                category = "None";
84
            }
85
            List<Facet> categoryFacets = categoryToFacetsMap.get(category);
86
            if(categoryFacets==null){
87
                categoryFacets = new ArrayList<>();
88
            }
89
            categoryFacets.add(facet);
90
            categoryToFacetsMap.put(category, categoryFacets);
91
        }
92
        for (Entry<String, List<Facet>> entry: categoryToFacetsMap.entrySet()) {
93
            String category = entry.getKey();
94
            // create group
95
            Group group = new Group(composite.getFilterListComposite(), SWT.NONE);
96
            group.setLayout(new GridLayout());
97
            GridDataFactory.fillDefaults().applyTo(group);
98
            group.setText(category!=null?category:"None");
99
            // fill group with facet filters
100
            List<Facet> categoryFacets = entry.getValue();
101
            for (Facet facet : categoryFacets) {
102
                if(facet.getFacet()!=null){
103
                    FilterComposite filterComposite = new FilterComposite(facet, this, group, SWT.NONE);
104
                    appliedFacets.add(facet);
105
                }
106
            }
107
        }
108

    
109
    }
110

    
111
    private Set<Facet> createResults(List<S> results) {
112
        Set<Facet> facets = new HashSet<>();
113
        searchResultComposites.clear();
114
        for (S result : results) {
115
            searchResultComposites.add(createResultComposite(result, composite.getSearchResultComposite()));
116
            facets.addAll(result.getFacets());
117
        }
118
        return facets;
119
    }
120

    
121
    public void applyFilter(FilterComposite filterComposite) {
122

    
123
        composite.clearResults();
124

    
125
        Facet facet = filterComposite.getFacet();
126
        if(filterComposite.isFilterActive()){
127
            appliedFacets.add(facet);
128
        }
129
        else{
130
            appliedFacets.remove(facet);
131
        }
132

    
133
        searchResultComposites.clear();
134
        for (S searchResult : searchResults) {
135
            if(searchResult.hasAnyFacet(appliedFacets)){
136
                searchResultComposites.add(createResultComposite(searchResult, composite.getSearchResultComposite()));
137
            }
138
        }
139

    
140
        composite.refresh();
141
    }
142

    
143
    private void search(){
144
        composite.clear();
145
        search(composite.getTxtSearch().getText());
146
    }
147

    
148
    public List<S> getSelectedSearchResults(){
149
        List<S> selectedSearchResults = new ArrayList<>();
150
        searchResultComposites.stream()
151
        .filter(resultComposite->resultComposite.getBtnCheck().getSelection())
152
        .forEach(selected->selectedSearchResults.add(selected.getResult()));
153
        return selectedSearchResults;
154
    }
155

    
156
    @Override
157
    public void keyPressed(KeyEvent e) {
158
        if(e.keyCode==SWT.CR && e.widget==composite.getTxtSearch()){
159
            search();
160
        }
161
    }
162

    
163
    @Override
164
    public void keyReleased(KeyEvent e) {
165
    }
166

    
167
    @Override
168
    public void widgetSelected(SelectionEvent e) {
169
        if(e.widget==composite.getBtnSearchButton()){
170
            search();
171
        }
172
    }
173

    
174
    @Override
175
    public void widgetDefaultSelected(SelectionEvent e) {
176
    }
177

    
178
}
(5-5/6)